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.

[参考译文] TDA4VE-Q1:DisplayM2M 节点是否支持分辨率为 2560 * 1440 的图像格式转换?

Guru**** 2439560 points
Other Parts Discussed in Thread: TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1537205/tda4ve-q1-does-the-displaym2m-node-support-image-format-conversion-with-a-resolution-of-2560-1440

器件型号:TDA4VE-Q1
Thread:TDA4VM 中讨论的其他器件

工具/软件:

您好:

0901 之间进行配置。

我想在使用 displayM2M 节点时将 2560 * 1440 RGBX 格式的图像转换为 NV12、但转换后的图像中会出现以下问题。 请您帮助我分析原因?

原始图像:

转换后的图像:

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

    您好、

    这是重复的问题吗?

    此致、
    Tanmay

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

    我使用的平台是 TDA4VE、我在 TDA4VM 上犯了一个错误、但我不知道如何删除前一个平台、因此我不得不再次提出这个问题。

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

    嗨、Damon

    您使用什么应用程序来测试 dispm2m 色彩转换?

    此致、

    Adam

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

    尊敬的 Damon:

    您能否与配置值共享图形创建部分、以及如何保存图像?

    此致、
    Gokul

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

    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;
    }
    

    上面是图形创建部分。

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

    您好、Adam

    我们使用自定义应用程序进行测试。 这里是否有演示供我们测试?

    谢谢你。

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

    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:

    您可以尝试此测试程序 video_IO/kernels/video_IO/test/test_display_m2m.c 吗?

    在/opt/vision_apps 下运行./vx_app_conformance_video_io.out --filter=tivxVideoIODisplayM2M*

    此致、

    Adam

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

    您好、Adam

    我已经测试了这个程序,结果如下。

    在修改分辨率之前、程序可以正常运行

    此致、

    Damon

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

    尊敬的 Damon:

    您能否请在最新的 SDK 中检查一次、我们在 9.1 上看到了更高分辨率的一些问题。

    此致、
    Gokul

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

    您好、Gokul、

    我使用的是 SDK 版本 0901。 您是否有任何适用于我们的更新版本?

    此致、

    Damon

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

    尊敬的 Damon:

    您可以尝试使用最新的 SDK 版本 11.00 吗?

    https://dr-download.ti.com/software-development/software-development-kit-sdk/MD-50weZVBfzl/11.00.00.06/ti-processor-sdk-rtos-j721s2-evm-11_00_00_06.tar.gz

    此致、
    Gokul

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

    您好、Gokul、

    我们没有此 TDA4 VE 演示板的硬件。 我如何验证它、 或者您是否有任何其他解决方案来验证?

    此致、

    Damon

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

    尊敬的 Damon:

    我们没有此 TDA4 VE 演示板的硬件

    您应该拥有一个 EVM 吗? 或者是您已使用 SDK 版本 9.0 进行测试的定制板。

    您能在这里分享您的输入图像、以便我在找到一些时间后可以在此处试用设置吗?

    此致、
    Gokul

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

    您好、Gokul、

    您提供的 SDK 11.00 是否可以 在 EVM 上运行?  请向我提供一封电子邮件、以便我可以向您发送 RGBX 格式的图像。 似乎不支持以这种格式上传图像。

    此致、

    Damon

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

    尊敬的 Damon:

    是的、它将在 EVM 上运行、是最新的 SDK 版本。

    您是否可以将其添加到.zip 文件中并上传它?

    此致、
    Gokul

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

    您好、Gokus、

    我曾尝试在 EVM 电路板上运行 SDK 程序、但发现无法启动。 我再次尝试在自己的 0901ve 板上运行我们的程序、发现当分辨率宽度大于 2048 时、当 displayM2MNode 的输出图像格式设置为 NV12 时会出现异常情况(当输出格式设置为 yuyv 时这是正常现象)。 你能给我更多的建议?

    此致、

    Damon

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

    尊敬的 Damon:

    您能共享写回管道寄存器转储、  

    从地址 (0x4af0000UL) 并直到此结构的大小、

    此致、
    Gokul

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

    您好、Gokul、

    我不明白您的意思。 我是否应该使用任何工具来操作它或通过日志检查?

    谢谢、

    Damon

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

    尊敬的 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

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

    尊敬的 Damon:

    您是否正在将图像从输入裁剪到输出、以及是否可以共享您的输入和输出图像尺寸。

    此致、
    Gokul

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

    您好、Gokul、

    我的要求是将 Display M2M 的输出图像裁剪为 2 个部分、输入大小为 2560 * 1440、输出图像大小为 832 * 1,120,1568 * 1120。

    此致、

    Damon

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

    尊敬的 Damon:

    那么、您是否使用 2 个 displaym2m 节点? 带有 2 个不同的输出图像。 您为哪种情况发布的图片?

    此致、
    Gokul

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

    您还可以使用 832 * 1120 或 1568 * 1120 仅检查一个输出

    您共享的寄存器转储用于何种配置。

    此致、
    Gokul

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

    您好、Gokul、

    你误解了我的意思。 我将显示 M2M 节点下游的定标器节点用于裁剪。 对于显示 M2M 节点的输入和输出分辨率、它们都是 2560 * 1440、displayM2M 仅用于更改颜色格式 RGBX ->NV12

    此致、

    Damon

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

    好的、明白了、

    使用 1 个 displaym2m 节点转换颜色、输入和输出图像尺寸相同。

    我们看到两个寄存器 ( 0x04AF0208 和 0x04AF0210) 之间的值存在一些差异、这两个寄存器是输出和输入大小寄存器。 理想情况下、如果输入和输出大小相同、则这些值应该相同。 您能否检查 yuyv 输出是否这 2 个值相同?

    此致、
    Gokul

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

    您好、Gokul、

    结果如下。 请检查它。

    此致、

    Damon

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

    尊敬的 Damon:

    您可以将映像文件放入.zip 文件中并共享它吗?

    此致、
    Gokul

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

    您好、Gokul、

    这是分辨率为 2560 * 1440 且格式为 RGBX 的图像。

    e2e.ti.com/.../2437.test.rar

    此致、

    Damon

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

    尊敬的 Damon:

    让我从我这边尝试一下,然后回到你那里。

    此致、
    Gokul

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

    尊敬的 Damon:

    您可以在第 616-617 行 ti-processor-sdk-rtos-j721s2-evm-09_01_00_06/pdk_j721s2_09_01_00_22/packages/ti/csl/sypds/v4/priv/csl_dssWbPipe.c 中更改该文件吗 src

    从中导出:

    至、

    并重新编译 SDK。

    此致、
    Gokul

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

    您好、Gokul、

    进行此项修改后、输出图像正常。 该解决方案可以解决我的问题。

    谢谢、

    Damon

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

    尊敬的 Damon:

    我为该错误创建了一个 JIRA、并附加了用于内部跟踪 jira.itg.ti.com/.../PDK-18111 的链接
    此问题应在下一个 SDK 版本中得到修复。

    由于问题已解决、我将关闭此主题。

    此致、
    Gokul