安卓camera总体框架
今天是周五了,時間過得真快,通常這個時候,我都還沉醉了上班的狀態中,說到上班,我是認真的,我非常喜歡上班,特別是今天,我會聽到一聲優美的聲音,我的銀行卡會多出一些錢,而這些最粗魯的獎勵也是我最討厭的,我認為,上班就上班嘛,為什么要發工資呢。哈哈~提前祝大家周末愉快。這篇文章跟攝像頭有關,是我一個做攝像頭工作很久的同學總結的,如果在攝像頭方面想有所建樹,我可以幫忙引薦認識一下,或者在工作上遇到影像方面的難題,也可以請教一下,就這樣。
前言摘要
隨著技術的發展,攝像頭在手機中是非常重要的模塊,也是目前主流手機品牌主打的一個功能模塊。例如oppo 手機廣告語 「照亮你的美,柔光自拍」,小米手機「有你拍照會更加美」華為手機更是采用高端的萊卡攝像頭,mate系列拍照簡直是逆天表現,這些產品的買點和打造,沒有能夠離開攝像頭這個重要的功能角色。所以對在校學生,還是即將走向工作崗位或者在工作崗位想從事影像技術開發的愛好者,從現在開始,我將帶領你們走入camera開發,通過閱讀這些文檔,掌握camera開發技術,對于畢業生來講,是謀職一個熱門的專業領域,對工作的工程師,可以拓寬你們camera模塊的專業技能,如果你們通過閱讀我寫的文檔,能夠有收獲,那么我的付出會感到欣慰。
camera軟件整體架構圖
我們來先看camera軟件整體架構
App應用端
APP代碼位置:packages/apps/Camera2
代碼功能:
主要對 android.hardware.Camera(在Framework中) 類的調用,并且實現Camera 應用的業務邏輯和UI 顯示。Camera 的應用層在Android 上表現為直接調用SDK API 開發的一個Camera 應用APK包。一個Android 應用中若要使用這個android.hardware.Camera類,需要在Manifest 文件聲明Camera的權限,另外還 需要添加一些<uses-feature> 元素來聲明應用中的Camera 特性,如自動對焦等。
framework層
framework
代碼位置:
frameworks/base/core/java/android/hardware/Camera.java
編譯調試:
mmm frameworks/base,代碼編譯成framework.jar。
代碼功能:
AP端必須包含android.hardware.Camera類,才可以調用framework接口函數。
JNI層
Jni
代碼路勁:
frameworks/base/core/jni/android_hardware_Camera.cpp。
編譯調試:
mmm frameworks/base/core/jni,代碼編譯成libandroid_runtime.so
代碼功能:
這是是Android提供給app層調用的java接口。這個類用來連接或斷開一個Camera服務,設置拍攝參數,開始、停止預覽,拍照等。android.hardware.Camera這個類是和JNI中定義的類是一個,有些方法通過Jni的方式調用本地代碼得到,有些方法自己實現。
camera client
代碼位置:
frameworks/av/camera/ qinyuanyi@sz-ubuntu-01:~/work/qcom$ ls frameworks/av/camera/ include //頭文件 ICameraClient.cpp CameraBase.cpp CameraParameters2.cpp CameraUtils.cpp ICamera.cpp Camera.cpp CameraParameters.cpp CaptureResult.cpp ICameraRecordingProxy.cpp編譯調試:
mmm frameworks/av/camera/ ,被編譯成庫libcamera_client.so。
代碼功能:
frameworks/av/camera/目錄下,主要功能部分的代碼為Camera.cpp、ICameraService.cpp、ICamera.cpp、ICameraClient.cpp、CameraBase.cpp在Camera模塊的各個庫中,libcamera_client.so 位于核心的位置,作為Camera框架的 Client客戶端部分,與另外一部分內容服務端libcameraservice.so通過進程間通訊(即Binder機制)的方式進行通訊。其中Camera.cpp是主要的核心部分,它提供了對上層的主要功能接口。ICameraClient 類繼承IInterface,并定義了Camera客戶端的接口,BnCameraClient 繼承BnInterface,這是為基于Android的基礎類Binder機制實現在進程通訊而構建的。
camera service
代碼位置:
frameworks/av/services/camera/libcameraservice/?
qinyuanyi@sz-ubuntu-01:~/work/qcom$ ls frameworks/av/services/camera/libcameraservice/ Android.mk api1 api2 device1 device3????????????????? CameraFlashlight.h? CameraService.h CameraService.cpp????????????????? CameraFlashlight.cpp???? common???????????
?編譯調試:
mmm frameworks/av/services/camera/libcameraservice/,被編譯成庫libcameraservice.so。
代碼功能:
libcameraservice.so是Camera 框架的中間層,Camera服務器程序,它實現了Camera服務端的功能,并且與libcamera_client.so通過進程間通訊(即 Binder機制)的方式進行通訊。然后通過調用實際的Camera 硬件接口來實現功能,即下層HAL層。
CameraService里面主要實現了兩個類: CameraService---->BnCameraService---->ICameraService CameraService::Client---->BnCamera---->ICamera CameraService::Client通過調用CameraHAL層控制具體的硬件操作流程來實現具體的功能。
libcameraservice的啟動:
vim frameworks/av/media/mediaserver/main_mediaserver.cp
libcameraservice調用CameraHAL層關鍵代碼:
frameworks/av/services/camera/libcameraservice/api1/CameraClient.cpp frameworks/av/services/camera/libcameraservice/device1/CameraHardwareInterface.h CameraClient.cpp是CameraService::Client類的實現,該類提供了給ICamera調用的startPreview等相關功能接口,在CameraClient的各函數中,通過初始化CameraHardwareInterface類并調用它提供的操作接口連接到Hal層。
CameraHardwareInterface.h是libcameraservice與cameraHal的接口。在它的initialize函數中調用了從module的open函數返回了mDevice,mDevice提供了上層的一系列的操作函數集合,通過調用mDevice->ops的相應的相應指針進行調用,比如下邊的startPreview函數。
hal層
代碼位置:
hardware/qcom/camera/QCamera2/?
x@sz-ubuntu-01:~/work/qcom$ ls ?hardware/qcom/camera/QCamera2/ Android.mk ???
HAL HAL3 stack util QCamera2Factory.cpp ?? QCamera2Factory.h QCamera2Hal.cpp QCameraFormat.h?
HAL 和 HAL3:分別是camera hal1和hal3架構,目前主流趨勢是hal3.不過hal1架構目前比較穩定。
QCamera2Factory.cpp:qcom和mtk廠商定制的接口
QCamera2Hal.cpp:實現函數映射,通過QCamera2Hal.cpp去訪問QCamera2Factory.cpp
編譯調試:mmm hardware/qcom/camera/QCamera2/?
生成平臺“camera.xxx平臺.so”。
代碼功能:廠商的定制hal層都在這個目錄,我們算法的接入也是在這個目錄。所以hal是framework和kernel底層通信的橋梁。Qcom對hal層數據流的管理采用channel和stream方式,其中包括對內存的申請和分配都在其中進行。
vendor層
代碼位置:
vendor/qcom/proprietary/mm-camera qinyuanyi@sz-ubuntu-01:~/work/qcom$ls vendor/qcom/proprietary/mm-camera/mm-camera2/ Android.mk includes log_debug media-controller server-imaging server-tuning services tests編譯調試:mmm vendor/qcom/proprietary/mm-camera,不同目錄下面生成平臺xxx.so。然后根據每個目錄下面的mk文件,查找對應so庫。
代碼功能:Qcom這里采用mct demon進程控制,hal和mct通信是通過socket通信方式進行傳輸的,那么從底層拿到數據以后,通過mct方式進行傳輸,然后拋給hal層。
kernel層
代碼位置:kernel/drivers/media/platform/msm/camera_v2/
@sz-ubuntu-01:~/work/qcom$ ls? kernel/drivers/media/platform/msm/camera_v2/ camera? common? fd? isp? ispif? jpeg_10? jpeg_dma? Kconfig? Makefile? msm_buf_mgr? msm.c? msm.h? msm_sd.h? msm_vb2? pproc? sensor編譯調試:make -j16 使用正常的編譯kernel的命令即可,不同平臺對于kernel的編譯可能稍微有差異。
代碼功能:Kernel下面底層的kernel邏輯代碼功能模塊都在這里。Sensor驅動的probe和AF flash驅動都在這里實現。
小結
上面是對camera模塊框架的初步分析和認識,大家對整個框架先有個初步的了解,隨著學習的深入,我們會逐步的深入到某一層進行剖析,結合實際的開發,讓大家知道實際開發中需要做的工作。并對學習的知識點進行深入的理解和思考,那么會隨著水平的提高,重構出性能更加完美的架構和系統,期待這個指引能夠激發你們的學習熱情,并且成為未來影像技術的專家。
參考:
參考的文章是我很久之前寫的,如果當時我是在MTK平臺上分析的,希望對大家有所幫助
https://linus.blog.csdn.net/article/details/49943289
總結
以上是生活随笔為你收集整理的安卓camera总体框架的全部內容,希望文章能夠幫你解決所遇到的問題。