一 . 对于高通已经有的算法node 如IFE IPE 高通给了自己定义的dump 方式
(1) Dump 图片数据首先要打开dump 图片数据的自动总开关其位置在camxsettings.xml 中
camx/src/core/camxsettings.xml
在此文件中我们查找自动dump图片的变量名 autoImageDump 会找到如下setting数据;
Dump 图片的开关;
<setting>
1040 <Name>Auto Image Dump</Name>
1041 <Help>Dumps output images for all enabled nodes. This will run extremely slow</Help>
1042 <VariableName>autoImageDump</VariableName>
1043 <VariableType>BOOL</VariableType>
1044 <SetpropKey>persist.vendor.camera.autoImageDump</SetpropKey>
1045 <DefaultValue>FALSE</DefaultValue>
1046 <Dynamic>FALSE</Dynamic>
1047 </setting>
通过上面代码可以看到 DefaultValue 默认值是false; 我们需要把其打开 ,设置方式如下:
// 0 代表false 1 代表 true
adb shell setprop persist.vendor.camera.autoImageDump 1
(2) dump 输出口的图片数据,
例如我要dump IPE Node 输出口图片数据如下:
我们可以在camxsettings.xml文件中找到关键字 :Auto Output Image Dump Node/Port Mask 表示输出口 dump 图片数据的定义.
1091 <setting>
1092 <Name>Auto Output Image Dump Node/Port Mask</Name>
1093 <Help>
1094 Will limit dumps to only the specified nodes and ports when autoImageDump is enabled
1095 Uses ImageDumpType to define the flags
1096 No dumps = 0x0
1097 All output ports for IFE = 0x1
1098 All output ports for IPE = 0x2
1099 All output ports for BPS = 0x4
1100 All JPEG output ports for all JPEG nodes = 0x8
1101 All output ports for FDHw = 0x10
1102 All output ports for LRME = 0x20
1103 All output ports for RANSAC = 0x40
1104 All output ports for all ChiNodes = 0x80
1105 All other nodes not explicitly listed above = 0x40000000
1106 </Help>
1107 <VariableName>autoImageDumpMask</VariableName>
1108 <VariableType>UINT</VariableType>
1109 <SetpropKey>persist.vendor.camera.autoImageDumpMask</SetpropKey>
1110 <DefaultValue>0x400000ff</DefaultValue>
1111 <Dynamic>FALSE</Dynamic>
1112 </setting>
从上面可以看出:我们要从IPE Dump 数据所以需要设置为0x2
所以设置方式如下:
//打开总开关
adb shell setprop persist.vendor.camera.autoImageDump 1
//设置dump 类型为IPE
adb shell setprop persist.vendor.camera.autoImageDumpMask 0x02
上面两项设置完成后需要杀服务
adb shell ps -A |grep camera
cameraserver 7642 1 53280 3400 binder_ioctl_write_read 0 S cameraserver
cameraserver 7643 1 499652 13100 binder_ioctl_write_read 0 S android.hardware.camera.provider@2.4-service_64
adb shell killall android.hardware.camera.provider@2.4-service_64 cameraserver
(3) dump 输入口的图片数据,
例如我要dump IPE Node 输入口图片数据如下:
069 <setting>
1070 <Name>Auto Input Image Dump Node/Port Mask</Name>
1071 <Help>
1072 Will limit dumps to only the specified nodes when autoInputImageDump is enabled
1073 Uses ImageDumpType to define the flags
1074 No dumps = 0x0
1075 All input ports for IFE = 0x1
1076 All input ports for IPE = 0x2
1077 All input ports for BPS = 0x4
1078 All JPEG input ports for all JPEG nodes = 0x8
1079 All input ports for FDHw = 0x10
1080 All input ports for LRME = 0x20
1081 All input ports for RANSAC = 0x40
1082 All input ports for all ChiNodes = 0x80
1083 All other nodes not explicitly listed above = 0x40000000
1084 </Help>
1085 <VariableName>autoInputImageDumpMask</VariableName>
1086 <VariableType>UINT</VariableType>
1087 <SetpropKey>persist.vendor.camera.autoInputImageDumpMask</SetpropKey>
1088 <DefaultValue>0x400000ff</DefaultValue>
1089 <Dynamic>FALSE</Dynamic>
1090 </setting>
从上面可以看出:我们要从IPE Dump 输入数据所以需要设置为0x2
所以设置方式如下:
adb shell setprop persist.vendor.camera.autoInputImageDumpMask 0x02
当dump IPE 输入口时还需要设置autoImageDumpIPEinputPortMask 的类型此处设置为IPEInputPortFull =0x1
<setting>
<Name>Auto Image Dump Input Port Mask for IPE </Name>
<Help>
Input port mask for IPE:
IPEInputPortFull = 0x1;
IPEInputPortDS4 = 0x2;
IPEInputPortDS16 = 0x4;
IPEInputPortDS64 = 0x8;
IPEInputPortFullRef = 0x10;
IPEInputPortDS4Ref = 0x20;
IPEInputPortDS16Ref = 0x40;
IPEInputPortDS64Ref = 0x80;
ALLports = 0xFF
</Help>
<VariableName>autoImageDumpIPEinputPortMask</VariableName>
<VariableType>UINT</VariableType>
<SetpropKey>persist.vendor.camera.autoImageDumpIPEinputPortMask</SetpropKey>
<DefaultValue>0x0F</DefaultValue>
<Dynamic>FALSE</Dynamic>
</setting>
所以最终的设置方式如下:
//打开总开关
adb shell setprop persist.vendor.camera.autoImageDump 1
//设置dump 输入的类型是IPE
adb shell setprop persist.vendor.camera.autoInputImageDumpMask 0x02
adb shell setprop persist.vendor.camera.autoImageDumpIPEinputPortMask 0x01
(3) 以上操作完成后我们需要开启相机, 稍微会出现一点卡顿现象, 开启3到4 秒。后就可以关闭掉了
dump 数据存储在:
data/vendor/camera/
查看数据的方式:通过ImagePlayer 软件进行查看数据这个是windows 软件;
最后: 还需要在不用的时候关闭掉, dump 数据的设置,
adb shell setprop persist.vendor.camera.autoImageDump 0
adb shell setprop persist.vendor.camera.autoImageDumpMask 0x0
二. 我们在node中自己写Dump图片数据 的方式:
(1)我们以memcpyNode 为例子进行讲解:
我们需要在其node 中的ProcessRequest()方法中进行我们的dump 数据操作, 此方法不断的在刷新我们每一帧数据的buffer
假设我们在其中调用一个我们已经写好的dump方法,其名字如下:DumpIntPutOrOutPut()方法;
其调用的具体位置代码如下:
CDKResult ChiMemCpyNode::ProcessRequest(
CHINODEPROCESSREQUESTINFO* pProcessRequestInfo)
{
......
if (TRUE == IsBypassableNode())
{
......
}
else
{
if (0 == i)
{
//dump图片调用自己写的方法,传入参数,第一个参数是node 的输出buffer数据信息
//第二个参数是node 的输入buffer数据信息;
//第三个参数是当期是那一桢数据;
DumpIntPutOrOutPut(pProcessRequestInfo>phOutputBuffer[i]
,pProcessRequestInfo>phInputBuffer[i]
,pProcessRequestInfo->frameNum);
CopyImage(pProcessRequestInfo->phOutputBuffer[i], pProcessRequestInfo->phInputBuffer[i]);
}
else if (1 == i)
{
CopyImage(pProcessRequestInfo->phOutputBuffer[i], pProcessRequestInfo->phInputBuffer[0]);
LOG_INFO(CamxLogGroupChi, "CopyImage done for two output ports");
}
}
}
m_processedFrame++;
UpdateMetaData(pProcessRequestInfo->frameNum);
}
return CDKResultSuccess;
}
(2) 一个简单的dump 图方法的写法如下:
/// dump 图片算法数据
///CHINODEBUFFERHANDLE hOutput 图片输出buffer
///CHINODEBUFFERHANDLE hInput 图片输入buffer
///UINT64 requestId 当前是哪一帧
VOID ChiMemCpyNode:: DumpIntPutOrOutPut( CHINODEBUFFERHANDLE hOutput,
CHINODEBUFFERHANDLE hInput
,
UINT64 requestId)
{
//表示我在第八帧的时候才进行数据dump
if(requestId==8){
//算法node 输出图的高度
UINT32 outHeight = hOutput->format.formatParams.yuvFormat[0].height;
//算法node 输出图的宽度
UINT32 outWidth = hOutput->format.formatParams.yuvFormat[0].width;
//算法node 输入图高度
UINT32 inHeight = hInput->format.formatParams.yuvFormat[0].height;
//算法node 输入图宽度
UINT32 inWidth = hInput->format.formatParams.yuvFormat[0].width;
//创建我们要保存到的文件file,"wb+":只进行读写
FILE *fpIn4k = fopen("/data/vendor/camera/eptzinput3.nv12", "wb+");
if (fpIn4k)
{
//向文件中写入图片数据;
fwrite(hInput->pImageList[0].pAddr[0], 1, inHeight*inWidth*1.5, fpIn4k);
//关闭流操作
fclose(fpIn4k);
}else{
LOG_ERROR(CamxLogGroupChi, "dengbaocheng: fpint false");
}
FILE *fpout1080p = fopen("/data/vendor/camera/eptzoutput3.nv12", "wb+");
if (fpout1080p)
{
fwrite( hOutput->pImageList[0].pAddr[0], 1, outHeight*outWidth*1.5, fpout1080p);
fclose(fpout1080p);
}else{
LOG_ERROR(CamxLogGroupChi, "dengbaocheng: fpout false");
}
}
}
dump 数据的查看工具:
下载地址
提取码: eaye