Android的Camera应用完成如下三个功能:预览,拍照和录像。
以下是Android下UVC的Camera操作流程:
一、打开
首先当打开Camera HAL时;会通过ioctl向uvc驱动申请buffer,并通过mmap映射进用户空间。uvc驱动提供HAL的是yuv422(yuyv)格式的原始数据流。
二、预览
apk会首先申请surface(假设没有使用overlay);Camera HAL的previewThread线程会获取当前的gralloc显存,并将《一》中的buffer memcpy至显存。
三、拍照
Camera HAL的pictureThread线程会通过malloc申请jpeg数据所需的imgbuffer,并通过调用libjpeg库将《一》中的buffer数据压缩成jpeg格式、保存至imgbuffer;通过层层回调,将imgbuffer的jpeg数据回传给apk。最后,apk完成数据的存盘。
四、录像
Camera HAL的previewThread线程会通过key value(CameraParameter)判断apk是需要录像了;接着,会通过层层回调、将原始的buffer(yuv422)数据传递给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.
说明,层层回调是指:
CameraService向Camera HAL注册回调函数;
Camera Native客户端又向CameraService注册回调函数;
Camera API通过JNI向Camera Native注册回调函数;
Camera apk又向Camera API注册回调函数。
(一个粗略的录制的流程应该是这样: Camera HAL 给Camera Native(Client)发回调通知数据好了,Camera Client通过回调通知CameraSource,这样新数据到来,OMXCodec调用CameraSource::read()返回,编码完成后,MPEG4Writer得到这个数据并放到文件里面去)
From
http://blog.csdn.net/tankai19880619/article/details/9075839