Android4.2 Camera子系统

时间:2020-12-23 16:44:56

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注册回调函数。

具体回调流程,请看如下链接:

Android之Camera预览

Android之Camera拍照

Android系统Camera录像过程分析

五、相关博文链接

1.Android相关

Android4.2之Camera系统HAL调用流程

Android之Camera拍照插值算法

Android之Camera预览过程中插拔摄像头节点后移

Android系统Camera参数设置

Android系统Camera预览刚打开时由暗变明

Android系统Camera图片反转的一个问题

一个xml引起的三方Camera应用不能使用问题

2.Linux Kernel相关

Linux下V4L2一个调试问题方法(拍照偏绿)

Linux下V4L2拍照测试用例

Linux uvc摄像头驱动初探

Linux uvc驱动分析