您的位置:首页 > 移动开发 > Android开发

[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.                                                  

                     

                        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: