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.

[参考译文] TDA4AEN-Q1:M2M 节点是否支持 TDA4AEN 平台?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1514872/tda4aen-q1-does-the-m2m-node-support-the-tda4aen-platform

器件型号:TDA4AEN-Q1

工具/软件:

您好、TI 专家、

遵循此主题、如下所示:

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1306674/faq-tda4vm-enable-csi-tx-output-instead-of-dss-output-in-the-capture-demos-of-vision_apps

我已将 enable_CSITX_output.patch 的补丁移植到 TDA4AEN。

但我发现这个平台没有 M2M 节点。

那么、它是否支持 TDA4AEN 中的函数"csitx 输出而不是 DSS 输出"?


谢谢、

YL

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

    尊敬的 YL:

    您 DSS M2M 节点吗? 那么否、TDA4AEN 器件不支持此节点。  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的答复。

    那么、您是否有任何想法的 CSI Rx 到 CSI TX 解决方案?

    谢谢、

    YL

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

    尊敬的 YL:

    但为什么需要 DSS M2M 节点呢? 这是否用于某些颜色转换? 哪种颜色转换?  

    此致、

    Brijesh

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

    您好、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

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

    尊敬的 YL:

    是、CSITX 不支持 NV12输出格式。  

    但为什么 需要输出 NV12格式?  

    您可以改用 YUV422格式吗? VISS 可以支持输出 YUV422格式。  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的答复。

    按照以下命令操作:补丁删除显示节点、改为添加一个 Display M2M 节点(将 DATA_FORMAT 从 NV12转换为 YUV422)、然后 YUV422图像通过 CSI-TX 实例0发送到 CSI-TX 节点。

    我们需要使用 M2M 节点将 DATA_FORMAT 从 NV12转换为 YUV422、对吗?

    如果它没有 M2M 节点、如何将  DATA_FORMAT 从 NV12转换为 YUV422?

    谢谢、

    YL

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

    尊敬的 YL:

    但哪个组件输出 NV12数据? 我们是否可以将该元件更改为直接输出 YUV422数据?  

    此致、

    Brijesh

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

    您好、Brijesh、

    我们的传感器输出 MIPI RAW 12、然后处理到 VISS 节点和 LDC 节点。

    我们希望将 LDC 输出到 CSITx。

    在单摄像头应用设计中、LDC OUT 的图像格式为 NV12。

    在此补丁中、它使用 M2M 节点从 NV12转换 YUV422。

    但在 TDA4AEN 平台中、它没有 M2M 节点来执行这种转换映像格式。

    那么、您是否想将 NV12的映像格式转换为 YUV422?

    谢谢、

    YL

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

    尊敬的 YL:

    是否使用 LDC 进行失真校正? 如果没有、我们是否可以绕过 VISS 输出并将其直接连接到 CSITX? VISS 可以支持 YUV422输出 格式。  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的答复。

    是的,我们的产品应该在 LDC 功能加工,因为我们的镜头是超宽的,它有失真。

    那么、这是 LDC 器件的限制吗? 因为它只是输出 NV12、所以不能输出 YUV422?

    如果是、LDC 的 M2M 节点设计、因为它仅在 NV12上输出?

    谢谢、

    YL

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

    尊敬的 YL:

    是的、LDC 将在 NV12上输出、这意味着我们需要一些其他机制来将此数据转换为 YUV422。 您是否可以使用 A53 NEON 指令将其转换为 YUV422?  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的支持。

    您能帮助提供这方面的测试补丁吗?

    A53 NEON 代替 M2M 节点。

    在当前补丁中、它使用 tiovx 库来执行 LDC 的链接流水线-> M2M -> CSITX。

    A53 NEON 很难覆盖 M2M。

    谢谢、

    YL

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

    尊敬的 YL:

    TDA4AEN 器件上没有可用的 DSS M2M 节点、因此除了使用 A53 Neon 指令转换此格式之外、我看不到任何其他选项。  

    此致、

    Brijesh

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

    您好、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

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

    尊敬的 YL:

    否、LDC 不支持 YUV422输出格式、但我要再次确认。  

    此致、

    Brijesh

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

    尊敬的 YL:

    LDC 可以支持 YUV422输出格式、因此可以将 LDC 输出直接连接到 CSITX。  

    此致、

    Brijesh  

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

    您好、Brijesh、

    感谢您的答复。

    因此、如果我们希望 LDC 输出  Vx_DF_IMAGE_UYVY 的图像格式、是否应更改 VISS 以设置 Vx_DF_IMAGE_UYVY 的图像格式?

    如果可以的话, CSITX 将会工作,是正确的吗?

    谢谢、

    YL

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

    尊敬的 YL:

    即使 VISS 也支持 YUV422格式、因此请更改 VISS 和 LDC 的输出格式 、然后才能将它们连接到 CSITX。  

    此致、

    Brijesh

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

    您好、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);
    }

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

    尊敬的 YL:

    是的、这是正确的机制。  

    此致、

    Brijesh

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

    您好、Brijesh、

    我们解决了此问题、请在调试日志前忽略。

    谢谢、

    YL

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

    谢谢 YL、有关该主题的任何其他问题?  

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

    您好、Brijesh、

    我认为现在没有问题。

    谢谢、

    YL

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

    谢谢、关闭本主题。