Camera Framework 代碼分析
和你一起終身學(xué)習(xí),這里是程序員Android
通過(guò)閱讀本文您將收獲以下知識(shí)點(diǎn):
一、 Camera Framework 列文件目錄
二、 JNI 相關(guān)
三、 AIDL 相關(guān)
四、 IInterface 類(lèi)型文件
五、Parcelable 類(lèi)型文件
六、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 通過(guò) Binder 機(jī)制和 CameraService 通信。
API 2 中,直接在 CameraManager.java 中通過(guò) Binder 機(jī)制和 CameraService 通信。
三、 AIDL 相關(guān)
Framework Camera AIDL 是 Camera 中客戶(hù)端和服務(wù)端跨進(jìn)程通信時(shí)使用的 AIDL 文件,代碼都在frameworks/av/camera/目錄下,其中 aidl 文件一共有 16 個(gè)
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 文件有兩種類(lèi)型:
作為 Binder 中的 IInterface 跨進(jìn)程通信中能提供的方法
作為 Binder 中的 parcelable 跨進(jìn)程通信數(shù)據(jù)傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)
很容易從名字上區(qū)分這兩種類(lèi)型的文件,IInterface 類(lèi)型的文件都是以 I 開(kāi)頭的,比如:ICameraService.aidl, ICameraDeviceUser.aidl等。不管是哪種類(lèi)型的 aidl 文件,它們都會(huì)生成對(duì)應(yīng)的 .java, .h, .cpp 文件,分別供 Java 層和 CPP 層調(diào)用。
四、 IInterface 類(lèi)型文件
IInterface 類(lèi)型文件一共有 7 個(gè),它們的 .java, .h, .cpp 文件,絕大部分都是自動(dòng)生成的。
Java 文件是在?frameworks/base/Android.mk?中定義規(guī)則,在編譯時(shí)自動(dòng)生成:
//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/?目錄下生成對(duì)應(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?兩個(gè)文件是直接以代碼形式手動(dòng)實(shí)現(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 個(gè)?aidl?文件是在?frameworks/av/camera/Android.bp?中定義規(guī)則,編譯時(shí)自動(dòng)生成對(duì)應(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/?目錄下生成對(duì)應(yīng)的?.h, .cpp?文件,通常在該目錄下會(huì)同時(shí)生成 32 和 64 位兩套代碼,但實(shí)際兩份代碼是一樣的,這里選取 64 位的:
64 位:
android_arm64_armv8-a_shared_core32 位:
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 類(lèi)型文件
parcelable?類(lèi)型文件一共有 9 個(gè),它們都是手動(dòng)編寫(xiě)的代碼。
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?文件名稱(chēng)一一對(duì)應(yīng)的,而是在?aidl?文件中定義的,比如?CameraStatus.aidl?定義如下:
packageandroid.hardware;
/** @hide */
parcelable CameraStatus cpp_header "camera/CameraBase.h";
parcelable?類(lèi)型的?aidl?文件對(duì)應(yīng)的?.h, .cpp?文件目錄為?frameworks/av/camera?,對(duì)應(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)
分為客戶(hù)端向服務(wù)端的請(qǐng)求?ICameraService.aidl?和客戶(hù)端監(jiān)聽(tīng)服務(wù)端的變化?ICameraServiceListener.aidl?。這兩個(gè)?AIDL?是在?CameraService.cpp?中實(shí)現(xiàn)對(duì)應(yīng)功能的。
interface
{
??? ...
??? constintCAMERA_TYPE_BACKWARD_COMPATIBLE = 0;
??? constint CAMERA_TYPE_ALL= 1;
??? // 返回指定類(lèi)型的相機(jī)設(shè)備數(shù)量
??? intgetNumberOfCameras(int type);
??? // 根據(jù) id 返回當(dāng)前相機(jī)設(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)聽(tīng)
??? CameraStatus[] addListener(ICameraServiceListenerlistener);
??? voidremoveListener(ICameraServiceListenerlistener);
??? // 根據(jù) id 返回相機(jī)支持的屬性
??? 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;
??? // 相機(jī)設(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?層注冊(cè)的
interfaceICameraServiceProxy
{
??? // CameraService 向代理服務(wù)發(fā)送消息,通知用戶(hù)更新
??? 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ā)送消息,通知相機(jī)設(shè)備狀態(tài)更新
??? onewayvoidnotifyCameraState(String cameraId, int facing,
??????????? intnewCameraState, String clientName);
}
八、 ICamera 相關(guān)
Camera API1 才會(huì)使用到,分為 ICamera.aidl, ICameraClient.aidl
它們的代碼是手動(dòng)實(shí)現(xiàn)的,參考:CameraClient.h/cpp, Camera.h/cpp
九、ICameraDevice 相關(guān)
Camera API2 才會(huì)使用到,分為客戶(hù)端向服務(wù)端的請(qǐng)求 ICameraDeviceUser.aidl 和服務(wù)端發(fā)給客戶(hù)端的回調(diào) ICameraDeviceCallbacks.aidl 。
表示相機(jī)設(shè)備具備的能力,能夠提供的函數(shù);這兩個(gè) AIDL 是在 CameraDeviceClient 中實(shí)現(xiàn)對(duì)應(yīng)功能的
// 1.ICameraDeviceUser.aidl interfaceICameraDeviceUser
{
?? ?voiddisconnect();
??? constintNO_IN_FLIGHT_REPEATING_FRAMES = -1;
??? // 向設(shè)備提交捕獲請(qǐng)求
??? SubmitInfo submitRequest(inCaptureRequest request, boolean streaming);
??? SubmitInfo submitRequestList(inCaptureRequest[] requestList,
??????? boolean streaming);
??? // 取消置頂 id 的重復(fù)請(qǐng)求,并返回上次請(qǐng)求的幀 id
??? longcancelRequest(intrequestId);
??? constintNORMAL_MODE = 0;
??? constintCONSTRAINED_HIGH_SPEED_MODE = 1;
??? constintVENDOR_MODE_START = 0x8000;
??? // 在流處理前執(zhí)行配置請(qǐng)求
??? 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)建默認(rèn)請(qǐng)求,返回相機(jī)參數(shù)信息
??? CameraMetadataNative createDefaultRequest(inttemplateId);
??? // 獲取相機(jī)參數(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);
??? // 重復(fù)請(qǐng)求引起的錯(cuò)誤回調(diào)
??? oneway voidonRepeatingRequestError(in longlastFrameNumber,
???????????????????????????????????????in intrepeatingRequestId);
??? oneway voidonRequestQueueEmpty();
}
十、Services 目錄下的文件介紹
frameworks/av/services/camera/libcameraservice?AOSP 中這個(gè)目錄下是 87 個(gè)文件,而 Qcom 的基線中增加了 27 個(gè)文件,分別為 api1/qticlient2 目錄下的 25 個(gè)文件,以及 QTICamera2Client.cpp, QTICamera2Client.h 兩個(gè)文件。
.
├—— 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 客戶(hù)端調(diào)用服務(wù)端方法時(shí),Camera API1/2 接口對(duì)應(yīng)功能都是在 CameraService 中實(shí)現(xiàn)的,而這里的 API1/2 目錄對(duì)應(yīng)的就是對(duì)上層不同版本接口的處理
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 有三個(gè)重要的子類(lèi):
CameraClient
如果平臺(tái)僅支持 HAL 1,即 CAMERA_DEVICE_API_VERSION_1_0 ;使用 API 1/2 + HAL 1 都會(huì)對(duì)應(yīng)該客戶(hù)端。Camera2Client
如果平臺(tái)支持 HAL 3 ,即 CAMERA_DEVICE_API_VERSION_3_0 及以上版本;使用 API 1 + HAL 3 對(duì)應(yīng)的客戶(hù)端。Camera2Client 會(huì)將 API1 中的接口轉(zhuǎn)換為 API2 中對(duì)應(yīng)的功能。CameraDeviceClient
如果平臺(tái)支持 HAL 3 ,使用 API 2 + HAL 3 對(duì)應(yīng)的客戶(hù)端。
平臺(tái)僅支持 HAL 1 時(shí),API 2 在 openCamera 時(shí),通過(guò) CameraDeviceUserShim 將 API 2 轉(zhuǎn)換為 API 1 ,即 HAL 1 + API 1 向下發(fā)起請(qǐng)求。
LegacyCameraDevice 會(huì)將 CAMERA API2 轉(zhuǎn)換為 CAMERA API1 ,而 CameraDeviceUserShim 封裝了 LegacyCameraDevice 。
十二、 QTICamera2Client
Qcom 的基線中增加了 27 個(gè)文件,分別為 api1/qticlient2 目錄下的 25 個(gè)文件,以及 QTICamera2Client.cpp, QTICamera2Client.h 兩個(gè)文件。
而 QTICamera2Client 是高通針對(duì) API1 做的優(yōu)化?在什么情況下會(huì)轉(zhuǎn)換為 QTICamera2Client 呢?看如下源碼
classCamera2Client :
??????? publicCamera2ClientBase
{
#endif
...
??? sp
...
??? sp
...
}
// 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 是高通對(duì) API 1 中 Camera2Client 做的一層封裝,添加了部分功能,主要是向上提供 raw 數(shù)據(jù)。
// 1. QTICamera2Client.hclassQTICamera2Client: publicvirtual RefBase{
private:
??? wp
???
public:
???QTICamera2Client(sp
??? ~QTICamera2Client();
??? ...
}
QTICamera2Client::QTICamera2Client(sp
??????? mParentClient(client) {
}
十三、 device1/device3
device1/device3 可以理解為 Framework 層對(duì)應(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?的連接過(guò)程
// API1: CameraClient.h
sp
sp
API1/3/device3/HAL3?的連接過(guò)程
// API1: Camera2Client.hclassCamera2Client :
??? publicCamera2ClientBase
??? publicCamera2ClientBase
???
//Camera2ClientBase.h
sp
Camera2ClientBase
???
???
???
??? 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 都是對(duì)應(yīng)的 Camera3Device
??? mDevice = newCamera3Device(cameraId);
??? ...
}
從源碼可以看出,不管是 API1/2 ,只要是 HAL 3 ,Camera2Client, CameraDeviceClient 兩個(gè)客戶(hù)端對(duì)應(yīng)的都是 device3: Camera3Device 。
Camera3Device::HalInterface 內(nèi)部類(lèi),用于和 HAL 層通信,實(shí)現(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開(kāi)發(fā)干貨分享
至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺(jué)得很優(yōu)秀,如有侵權(quán),懇請(qǐng)聯(lián)系小編刪除,歡迎您的建議與指正。同時(shí)期待您的關(guān)注,感謝您的閱讀,謝謝!
點(diǎn)個(gè)在看,方便您使用時(shí)快速查看!
