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.

[参考译文] PROCESSOR-SDK-J721S2:有关当 tivxDisplayNode 仅用于 vxgraph 时如何设计 vxgraph 调度的问题

Guru**** 2483345 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1444808/processor-sdk-j721s2-qestion-about-how-to-design-vxgraph-schedule-when-tivxdisplaynode-only-used-in-vxgraph

器件型号:PROCESSOR-SDK-J721S2

工具与软件:

您好、TI 专家

我正在将应用程序建立在 vision_apps 中的"app_single_cam"基础上。

(https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/vision_apps/docs/user_guide/group_apps_basic_demos_app_single_cam.html#autotoc_md42)

我想将其分为两个过程:"捕获"过程和"显示"过程

我认为"捕获"过程有 CSI2-RX - VISS - LDC - (MSC)节点、可以将 VX 流水线调度设计设计为与"app_single_cam"相同

捕获过程发送  通过流水线更新的 vx_image 来显示节点过程、

但是、显示过程仅具有 DSS (tivxDisplayNode) 节点。

我是 tiovx 框架的初学者、 我不确定如何运行仅使用 TI5xDisplayNode 的 vxgraph。

总之、我尝试了 如下单元测试的显示过程演示(从我的来源中简化了)

// make vx_image
obj->source_img = tivx_utils_create_vximage_from_bmpfile(obj->context, filename, vx_false_e);


// connect display to source
obj->display_image = obj->source_img


// make display node
memset(&obj->display_params, 0, sizeof(tivx_display_params_t));
obj->display_params.opMode = TIVX_KERNEL_DISPLAY_ZERO_BUFFER_COPY_MODE;
obj->display_params.pipeId = 0;
obj->display_params.outHeight = 1080;
obj->display_params.outWidth = 1920;
obj->display_params.posX = 0;
obj->display_params.posY = 0;

obj->display_param_obj = vxCreateUserDataObject(obj->context, "tivx_display_params_t", sizeof(tivx_display_params_t), &obj->display_params);
obj->displayNode = tivxDisplayNode(obj->graph, obj->display_param_obj, obj->display_image);


// make gragh queue param
graph_parameters_queue_params_list[graph_parameter_num].graph_parameter_index = graph_parameter_num;
graph_parameters_queue_params_list[graph_parameter_num].refs_list_size = obj->num_buf;
graph_parameters_queue_params_list[graph_parameter_num].refs_list = (vx_reference*)&(obj->display_image);

tivxSetGraphPipelineDepth(obj->graph, 1);

vxSetGraphScheduleConfig(obj->graph,
                        VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
                        1,
                        graph_parameters_queue_params_list
                        );


// run gragh
// start enque
vxGraphParameterEnqueueReadyRef(obj->graph, 0, (vx_reference*)&(obj->display_image), 1);

// deque
vxGraphParameterDequeueDoneRef(obj->graph, 0, (vx_reference*)&test_image, 1, &num_refs_capture);
// re enque
vxGraphParameterEnqueueReadyRef(obj->graph, 0, (vx_reference*)&test_image, 1);

当该应用程序运行时、

图像在监视器中显示正确、但应用程序过程像这样挂起。

vxSetGraphScheduleConfig done
    79.032796 s:  VX_ZONE_INFO:[ownNodeKernelValidate:256] Validating kernel com.ti.display
    79.033254 s:  VX_ZONE_INFO:[ownNodeKernelInit:563] Calling create callback for node node_89
    79.034193 s:  VX_ZONE_INFO:[ownNodeKernelInit:583] Create callback for node node_89 completed
    79.034302 s:  VX_ZONE_INFO:[ownGraphNodeKernelInit:615] kernel init for node 0, kernel com.ti.display ...
    79.034316 s:  VX_ZONE_INFO:[ownGraphNodeKernelInit:626] kernel init for node 0, kernel com.ti.display ... done !!!
    79.042260 s:  VX_ZONE_INFO:[ownDataRefQueueEnqueueReadyRef:90] Q (queue=15, ref=4)
    79.042332 s:  VX_ZONE_INFO:[ownGraphScheduleGraph:843] Scheduling Graph (graph=18, pipe=0)
    79.042349 s:  VX_ZONE_INFO:[ownNodeKernelSchedule:800] Scheduling Node (node=7, pipe=0)
enque start ... done
    79.042431 s:  VX_ZONE_INFO:[ownDataRefQueueDequeueDoneRef:166] DQ (queue=16) .. NO BUFFER
    79.042630 s:  VX_ZONE_INFO:[ownCheckGraphCompleted:751] Graph Completed (graph=18, pipe=0)
    79.042645 s:  VX_ZONE_INFO:[ownCheckGraphCompleted:779] All Graphs Completed

我的问题:

像这样、即使我仅使用图形中的显示节点、我是否也必须进行流水线调度?

或者是否有其他方法可以运行显示节点?

如果需要流水线调度来运行图形

我可以获得此设计的指南吗?

在这个用例中、我是否会参考 SDK 中的源代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我是否可以知道、将捕获和显示作为单独进程的一部分、而不是在同一进程中的单独线程上运行的2个图形的用例是什么?

    您是否已计划如何通过2个流程发送数据以实现此目的? 因为图形和上下文绑定到进程

    此致、

    Nikhil

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

    您好、Nikhil

    再一次看到,你留下了一个答案,对我的兄弟关于多进程沟通的问题。

    感谢您表现出兴趣。

    Nikhil 说

    我是否可以知道、将捕获和显示作为单独进程的一部分、而不是在同一进程中的单独线程上运行的2个图形的用例是什么?

    我们的目标系统有多个用例、但我不想根据每个用例创建单独的应用程序。

    我想将其分为基本流程并将其组合使用。

    例如、捕获过程、深度学习过程、网络过程等。

    划分流程的原因是每个流程都由不同的团队来实施。

    因此、只有各个流程之间的通信接口将标准化、其余的将由各个团队开发。

    我用"单摄像头演示"构建基本的过程通信结构。

    实际上、视频输出处理器只是用于简单的验证目的、将在最终硬件中删除。

    我们始终以这种方式在其他硬件上构建应用程序。

    我自然认为它也会在 tiovx 框架内实施。

    Nikhil 说

    您是否已计划如何通过2个流程发送数据以实现此目的? 因为图形和上下文绑定到进程

    是的、共享数据是必要的。

    我的另一个问题,我问,我希望使用酒吧/次中间件为这种沟通。

    我只知道可以共享从 vx_reference thorgh shocket 通信转换而来的文件描述符(FD)。

    如果套接字通信是唯一的选择、我现在打算使用它。

    我希望你能回答是否还有其他方法。

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

    我懂了。  

    在这种情况下、您会在不同的进程中有不同的图形。 如果将是单节点图、则没有流水线点。 缓冲区可用后、您可以执行显示图(如果其中只有一个显示节点)。

    我已回复了有关过程通信的另一个主题

    此致、

    Nikhil

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

    您好、Nikhil

    再次感谢您的回答。

    很抱歉、我想再问您一个问题。

    我制作了一个单元过程、并按如下方式对其进行了测试。


    图像文件读取过程(A) - 视频输出过程(B)

    测试案例1):成功

    过程
    -打开一个文件并创建 vx_image 类型。
    -发送 vx_image 到(B)

    B 过程
    -接收 vx_image 表单(a)

    static vx_status app_read_msg_to_conv_img(AppObj *obj)
    {
     // Simplyfication code
     tivxMemTranslateFd(fd64, size, &ptrs, &phyAddr);
     vx_image img = vxCreateImage(obj->context,widh,height,format);
     vx_reference ref = (vx_reference)img;
     tivxReferenceImportHandle(ref, &ptrs, &size, 1);
    
     // display input link to received reference
     obj->display_image = (vx_image)ref;
    }

    -使用接收到的 vx_image 生成图形和 tivxDisplayNode

    obj->displayNode = tivxDisplayNode(obj->graph, obj->display_param_obj, obj->display_image);

    -使用 vxProcessGraph() API 运行

    while(1) {
     vxProcessGraph(obj->graph);
     if(obj->stop_task)
            break;
    }

    测试案例 2):失败

    过程
    -打开10个文件并创建 vx_image 类型。
    -以一秒的间隔按顺序发送 vx_images

    B 过程
    -接收第一个 vx_image 表单(A)
    -使用接收到的第一个 vx_image 生成图形& tivxDisplayNode
    -使用 vxProcessGraph() API 运行
    -接收下一个 vx_image 并更新显示输入图像(只需重复调用第一函数)

    while(1) {
     vxProcessGraph(obj->graph);
     if(obj->stop_task)
            break;
     app_read_msg_to_conv_img(obj); // just call again
    }

    在测试情况2中、显示了第一个映像、但未更新下一个映像。
    ( 成功接收 FD 并转换 vx_image)

    在我看来、我应该需要使用流水线来更新输入数据。

    或者是否可以通过流水线更新输入数据?

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

    您好!

    而不是每次使用以下命令创建图像、  

    vx_image img = vxCreateImage(obj->context,width,height,format);

    您是否可以使用相同的参考并仅将 ptrs 更新为此参考然后调用过程图?

    因为当您创建节点时、显示图像将使用您创建的参考、并且它需要相同的参考

    此致、

    Nikhil

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

    您好、Nikhil

    我听从了你的意见、结果成功了。

    感谢您的帮助!