Thread:TDA4VM 中讨论的其他器件
工具/软件:
您好:
0901 之间进行配置。
我想在使用 displayM2M 节点时将 2560 * 1440 RGBX 格式的图像转换为 NV12、但转换后的图像中会出现以下问题。 请您帮助我分析原因?
原始图像:

转换后的图像:

This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:
您好:
0901 之间进行配置。
我想在使用 displayM2M 节点时将 2560 * 1440 RGBX 格式的图像转换为 NV12、但转换后的图像中会出现以下问题。 请您帮助我分析原因?
原始图像:

转换后的图像:

typedef struct {
vx_int32 width;
vx_int32 height;
vx_uint32 dataFormat;
} ImgObjInfo;
imgObjInfo.width = 2560;
imgObjInfo.height = 1440;
imgObjInfo.dataFormat = VX_DF_IMAGE_NV21;//出图格式NV12
status = obj->module.app_display_m2m_module_srv.app_init_displayM2M(obj->context, imgObjInfo, 1, 1);
if(VX_SUCCESS == status)
{
vx_image displayM2M_in_image = (vx_image)vxGetObjectArrayItem(obj->module.srvInvoObj.arr_Output, 0);
status = obj->module.app_display_m2m_module_srv.app_create_graph_displayM2M(obj->graph, displayM2M_in_image,
false, "DisplayM2MNodeSRV", TIVX_TARGET_DISPLAY_M2M1);
vxReleaseImage(&displayM2M_in_image);
}
vx_status App_display_m2m_module::app_init_displayM2M(const vx_context& context, const ImgObjInfo& info_Output, const vx_int32& numCH, const vx_uint32& numBuf/* =1*/)
{
vx_status status = VX_SUCCESS;
tivx_display_m2m_params_t m2m_config;
tivx_display_m2m_params_init(&m2m_config);
m2m_config.instId = 0;
m2m_config.numPipe = 1;
m2m_config.overlayId = 3;
m2m_config.pipeId[0] = 3;
m_DisplayM2MObj.config = vxCreateUserDataObject(context, "tivx_display_m2m_params_t", sizeof(tivx_display_m2m_params_t), &m2m_config);
if (vxGetStatus((vx_reference)m_DisplayM2MObj.config) != VX_SUCCESS)
{
status = VX_FAILURE;
APP_PRINTF("init displayM2MObj failed\n");
}
vx_image output = vxCreateImage(context, info_Output.width, info_Output.height, info_Output.dataFormat);
for (vx_uint32 buf_id = 0; buf_id < MAX_NUM_BUFS && buf_id < numBuf; buf_id++)
{
m_DisplayM2MObj.arr_Output[buf_id] = vxCreateObjectArray(context, (vx_reference)output, numCH);
if (vxGetStatus((vx_reference)m_DisplayM2MObj.arr_Output[buf_id]) != VX_SUCCESS)
{
printf("m_DisplayM2MObj.arr_Output[buf_id] create failed\n");
return VX_FAILURE;
}else{
m_DisplayM2MObj.img_Output[buf_id] = (vx_image)vxGetObjectArrayItem(m_DisplayM2MObj.arr_Output[buf_id], 0);
if (vxGetStatus((vx_reference)m_DisplayM2MObj.img_Output[buf_id]) != VX_SUCCESS)
{
printf("m_DisplayM2MObj.img_Output[buf_id] create failed\n");
status = VX_FAILURE;
}
}
}
vxReleaseImage(&output);
return status;
}
vx_status App_display_m2m_module::app_create_graph_displayM2M(const vx_graph& graph, const vx_image& imgInput, const bool& bReplicate/* = true*/,
const std::string& strName/* = "DisplayM2MNode"*/, const std::string& strTarget/* = TIVX_TARGET_DISPLAY_M2M1*/)
{
vx_status status = VX_SUCCESS;
vx_image output = (vx_image)vxGetObjectArrayItem(app_get_output_image_arr(0), 0);
m_DisplayM2MObj.node = tivxDisplayM2MNode(graph, m_DisplayM2MObj.config, imgInput, output);
vxSetNodeTarget(m_DisplayM2MObj.node, VX_TARGET_STRING, strTarget.c_str());
vxSetReferenceName((vx_reference)m_DisplayM2MObj.node, strName.c_str());
if (bReplicate)
{
vx_bool replicate[] = { vx_false_e, vx_true_e, vx_true_e };
vxReplicateNode(graph, m_DisplayM2MObj.node, replicate, 3);
}
if (vxGetStatus((vx_reference)m_DisplayM2MObj.node) != VX_SUCCESS)
{
status = VX_FAILURE;
APP_PRINTF("m_DisplayM2MObj.node create failed\n");
}
vxReleaseImage(&output);
return status;
}
上面是图形创建部分。
vx_status app_write_nv12_to_file(char *filename, vx_image image)
{
vx_uint32 width, height, num_bytes;
vx_imagepatch_addressing_t image_addr1, image_addr2;
vx_rectangle_t rect;
vx_map_id map_id1, map_id2;
vx_df_image df;
void *data_ptr1, *data_ptr2;
vx_status status;
status = vxGetStatus((vx_reference)image);
if(status==VX_SUCCESS)
{
vxQueryImage(image, VX_IMAGE_WIDTH, &width, sizeof(vx_uint32));
vxQueryImage(image, VX_IMAGE_HEIGHT, &height, sizeof(vx_uint32));
vxQueryImage(image, VX_IMAGE_FORMAT, &df, sizeof(vx_df_image));
rect.start_x = 0;
rect.start_y = 0;
rect.end_x = width;
rect.end_y = height;
status = vxMapImagePatch(image,
&rect,
0,
&map_id1,
&image_addr1,
&data_ptr1,
VX_READ_ONLY,
VX_MEMORY_TYPE_HOST,
VX_NOGAP_X
);
if (status != VX_SUCCESS)
{
printf("# ERROR: vxMapImagePatch failed\n");
}
rect.end_y = height/2;
status = vxMapImagePatch(image,
&rect,
1,
&map_id2,
&image_addr2,
&data_ptr2,
VX_READ_ONLY,
VX_MEMORY_TYPE_HOST,
VX_NOGAP_X
);
if (status != VX_SUCCESS)
{
printf("# ERROR: vxMapImagePatch failed\n");
}
if(status==VX_SUCCESS)
{
FILE *fp = fopen(filename,"wb");
if(fp!=NULL)
{
vx_uint32 ret = 0;
num_bytes = image_addr1.dim_y * image_addr1.stride_y;
ret = fwrite(data_ptr1, sizeof(vx_uint8), num_bytes, fp);
if(ret!=num_bytes)
{
printf("# ERROR: Unable to write data to file [%s], ret = %d, num_bytes = %d\n", filename, ret, num_bytes);
}
num_bytes = image_addr2.dim_y * image_addr2.stride_y;
ret = fwrite(data_ptr2, sizeof(vx_uint8), num_bytes, fp);
if(ret!=num_bytes)
{
printf("# ERROR: Unable to write data to file [%s], ret = %d, num_bytes = %d\n", filename, ret, num_bytes);
}
fclose(fp);
}
else
{
printf("# ERROR: Unable to open file for writing [%s]\n", filename);
status = VX_FAILURE;
}
vxUnmapImagePatch(image, map_id1);
vxUnmapImagePatch(image, map_id2);
}
}
else
{
printf("# ERROR: Invalid image specified for writing\n");
}
return status;
}
以上是保存图像部分。
尊敬的 Damon:
您可以尝试使用最新的 SDK 版本 11.00 吗?
此致、
Gokul
尊敬的 Damon:
当在另一个 Linux 终端中运行您的应用时、
#!/bin/bash BASE_ADDRESS=0x04af0000 for (( i=$BASE_ADDRESS; i< ($BASE_ADDRESS + 588) ; i+=4 )); do # Commands to be executed echo "Reading register at $i:" devmem2 "$i" done
这将转储写回 PIPE 寄存器。
此致、
Gokul
您好、Gokul、
这是分辨率为 2560 * 1440 且格式为 RGBX 的图像。
此致、
Damon