Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
camera_take_picture -> CameraHal_Module.cpp //CameraService收到Service命令后會調用HAL層的拍照接口.
gCameraHals[rk_dev->cameraid]->takePicture -> //cameraid由於區分前后攝像頭.
CameraHal::takePicture -> CameraHal.cpp
commandThreadCommandQ.put //cmd: CMD_CONTINUOS_PICTURE,單拍和連拍都走這個,只是數量不一樣.
CameraHal::commandThread -> thread收到命令后被觸發
mDisplayAdapter->pauseDisplay //如果沒在錄像且是單拍就暫停顯示. 另外看代碼rk3288部支持recording的時候拍照.
//如果當前preview size和要設置preview size一樣就不再重新preview,否則要執行stoppreview -> startpreivew的動作.
mEventNotifier->stopReceiveFrame
mCameraAdapter->stopPreview
mCameraAdapter->startPreview
mDisplayAdapter->startDisplay //當連續拍照的時候,顯示也恢復正常,否則會看到畫面卡着不動以為死機了.
//preview size一樣時作閃光燈控制,rk也沒實現,空函數.
mCameraAdapter->flashcontrol
//接下來是單張/多張通用流程
fillPicturInfo //獲取jpeg參數,如旋轉,gps坐標, jpeg質量, thumbnail, focus length. format固定為V4L2_PIX_FMT_NV12.
mEventNotifier->takePicture ->
AppMsgNotifier::takePicture AppMsgNotifier.cpp //主要拷貝一份照片信息和拍照數量以及設置當前的一些狀態.
//接下來就等着有frame上來,有frame后,previewThread被觸發
CameraAdapter::previewThread -> CameraAdapter.cpp
getFrame //從驅動得到frame
reprocessFrame //如果是usb camera那么會處理YUYV或者MJPEG到NV12格式的轉換,其他類型Camera不做處理.
mRefEventNotifier->notifyNewPicFrame ->
AppMsgNotifier::notifyNewPicFrame -> AppMsgNotifier.cpp
encProcessThreadCommandQ.put -> //cdm: CMD_ENCPROCESS_SNAPSHOT
AppMsgNotifier::captureEncProcessPicture -> //核心部分
mRawBufferProvider->createBuffer //存RAW數據
mJpegBufferProvider->createBuffer //存JPEG數據
callback_notify_shutter ->
callbackThreadCommandQ.put -> //cmd:CMD_MSG_SHUTTER
callbackThread -> //thread收到命令被觸發
mNotifyCb //跑到了CameraAppCallbackThread::CMD_MSG_SHUTTER這條case.
//callback在camera framework初始化的時候被調用.
//CameraClient::initialize -> mHardware->setCallbacks -> mDevice->ops->set_callbacks
//然后這里的回調函數就是notifyCallback()了,這里不做展開了.
rga_nv12_scale_crop //轉換處理原始數據幀, RGA是rk3288的一個獨立硬件圖形處理模塊,一個2D GPU.
open //對應設備文件是 /dev/rga
ioctl //參數設置好后下cmd: RGA_BLIT_SYNC
close
copyAndSendRawImage //生成raw幀后通知framework
callback_raw_image ->
callbackThreadCommandQ.put -> cmd: CMD_MSG_RAW_IMAGE
AppMsgNotifier::callbackThread ->
mDataCb -> //之前有個notify回調,這里是data callback
CameraClient::dataCallback() //參數是CAMERA_MSG_RAW_IMAGE
/*有了Raw data之后開始要處理成jpeg了.*/
Jpegfillexifinfo //填充exif
hw_jpeg_encode //編碼成Jpeg,這部分代碼沒有開放,頭文件在
//hardware/rockchip/jpeghw/jpeghw/release/encode_release/hw_jpegenc.h
//庫文件是vendor/rockchip/common/vpu/lib/arm/libjpeghwenc.so
copyAndSendCompressedImage -> //通知framework層壓縮完成
callback_compressed_image ->
callbackThreadCommandQ.put -> //cmd: CMD_MSG_COMPRESSED_IMAGE
AppMsgNotifier::callbackThread ->
mDataCb -> //callback和前面一樣,只是參數不同: CAMERA_MSG_COMPRESSED_IMAGE
frame->release //HAL層的拍照任務到這里就完成了.
HAL層處理成壓縮的JPEG照片之后傳給Camera Service, 然后它也以callback的方式通知Client端, 將data傳遞給Client,最終到APP.