主题中讨论的其他器件: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 创建大型共享区域。
是否有人可以给我一些建议来解决上述问题或为我的系统推荐另一种软件架构?