[RK3288][Android6.0] Camera HAL层拍照编码成JPEG流程小结
2016-12-08 09:49
477 查看
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.
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.
相关文章推荐
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] Audio录音frame rate设置流程小结
- [RK3288][Android6.0] USB WiFi驱动流程小结
- [RK3288][Android6.0] 网络服务Netd初始化流程小结
- [RK3288][Android6.0] Wifi Service初始化流程小结
- [RK3288][Android6.0] U-boot 启动流程小结
- [RK3288][Android6.0] PWM backlight 驱动流程小结
- [RK3288][Android6.0] PWM backlight 驱动流程小结
- [RK3288][Android6.0] Audio的音量设置流程小结
- [RK3288][Android6.0] StageFright解码流程小结
- [RK3288][Android6.0] U-boot 启动流程小结【转】
- [RK3288][Android6.0] 开机播放音乐流程小结
- [RK3288][Android6.0] TS-ADC驱动流程小结
- [RK3288][Android6.0] U-boot显示模块部分流程小结
- [RK3288][Android6.0] USB Mass Storage流程小结
- [RK3288][Android6.0] 串口驱动流程小结
- [RK3288][Android6.0] Display驱动初始化流程小结
- [RK3288][Android6.0] USB hub初始化流程小结
- [RK3288][Android6.0] DDR Frequency控制流程小结
- [RK3288][Android6.0] Display驱动初始化流程小结【转】