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.

[参考译文] TDA4VM:LDC 节点分段故障

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1127248/tda4vm-ldc-node-segmentation-fault

器件型号:TDA4VM

您好!

我对 LDC 节点处理有疑问。 我使用 所附相关链接中提到的方法 为 IMX623摄像头生成我的网格 LUT 硬件版本。 我确保使用 与 IMX623相对应的正确规格文件。

我在此附上使用的输入图像,MATLAB 生成的网格 LUT ( mesh.txt )和相应的 DCC 工具生成的网格 LUT 硬件版本( IMX623_mesh_lut.txt )。  

e2e.ti.com/.../2100.mesh.txt   e2e.ti.com/.../IMX623_5F00_mesh_5F00_lut.txt   e2e.ti.com/.../Input_5F00_image.zip

我使用生成的 IMX623_mesh_LUT 作为 LDC 节点的 LUT。 下面是我们编写的用于自己应用的 LDC 节点。 当我在 EVM 上运行时、我在中遇到分段故障
(第40行) status = vxCopyImagePatch (mesh_img、&rect、0、ℑ Ω_addr、LDC_LUT、Vx_write_only、 vx_memory_type_host);

    void NodeGraphProcessing::lDCprocessing(vx_context context)
   {
    vx_status status = VX_SUCCESS;
    vx_image ldc_in_image = getInputImage();
    GraphBaseInfo graphBaseInfo = {getGraph(), getContext()};
    GraphNodeGenerator mGraphNodeGenerator(graphBaseInfo);
    GraphNodeCommon *GraphCommonNode = new GraphNodeCommon();
    vx_image mesh_img = NULL;
    vx_rectangle_t rect;
    vx_image ldc_out = NULL;
    uint32_t table_width, table_height;
    vx_imagepatch_addressing_t image_addr;
    vx_user_data_object mesh_params_obj;
    tivx_vpac_ldc_mesh_params_t mesh_params;
    tivx_vpac_ldc_region_params_t region_params;
    vx_user_data_object region_params_obj;
    tivx_vpac_ldc_params_t ldc_params;
    vx_user_data_object ldc_param_obj;
    vx_node node_ldc;

    table_width = (((1936 / (1 << 2)) + 1u) + 15u) & (~15u);
    table_height = ((1552 / (1 << 2)) + 1u);

    /* Mesh Image */
    mesh_img = vxCreateImage(context, table_width, table_height, VX_DF_IMAGE_U32);

    /* Copy Mesh table */
    rect.start_x = 0;
    rect.start_y = 0;
    rect.end_x = table_width;
    rect.end_y = table_height;

    image_addr.dim_x = table_width;
    image_addr.dim_y = table_height;
    image_addr.stride_x = 4u;
    image_addr.stride_y = table_width * 4u;

    if (status == VX_SUCCESS)
    {
        status = vxCopyImagePatch(mesh_img, &rect, 0, &image_addr,
                                  ldc_lut, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
        
    }

    if (VX_SUCCESS != status)
    {
        printf("Copy Image Failed\n");
    }

    ldc_out = vxCreateImage(context, 1936, 1552, (vx_df_image)VX_DF_IMAGE_NV12);
    
    /* Mesh Parameters */
    mesh_params_obj = vxCreateUserDataObject(context,
                                             "tivx_vpac_ldc_mesh_params_t", sizeof(tivx_vpac_ldc_mesh_params_t), NULL);
    memset(&mesh_params, 0, sizeof(tivx_vpac_ldc_mesh_params_t));

    tivx_vpac_ldc_mesh_params_init(&mesh_params);
    mesh_params.mesh_frame_width = 1936;
    mesh_params.mesh_frame_height = 1552;
    mesh_params.subsample_factor = 4;
    if (status == VX_SUCCESS)
    {
        status = vxCopyUserDataObject(mesh_params_obj, 0,
                                      sizeof(tivx_vpac_ldc_mesh_params_t), &mesh_params,
                                      VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
    }

    /* Block Size parameters */
    region_params_obj = vxCreateUserDataObject(context,
                                               "tivx_vpac_ldc_region_params_t", sizeof(tivx_vpac_ldc_region_params_t),
                                               NULL);
    region_params.enable = 1;
    region_params.out_block_width = 64;
    region_params.out_block_height = 32;
    region_params.pixel_pad = 1;
    if (status == VX_SUCCESS)
    {
        status = vxCopyUserDataObject(region_params_obj, 0,
                                      sizeof(tivx_vpac_ldc_region_params_t), &region_params,
                                      VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
    }

    /* LDC Configuration */

    tivx_vpac_ldc_params_init(&ldc_params);
    ldc_params.luma_interpolation_type = 1;

    ldc_param_obj = vxCreateUserDataObject(context,
                                           "tivx_vpac_ldc_params_t", sizeof(tivx_vpac_ldc_params_t), NULL);
    if (status == VX_SUCCESS)
    {
        status = vxCopyUserDataObject(ldc_param_obj, 0, sizeof(tivx_vpac_ldc_params_t),
                                      &ldc_params, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
    }

    vx_graph graph = getGraph();

    // change mesh_image to NULL and check
    node_ldc = tivxVpacLdcNode(graph, ldc_param_obj, NULL,
                               region_params_obj, mesh_params_obj,
                               mesh_img, NULL, ldc_in_image,
                               ldc_out, NULL);

    GraphCommonNode->setNode(node_ldc);

    if (status == VX_SUCCESS)
    {
        status = vxSetNodeTarget(node_ldc, VX_TARGET_STRING, TIVX_TARGET_VPAC_LDC1);
    }
    else
    {
        printf("app_create_ldc returned error \n");
    }

    setOutputImage(ldc_out);

    vx_uint32 outWidth, outHeight;
    vx_size outSize, inSize;
    vxQueryImage(ldc_out, VX_IMAGE_SIZE, &outSize, sizeof(vx_size));
    vxQueryImage(ldc_out, VX_IMAGE_WIDTH, &outWidth, sizeof(vx_uint32));
    vxQueryImage(ldc_in_image, VX_IMAGE_SIZE, &inSize, sizeof(vx_size));
    vxQueryImage(ldc_out, VX_IMAGE_HEIGHT, &outHeight, sizeof(vx_uint32));
    printf("Output image width: %d\n", outWidth);
    printf("Output image height: %d\n", outHeight);
    printf("Input image size: %ld bytes\n", inSize);
    printf("Output image size: %ld bytes\n", outSize);
}


我不能完全确定为什么这会在这里失败。 LUT 的生成方式是否存在故障,或者我是否在此处遗漏了某个内容? 您能不能建议进行任何更改或测试、我可以尝试对此进行调试?

谢谢你
-普拉希克沙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好  ,我是否可以就上述问题获得任何支持?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好

    我看到您正在将 LUT 指针传递给该 API。 该 LUT 是否有效并以正确的大小分配? 请您检查一下吗?  

    由于此 API vxCopyImagePatch 仅从 LUT 地址复制到图像缓冲区、因此如果 LUT 不起作用、则会在 Linux 上导致 SEG 故障。

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、LUT 有效。 我将其作为头文件附加、并将其包含在主代码中、如所示

    #include "LDC_LUT_1936x1552.h"
    静态 uint16_t LDC_LUT[]= LDC_LUT_1936_1552;

     e2e.ti.com/.../ldc_5F00_lut_5F00_1936x1552.h


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好

    根据我们与 Gang 的内部讨论、此问题已得到解决、因此关闭此 TT。  

    此致、

    Brijesh