<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Camera Framework 架構(gòu)了解下

          共 19021字,需瀏覽 39分鐘

           ·

          2020-08-24 17:37

          和你一起終身學習,這里是程序員Android

          通過閱讀本文您將收獲以下知識點:

          一、 Camera Framework 列文件目錄
          二、 JNI 相關(guān)
          三、 AIDL 相關(guān)
          四、 IInterface 類型文件
          五、Parcelable 類型文件
          六、ICameraService 相關(guān)
          七、 ICameraServiceProxy.aidl 文件
          八、 ICamera 相關(guān)
          九、 ICameraDevice 相關(guān)
          十、 Services 目錄下的文件介紹
          十一、API1/API2
          十二、QTICamera2Client
          十三、Device1/Device3

          一、 Camera Framework 列文件目錄

          1.API1:(frameworks/base/core/java/android/hardware/Camera.java)
          2.API2:(frameworks/base/core/java/android/hardware/camera2/)
          3.JNI:?(frameworks/base/core/jni/)
          4.AIDL:( frameworks/av/camera/aidl/)
          5.Native:?(frameworks/av/camera/)
          6.Service:?(frameworks/av/services/camera/libcameraservice/)
          7.Qcom Hal:?(vendor/qcom/propietary/camx/)
          8.Qcom Kernel:(kernel/msm-4.19/techpack/camera/)

          二、 JNI 相關(guān)

          主目錄為?frameworks/base/core/jni

          //frameworks/base/core/jni
          ./android_hardware_camera2_legacy_LegacyCameraDevice.cpp
          ./android_hardware_Camera.cpp
          ./android/graphics/Camera.cpp
          ./
          include/android_runtime/android_hardware_camera2_CameraMetadata.h
          ./android_hardware_camera2_DngCreator.cpp
          ./android_hardware_camera2_CameraMetadata.cpp
          ./android_hardware_camera2_legacy_PerfMeasurement.cpp

          API 1 中,使用 jni 通過 Binder 機制和 CameraService 通信。

          API 2 中,直接在 CameraManager.java 中通過 Binder 機制和 CameraService 通信。

          三、 AIDL 相關(guān)

          Framework Camera AIDL 是 Camera 中客戶端和服務(wù)端跨進程通信時使用的 AIDL 文件,代碼都在frameworks/av/camera/目錄下,其中 aidl 文件一共有 16 個

          xmt@server005:~/frameworks/av/camera/aidl/android/hardware$ tree
          .
          ├—— camera2
          │?? ├—— CaptureRequest.aidl
          │?? ├—— ICameraDeviceCallbacks.aidl
          │?? ├—— ICameraDeviceUser.aidl
          │?? ├—— impl
          │?? │??├—— CameraMetadataNative.aidl
          │?? │??└—— CaptureResultExtras.aidl
          │?? ├—— params
          │?? │??├—— OutputConfiguration.aidl
          │?? │??├—— VendorTagDescriptor.aidl
          │?? │??└—— VendorTagDescriptorCache.aidl
          │?? └—— utils
          │?????? └—— SubmitInfo.aidl
          ├—— CameraInfo.aidl
          ├—— CameraStatus.aidl
          ├—— ICamera.aidl
          ├—— ICameraClient.aidl
          ├—— ICameraService.aidl
          ├—— ICameraServiceListener.aidl
          └—— ICameraServiceProxy.aidl

          4directories,?16?files

          frameworks/av/camera/aidl/目錄下的 aidl 文件有兩種類型:

          • 作為 Binder 中的 IInterface 跨進程通信中能提供的方法

          • 作為 Binder 中的 parcelable 跨進程通信數(shù)據(jù)傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)

          很容易從名字上區(qū)分這兩種類型的文件,IInterface 類型的文件都是以 I 開頭的,比如:ICameraService.aidl, ICameraDeviceUser.aidl等。不管是哪種類型的 aidl 文件,它們都會生成對應(yīng)的 .java, .h, .cpp 文件,分別供 Java 層和 CPP 層調(diào)用。

          四、 IInterface 類型文件

          IInterface 類型文件一共有 7 個,它們的 .java, .h, .cpp 文件,絕大部分都是自動生成的。

          Java 文件是在?frameworks/base/Android.mk?中定義規(guī)則,在編譯時自動生成:

          //frameworks/base/Android.mk
          LOCAL_SRC_FILES +=?
          ??? ...
          ???../av/camera/aidl/android/hardware/ICameraService.aidl?
          ???../av/camera/aidl/android/hardware/ICameraServiceListener.aidl?
          ???../av/camera/aidl/android/hardware/ICameraServiceProxy.aidl?
          ???../av/camera/aidl/android/hardware/ICamera.aidl?
          ??? ../av/camera/aidl/android/hardware/ICameraClient.aidl
          ???../av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl?
          ???../av/camera/aidl/android/hardware/camera2/ICameraDeviceCallbacks.aidl?
          ??? ...
          ?...

          在?out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/dotdot/?目錄下生成對應(yīng)的?Java?文件:

          //out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/dotdot/
          av/camera/aidl/android/hardware/ICameraService.java
          av/camera/aidl/android/hardware/ICameraServiceListener.java
          av/camera/aidl/android/hardware/ICameraServiceProxy.java
          av/camera/aidl/android/hardware/ICamera.java
          av/camera/aidl/android/hardware/ICameraClient.java
          av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.java
          av/camera/aidl/android/hardware/camera2/ICameraDeviceCallbacks.java

          .h, .cpp?文件中,ICamera.aidl, ICameraClient.aidl?兩個文件是直接以代碼形式手動實現(xiàn)的:

          // 1. ICameraClient.aidl
          frameworks/av/camera/aidl/android/hardware/ICameraClient.aidl
          frameworks/av/camera/
          include/camera/android/hardware/ICameraClient.h
          frameworks/av/camera/ICameraClient.cpp

          // 2.ICamera.aidl
          frameworks/av/camera/aidl/android/hardware/ICamera.aidl
          frameworks/av/camera/
          include/camera/android/hardware/ICamera.h
          frameworks/av/camera/ICamera.cpp

          其他 5 個?aidl?文件是在?frameworks/av/camera/Android.bp?中定義規(guī)則,編譯時自動生成對應(yīng)的?.h, .cpp?文件:

          //frameworks/av/camera/Android.bp
          cc_library_shared {
          ??? name:?
          "libcamera_client",

          ??? aidl: {
          ??????? export_aidl_headers:?
          true,
          ??????? local_include_dirs: [
          "aidl"],
          ??????? include_dirs: [
          ????????????
          "frameworks/native/aidl/gui",
          ??????? ],
          ??? },

          ??? srcs: [
          ????????
          // AIDL files for camerainterfaces
          ????????
          // The headers for theseinterfaces will be?
          ????????
          // available to anymodules that
          ????????
          // include libcamera_client,at the path "aidl/package/path/BnFoo.h"
          ????????
          "aidl/android/hardware/ICameraService.aidl",
          ????????
          "aidl/android/hardware/ICameraServiceListener.aidl",
          ????????
          "aidl/android/hardware/ICameraServiceProxy.aidl",
          ????????
          "aidl/android/hardware/camera2/ICameraDeviceCallbacks.aidl",
          ????????
          "aidl/android/hardware/camera2/ICameraDeviceUser.aidl",


          ????????
          // Source for camerainterface parcelables,?
          ????????
          // and manually-writteninterfaces
          ????????
          "Camera.cpp",
          ????????
          "CameraMetadata.cpp",
          ????????
          "CameraParameters.cpp",
          ??????? ...
          }

          在?out/soong/.intermediates/frameworks/av/camera/libcamera_client/?目錄下生成對應(yīng)的?.h, .cpp?文件,通常在該目錄下會同時生成 32 和 64 位兩套代碼,但實際兩份代碼是一樣的,這里選取 64 位的:

          • 64 位:android_arm64_armv8-a_shared_core

          • 32 位:android_arm_armv7-a-neon_cortex-a53_shared_core

          //?目錄out/soong/.intermediates/frameworks/av/camera/libcamera_client// 64??android_arm64_armv8-a_shared_core/gen/aidl/
          android/hardware/ICameraService.h
          android/hardware/BnCameraService.h
          frameworks/av/camera/aidl/android/hardware/ICameraService.cpp

          android/hardware/ICameraServiceListener.h
          android/hardware/BnCameraServiceListener.h
          frameworks/av/camera/aidl/android/hardware/ICameraServiceListener.cpp

          android/hardware/ICameraServiceProxy.h
          android/hardware/BnCameraServiceProxy.h
          frameworks/av/camera/aidl/android/hardware/ICameraServiceProxy.cpp

          android/hardware/camera2/ICameraDeviceUser.h
          android/hardware/camera2/BnCameraDeviceUser.h
          frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.cpp

          android/hardware/camera2/ICameraDeviceCallbacks.h
          android/hardware/camera2/BnCameraDeviceCallbacks.h
          frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceCallbacks.cpp

          五、 parcelable 類型文件

          parcelable?類型文件一共有 9 個,它們都是手動編寫的代碼。

          Java?文件目錄為?frameworks/base/core/java/android/hardware/?:

          //frameworks/base/core/java/android/hardware/
          camera2/CaptureRequest.java
          camera2/impl/CameraMetadataNative.java
          camera2/impl/CaptureResultExtras.java
          camera2/params/OutputConfiguration.java
          camera2/params/VendorTagDescriptor.java
          camera2/params/VendorTagDescriptorCache.java
          camera2/utils/SubmitInfo.java
          CameraInfo.java
          CameraStatus.java

          .h, .cpp?文件并不一定是和?aidl?文件名稱一一對應(yīng)的,而是在?aidl?文件中定義的,比如?CameraStatus.aidl?定義如下:

          packageandroid.hardware;

          /**?@hide?*/
          parcelable CameraStatus cpp_header?
          "camera/CameraBase.h";

          parcelable?類型的?aidl?文件對應(yīng)的?.h, .cpp?文件目錄為?frameworks/av/camera?,對應(yīng)關(guān)系整理如下:

          // .h, .cpp?文件目錄?frameworks/av/camera//CaptureRequest.aidlinclude/camera/camera2/CaptureRequest.h
          camera2/CaptureRequest.cpp

          //CameraMetadataNative.aidlinclude/camera/CameraMetadata.h
          CameraMetadata.cpp

          //CaptureResultExtras.aidlinclude/camera/CaptureResult.h
          CaptureResult.cpp

          //OutputConfiguration.aidlinclude/camera/camera2/OutputConfiguration.h
          camera2/OutputConfiguration.cpp

          //VendorTagDescriptor.aidl?VendorTagDescriptorCache.aidlinclude/camera/VendorTagDescriptor.h
          VendorTagDescriptor.cpp

          //SubmitInfo.aidlinclude/camera/camera2/SubmitInfo.h
          camera2/SubmitInfo.cpp

          //CameraInfo.aidl??CameraStatus.aidlinclude/camera/CameraBase.h
          CameraBase.cpp

          六、ICameraService 相關(guān)

          分為客戶端向服務(wù)端的請求?ICameraService.aidl?和客戶端監(jiān)聽服務(wù)端的變化?ICameraServiceListener.aidl?。這兩個?AIDL?是在?CameraService.cpp?中實現(xiàn)對應(yīng)功能的。

          interface?
          {
          ??? ...
          ????
          constintCAMERA_TYPE_BACKWARD_COMPATIBLE =?0;
          ????
          constint?CAMERA_TYPE_ALL=?1;

          ????
          //?返回指定類型的相機設(shè)備數(shù)量
          ????
          intgetNumberOfCameras(int?type);
          ????
          //?根據(jù)?id?返回當前相機設(shè)備信息
          ??? CameraInfo?
          getCameraInfo(intcameraId);

          ??? ...
          ????
          constintCAMERA_HAL_API_VERSION_UNSPECIFIED = -1;
          ????
          // api1 + hal1
          ??? ICamera?
          connect(ICameraClientclient,
          ????????????
          int?cameraId,
          ??????????? String opPackageName,
          ????????????
          intclientUid,?intclientPid);

          ????
          // api2 + hal3
          ??? ICameraDeviceUser?
          connectDevice(ICameraDeviceCallbackscallbacks,
          ??????????? String cameraId,
          ??????????? String opPackageName,
          ????????????
          intclientUid);

          ????
          // api1 +?指定?hal?版本(通常為?hal1
          ??? ICamera?
          connectLegacy(ICameraClientclient,
          ????????????
          int?cameraId,
          ????????????
          inthalVersion,
          ??????????? String opPackageName,
          ????????????
          intclientUid);

          ????
          //?添加和移除?ICameraServiceListener?監(jiān)聽
          ??? CameraStatus[] addListener(ICameraServiceListenerlistener);
          ????
          voidremoveListener(ICameraServiceListenerlistener);

          ????
          //?根據(jù)?id?返回相機支持的屬性
          ??? CameraMetadataNative?
          getCameraCharacteristics(StringcameraId);

          ????
          //?獲取?vendor tag?
          ??? VendorTagDescriptor?
          getCameraVendorTagDescriptor();
          ??? VendorTagDescriptorCache?
          getCameraVendorTagCache();

          ????
          // camera api 1?獲取參數(shù)信息
          ??? String?
          getLegacyParameters(intcameraId);

          ????
          constintAPI_VERSION_1 =?1;
          ????
          constintAPI_VERSION_2 =?2;
          ????
          //?指定?id?支持的?API?版本
          ????
          booleansupportsCameraApi(StringcameraId,?intapiVersion);
          ????
          //?指定?id?設(shè)置手電筒模式
          ????
          voidsetTorchMode(StringcameraId,?boolean?enabled,?
          ??????? IBinder clientBinder);

          ????
          //?服務(wù)端向系統(tǒng)打印系統(tǒng)消息
          ????
          constintEVENT_NONE =?0;
          ????
          constintEVENT_USER_SWITCHED =?1;
          ??? oneway?
          voidnotifySystemEvent(int?eventId,in?int[] args);
          }

          // 2.ICameraServiceListener.aidlinterfaceICameraServiceListener
          {
          ????
          constintSTATUS_NOT_PRESENT????? =?0;
          ????
          constintSTATUS_PRESENT????????? =?1;
          ????
          constintSTATUS_ENUMERATING????? =?2;
          ????
          constintSTATUS_NOT_AVAILABLE??? = -2;
          ????
          constintSTATUS_UNKNOWN????????? = -1;
          ????
          //?相機設(shè)備狀態(tài)變化事件
          ??? oneway?
          voidonStatusChanged(int?status,String cameraId);

          ????
          constintTORCH_STATUS_NOT_AVAILABLE =?0;
          ????
          constintTORCH_STATUS_AVAILABLE_OFF =?1;
          ????
          constintTORCH_STATUS_AVAILABLE_ON? =?2;
          ????
          constintTORCH_STATUS_UNKNOWN = -1;
          ????
          //?手電筒狀態(tài)變化事件
          ??? oneway?
          voidonTorchStatusChanged(int?status,String cameraId);
          }

          七、 ICameraServiceProxy.aidl 文件

          CameraServiceProxy?服務(wù)是在?Java?層注冊的

          interfaceICameraServiceProxy
          {
          ????
          // CameraService?向代理服務(wù)發(fā)送消息,通知用戶更新
          ????
          onewayvoidpingForUserUpdate();

          ????
          constintCAMERA_STATE_OPEN?=?0;
          ????
          constintCAMERA_STATE_ACTIVE?=?1;
          ????
          constintCAMERA_STATE_IDLE?=?2;
          ????
          constintCAMERA_STATE_CLOSED?=?3;
          ????
          constintCAMERA_FACING_BACK?=?0;
          ????
          constintCAMERA_FACING_FRONT?=?1;
          ????
          constintCAMERA_FACING_EXTERNAL?=?2;

          ????
          // CameraService?向代理服務(wù)發(fā)送消息,通知相機設(shè)備狀態(tài)更新
          ????
          onewayvoidnotifyCameraState(String cameraId,?int?facing,?
          ????????????
          intnewCameraState, String clientName);
          }

          八、 ICamera 相關(guān)

          Camera API1 才會使用到,分為 ICamera.aidl, ICameraClient.aidl
          它們的代碼是手動實現(xiàn)的,參考:CameraClient.h/cpp, Camera.h/cpp

          九、ICameraDevice 相關(guān)

          Camera API2 才會使用到,分為客戶端向服務(wù)端的請求 ICameraDeviceUser.aidl 和服務(wù)端發(fā)給客戶端的回調(diào) ICameraDeviceCallbacks.aidl 。
          表示相機設(shè)備具備的能力,能夠提供的函數(shù);這兩個 AIDL 是在 CameraDeviceClient 中實現(xiàn)對應(yīng)功能的

          // 1.ICameraDeviceUser.aidl?interfaceICameraDeviceUser
          {
          ?? ?
          voiddisconnect();

          ????
          constintNO_IN_FLIGHT_REPEATING_FRAMES = -1;
          ????
          //?向設(shè)備提交捕獲請求
          ??? SubmitInfo?
          submitRequest(inCaptureRequest request,?boolean?streaming);
          ??? SubmitInfo?
          submitRequestList(inCaptureRequest[] requestList,?
          ????????
          boolean?streaming);
          ????
          //?取消置頂?id?的重復請求,并返回上次請求的幀?id
          ????
          longcancelRequest(intrequestId);

          ????
          constintNORMAL_MODE =?0;
          ????
          constintCONSTRAINED_HIGH_SPEED_MODE =?1;
          ????
          constintVENDOR_MODE_START =?0x8000;

          ????
          //?在流處理前執(zhí)行配置請求
          ????
          voidbeginConfigure();
          ????
          //?根據(jù)指定輸出配置,創(chuàng)建流
          ????
          intcreateStream(inOutputConfiguration outputConfiguration);
          ????
          voidendConfigure(intoperatingMode);
          ????
          voiddeleteStream(intstreamId);

          ????
          //?創(chuàng)建輸入流,返回流?id
          ????
          intcreateInputStream(int?width,?int?height,?int?format);
          ????
          //?返回輸入流的?Surface
          ??? Surface?
          getInputSurface();

          ????
          // Keep in sync withpublic API in
          ????
          //frameworks/base/core/java/android/hardware/camera2/CameraDevice.java
          ????
          constintTEMPLATE_PREVIEW =?1;
          ????
          constintTEMPLATE_STILL_CAPTURE =?2;
          ????
          constintTEMPLATE_RECORD =?3;
          ????
          constintTEMPLATE_VIDEO_SNAPSHOT =?4;
          ????
          constintTEMPLATE_ZERO_SHUTTER_LAG =?5;
          ????
          constintTEMPLATE_MANUAL =?6;
          ????
          //?根據(jù)模板創(chuàng)建默認請求,返回相機參數(shù)信息
          ??? CameraMetadataNative?
          createDefaultRequest(inttemplateId);
          ????
          //?獲取相機參數(shù)信息
          ??? CameraMetadataNative?
          getCameraInfo();
          ????
          voidwaitUntilIdle();
          ????
          longflush();
          ????
          voidprepare(intstreamId);
          ????
          voidtearDown(intstreamId);
          ????
          voidprepare2(int?maxCount,intstreamId);
          ????
          voidfinalizeOutputConfigurations(int?streamId,
          ??????? in OutputConfigurationoutputConfiguration);
          }

          // 2.ICameraDeviceCallbacks.aidlinterfaceICameraDeviceCallbacks
          {
          ??? ...
          ??? oneway?
          voidonDeviceError(interrorCode,?
          ??????? in CaptureResultExtrasresultExtras);
          ??? oneway?
          voidonDeviceIdle();
          ??? oneway?
          voidonCaptureStarted(inCaptureResultExtras resultExtras,?
          ????????
          longtimestamp);
          ??? oneway?
          voidonResultReceived(inCameraMetadataNative result,
          ???????????????????????????????? inCaptureResultExtras resultExtras);
          ??? oneway?
          voidonPrepared(intstreamId);
          ????
          //?重復請求引起的錯誤回調(diào)
          ??? oneway?
          voidonRepeatingRequestError(in?longlastFrameNumber,
          ???????????????????????????????????????in?
          intrepeatingRequestId);
          ??? oneway?
          voidonRequestQueueEmpty();
          }

          十、Services 目錄下的文件介紹

          frameworks/av/services/camera/libcameraservice?AOSP 中這個目錄下是 87 個文件,而 Qcom 的基線中增加了 27 個文件,分別為 api1/qticlient2 目錄下的 25 個文件,以及 QTICamera2Client.cpp, QTICamera2Client.h 兩個文件。

          .
          ├——?
          Android.mk
          ├——?
          api1
          │?? ├——?
          client2
          │?? └——?
          qticlient2
          ├——?
          api2
          ├——?
          CameraFlashlight.cpp
          ├——?
          CameraFlashlight.h
          ├——?
          CameraService.cpp
          ├——?
          CameraService.h
          ├——?
          common
          ├——?
          device1
          ├——?
          device3
          ├——?
          gui
          ├——?
          MODULE_LICENSE_APACHE2
          ├——?
          NOTICE
          ├——?
          tests
          └——?
          utils

          從目錄結(jié)構(gòu)上可以看出,API1/2?和?HAL1/3?就是在這一層體現(xiàn)的。

          十一、 API1/API2

          APP Java 客戶端調(diào)用服務(wù)端方法時,Camera API1/2 接口對應(yīng)功能都是在 CameraService 中實現(xiàn)的,而這里的 API1/2 目錄對應(yīng)的就是對上層不同版本接口的處理

          api1
          ├——?
          Camera2Client.cpp
          ├——?
          Camera2Client.h
          ├——?
          CameraClient.cpp
          ├——?
          CameraClient.h
          ├——?
          client2
          │?? ├——?
          CallbackProcessor.cpp
          │?? ├——?
          CallbackProcessor.h
          │?? ├——?
          Camera2Heap.h
          │?? ├——?
          CaptureSequencer.cpp
          │?? ├——?
          CaptureSequencer.h
          │ ??├——?
          FrameProcessor.cpp
          │?? ├——?
          FrameProcessor.h
          │?? ├——?
          JpegCompressor.cpp
          │?? ├——?
          JpegCompressor.h
          │?? ├——?
          JpegProcessor.cpp
          │?? ├——?
          JpegProcessor.h
          │?? ├——?
          Parameters.cpp
          │?? ├——?
          Parameters.h
          │?? ├——?
          StreamingProcessor.cpp
          │?? ├——?
          StreamingProcessor.h
          │?? ├——?
          ZslProcessor.cpp
          │?? └——?
          ZslProcessor.h
          ├——?
          QTICamera2Client.cpp
          ├——?
          QTICamera2Client.h
          └——?
          qticlient2
          ??? ├——?
          CallbackProcessor.cpp
          ??? ├——?
          CallbackProcessor.h
          ??? ├——?
          Camera2Heap.h
          ??? ├——?
          CaptureSequencer.cpp
          ??? ├——?
          CaptureSequencer.h
          ??? ├——?
          FrameProcessor.cpp
          ??? ├——?
          FrameProcessor.h
          ??? ├——?
          JpegCompressor.cpp
          ??? ├——?
          JpegCompressor.h
          ??? ├——?
          JpegProcessor.cpp
          ??? ├——?
          JpegProcessor.h
          ??? ├——?
          Parameters.cpp
          ??? ├——?
          Parameters.h
          ??? ├——?
          QTICaptureSequencer.cpp
          ??? ├——?
          QTICaptureSequencer.h
          ??? ├——?
          QTIFrameProcessor.cpp
          ??? ├——?
          QTIFrameProcessor.h
          ??? ├——?
          QTIParameters.cpp
          ??? ├——?
          QTIParameters.h
          ??? ├——?
          RawProcessor.cpp
          ??? ├——?
          RawProcessor.h
          ??? ├——?
          StreamingProcessor.cpp
          ??? ├——?
          StreamingProcessor.h
          ??? ├——?
          ZslProcessor.cpp
          ??? └——?
          ZslProcessor.hapi2
          ├——?
          CameraDeviceClient.cpp
          └——?
          CameraDeviceClient.h


          BasicClient 有三個重要的子類:

          • CameraClient
            如果平臺僅支持 HAL 1,即 CAMERA_DEVICE_API_VERSION_1_0 ;使用 API 1/2 + HAL 1 都會對應(yīng)該客戶端。

          • Camera2Client
            如果平臺支持 HAL 3 ,即 CAMERA_DEVICE_API_VERSION_3_0 及以上版本;使用 API 1 + HAL 3 對應(yīng)的客戶端。Camera2Client 會將 API1 中的接口轉(zhuǎn)換為 API2 中對應(yīng)的功能。

          • CameraDeviceClient
            如果平臺支持 HAL 3 ,使用 API 2 + HAL 3 對應(yīng)的客戶端。
            平臺僅支持 HAL 1 時,API 2 在 openCamera 時,通過 CameraDeviceUserShim 將 API 2 轉(zhuǎn)換為 API 1 ,即 HAL 1 + API 1 向下發(fā)起請求。
            LegacyCameraDevice 會將 CAMERA API2 轉(zhuǎn)換為 CAMERA API1 ,而 CameraDeviceUserShim 封裝了 LegacyCameraDevice 。

          十二、 QTICamera2Client

          Qcom 的基線中增加了 27 個文件,分別為 api1/qticlient2 目錄下的 25 個文件,以及 QTICamera2Client.cpp, QTICamera2Client.h 兩個文件。
          而 QTICamera2Client 是高通針對 API1 做的優(yōu)化?在什么情況下會轉(zhuǎn)換為 QTICamera2Client 呢?看如下源碼

          classCamera2Client?:
          ????????
          publicCamera2ClientBase
          {

          friendclassQTICamera2Client;
          #endif
          ...

          ??? spmRawProcessor;
          #endif
          ...

          ??? spmQTICamera2Client;
          #endif
          ...
          }

          // 2.Camera2Client.cpptemplate<typenameTProviderPtr>
          status_tCamera2Client::initializeImpl(TProviderPtr providerPtr)
          {
          ...

          ??? mQTICamera2Client =?
          newQTICamera2Client(this);
          #endif
          ...

          ??? mRawProcessor =?
          newRawProcessor(this,mCaptureSequencer);
          ??? threadName = String8::format(
          "C2-%d-RawProc",mCameraId);
          ??? mRawProcessor->run(threadName.
          string());
          #endif
          ...
          }

          QTICamera2Client 是高通對 API 1 中 Camera2Client 做的一層封裝,添加了部分功能,主要是向上提供 raw 數(shù)據(jù)。

          // 1. QTICamera2Client.hclassQTICamera2Client:?publicvirtual?RefBase{
          private:
          ??? wpmParentClient;
          ????
          status_tstopPreviewExtn();

          public:
          ???QTICamera2Client(sp client);
          ??? ~QTICamera2Client();
          ??? ...
          }

          // 2.QTICamera2Client.cpp
          QTICamera2Client::QTICamera2Client(sp client):
          ??????? mParentClient(client) {
          }

          十三、 device1/device3

          device1/device3 可以理解為 Framework 層對應(yīng) HAL 層的 HAL 1/3 。

          device1
          ├——?
          CameraHardwareInterface.cpp
          └——?
          CameraHardwareInterface.hdevice3
          ├——?
          Camera3BufferManager.cpp
          ├——?
          Camera3BufferManager.h
          ├——?
          Camera3Device.cpp
          ├——?
          Camera3Device.h
          ├——?
          Camera3DummyStream.cpp
          ├——?
          Camera3DummyStream.h
          ├——?
          Camera3InputStream.cpp
          ├——?
          Camera3InputStream.h
          ├——?
          Camera3IOStreamBase.cpp
          ├——?
          Camera3IOStreamBase.h
          ├——?
          Camera3OutputStream.cpp
          ├——?
          Camera3OutputStream.h
          ├——?
          Camera3OutputStreamInterface.h
          ├——?
          Camera3SharedOutputStream.cpp
          ├——?
          Camera3SharedOutputStream.h
          ├——?
          Camera3StreamBufferFreedListener.h
          ├——?
          Camera3StreamBufferListener.h
          ├——?
          Camera3Stream.cpp
          ├——?
          Camera3Stream.h
          ├——?
          Camera3StreamInterface.h
          ├——?
          Camera3StreamSplitter.cpp
          ├——?
          Camera3StreamSplitter.h
          ├——?
          StatusTracker.cpp
          └——?
          StatusTracker.h

          • API1/device1/HAL1?的連接過程

          // API1: CameraClient.h
          sp????mHardware;
          //device1: CameraHardwareInterface.h
          sp mHidlDevice;
          //?這里的?ICameraDevice?即為?HAL1API1 的客戶端 CameraClient 對應(yīng)的 device1: CameraHardwareInterface,而它直接包含了 HAL1 中 ICameraDevice

          • API1/3/device3/HAL3?的連接過程

          // API1: Camera2Client.hclassCamera2Client?:
          ????
          publicCamera2ClientBase{...}

          // API2:CameraDeviceClient.hclassCameraDeviceClient?:
          ????
          publicCamera2ClientBase,
          ????
          publiccamera2::FrameProcessorBase::FilteredListener{...}

          //Camera2ClientBase.h
          sp? mDevice;

          //Camera2ClientBase.cpptemplate?<typenameTClientBase>
          Camera2ClientBase::Camera2ClientBase(
          ????
          constsp& cameraService,
          ????
          constsp& remoteCallback,
          ????
          constString16& clientPackageName,
          ????
          constString8& cameraId,
          ????
          intcameraFacing,
          ????
          intclientPid,
          ????
          uid_tclientUid,
          ????
          intservicePid):
          ??? TClientBase(cameraService,remoteCallback, clientPackageName,
          ??????????? cameraId, cameraFacing,clientPid, clientUid, servicePid),
          ???mSharedCameraCallbacks(remoteCallback),
          ???mDeviceVersion(cameraService->getDeviceVersion(
          ??????????? TClientBase::mCameraIdStr)),
          ??? mDeviceActive(
          false)
          {
          ??? ...
          ??? mInitialClientPid = clientPid;
          ????
          //?只要是?HAL3?,則?device?都是對應(yīng)的?Camera3Device
          ??? mDevice =?
          newCamera3Device(cameraId);
          ??? ...
          }

          從源碼可以看出,不管是 API1/2 ,只要是 HAL 3 ,Camera2Client, CameraDeviceClient 兩個客戶端對應(yīng)的都是 device3: Camera3Device 。

          Camera3Device::HalInterface 內(nèi)部類,用于和 HAL 層通信,實現(xiàn)了 HAL 層 ICameraDeviceSession.hal 部分代碼:

          // Camera3Device.hclassCamera3Device?:
          ??? ...
          ????
          classHalInterface?:?publiccamera3::Camera3StreamBufferFreedListener {
          ??????
          public:
          ??????? ...
          ????????
          // Calls into the HALinterface

          ????????
          // Caller takes ownershipof requestTemplate
          ????????
          status_tconstructDefaultRequestSettings(
          ????????????????
          camera3_request_template_ttemplateId,
          ????????????????
          /*out*/camera_metadata_t**requestTemplate);
          ????????
          status_tconfigureStreams(
          ????????????
          /*inout*/camera3_stream_configuration *config);
          ????????
          status_tprocessCaptureRequest(camera3_capture_request_t*request);
          ????????
          status_t?flush();
          ????????
          status_t?close();
          ??????? ...
          ??? }
          ??? ...
          }

          ?原文鏈接:https://www.dazhuanlan.com/2019/10/16/5da68019bdbe3/

          相關(guān)文章友情推薦?

          1. Android開發(fā)干貨分享

          至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,如有侵權(quán),懇請聯(lián)系小編刪除,歡迎您的建議與指正。同時期待您的關(guān)注,感謝您的閱讀,謝謝!

          點個在看,方便您使用時快速查看!


          瀏覽 70
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆熟妇乱妇熟色A片在线看 | 国产九九九在线观看 | 男女拍拍的视频 | 欧美手机精品在线 | 日韩黄色A片吋影 |