1、Camera成像原理介紹java
Camera工做流程圖linux
Camera的成像原理能夠簡單歸納以下:android
景物(SCENE)經過鏡頭(LENS)生成的光學圖像投射到圖像傳感器(Sensor)表面上,而後轉爲電信號,通過A/D(模數轉換)轉換後變 爲數字圖像信號,再送到數字信號處理芯片(DSP)中加工處理,再經過IO接口傳輸到CPU中處理,經過DISPLAY就能夠看到圖像了。架構
電荷耦合器件(CCD)或互補金屬氧化物半導體(CMOS)接收光學鏡頭傳遞來的影像,經模/數轉換器(A/D)轉換成數字信號,通過編碼後存儲。app
流程以下:
一、CCD/CMOS將被攝體的光信號轉變爲電信號—電子圖像(模擬信號)
二、由模/數轉換器(ADC)芯片來將模擬信號轉化爲數字信號
三、數字信號造成後,由DSP或編碼庫對信號進行壓縮並轉化爲特定的圖像文件格式儲存框架
數碼相機的光學鏡頭與傳統相機相同,將影像聚到感光器件上,即(光)電荷耦合器件(CCD) 。CCD替代了傳統相機中的感光膠片的位置,其功能是將光信號轉換成電信號,與電視攝像相同。ide
CCD是半導體器件,是數碼相機的核心,其內含器件的單元數量決定了數碼相機的成像質量——像素,單元越多,即像素數高,成像質量越好,一般狀況下像素的高低表明了數碼相機的檔次和技術指標。ui
2、Android Camera框架編碼
Android的Camera子系統提供一個拍照和錄製視頻的框架。.net
它將Camera的上層應用與Application Framework、用戶庫串接起來,而正是這個用戶庫來與Camera的硬件層通訊,從而實現操做camera硬件。
三、Android Camera的代碼結構
Android的Camera代碼主要在如下的目錄中:
Camera的JAVA部分
packages/apps/Camera/。其中Camera.java是主要實現的文件。這部份內容編譯成爲目標是Camera.apk
com.android.camera這個包,幾個主要的類文件以下:
PhotoViewer:GalleryPicker.java(全部圖片集)--->ImageGallery.java(某個Folder下圖片列表)--->ViewImage.java(看某張具體圖片)
VideoPlayer:GalleryPicker.java(全部視頻集) --->MovieView.java(看某一個視頻)
Camera:Camera.java(Camera取景及拍照)
VideoCamera:VideoCamera.java(VideoCamera取景及攝像)
Camera的framework供上層應用調用的部分
base/core/java/android/hardware/Camera.java
這部分目標是framework.jar
Camera的JNI部分
frameworks/base/core/jni/android_hardware_Camera.cpp
這部份內容編譯成爲目標是libandroid_runtime.so。
Camera UI庫部分
frameworks/base/libs/ui/camera
這部分的內容被編譯成庫libcamera_client.so。
Camera服務部分
frameworks/base/camera/libcameraservice/
這部份內容被編譯成庫libcameraservice.so。
Camera HAL層部分
hardware/msm7k/libcamera
或
vendor/qcom/android-open/libcamera2
爲 了實現一個具體功能的Camera,在HAL層須要一個硬件相關的Camera庫(例如經過調用video for linux驅動程序和Jpeg編碼程序實現或者直接用各個chip廠商實現的私有庫來實現,好比Qualcomm實現的libcamera.so和 libqcamera.so),實現CameraHardwareInterface規定的接口,來調用相關的庫,驅動相關的driver,實現對 camera硬件的操做。這個庫將被Camera的服務庫libcameraservice.so調用。
未完待續
在下一篇中,我會以兩條路徑來詳細介紹Camera HAL的實現:本身依據V4l2規範來實現CameraHardwareInterface; Qualcomm的Camera架構(QualcommCameraHardware和mm-camera/mm-still)。固然,在涉及到 Qualcomm私有庫部分,爲避免沒必要要的麻煩,我會一筆帶過。敬請見諒!