zoukankan      html  css  js  c++  java
  • camera frame work v3 note

    1 android_atomic_write(level, &gLogLevel);

       原子写操作。

    2 构造函数和onFirstRef

    onFirstRef 会在构造函数运行后执行,这个是在mediaserver 这个进程启动时运行的,具体为何可查看代码。

    3  ICameraServiceListener

      class ICameraServiceListener : public IInterface

    定义了接口,一定会有构建bp和bn,形成进程间通讯。

    bn 是具体的实现, bp 则是通过binder 调用bn实现功能。

    这个实现就是

    onStatusChanged(Status status, int32_t cameraId)=0

    BpCameraServiceListener 实现了onStatusChanged,而BnCameraServiceListener 没有实现,所以,所有从BnCameraServiceListener继承的累都必须

    实现这个函数。也就是说,我们调用的一直是bp,但好像bn在执行。一般这样的调用都有一个明显的特征

    listener->onStatusChanged(mStatusList[i], i);
    而lisrener 是
    const sp<ICameraServiceListener>& listener

    这样调用的是bp,那么就得找到bn,来看这个函数。一般是到ICameraServiceListener.c 中找BnCameraServiceListener 然后找到谁继承BnCameraServiceListener,在这里找到onStatusChanged

    4 连接到camera

    android_hardware_Camera_native_setup---->
    
        sp<Camera> camera = Camera::connect(cameraId, clientName,
                Camera::USE_CALLING_UID);

    调用到cameraserver的conect

    status_t CameraService::connect(
            const sp<ICameraClient>& cameraClient,
            int cameraId,
            const String16& clientPackageName,
            int clientUid,
            /*out*/
            sp<ICamera>& device)

    比较有意思的是第一个和最后一个参数。

    第一个参数是回调函数的bp, 最后一个函数竟然是camera的bp

    连接的主要工作就是

                client = new Camera2Client(this, cameraClient,
                        clientPackageName, cameraId,
                        facing, callingPid, clientUid, getpid(),
                        deviceVersion);

      mClient[cameraId] = client;

     client->initialize(mModule)

    构造时调函数的bp会被保存。

    这样camera 就连接上了,并返回了camera cloass obj。

    camera.cpp 是icamera的一个bp,同时也是回调的bn

    Camera2Client.cpp 是icamera的bn,是回调的bp。

    5 设备的创建

    CameraDeviceFactory::createDevice  Camera2Client 构造中调用

    根据设备api的不同,有Camera3Device  Camera2Device

    camera 设备构造时camera3_callback_ops 被赋值,之后会交给hal 用的。

    这个结构有连个操作,一个是通知,用于error 和 shutter ,另一个是返回请求结果 sProcessCaptureResult

    6 设备的初始化

    Camera2Client::initialize  --------->

    Camera2ClientBase::initialize --->mDevice->initialize

    然后

    mStatusTracker = new StatusTracker(this);

    mRequestThread = new RequestThread(this, mStatusTracker, device);

    这是两个线程。

    Camera2Client::initialize  里启动了

    mStreamingProcessor

    mFrameProcessor

    mCaptureSequencer

    mJpegProcessor

    mZslProcessorThread

    mCallbackProcessor

    线程

  • 相关阅读:
    【Hadoop离线基础总结】Hue的简单介绍和安装部署
    【Hadoop离线基础总结】Hue与Mysql集成
    【Hadoop离线基础总结】Hue与Impala集成
    【Hadoop离线基础总结】Hue与Hive集成
    【Hadoop离线基础总结】Hue与Hadoop集成
    【Hadoop离线基础总结】impala简单介绍及安装部署
    centos7启动httpd服务失败:Job for httpd.service failed because the control process exited with error code.
    【Hadoop离线基础总结】Mac版VMware Fusion虚拟机磁盘挂载
    Azkaban无法连接网页
    【Hadoop离线基础总结】流量日志分析网站整体架构模块开发
  • 原文地址:https://www.cnblogs.com/soc-linux-driver/p/3683792.html
Copyright © 2011-2022 走看看