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.

[参考译文] TMS320DM8168:如何使 DM8168以高性能运行视频采集、处理和流式传输

Guru**** 2595800 points
Other Parts Discussed in Thread: TVP7002

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/584137/tms320dm8168-how-to-make-dm8168-run-video-capture-processing-and-streaming-with-high-performance

器件型号:TMS320DM8168
主题中讨论的其他器件:TVP7002

大家好、
我正在使用 EZSDK 开发套件 DM8168。 我想构建一个包含视频捕获、图像处理和视频流的应用程序。是否有人可以就软件架构的设计提出一些建议?

要求:
+从 tvp7002 (摄像机高清模拟)捕获:帧1280x720
+使用一些特殊算法在 DSP 上运行图像处理
+使用 gstreamer 的流帧结果(25fps)

下面是我当前的架构:
+在 ARM 上:2个应用
主应用程序:主应用程序(捕获视频、与内核 DSP 和流处理进行通信)
LiveStreamer:使用 gstappsrc 运行 gstreamer 流水线
+基于内核 DSP (DSP 应用):运行图像处理算法

关于应用程序间的通信:
+主应用程序和 DSP 应用程序:使用 syslink 通知和共享区域。
我选择共享区域 IPC_SR_COMMON (addr = 0x9F700000、长度= 2MB)。 主应用程序将帧捕获到共享区域、通知 DSP 应用程序运行算法。 DSP 应用程序运行算法并在处理完成时通知主应用程序。

+主应用程序和 LiveStreamer 应用程序:在 LiveStreamer 中、我使用存储器映射直接从共享区域的物理地址(0x9F700000)读取数据。 LiveStreamer 运行流水线、GstAppSrc 将帧数据推入。
我使用单独的进程来运行 gstreamer、因为我无法使主应用程序和 gstreamer 中的 Qt 主循环协同工作。 此外、我认为我可以轻松地启动/停止 gstreamer、而无需担心内存管理。

目前、我的系统工作正常、但性能不佳:视频流仅为8fps、ARM 负载为100%。

这是3个主要问题:
+在 LiveStreamer 中:GstAppSrc 需要创建新的 GstBuffer 来复制帧数据
GstBuffer * buffer = GST_buffer_new();

uint8_t * tempBuffer=(uint8_t*) malloc (app->length);
memcpy (tempBuffer、app->imgBuf、app->length);//将帧数据复制到新缓冲区中

GST_buffer_MALLOcData (buffer)= tempBuffer;
gst_buffer_size (buffer)= app->length;
GST_buffer_data (buffer)= GST_buffer_MALLOcData (buffer);
GstFlowReturn = GST_APP_src_push_buffer (APP->appSrc、buffer);

如果不分配新缓冲区、我找不到任何用于推送数据的解决方案。


+ GstAppSrc 从共享区域读取数据并复制到新的 GstBuffer。
ARM 上的 memcpy 非常慢(对于复制帧1280x720、为100ms)。

+共享区域被缓存。 如果我只使用图像处理、请关闭 LiveStreamer、DSP 上的算法运行速度更快。 如果启用 LiveStreamer (使用存储器映射)、算法运行速度会降低6->10ms。 此外、IPC_SR_COMMON 区域非常小、如何为主机和 MC-HDVICP2和 MC-HDVPSS 创建大型共享区域。

