Camera S openCamera流程分析

OpenCamera 流程分析

打开相机流程从CameraService开始分析:
上层打开相机时会调用connectDevice函数,在其中构造CameraDeviceClient实例,并初始化。

          bool overrideForPerfClass = SessionConfigurationUtils::targetPerfClassPrimaryCamera(
                  mPerfClassPrimaryCameraIds, cameraId.string(), targetSdkVersion);
          if(!(ret = makeClient(this, cameraCb, clientPackageName, clientFeatureId,
                  cameraId, api1CameraId, facing, orientation,
                  clientPid, clientUid, getpid(),
                  deviceVersion, effectiveApiLevel, overrideForPerfClass,
                  /*out*/&tmp)).isOk()) {
              return ret;
          }
          client = static_cast<CLIENT*>(tmp.get());
  
          LOG_ALWAYS_FATAL_IF(client.get() == nullptr, "%s: CameraService in invalid state",
                  __FUNCTION__);
  
          err = client->initialize(mCameraProviderManager, mMonitorTags);

在CameraDeviceClient构造方法中会创建一个Camera2ClientBase实例,mCameraDevice也会在Camera2ClientBase方法中构建。

      Camera2ClientBase(cameraService, remoteCallback, clientPackageName, clientFeatureId,
                  cameraId, /*API1 camera ID*/ -1, cameraFacing, sensorOrientation,
                  clientPid, clientUid, servicePid, overrideForPerfClass),
      mInputStream(),
      mStreamingRequestId(REQUEST_ID_NONE),
      mRequestIdCounter(0),
      mOverrideForPerfClass(overrideForPerfClass) {
  

接着CameraDeviceClient的initilaze方法

      //CameraDeivce的初始化方法就在这里,Hal层就是在这进入的
      res = Camera2ClientBase::initialize(providerPtr, monitorTags);
      if (res != OK) {
          return res;
      }
  
      String8 threadName;
      //创建了一个帧元数据处理线程
      mFrameProcessor = new FrameProcessorBase(mDevice);
      threadName = String8::format("CDU-%s-FrameProc", mCameraIdStr.string());
      mFrameProcessor->run(threadName.string());
      //开启线程并注册监听,暂时不知道是啥监听,后面分析
      mFrameProcessor->registerListener(camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MIN_ID,
                                        camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MAX_ID,
                                        /*listener*/this,
                                        /*sendPartials*/true);
      //获取Deviceinfo
      const CameraMetadata &deviceInfo = mDevice->info();
      camera_metadata_ro_entry_t physicalKeysEntry = deviceInfo.find(
              ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS);
      if (physicalKeysEntry.count > 0) {
          mSupportedPhysicalRequestKeys.insert(mSupportedPhysicalRequestKeys.begin(),
                  physicalKeysEntry.data.i32,
                  physicalKeysEntry.data.i32 + physicalKeysEntry.count);
      }

CameraClientBase会调用Camera3Device的initialize()方法。
该方法主要做了2件事:

1.openSession

      status_t res = manager->openSession(mId.string(), this,
              /*out*/ &session);

2.new RequestThread

      mRequestThread = new RequestThread(
            this, mStatusTracker, mInterface, sessionParamKeys, mUseHalBufManager);

先分析openSession,new RequestThread后面再分析

openSession 通过CameraProvider最终会进入到CameraDeviceImpl中执行open()函数和CreateSession(),open回去执行CameraModule的open,然后会依次执行SprdCamera3Factory.open->SprdCamera3HWI.open,SprdCameraEMIf.startCameraIfNecessary(),最后会走到cmr_oem的camera_init_internal,之后就是各种硬件的初始化

 ret = camera_sensor_init(oem_handle, is_autotest);
    if (ret) {
        CMR_LOGE("failed to init sensor %ld", ret);
        goto exit;
    }

    ret = camera_grab_init(oem_handle);
    if (ret) {
        CMR_LOGE("failed to init grab %ld", ret);
        goto sensor_deinit;
    }

    ret = camera_setting_init(oem_handle);
    if (ret) {
        CMR_LOGE("failed to init setting %ld", ret);
        goto grab_deinit;
    }

    ret = camera_res_init(oem_handle);
    if (ret) {
        CMR_LOGE("failed to init res %ld", ret);
        goto setting_deinit;
    }

    ret = camera_isp_init(oem_handle);
    if (ret) {
        CMR_LOGE("failed to init isp %ld", ret);
        goto res_deinit;
    }

打开相机大概就是这些,回过头来看openSession的地方

 struct camera_info info;
        res = mModule->getCameraInfo(mCameraIdInt, &info);
        if (res != OK) {
            ALOGE("%s: Could not open camera: getCameraInfo failed", __FUNCTION__);
            device->common.close(&device->common);
            mLock.unlock();
            _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
            return Void();
        }

        session = createSession(
                device, info.static_camera_characteristics, callback);
        if (session == nullptr) {
            ALOGE("%s: camera device session allocation failed", __FUNCTION__);
            mLock.unlock();
            _hidl_cb(Status::INTERNAL_ERROR, nullptr);
            return Void();
        }
        if (session->isInitFailed()) {
            ALOGE("%s: camera device session init failed", __FUNCTION__);
            session = nullptr;
            mLock.unlock();
            _hidl_cb(Status::INTERNAL_ERROR, nullptr);
            return Void();
        }
        mSession = session;

        IF_ALOGV() {
            session->getInterface()->interfaceChain([](
                ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {
                    ALOGV("Session interface chain:");
                    for (const auto& iface : interfaceChain) {
                        ALOGV("  %s", iface.c_str());
                    }
                });
        }

createSession()实际就是创建了一个CameraDeviceSession,看起来没什么特殊的。继续回溯到Camera3Device.cpp中
在成功创建session后,依次会创建3个对象 Camera3BufferManager,RequestThread,PreparerThread。
其中RequestThread是用于循环处理请求的的一个线程,PreparerThread线程尚未清楚是做什么的,后面一起分析。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值