android6.0手机照相编程,[RK3288][Android6.0] Camera HAL層拍照編碼成JPEG流程小結

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值