【Camera Framework笔记】四、流程梳理 - getCharacteristics&openCamera

    1. getCharacteristics  总体流程
        getCharacteristics
                    |
        cameraservice
                    |
        cameraprovidermanager
                    |
           deviceinfo3
        
        cameraserver进程刚起来做enumerate时会将 cameraCharacteristics 存放在cameraprovidermanager的deviceinfo3里面mcameraCharacteristics
        上层问cameraservice要cameraCharacteristics时,cameraservice从deviceinfo3中直接获取
        如果是logical multicam  camera会针对每一个物理camera调用到hal层的 getphysicalcameraCharacteristics,保存在mphysicalcameraCharacteristics map中

    2. addlistener / remove  
        需要知道当前平台哪些camera可用
        某一个camera的状态发生改变时(open close),通过callback的方式动态通知给client
    
    3. openCamera 流程
        总体流程:
        权限检查、输入参数检查->camera抢占逻辑->client初始化->device初始化
        
        connectDevice流程:
        connectHelper流程:
            1.为NON-System ndk client 获取clientpackagename
            2.记录opentimeNS
            3.获取到mServiceLockWrapper这把锁,保证同一时刻只有一个客户端在opencamera
            4.权限和cameraid检查(详见 4 == 4 validateConnectLocked)
            5.处理抢占逻辑 handleEvictionsLocked
            6.获取deviceVersionAndTransport
            7.makeclient和client->initialize
            8.finishConnectLocked
                将client添加到active client manager中,
                addAndEvict当前的client
                    wouldEvicLocked,看下是否还会出现抢占
                并监听client进程是否挂掉
           (monitorTags:监听每一帧每一个metadata的状态)

4 == 4
      validateConnectLocked流程:
            1. validateClientPermissionsLocked
                获取到UID PID
                shouldrejectsystemcameraconnection对system camera的权限进行检查
                检查是否有已经获取到camera权限
                检查uid是否处于active状态
                检查sensor privacy是否没有enable
                检查当前用户是否在allow user list里面(多用户场景)
            2.根据cameraid获取camerastate 检查cameraid是否合法
            3.根据camerastate检查当前cameradevice是否可用

TIPS:

        clientDescriptor 用于描述一个 camera client对象:
                KEY     当前Camera Client对应的CameraId
                VALUE     当前Camera Client对象
                cost     打开当前Camera需要耗费的resource cost
                conflictingKeys     与当前Camera无法同时打开的Camera Id列表
                score     打开当前Camera的客户端进程oom_adj score,这个值越大越容易被LMK干掉,前台进程这个值为0
                ownerId     打开当前Camera的客户端进程PID
                state     打开当前Camera的客户端进程的状态,值越小优先级越高
                isVendorClient     打开当前Camera的客户端是否是Vendor进程
                oomScoreOffset     需要增加的oomScore偏移值(相当于在抢占逻辑中,降低自己的优先级)
                
        clientPriority 用于描述一个 camera client进程的优先级:
                score     打开当前Camera的客户端进程oom_adj score,这个值越大越容易被LMK干掉,前台进程这个值为0
                state     打开当前Camera的客户端进程的状态,值越小优先级越高
                isVendorClient     打开当前Camera的客户端是否是Vendor进程
                scoreOffset     需要增加的oomScore偏移值(相当于在抢占逻辑中,降低自己的优先级)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cam_Rxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值