Camera Framework 架構(gòu)了解下
和你一起終身學習,這里是程序員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_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 類型文件
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
{
#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 是高通對 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 層對應(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
sp
API1/3/device3/HAL3?的連接過程
// 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?都是對應(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)注,感謝您的閱讀,謝謝!
點個在看,方便您使用時快速查看!
