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.

[参考译文] TDA4VH-Q1:自定义用户内核中的输入参数类型无效

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1530138/tda4vh-q1-invalid-type-of-input-parameter-in-custom-user-kernel

器件型号:TDA4VH-Q1

工具/软件:

您好、

SDK 版本:11.00.00.06

我正在创建一个自定义用户内核、其中输入是对象数组、输出是用户数据类型对象。 我在输入中传递对象数组类型、但当图形开始运行时、会显示如下警告:

   101.140033 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.174028 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.207621 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.241572 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.275346 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.309431 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.343840 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.381229 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.419198 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.457317 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063
   101.479048 s:  VX_ZONE_WARNING: [ownNodeUserKernelExecute:1085] node custom_node param index 0 not match, expect type 2067, get 2063

代码片段如下:

内核注册功能

/* Kernel registration */
vx_status obj_arr_copy_kernel_register(vx_context context)
{
    vxAllocateUserKernelId(context, &g_kernel_id);
    vx_kernel kernel = vxAddUserKernel(
        context,
        (vx_char *)OBJ_ARR_COPY_KERNEL_NAME,
        g_kernel_id, // Unique kernel ID
        obj_arr_copy_process,
        OBJ_ARR_COPY_KERNEL_MAX_PARAMS, // 2 parameters
        obj_arr_copy_validate,
        NULL, NULL);
    if (!kernel)
        return VX_ERROR_NO_MEMORY;

    /*Add both input and output parameters*/
    vxAddParameterToKernel(kernel, OBJ_ARR_COPY_KERNEL_IN_IDX, VX_INPUT, VX_TYPE_OBJECT_ARRAY, VX_PARAMETER_STATE_REQUIRED);
    vxAddParameterToKernel(kernel, OBJ_ARR_COPY_KERNEL_OUT_IDX, VX_OUTPUT, VX_TYPE_USER_DATA_OBJECT, VX_PARAMETER_STATE_REQUIRED);

    return vxFinalizeKernel(kernel);
}

创建节点:

// API to create a TIOVX graph node for this kernel
vx_node obj_arr_copy_node(vx_graph graph, vx_object_array in, vx_user_data_object out)
{
    if (!graph || !in || !out)
    {
        printf("Invalid input to obj arr copy node creation api\n");
        return NULL;
    }
    vx_reference refs[] = {(vx_reference)in, (vx_reference)out};

    vx_node node = tivxCreateNodeByKernelEnum(graph,
                                              g_kernel_id,
                                              refs, sizeof(refs) / sizeof(refs[0]));

    if (!node)
        return NULL;

    return node;
}

调用节点 API:

/*Create custom node*/
custom_obj->node = obj_arr_copy_node(graph, in_arr, custom_obj->output_obj);
if (!custom_obj->node)
{
    GEN3_DBG_PRINTF_ERR("Failed to create custom node\n");
}

此处的“in_arr"是“是 VX 对象数组类型。 我已经通过使用 API vxQueryReference () 打印引用类型来进行检查,以获取引用类型,并且它正在打印 enum : 2067(VX 对象数组类型)。

我已将此检查放入内核验证函数、并且也通过了此检查、但当图形开始运行时、内核的进程函数会发出上述警告。 不知道问题在哪里,请建议。

FYI:当前输入对象数组只有一个元素。

谢谢。此致、

Lalit

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

    您好 Lalit、

    是否可以使用 tivxExportGraphToDot() 将图形导出为点输出并与我共享点输出文件?

    此致、
    Gokul

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

    尊敬的 Gokul:  

    以下是生成的文件。 让我知道你还需要从我这边。 此外、我如何解读这些文件以进行调试? 是否有相关文档?

    e2e.ti.com/.../class_5F00_v_5F00_ds_5F00_graph_5F00_dot_5F00_4_5F00_pipe0_5F00_img.txte2e.ti.com/.../class_5F00_v_5F00_ds_5F00_graph_5F00_dot_5F00_1_5F00_img.txt

     e2e.ti.com/.../class_5F00_v_5F00_ds_5F00_graph_5F00_dot_5F00_3_5F00_data_5F00_ref_5F00_q_5F00_img.txte2e.ti.com/.../class_5F00_v_5F00_ds_5F00_graph_5F00_dot_5F00_2_5F00_pipe_5F00_img.txt

    谢谢。此致、

    Lalit

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

    您好 Lalit、

    我想您将获取 scalar_node 的输出并将其作为自定义节点的输入。

    标量节点的输出是 vx_image 类型、您的 custom_node 将 obj_arr 作为输入。

    所以你会创建一个 object_arr 并把第 0 个元素分配给 scalar_node 的输出,我的理解是正确的吗?

    在这种情况下、即使 object_array 中有一个元素使其被复制、也必须复制 scalar_node 的输出参数、
    这应该可以解决您的问题。

    如果它没有解决,然后在修改后发送给我图形文件。

    在图形输出 3 中、您应该看到所有 4 个缓冲区都是 obj_arr、而不是 image_**。  
    这里、一个缓冲区是 obj_arr、其余缓冲区是 image 类型。

    我如何解释这些文件以便在我这边进行调试? 是否有相关文档?

    请参阅此链接、

    https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/tiovx/docs/user_guide/JPEG_TOOL.html

    此致、
    Gokul

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

    尊敬的 Gokul:

    因此、定标器节点总共具有 3 个输出、我将 第三个 输出用于自定义节点、前两个输出用于其他位置。 我能否仅复制第三个 标量输出而不复制 前 两个标量? 有可能吗?

    谢谢。此致、

    Lalit

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

    您好 Lalit、

    只要 object_arr 有一个元素、仅复制第三个标量输出。

    此致、
    Gokul

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

    尊敬的 Gokul:  

    它在执行复制后工作正常。 我对何时应该进行复制和何时不应该进行复制感到有点困惑。  

    我的理解是、如果输入对象数组有多个元素、则需要复制节点。 原始节点在第一个元素上工作、复制节点在后续元素上工作。 我的理解是否正确?

    我又进行了一个测试、在复制缩放器输出时将内核输入更改为 vx_image(因为物镜 arr 仅具有一个映像)。 这次它给出了错误“预期 2063 但得到 2067 错误“。 这是否意味着复制正在将标量输出从 vx_image 转换为 vx_object_array 类型? 请澄清。

    谢谢。此致、

    Lalit

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

    您好 Lalit、

    由于标量节点提供作为映像类型的输出、而 custom_nodes 消耗整个 object_arr、因此框架仅在内部分配类型为 vx_image 的缓冲区、而不是 obj_arr。 因此、我们指定 replicate 选项、以便它为 object_arr 分配内存。

    那么、这是否意味着复制正在将标量输出从 vx_image 转换为 vx_object_array 类型

    它不转换数据类型、用于在内部分配 obj_arr 类型的缓冲区  

    在这种情况下、只有一个缓冲区创建为 obj_arr、而其他缓冲区创建为 image。

    因此、当节点将输出作为映像、然后消耗整个 object_arr 时、必须为该参数设置复制。

    此致、
    Gokul

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

    尊敬的 Gokul:

    感谢您的澄清。 我现在很清楚。  

    此致

    Lalit