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.

[参考译文] TDA4VEN-Q1:如何在不同 tiovx 图之间高效传输图像数据

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1641445/tda4ven-q1-how-to-efficiently-transfer-image-data-between-different-tiovx-graphs

器件型号: TDA4VEN-Q1
Thread 中讨论的其他器件: TDA4VH

尊敬的 TI 专家:

我们在 TDA4VEN 11.01 SDK 上构建了 tiovx 应用

目标: 如何在不同 tiovx 图之间高效传输图像数据

背景: 

流水线的设计如下:

 

主流水线对延迟和帧速率 (~60fps) 有极高的要求、而多个子流水线(TIDL 节点,自定义节点)的输出处理时间约在 50ms 至 300ms 之间。

为了满足主流水线的帧速率和延迟要求、 我们计划将主流水线和子流水线放置在不同 tiovx 图中。 然后、我们在 edgeai-tiovx-apps app_tiovx_linux_multi_graph_test.c 中发现了一个示例

/*
     * Note that in below loop graph on and 2 are running sequentially
     * to run them in parellel, you need to decuple them by creating
     * seperate threads for enqueue/dequeue of each graph
     */
    for (int i = 0; i < APP_NUM_ITERATIONS; i++) {
        //Graph1 Execution
        inbuf1 = v4l2_decode_dqueue_buf(v4l2_decode_handle);
        outbuf1 = tiovx_modules_acquire_buf(out_buf_pool1);
        tiovx_modules_enqueue_buf(inbuf1);
        tiovx_modules_enqueue_buf(outbuf1);
        inbuf1 = tiovx_modules_dequeue_buf(in_buf_pool1);
        outbuf1 = tiovx_modules_dequeue_buf(out_buf_pool1);
        v4l2_decode_enqueue_buf(v4l2_decode_handle, inbuf1);

        //Graph2 Execution
        inbuf2 = tiovx_modules_acquire_buf(in_buf_pool2);
        outbuf2 = tiovx_modules_acquire_buf(out_buf_pool2);
        //Swap input2 mem with output1 to feed graph1 out to graph2
        tiovx_modules_buf_swap_mem(outbuf1, inbuf2);
        tiovx_modules_release_buf(outbuf1);
        tiovx_modules_enqueue_buf(inbuf2);
        tiovx_modules_enqueue_buf(outbuf2);
        inbuf2 = tiovx_modules_dequeue_buf(in_buf_pool2);
        outbuf2 = tiovx_modules_dequeue_buf(out_buf_pool2);
        kms_display_render_buf(kms_display_handle, outbuf2);
        tiovx_modules_release_buf(inbuf2);
        tiovx_modules_release_buf(outbuf2);
    }

但此处使用的 tiovx_modules_buf_swap_mem () 方法无法解决我的问题。 由于 WebNode 的输出缓冲区将用于服务器输出管道,其中一个管道使用缓冲区,而另一个不能同时使用。

似乎一种可行的方法是通过为每个流水线进行复制来创建一个单独的缓冲区。 但是、由于图像数据非常大、并且我们的子流水线数量可能会增加、这种复制过程会导致大量 CPU 消耗。

因此、我们想问 TI 的专家对于这个问题是否有好的建议?

此致、

Jialin

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

    尊敬的 Jialin:

    主流水线对延迟和帧速率 (~60fps) 有极高的要求、而多个子流水线(TIDL 节点,自定义节点)的输出处理时间约在 50ms 至 300ms 之间。

    如果另一个流水线需要 50ms、您可能无法以 60fps 的速率运行主图、因此您可以将辅助流水线的 fps 降低到 30fps、并以 60fps 的速率运行主流水线。

    为此,您必须将图形分成 3 个图形,并管理缓冲区的排队/出队,从 viss 节点到第二个图形的 LDC 节点(主管道)和第三个图形的自定义节点。

    仅将奇数帧排队到第 3 个图、并将所有帧排队到第 2 个图、这样您就可以实现以不同的 fps 运行这些图。

    我将分享一些补丁以供参考、

    e2e.ti.com/.../8877.avp4_5F00_3_5F00_graphs.patch 修改了 avp4 演示、将演示拆分为 3 个图、并在没有存储器副本的情况下管理图形之间的排队/出队、本演示不会在 tda4aen 上运行、仅供参考。 如果仍要运行演示、则使用 TDA4AL 或 TDA4VH。

    e2e.ti.com/.../2502.avp4_5F00_15_5F00_30_5F00_srv_5F00_ldc_5F00_parallel_5F00_execution.patch 该补丁修改了 avp4 演示、以不同的 fps 运行 2 个不同的图形。

    此致、
    Gokul