是否有人可以给我一些建议来解决上述问题或为我的系统推荐另一种软件架构?

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

    您好!

    [引用 user="Kiet Phi77"]区域 IPC_SR_common 非常小,如何为主机和 MC-HDVICP2和 MC-HDVPSS 创建大型共享区域。

    请查看此 wiki 页面:

    http://processors.wiki.ti.com/index.php/EZSDK_Memory_Map#H.2FW_and_S.2FW_Limitations_To_Consider_For_Deciding_Memory_Map

    关于其他问题、当我有一些建议时、我将会向您回复。

    BR
    玛格丽塔

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

    您好、Margarita、

    您在许多主题中为我提供了帮助。 感谢您的支持。

    稍后我将尝试重建新的存储器映射。 目前、我正在使用灰色帧进行测试、我希望实现实时性能。 我很期待收到您的回复。

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

    Appsrc 元素在 A8上运行,因此我认为 ARM 负载达到100%并观察帧丢失(~8 fps)是正常的,尤其是有 memcpy。
    您能否提供有关主应用程序和直播应用程序的更多信息。
    根据我的理解,主应用程序执行捕获->流式传输。 第二、您编写了一个插件、其中包含在 DSP 上运行以进行某些处理的元素。

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

    这是我的系统图。

    在 A8上运行

    主要应用:  

    • 使用 V4L2 API 从/dev/video0进行捕获
    • 与内核 DSP 上的 DSP 应用通信(syslink notify)
    • 与 LiveStreamer 的通信(使用 UNIX 信号)
    • 一些其他功能

    LiveStreamer:运行 gstreamer 流水线、使用 GstAppSrc 元素推送帧数据(示例代码 http://amarghosh.blogspot.com/2012/01/gstreamer-appsrc-in-action.html)。 我修改 函数 read_data (gst_app_t *应用程序),在此函数中,来自主应用程序的 LiveStreamer 等待信号(sigwait (&waitset,&sig),以从共享区域读取数据,并使用 gst_app_src_push_buffer 将帧数据推入 GstAppsrc。

    主应用捕获帧进入共享区域、通知 DSP 应用运行算法。 DSP 应用程序运行算法并在处理完成时通知主应用程序。 主应用程序向 LiveStreamer 发送信号、以读取帧数据并推入管道。

    2.在内核 DSP 上运行

    DSP 应用:运行图像处理算法

    简而言之、我有一个主应用程序和 DSP 用于保存帧数据的共享区域。 从/dev/video0进行捕获时、我必须将帧复制到共享区域、当 DSP 完成处理帧时、LiveStreamer 还必须将帧数据从共享区域复制到新的 GstBuffer 中、然后推入 GstAppSrc

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

    感谢您的观看。
    您是否阅读过本手册?
    www.freedesktop.org/.../gstreamer-GstBuffer.html

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

    您好!

    我已阅读有关 GstBuffer 和 appsrc 元素的文档。 appsrc 有一个内部队列、我们需要创建新的 GstBuffer 并将其推入。 appsrc 还会自动释放 GstBuffer 的存储器。

    如果我将 GstBuffer 的数据指针直接分配给帧缓冲区(共享区域)、则管道无法运行。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有给你完全的帮助,
    它可能会有所帮助、使用
    Buffer = GST_Buffer_new ();
    GST_buffer_data (buffer)= ptR_for_shared_memory_buffer;
    您甚至可以使用为缓冲区分配自由函数、您可以使用该函数了解何时使用该帧缓冲区完成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。

    我已修改代码:使用 gst_buffer_data (buffer)= ptR_for_shared_memory_buffer 创建新的 GstBuffer。 我还向 GstBuffer 非自动释放内存添加了一个空闲函数。

    流水线可以运行、但系统性能较慢、FPS ~ 3 (使用 memcpy FPS ~8)。 尽管不使用任何 memcpy、但性能仍然很差。

    如果此软件架构不好,您不需要帮助我解决当前问题,您能建议我另一个系统设计吗?  

    DM8168上的许多示例仅包括捕获和流处理(双捕获、流式传输或捕获、编码到文件)、是否有人能向我展示其他示例、包括捕获、DSP 上的图像处理和流帧结果? 我想知道如何共享来自 v4l2捕获缓冲区的数据、共享区域 DSP 和 ARM 以及 gstappsrc 缓冲区。

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

    我看到您是通过 tvp7002捕获的。
    如您所知、您正在使用的 gstreamer v4l2src 元素正在 A8上运行。 memcpy 流元素也是如此。
    但我们还有另一个通过 tvp7002进行捕获的元素。 这是在媒体控制器(M3 VPSS)上运行的 OMX 组件。
    您可以在 OMX 用户指南中查看有关 VFCC 元素的信息。
    遗憾的是、我们没有使用 VFCC 的 gstreamer 元素。
    但是、正如您看到的、gstreamer OMX 元素也基于一些 OMX 组件、例如 OMX_h264enc -> VENC。
    我的重点是、我知道一些社区成员使用/编写了名为 OMX_CAMERA 的元素、该元素基于 OMX VFCC 元素而不是 v4l2src。 这意味着捕获元件将在 VPSS 上运行、而不是在 A8上运行。
    您可以在论坛中搜索更多信息。
    但 TI 不支持该元素 OMX_CAMER_CAMER_CAMER.

    此外、我们还有一些 OMX 示例、如 CAPTURE_CODETURE。 有一个类似在 DSP 上运行的 VLPB 示例(请参阅 OMX 用户指南)。 但没有用于流式传输的 OMX 组件。

    希望这对您有所帮助。

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

    您好、Margarita、

    我正在尝试使用高级 API、gstreamer 是唯一用于开发编码和流的高级框架。  

    我的捕获帧使用 V4L2 API、类似于回送示例。 捕获和显示运行非常平稳、ARM 负载为0%。 我只坚持在 A8应用、DSP 应用、gstreamer 应用之间共享数据。 LiveStreamer 在带有 appsrc 的 A8上运行、我需要创建一个新的 GstBuffer 并将帧数据复制到其中。 GStreamer 文档推荐了此解决方案。 目前、我可以将 GstBuffer 设置为指向共享存储器、但所有系统都在变慢、这不是一个安全的解决方案。

    我能否使用 A8上的 EDMA 更快地复制帧数据?

    我找不到有关系统的任何示例或参考设计、该系统可以在 DM8168中运行捕获、图像处理、编码和流式传输。 我是否正在尝试设计一个不适合 DM8168的超复杂系统?

    我将购买 RidgeRun Professional SDK、希望他们能帮助我解决当前的问题。

    感谢您的支持!!!

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

    在 Ezsdk 中、我们有 EDMA 演示、您可以在其中查看。
    /example-applications/linux-driver-examples-psp04.04.00.01

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

    感谢您的帮助! 如果我可以使我的系统更快地运行、我将在这里发布我的解决方案。