FSL Camer 调试

来源:互联网 发布:炒股软件数据不一样 编辑:程序博客网 时间:2024/05/29 08:47

FSL Camer 调试

分类: Android 451人阅读 评论(6)收藏 举报
videoframeworks代码分析bufferbtstruct

目录(?)[+]

  1. 概述
  2. CameraHal
    1. CameraHal代码分析
    2. Preview
      1. Overlay方式
      2. Surface方式
    3. 拍照
    4. 摄像
  3. 驱动调试
    1. V4l2驱动
    2. 芯片驱动

1       概述

FSL iMx53 Camera Android驱动调试完成,根据需要增加了Tw2836Tw9912NT99140模组的驱动代码。

 

2      CameraHal

2.1 CameraHal代码分析

Camera Hal层代码见下图1

1

其中CamerHal.cppcamer硬件抽象层,主要是接口,完成CamerServiceV4l2驱动之间的数据传递与控制,Camera_pmem.cppCameraHalmem(内存)数据处理函数的调用,CaptureDeviceInterface.cpp完成接口的建立,JpegEncoderInterface.cppJPEG编码的接口建立,JpegEncodeSoftware.cppJpeg软件编码的实现,PostProcessDeviceInterface.cppPostProcessDevice接口,PP_ipulib.cppPostProcessDevice的函数实现,V4l2CapDeviceBase.cppV4l2 capture的实现,V4l2CsiDevice.cpp V4l2CapDeviceBase的扩展实现。

 

2.2 Preview

CameraHal决定了camer数据到显示的数据流向,即通过overlay显示还是通过Surface来显示,此选择通过CameraHal.h中的

这个函数来决定,return true为使用overlay,相反,通过Surface上层来显示。默认为使用overlay方式。

 

2.2.1.1 Overlay方式

Overlay一般用于视频播放、Camera preview等高帧率的显示,或者一些有两层UI的显示情况,FSL自身完成的Camera是按Overlay的方式来做的。使用Overlay方式Preview,可以从CameraService.cpp (frameworks\base\services\

camera\libcameraservice)看起(见图2):

 

2

 

其中mUseOverlay就是CameraHaluseOverlay()的返回值即true,调用setoverlay(见图3),

3

 

这样,就建立了overlay图层来显示camera的图像,注意overlay目前仅支持以下格式见图4(如果V4l2获取的的格式和这些不同,将显示不正确,需通过软件转换或者通过设置制式,通过IPU来转换,具体见后面介绍)。

4

                                                                     

再回到图2startpreviewmHardware->startPreview();),此时转入CameraHal中去。

 

 

 

前面几个函数:PrepareCaptureDevicesPreparePostProssDevicePreparePreviwBufPreparePreviwMisc都是Camra开始之前做准备工作,初始化参数,注册和申请bufferCameraHALPreviewStart中,创建CaptureFrameThreadPreviewShowFrameThreadEncodeFrameThread三个线程,来处理CapturePreveiw以及Encode的数据。至此,三个线程开始循环、来进行camera数据的捕获、显示、和编解码。

2.2.1.2 Surface方式

对于一般的应用来说,使用overlay已经满足了要求,而如果特殊需要,如其他应用占用overlay,硬件冲突,此时可通过修改CameraHal.h中的useoverlay函数返回false。与overlay调用的不同在于startPreviewModeregisterPreviewBuffers。需要完善的是,Surface本身显示的RGB565的图像,而Camera采集到的大多为YUV的图像,此时需要进行数据的转换,并把Buffer数据的格式,修改为RGB565的格式,修改后的代码如下:

 

注意:在capture时通过软件的方式进行转换YUVRGB的话,会明显感觉到图像的移动偏慢,为了保证流畅性,可以通过FSLIPU在底层进行转换,V4l2CsiDevice :: V4l2ConfigInput(struct capture_config_t *pCapcfg)里的input决定了数据流为csi-enc还是csi-prp-enc,这样做,可以保证预览的效果,但是由于视频的编码,仅支持YUV格式,底层转换后,要在EncodeFrameThread进行RGBYUV的转换后再进行编码,对于视频编码的效果,也会有一定的影像,需根据需要折中处理。

2.3拍照

调用流程和Preview一致,都是从CameraServiceCameraHal。拍照是一组单独的流程,从新打开,根据获得的jpegencode参数来设置camera参数,并启动camera,获取一帧图像数据,送到jpegencode编码。

2.4摄像

摄像的数据流程主要是在encodeframeThread中。

3       驱动调试

3.1 V4l2驱动

V4l2camera HAL层与底层的接口,来完成数据的传递。

3.2芯片驱动

目前调试过两种类型的摄像头,一种是ITU-R 656 YUV输出的Video Decode,另外一种是YUV输出的摄像头模组;从目前遇到的情况看,主要看以下几个关键参数的设置和i2c的调试。

Probe函数里面

cameradata.pix.width = video_fmts[video_idx].raw_width;

camera_data.pix.height = video_fmts[video_idx].raw_height;

camera_data.pix.pixelformat = V4L2_PIX_FMT_UYVY;  /* YUV422 */

camera_data.pix.priv = 1;  /* 1 is used to indicate TV in */

camera_data.on = true;

camera_data.csi = plat_data ->csi;

以及g_ifparm中的

p->u.bt656.clock_curr = camera_data.mclk;// 0 –CCIR656 1-Gated

p->if_type = V4L2_IF_TYPE_BT656;

p->u.bt656.mode=V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT;

p->u.bt656.clock_min = CAMERA_XCLK_MIN;

p->u.bt656.clock_max = CAMERA _XCLK_MAX;