Android的Camera应用完成如下三个功能:预览,拍照和录像。
以下是Android下UVC的Camera操作流程:
一、打开
首先当打开Camera HAL时;会通过ioctl向uvc驱动申请buffer,并通过mmap映射进用户空间。uvc驱动提供HAL的是yuv422(yuyv)格式的原始数据流。
二、预览
apk会首先申请surface(假设没有使用overlay);Camera HAL的previewThread线程会获取当前的gralloc显存,并将《一》中的buffer数据yuv422(yuyv)转换成yuv420sp(nv21)后memcpy至显存。
三、拍照
Camera HAL的pictureThread线程会通过malloc申请jpeg数据所需的imgbuffer,并通过调用libjpeg库将《一》中的buffer数据压缩成jpeg格式、保存至imgbuffer;通过层层回调,将imgbuffer的jpeg数据回传给apk。最后,apk完成数据的存盘。
四、录像
Camera HAL的previewThread线程会通过key value(CameraParameter)判断apk是需要录像了;接着,会通过层层回调、将原始的buffer(yuv422)转换成yuv420sp(nv21)数据传递给apk。apk通过调用MediaRecorder将原始数据编码成h264,并存盘。
在这里需要注意:
jb/frameworks/av/media/libstagefright/CameraSouce.cpp
CameraSource *CameraSource::CreateFromCamera( const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy, int32_t cameraId, Size videoSize, int32_t frameRate, const sp<Surface>& surface, bool storeMetaDataInVideoBuffers) 中storeMetaDataInVideoBuffers: @param storeMetaDataInVideoBuffers request to store meta * data or real YUV data in video buffers. Request to * store meta data in video buffers may not be honored * if the source does not support this feature.
其中storeMetaDataInVideoBuffers为ture指HAL送至APK为MetaData数据、编码器接收MetaData数据,为false表示HAL送至APK为yuv420sp数据、编码器接收yuv420sp数据;一般设置为false。
说明,层层回调是指:
CameraService向Camera HAL注册回调函数;
Camera Native客户端又向CameraService注册回调函数;
Camera API通过JNI向Camera Native注册回调函数;
Camera apk又向Camera API注册回调函数。
具体回调流程,请看如下链接:
五、相关博文链接
1.Android相关
2.Linux Kernel相关