问题1:sensor info

详细

Sensor info.txt如何制作,不同sensor不一样,具体从哪个文件中找到相应的配置

解答

Sensor info.txt模板如下:

30.000000f, /* Max FPS */
1, /* min line ct */
2196, /* maximum line count in max fps */
2196, /* maximum line count */
1, /* minimum gain */
251, /* max gain fix fps */
251, /* max gain after linear afr */
3072, /* raw image width */
2048, /* raw image height */
RGGB, /* bayer pattern */
10, //bits per pixel
1, //packed or not, packed=1, unpacked=0
0, /* crop top after camif */
0, /* crop bottom after camif */
0, /* crop left after camif */
0, /* crop right after camif */
240, //black level in 12-bit value based on spec
240, //black level under low light
240, //black level under bright light

来源:
可以从sensor_lib.h中获取到

  1. FPS:sensor最大输出帧率,对应out_info 的max_fps
  2. Min/max line: 从sensor手册中获取到
  3. Min/max gain: 最大增益由自己定,一般不会太大,不会超过256
  4. Raw image width/height:raw尺寸,对应out_info里面的x_output/y_output
  5. Bayer pattern: RAW 滤光片排列格式,对应sensor_output的filter_arrangement,一般是RGGB
  6. Bit per pixel:sensor一般支持10bit和12bit,看寄存器配成多少bit,对应sensor_output的raw_output
  7. Packed or not:RAW的两种格式
  8. Crop:上下左右的裁剪,对应crop_params
  9. Black level: 来自手册或者自己的测量,注意10bit要转成12bit,比如raw测出来的黑电平是60,转成12bit,就是多加两位,乘以四,最后就是240

建议:

  1. 建议先抓一张raw图,把raw图导入chromatix工具,多测试几种格式,确定了RAW图的格式再把sensor info.txt定下来
  2. 像黑电平,曝光行等在chromatix工具调试的过程中可以修改,并不是说写了多少就是多少。

问题2:调试文件目录

详细


这几个调试文件夹分别对应isp pipe中的哪些功能。
比如说我想改ae是不是只需要改3A文件夹下的相关变量内容。

回答

  1. 3A 对应的是3A模块:AE,AWB,AF
  2. Common 对应的是RAW域最前端的基础处理模块:黑电平(线性化),rolloff。
  3. CPP 对应的是ISP中的CPP模块,主要是yuv域的降噪WNR和锐化ASF。
  4. Isp 对应的是VFE模块,包括PDAF,ABF,绿平衡,坏点校正,去马赛克,gamma,color conversion,宽动态调节(LTM(注意有两个版本,都是有效的)/GTM/ADRC),肤色去噪,CAC,色度抑制,肤色增强,统计数据配置,video HDR(只支持隔行扫描HDR sensor),人脸检测等模块。
    最常用到的就是ABF,gamma,color conversion,宽动态调节。
  5. Postproc 对应的是RNR降噪参数,CAC等不常用的参数,一般不会调,用默认的。

chromatix工具最终是生成头文件的,我们当然可以跳过工具,直接去修改头文件。两者是一样的效果。

问题3:抓RAW图

详细

手机/ipc设备拍摄raw图的方法。

回答

手机抓raw图的方法(传统)

  1. 安装骁龙相机
  2. 连续点击五次设置里面的红眼消除,进入高级设置
  3. 关闭零秒快拍(ZSL)选项,关闭pdaf功能
  4. 选择图片格式 RAW
  5. 按下拍照就是抓取RAW图了,图片保存在/sdcard/DCIM/Camera或者/data/misc/camera路径下

Ipc抓取raw图的方法:

  1. 连接usb线
  2. 安装total control
  3. 安装骁龙相机
  4. 用手机抓raw图的方法抓取

Adb抓取raw图(仅适用于660以上平台)

adb shell chmod 777 /data/misc/camera
adb shell setprop persist.camera.raw_yuv 1
adb shell setprop persist.camera.preview_raw 1
adb shell setprop persist.camera.dumpimg 0
adb shell setprop persist.camera.dumpimg 131088

