工具/软件:
您好、TI 专家、
遵循此主题、如下所示:
我已将 enable_CSITX_output.patch 的补丁移植到 TDA4AEN。
但我发现这个平台没有 M2M 节点。
那么、它是否支持 TDA4AEN 中的函数"csitx 输出而不是 DSS 输出"?
谢谢、
YL
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.
工具/软件:
您好、TI 专家、
遵循此主题、如下所示:
我已将 enable_CSITX_output.patch 的补丁移植到 TDA4AEN。
但我发现这个平台没有 M2M 节点。
那么、它是否支持 TDA4AEN 中的函数"csitx 输出而不是 DSS 输出"?
谢谢、
YL
您好、Brijesh、
根据 ">e2e.ti.com/.../faq-tda4vm-enable-csi-tx-output-instead-of-dss-output-in-the-capture-demos-of-vision_apps"的补丁,我们已经实现了函数从 csirx 节点接收格式为 YUV422的图像。
因此、我们将使用与 YUV422相同的映像格式来实现 CSITx 节点连续性。
顺便说一句,如果它不支持在 tda4aen 平台上的 M2M 节点,是唯一一个方式解决方案,即 nv12的映像格式直接传输到 csitx 节点而不是 M2M 节点?
谢谢、
YL
您好、Brijesh、
我检查了 CSITx 器件的代码。
csitx 似乎对图像格式有限制。
那么、NV12的映像格式在 csitx 上是否不支持?
因为我已经检查了以 NV12映像格式使用的 VISS 和 LDC 来进行处理。
理想路径使用 NV12的映像格式在 csitx 节点上传输。
您能帮助我检查一下吗?
static vx_status VX_CALLBACK tivxAddKernelCsitxValidate(vx_node node, const vx_reference parameters[ ], vx_uint32 num, vx_meta_format metas[]) { vx_status status = (vx_status)VX_SUCCESS; vx_user_data_object configuration = NULL; vx_object_array input = NULL; vx_char configuration_name[VX_MAX_REFERENCE_NAME]; vx_size configuration_size, input_num_items; vx_reference obj_arr_element; vx_df_image img_fmt; vx_enum ref_type; if ( (num != TIVX_KERNEL_CSITX_MAX_PARAMS) || (NULL == parameters[TIVX_KERNEL_CSITX_CONFIGURATION_IDX]) || (NULL == parameters[TIVX_KERNEL_CSITX_INPUT_IDX]) ) { status = (vx_status)VX_ERROR_INVALID_PARAMETERS; VX_PRINT(VX_ZONE_ERROR, "One or more REQUIRED parameters are set to NULL\n"); } if ((vx_status)VX_SUCCESS == status) { configuration = (vx_user_data_object)parameters[TIVX_KERNEL_CSITX_CONFIGURATION_IDX]; input = (vx_object_array)parameters[TIVX_KERNEL_CSITX_INPUT_IDX]; } /* PARAMETER ATTRIBUTE FETCH */ if ((vx_status)VX_SUCCESS == status) { tivxCheckStatus(&status, vxQueryUserDataObject(configuration, (vx_enum)VX_USER_DATA_OBJECT_NAME, &configuration_name, sizeof(configuration_name))); tivxCheckStatus(&status, vxQueryUserDataObject(configuration, (vx_enum)VX_USER_DATA_OBJECT_SIZE, &configuration_size, sizeof(configuration_size))); tivxCheckStatus(&status, vxQueryObjectArray(input, (vx_enum)VX_OBJECT_ARRAY_NUMITEMS, &input_num_items, sizeof(input_num_items))); } /* PARAMETER CHECKING */ if ((vx_status)VX_SUCCESS == status) { if ((configuration_size != sizeof(tivx_csitx_params_t)) || (strncmp(configuration_name, "tivx_csitx_params_t", sizeof(configuration_name)) != 0)) { status = (vx_status)VX_ERROR_INVALID_PARAMETERS; VX_PRINT(VX_ZONE_ERROR, "'configuration' should be a user_data_object of type:\n tivx_csitx_params_t \n"); } } if ((vx_status)VX_SUCCESS == status) { obj_arr_element = vxGetObjectArrayItem(input, 0); if (NULL != obj_arr_element) { tivxCheckStatus(&status, vxQueryReference(obj_arr_element, (vx_enum)VX_REFERENCE_TYPE, &ref_type, sizeof(ref_type))); if ((vx_status)VX_SUCCESS == status) { if ( (TIVX_TYPE_RAW_IMAGE != ref_type) && ((vx_enum)VX_TYPE_IMAGE != ref_type) ) { status = (vx_status)VX_ERROR_INVALID_PARAMETERS; VX_PRINT(VX_ZONE_ERROR, "input object array must contain either TIVX_TYPE_RAW_IMAGE or VX_TYPE_IMAGE \n"); } else if ((vx_enum)VX_TYPE_IMAGE == ref_type) { tivxCheckStatus(&status, vxQueryImage((vx_image)obj_arr_element, (vx_enum)VX_IMAGE_FORMAT, &img_fmt, sizeof(img_fmt))); /* image limitation??? */ if (((vx_df_image)VX_DF_IMAGE_RGBX != img_fmt) && ((vx_df_image)VX_DF_IMAGE_U16 != img_fmt) && ((vx_df_image)VX_DF_IMAGE_UYVY != img_fmt) && ((vx_df_image)VX_DF_IMAGE_YUYV != img_fmt)) { status = (vx_status)VX_ERROR_INVALID_PARAMETERS; VX_PRINT(VX_ZONE_ERROR, "image format is invalid \n"); } } else { /* do nothing */ } } else { VX_PRINT(VX_ZONE_ERROR, "query 'input' object array reference failed \n"); } vxReleaseReference(&obj_arr_element); } else { status = (vx_status)VX_ERROR_INVALID_PARAMETERS; VX_PRINT(VX_ZONE_ERROR, "'input' object array elements are NULL \n"); } } return status; }
谢谢、
YL
您好、Brijesh、
感谢您的答复。
按照以下命令操作:补丁删除显示节点、改为添加一个 Display M2M 节点(将 DATA_FORMAT 从 NV12转换为 YUV422)、然后 YUV422图像通过 CSI-TX 实例0发送到 CSI-TX 节点。
我们需要使用 M2M 节点将 DATA_FORMAT 从 NV12转换为 YUV422、对吗?
如果它没有 M2M 节点、如何将 DATA_FORMAT 从 NV12转换为 YUV422?
谢谢、
YL
您好、Brijesh、
我们的传感器输出 MIPI RAW 12、然后处理到 VISS 节点和 LDC 节点。
我们希望将 LDC 输出到 CSITx。
在单摄像头应用设计中、LDC OUT 的图像格式为 NV12。
在此补丁中、它使用 M2M 节点从 NV12转换 YUV422。
但在 TDA4AEN 平台中、它没有 M2M 节点来执行这种转换映像格式。
那么、您是否想将 NV12的映像格式转换为 YUV422?
谢谢、
YL
您好、Brijesh、
在 APP_CREATE_LDC 的函数中、我们能否将 obj->LDC_OUT 的图像格式从 Vx_DF_image_NV12更改为 Vx_DF_image_UYVY?
/* NV12格式的 LDC 输出图像*/
obj->LDC_out = vxCreateImage (obj->context、
obj->table_width、obj->table_height、
Vx_DF_IMAGE_NV12);
谢谢、
YL
您好、Brijesh、
感谢您的答复。
我已在 viss 和 LDC 节点上将图像格式的配置设置为 YUV422、将数据类型设置为 Vx_DF_image_UYVY。
但在 LDC 至 CSITX 部分、我不知道哪个函数可以将图像从 LDC_OUT_IMAGE 复制到 csitx_image_arr。
您能帮助我们建议哪个函数可以覆盖此代码吗?
vx_image ldc_out_image = NULL; if (obj->ldc_enable) { APP_PRINTF("Enabling LDC\n"); status = app_create_ldc(obj, ldc_in_image); if(status == VX_SUCCESS) { status = vxSetNodeTarget(obj->node_ldc, VX_TARGET_STRING, TIVX_TARGET_VPAC_LDC1); } else { APP_PRINTF("app_create_ldc returned error\n"); return status; } if(status == VX_SUCCESS) { status = tivxSetNodeParameterNumBufByIndex(obj->node_ldc, 7u, obj->num_cap_buf); } ldc_out_image = obj->ldc_out; } else { ldc_out_image = ldc_in_image; } APP_PRINTF("Enabling DSS_M2M\n"); obj->csitx_input_image = vxCreateImage(obj->context, obj->width_in, obj->height_in, VX_DF_IMAGE_UYVY); status = vxGetStatus((vx_reference)obj->csitx_input_image); if(status != VX_SUCCESS) { APP_PRINTF("fail to create obj->csitx_input_image\n"); } else { APP_PRINTF("success to create obj->csitx_input_image\n"); } obj->csitx_image_arr = vxCreateObjectArray(obj->context, (vx_reference)obj->csitx_input_image, num_capture_frames); status = vxGetStatus((vx_reference)obj->csitx_image_arr); if(status != VX_SUCCESS) { APP_PRINTF("fail to create obj->csitx_image_arr\n"); } else { APP_PRINTF("success to create obj->csitx_image_arr\n"); } obj->display_m2m_output_image = (vx_image)vxGetObjectArrayItem(obj->csitx_image_arr, 0); status = vxGetStatus((vx_reference)obj->display_m2m_output_image); if(status != VX_SUCCESS) { APP_PRINTF("fail to get obj->display_m2m_output_image\n"); } else { APP_PRINTF("success to get obj->display_m2m_output_image\n"); } #if 0 obj->display_m2m_param_obj = vxCreateUserDataObject(obj->context, "tivx_display_m2m_params_t", sizeof(tivx_display_m2m_params_t), &obj->display_m2m_params); status = vxGetStatus((vx_reference)obj->display_m2m_param_obj); if(status != VX_SUCCESS) { APP_PRINTF("fail to create obj->display_m2m_param_obj\n"); } else { APP_PRINTF("success to create obj->display_m2m_param_obj\n"); } obj->displaym2mNode = tivxDisplayM2MNode(obj->graph, obj->display_m2m_param_obj, ldc_out_image, obj->display_m2m_output_image); /* replicate displaym2m_output so that framework created buffer for the object array, because csitx node uses object array as input */ vx_bool replicate[] = {vx_false_e, vx_false_e, vx_true_e}; vxReplicateNode(obj->graph, obj->displaym2mNode, replicate, 3); if(status == VX_SUCCESS) { status = vxSetNodeTarget(obj->displaym2mNode, VX_TARGET_STRING, TIVX_TARGET_DISPLAY_M2M1); } if(status == VX_SUCCESS) { status = tivxSetNodeParameterNumBufByIndex(obj->displaym2mNode, 2u, obj->num_cap_buf); } #endif /* CSI-TX */ { obj->csitx_node = tivxCsitxNode(obj->graph, obj->csitx_config, obj->csitx_image_arr); vxSetNodeTarget(obj->csitx_node, VX_TARGET_STRING, TIVX_TARGET_CSITX2); }
谢谢、
YL
您好、Brijesh、
我在互联网中查看了一些信息、它是否会如下修改、可以从 LDC 到 CSITX?
请帮助确认、谢谢。
YL
vx_image ldc_out_image = NULL; if (obj->ldc_enable) { APP_PRINTF("Enabling LDC\n"); status = app_create_ldc(obj, ldc_in_image); if(status == VX_SUCCESS) { status = vxSetNodeTarget(obj->node_ldc, VX_TARGET_STRING, TIVX_TARGET_VPAC_LDC1); } else { APP_PRINTF("app_create_ldc returned error\n"); return status; } if(status == VX_SUCCESS) { status = tivxSetNodeParameterNumBufByIndex(obj->node_ldc, 7u, obj->num_cap_buf); } ldc_out_image = obj->ldc_out; } else { ldc_out_image = ldc_in_image; } /* please help to check */ obj->csitx_image_arr = vxCreateObjectArray(obj->context, (vx_reference)ldc_out_image, num_capture_frames); /* CSI-TX */ { obj->csitx_node = tivxCsitxNode(obj->graph, obj->csitx_config, obj->csitx_image_arr); vxSetNodeTarget(obj->csitx_node, VX_TARGET_STRING, TIVX_TARGET_CSITX2); }
尊敬的 YL:
不、很可能这不起作用。 您正在 对 LDC 输出和 CSITX 输入使用不同的图像。
而不是这个、
-如果未复制 LDC 节点,可以创建大小为1的对象数组。
-然后在这个对象数组的 index1处获取图像
-使用此图像创建 LDC 节点
-并使用此对象阵列作为 CSITX 节点的输入。
-您可以使用 tivxSetNodeParameterNumBufByIndex 增加 LDC 输出的缓冲区深度。
此致、
Brijesh
您好、Brijesh、
感谢您的答复。
您是否意味着我需要实施复制映像节点(如 M2M 节点)?
下面的代码可以正常工作、这是正确的吗?
obj->display_m2m_output_image = (vx_image)vxGetObjectArrayItem(obj->csitx_image_arr, 0); status = vxGetStatus((vx_reference)obj->display_m2m_output_image); if(status != VX_SUCCESS) { APP_PRINTF("fail to get obj->display_m2m_output_image\n"); } else { APP_PRINTF("success to get obj->display_m2m_output_image\n"); } /* implement copy image node to instead of below? */ obj->display_m2m_param_obj = vxCreateUserDataObject(obj->context, "tivx_display_m2m_params_t", sizeof(tivx_display_m2m_params_t), &obj->display_m2m_params); status = vxGetStatus((vx_reference)obj->display_m2m_param_obj); if(status != VX_SUCCESS) { APP_PRINTF("fail to create obj->display_m2m_param_obj\n"); } else { APP_PRINTF("success to create obj->display_m2m_param_obj\n"); } obj->displaym2mNode = tivxDisplayM2MNode(obj->graph, obj->display_m2m_param_obj, ldc_out_image, obj->display_m2m_output_image); /* replicate displaym2m_output so that framework created buffer for the object array, because csitx node uses object array as input */ vx_bool replicate[] = {vx_false_e, vx_false_e, vx_true_e}; vxReplicateNode(obj->graph, obj->displaym2mNode, replicate, 3); if(status == VX_SUCCESS) { status = vxSetNodeTarget(obj->displaym2mNode, VX_TARGET_STRING, TIVX_TARGET_DISPLAY_M2M1); } if(status == VX_SUCCESS) { status = tivxSetNodeParameterNumBufByIndex(obj->displaym2mNode, 2u, obj->num_cap_buf); }