文章目录
一 . 对于高通已经有的算法node 如FDHw 高通给了自己定义的dump 方式
1.Dump 图片数据首先要打开dump 图片数据的自动总开关
文件位置amx/src/core/camxsettings.xml
在此文件中我们查找自动dump图片的变量名 autoImageDump 会找到如下setting数据:
<setting>
<Name>Auto Image Dump</Name>
<Help>Dumps output images for all enabled nodes. This will run extremely slow</Help>
<VariableName>autoImageDump</VariableName>
<VariableType>BOOL</VariableType>
<SetpropKey>persist.vendor.camera.autoImageDump</SetpropKey>
<DefaultValue>FALSE</DefaultValue>
<Dynamic>FALSE</Dynamic>
</setting
通过上面代码可以看到 DefaultValue 默认值是false; 我们需要把其打开 ,设置方式如下:
// 0 代表false 1 代表 true
adb shell setprop persist.vendor.camera.autoImageDump 1
2. dump 输出的图片数据
dump FDHw Node 输出口图片数据如下:
在camxsettings.xml文件中找到关键字 :Auto Output Image Dump Node/Port Mask 表示输出口 dump 图片数据的定义.
<setting>
<Name>Auto Output Image Dump Node/Port Mask</Name>
<Help>
Will limit dumps to only the specified nodes and ports when autoImageDump is enabled
Uses ImageDumpType to define the flags
No dumps = 0x0
All output ports for IFE = 0x1
All output ports for IPE = 0x2
All output ports for BPS = 0x4
All JPEG output ports for all JPEG nodes = 0x8
All output ports for FDHw = 0x10
All output ports for LRME = 0x20
All output ports for RANSAC = 0x40
All output ports for all ChiNodes = 0x80
All output ports for CVP = 0x100
All other nodes not explicitly listed above = 0x40000000
</Help>
<VariableName>autoImageDumpMask</VariableName>
<VariableType>UINT</VariableType>
<SetpropKey>persist.vendor.camera.autoImageDumpMask</SetpropKey>
<DefaultValue>0x400001ff</DefaultValue>
<Dynamic>FALSE</Dynamic>
</setting>
从FDHw Dump 数据所以需要设置为0x10
设置方式如下:
//打开总开关
adb shell setprop persist.vendor.camera.autoImageDump 1
//设置dump 类型为FDHw
adb shell setprop persist.vendor.camera.autoImageDumpMask 0x10
上面两项设置完成后需要杀服务
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 FDHw Node 输入口图片数据如下:
<setting>
<Name>Auto Input Image Dump Node/Port Mask</Name>
<Help>
Will limit dumps to only the specified nodes when autoInputImageDump is enabled
Uses ImageDumpType to define the flags
No dumps = 0x0
All input ports for IFE = 0x1
All input ports for IPE = 0x2
All input ports for BPS = 0x4
All JPEG input ports for all JPEG nodes = 0x8
All input ports for FDHw = 0x10
All input ports for LRME = 0x20
All input ports for RANSAC = 0x40
All input ports for all ChiNodes = 0x80
All input ports for CVP = 0x100
All other nodes not explicitly listed above = 0x40000000
</Help>
<VariableName>autoInputImageDumpMask</VariableName>
<VariableType>UINT</VariableType>
<SetpropKey>persist.vendor.camera.autoInputImageDumpMask</SetpropKey>
<DefaultValue>0x400001ff</DefaultValue>
<Dynamic>FALSE</Dynamic>
</setting>
从FDHw Dump 输入数据所以需要设置为0x10
设置方式如下:
adb shell setprop persist.vendor.camera.autoInputImageDumpMask 0x10
当dump FDHw 输入口时还需要设置autoImageDumpIPEinputPortMask 的类型此处设置为IPEInputPortFull =0x10
4.高通yuv输出方法如下:
VOID ChiNodeUtils::DumpImage(CHINODEBUFFERHANDLE pNodeBuff, const CHAR* imageNamePrefix)
{
if (NULL != pNodeBuff)
{
// Get format info
CHIIMAGEFORMAT imageFormat = pNodeBuff->format;
ChiFormat format = imageFormat.format;
CHIIMAGE& chiImage = pNodeBuff->pImageList[0];
UINT8* ppu8Plane[ChiNodeFormatsMaxPlanes];
INT32 pi32Pitch[ChiNodeFormatsMaxPlanes];
LOG_INFO(CamxLogGroupChi, "Image format : %d", format);
for(UINT i = 0; i < pNodeBuff->numberOfPlanes && i < ChiNodeFormatsMaxPlanes; i++)
{
ppu8Plane[i] = chiImage.pAddr[i];
switch(format)
{
case ChiFormat::YUV420NV12:
pi32Pitch[i] = imageFormat.formatParams.yuvFormat[0].planeStride;
break;
default:
pi32Pitch[i] = 0;
break;
}
LOG_INFO(CamxLogGroupChi, "%s pi32Pitch[i]: %d", imageNamePrefix, pi32Pitch[i]);
}
/* Construct file name */
char date[64] = {0};
char format_string[64] = {0};
CHAR filename[512] = {0};
CHAR directory[] = "/data/vendor/camera/";
// Get current time
struct timeval now;
gettimeofday(&now, NULL);
strftime(date, sizeof(date), "%Y%m%d_%H%M%S", localtime(&now.tv_sec));
// Fill format string
switch(format)
{
case ChiFormat::YUV420NV12:
ChiNodeUtils::SNPrintF(format_string, sizeof(format_string), "YUV420NV12");
break;
default:
break;
}
ChiNodeUtils::SNPrintF(filename, sizeof(filename), "%s%s_%s_%06ld_%dx%d.%s",
directory,
imageNamePrefix != NULL ? imageNamePrefix : "",
date,
now.tv_usec,
imageFormat.width,
imageFormat.height,
format_string);
// Open & write to file
LOG_INFO(CamxLogGroupChi, "try to open file : %s", filename);
int file_fd = open(filename,O_RDWR|O_CREAT|O_SYNC, 0777);
if(file_fd)
{
LOG_INFO(CamxLogGroupChi, "File %s open successfully", filename);
UINT bytes_write;
switch(format)
{
case ChiFormat::YUV420NV12:
bytes_write = write(file_fd, ppu8Plane[0], pi32Pitch[0] * imageFormat.height);
LOG_INFO(CamxLogGroupChi, "plane[0] bytes_write: %u", bytes_write);
bytes_write = write(file_fd,ppu8Plane[1],pi32Pitch[0] * (imageFormat.height >> 1) );
LOG_INFO(CamxLogGroupChi, "plane[1] bytes_write: %u", bytes_write);
break;
default:
LOG_ERROR(CamxLogGroupChi, "Unsupported DUMP format");
break;
}
close(file_fd);
} else {
LOG_ERROR(CamxLogGroupChi, "Failed to open file: %s", filename);
}
}
}
参考链接:https://blog.csdn.net/tunmengsmile/article/details/118355828