Tips

  1. 可以在QCamera2HWICallbacks.cpp的dumpFrameToFile函数查看具体实现过程。可能会出现抓拍到不止1张raw图的情况。
  2. 用骁龙相机抓出来的raw图是MIPI格式,而这里格式要改成packed,图片的名称中带有图片的大小。
  3. 第一次抓取raw图,设置好要重启camera或者重启应用程序。由于persist.camera.raw_yuv只有在给channel添加通道的时候才会读取,因此设置之后需要重启camera,可以重启设备或者重启应用程序。
  4. 图片路径在/data/misc/camera

问题4:头文件对应关系

详细

不同的sensor有不同的chromatix头文件,同一个sensor在不同数据流(预览,抓拍,录像)下也有不同的头文件,如何确定到底哪个生效呢?

回答

拿660平台举例,在/vendor/qcom/proprietary/mm-camera/media-controller/modules/sensors/configs路径下的xml里进行了配置。

这个位置有很多的xml配置文件,先找到这个设备的xml,比如说sdm660_camera.xml

<CameraModuleConfig>
<CameraId>0CameraId>
<SensorName>imx290SensorName>
<ChromatixName>imx290_chromatixChromatixName>
<ModesSupported>1ModesSupported>
<Position>BACKPosition>
<MountAngle>90MountAngle>
<CSIInfo>
<CSIDCore>2CSIDCore>
<LaneMask>0x1FLaneMask>
<LaneAssign>0x4320LaneAssign>
<ComboMode>0ComboMode>
CSIInfo>
<LensInfo>
<FocalLength>2.8FocalLength>
<FNumber>2.8FNumber>
<TotalFocusDistance>1.97TotalFocusDistance>
<HorizontalViewAngle>54.8HorizontalViewAngle>
<VerticalViewAngle>42.5VerticalViewAngle>
<MinFocusDistance>0.1MinFocusDistance>
LensInfo>
CameraModuleConfig>

这个文件配置了cameraid,sensor的名称(一般通过sensor名称来选择到底用哪套配置),位置等等信息。
里面有个ChromatixName的配置,这里是imx290_chromatix。
那么我们就继续在当前目录下找imx290_chromatix.xml这个文件

<ResolutionChromatixInfo>
<ChromatixName sensor_resolution_index="0">
<ISPPreview>imx290_previewISPPreview>
<ISPSnapshot>imx290_previewISPSnapshot>
<ISPVideo>imx290_previewISPVideo>
<CPPPreview>imx290_cpp_previewCPPPreview>
<CPPSnapshot>imx290_cpp_previewCPPSnapshot>
<CPPVideo>imx290_cpp_previewCPPVideo>
<CPPLiveshot>imx290_cpp_previewCPPLiveshot>
<A3Preview>imx290_default_preview_3aA3Preview>
<A3Video>imx290_default_preview_3aA3Video>
ChromatixName>
<ChromatixName sensor_resolution_index="1">
<ISPPreview>imx290_previewISPPreview>
<ISPSnapshot>imx290_previewISPSnapshot>
<ISPVideo>imx290_previewISPVideo>
<CPPPreview>imx290_cpp_previewCPPPreview>
<CPPSnapshot>imx290_cpp_previewCPPSnapshot>
<CPPVideo>imx290_cpp_previewCPPVideo>
<CPPLiveshot>imx290_cpp_previewCPPLiveshot>
<A3Preview>imx290_default_preview_3aA3Preview>
<A3Video>imx290_default_preview_3aA3Video>
ChromatixName>
ResolutionChromatixInfo>

这个文件配置了两套分辨率(帧率),这个分辨率分组是根据sensor_lib.h配置的。
当选择第一组分辨率时,可以看到在preview,snapshot,video数据流都可以指定对应的chromatix头文件。
注意,这里的imx290_preview并非直接是头文件的名称,而是动态库的名称。
到对应的chromatix头文件夹下可以找到对应目录下的Android.mk

LOCAL_SRC_FILES:= chromatix_imx290_preview.c

LOCAL_MODULE := libchromatix_imx290_preview

libchromatix_imx290_preview就是这个路径下的头文件生成的动态库。去掉前面的libchromatix_,正好就是需要的动态库名称。

如果是老平台,一般在代码中找LOAD_CHROMATIX函数,可以直接看到加载的是哪个动态库,再反过来找对应的头文件。