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:v4l2h264enc CPU 负载优化

Guru**** 2560080 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1527336/tda4vh-q1-v4l2h264enc-cpu-load-optimization

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

工具/软件:

TDA4VH  

SDK 11.0 Linux+FreeRTOS

我们使用 gstreamer 插件 v4l2h264enc 对视频流进行编码。  当我们使用以下 GST 流水线容器时、一切正常工作。

[2025-06-13 12:08:11]  gst_wrapper: GstCmdString:
[2025-06-13 12:08:11]  appsrc format=GST_FORMAT_TIME is-live=true do-timestamp=true block=false name=myAppSrc0 ! queue 
[2025-06-13 12:08:11]  ! video/x-raw, width=(int)1536, height=(int)1728, framerate=(fraction)30/1, format=(string)NV12, interlace-mode=(string)progressive, colorimetry=(string)smpte240m
[2025-06-13 12:08:11]  ! v4l2h264enc
[2025-06-13 12:08:11]  ! video/x-h264 
[2025-06-13 12:08:11]  ! h264parse config-interval=-1
[2025-06-13 12:08:11]  ! queue ! appsink name=myAppSink0 max-buffers=50 drop=true 
[2025-06-13 12:08:11]  
[2025-06-13 12:08:11]  GstPipe init status 0!

通过日志、我们可以确认 appsrc 推送的数据使用 DMA-BUF 的存储器、 因此、我们为 v4l2h264enc 添加了 output-IO-mode=5 配置、以降低 CPU 负载。

[2025-06-13 13:40:22]  gst_wrapper: GstCmdString:
[2025-06-13 13:40:22]  appsrc format=GST_FORMAT_TIME is-live=true do-timestamp=true block=false name=myAppSrc0 ! queue 
[2025-06-13 13:40:22]  ! video/x-raw, width=(int)1536, height=(int)1728, framerate=(fraction)30/1, format=(string)NV12, interlace-mode=(string)progressive, colorimetry=(string)smpte240m
[2025-06-13 13:40:22]  ! v4l2h264enc output-io-mode=dmabuf-import 
[2025-06-13 13:40:22]  ! video/x-h264 
[2025-06-13 13:40:22]  ! h264parse config-interval=-1
[2025-06-13 13:40:22]  ! queue ! appsink name=myAppSink0 max-buffers=50 drop=true 
[2025-06-13 13:40:22]  
[2025-06-13 13:40:22]  GstPipe init status 0!

但 v4l2h264enc 插件运行时显示错误:

[2025-06-13 14:22:21]  tivxTivxkernelpadimageProcess start !!!!
[2025-06-13 14:22:21]  0:00:13.155022482  1036 0xffff3c000d70 WARN          v4l2bufferpool gstv4l2bufferpool.c:850:gst_v4l2_buffer_pool_start:<v4l2h264enc0:pool0:src> Uncertain or not enough buffers, enabling copy threshold
[2025-06-13 14:22:21]  0:00:13.156372645  1036 0xffff3c000d70 ERROR          v4l2allocator gstv4l2allocator.c:1147:gst_v4l2_allocator_import_dmabuf:<v4l2h264enc0:pool0:sink:allocator> Got 2 dmabuf but needed 1
[2025-06-13 14:22:21]  0:00:13.156446342  1036 0xffff3c000d70 ERROR         v4l2bufferpool gstv4l2bufferpool.c:389:gst_v4l2_buffer_pool_import_dmabuf:<v4l2h264enc0:pool0:sink> failed to import dmabuf
[2025-06-13 14:22:21]  0:00:13.156492308  1036 0xffff3c000d70 WARN              bufferpool gstbufferpool.c:1246:default_reset_buffer:<v4l2h264enc0:pool0:sink> Buffer 0xffff3800a3f0 without the memory tag has maxsize (0) that is smaller than the configured buffer pool size (3981312). The buffer will be not be reused. This is most likely a bug in this GstBufferPool subclass
[2025-06-13 14:22:21]  0:00:13.156748290  1036 0xffff3c000d70 ERROR         v4l2bufferpool gstv4l2bufferpool.c:2211:gst_v4l2_buffer_pool_process:<v4l2h264enc0:pool0:sink> failed to prepare data
[2025-06-13 14:22:21]  0:00:13.156832573  1036 0xffff3c000d70 WARN            v4l2videoenc gstv4l2videoenc.c:901:gst_v4l2_video_enc_handle_frame:<v4l2h264enc0> error: Failed to process frame.
[2025-06-13 14:22:21]  0:00:13.156868849  1036 0xffff3c000d70 WARN            v4l2videoenc gstv4l2videoenc.c:901:gst_v4l2_video_enc_handle_frame:<v4l2h264enc0> error: Maybe be due to not enough memory or failing driver
[2025-06-13 14:22:21]  tivxTivxkernelpadimageProcess start !!!!

我们当前的配置是否正确? 如果正确、应如何解决上述问题?

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

    我们目前已取得以下进展。

    在 gstreamer 的源代码中、错误“得到 2 个 dmabuf 但需要 1“的原因是 src 缓冲器的 n_mem 为 2、但 dest 缓冲器的 n_mem 为 1。

    此外、我们发现 dest n_mem 为 1 的原因很可能是因为在 gst_v4l2_object_get_caps_info 中、v4l2object->prefed_non_continent 始终为 false。 因此、这会导致 gst_v4l2_object_set_format_full 中的 n_v4L_planes 始终为 1。

    2.同时,通过 v4l2-ctl 命令,我们发现 v4l2h264enc 对应的 video1 不显示对非连续的支持,但 v4l2h264dec 的 video0 显示“[8]:'nm21'(Y/4:2:0(N-C ))(它是否表示 v4l2h264dec 支持连续的 vu?)

    root@j784s4-evm:~# v4l2-ctl -d /dev/video0 --list-formats-ext
    ioctl: VIDIOC_ENUM_FMT
            Type: Video Capture Multiplanar
    
            [0]: 'YU12' (Planar YUV 4:2:0)
                    Size: Continuous 8x8 - 8192x4320
            [1]: 'NV12' (Y/UV 4:2:0)
                    Size: Continuous 8x8 - 8192x4320
            [2]: 'NV21' (Y/VU 4:2:0)
                    Size: Continuous 8x8 - 8192x4320
            [3]: '422P' (Planar YUV 4:2:2)
                    Size: Continuous 8x8 - 8192x4320
            [4]: 'NV16' (Y/UV 4:2:2)
                    Size: Continuous 8x8 - 8192x4320
            [5]: 'NV61' (Y/VU 4:2:2)
                    Size: Continuous 8x8 - 8192x4320
            [6]: 'YM12' (Planar YUV 4:2:0 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [7]: 'NM12' (Y/UV 4:2:0 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [8]: 'NM21' (Y/VU 4:2:0 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [9]: 'YM16' (Planar YUV 4:2:2 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [10]: 'NM16' (Y/UV 4:2:2 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [11]: 'NM61' (Y/VU 4:2:2 (N-C))
                    Size: Continuous 8x8 - 8192x4320
    root@j784s4-evm:~# v4l2-ctl -d /dev/video1 --list-formats-ext
    ioctl: VIDIOC_ENUM_FMT
            Type: Video Capture Multiplanar
    
            [0]: 'HEVC' (HEVC, compressed)
                    Size: Stepwise 256x128 - 8192x8192 with step 8/8
            [1]: 'H264' (H.264, compressed)
                    Size: Stepwise 256x128 - 8192x8192 with step 8/8
    root@j784s4-evm:~# v4l2-ctl -d /dev/video2 --list-formats-ext
    ioctl: VIDIOC_ENUM_FMT
            Type: Video Capture Multiplanar
    
            [0]: 'YU12' (Planar YUV 4:2:0)
                    Size: Continuous 8x8 - 8192x4320
            [1]: 'NV12' (Y/UV 4:2:0)
                    Size: Continuous 8x8 - 8192x4320
            [2]: 'NV21' (Y/VU 4:2:0)
                    Size: Continuous 8x8 - 8192x4320
            [3]: '422P' (Planar YUV 4:2:2)
                    Size: Continuous 8x8 - 8192x4320
            [4]: 'NV16' (Y/UV 4:2:2)
                    Size: Continuous 8x8 - 8192x4320
            [5]: 'NV61' (Y/VU 4:2:2)
                    Size: Continuous 8x8 - 8192x4320
            [6]: 'YM12' (Planar YUV 4:2:0 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [7]: 'NM12' (Y/UV 4:2:0 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [8]: 'NM21' (Y/VU 4:2:0 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [9]: 'YM16' (Planar YUV 4:2:2 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [10]: 'NM16' (Y/UV 4:2:2 (N-C))
                    Size: Continuous 8x8 - 8192x4320
            [11]: 'NM61' (Y/VU 4:2:2 (N-C))
                    Size: Continuous 8x8 - 8192x4320
    root@j784s4-evm:~# v4l2-ctl -d /dev/video3 --list-formats-ext
    ioctl: VIDIOC_ENUM_FMT
            Type: Video Capture Multiplanar
    
            [0]: 'HEVC' (HEVC, compressed)
                    Size: Stepwise 256x128 - 8192x8192 with step 8/8
            [1]: 'H264' (H.264, compressed)
                    Size: Stepwise 256x128 - 8192x8192 with step 8/8
    root@j784s4-evm:~#
    root@j784s4-evm:~# gst-inspect-1.0 | grep v4l2
    video4linux2:  v4l2deviceprovider (GstDeviceProviderFactory)
    video4linux2:  v4l2h264dec: V4L2 H264 Decoder
    video4linux2:  v4l2h264enc: V4L2 H.264 Encoder
    video4linux2:  v4l2h265dec: V4L2 H265 Decoder
    video4linux2:  v4l2h265enc: V4L2 H.265 Encoder
    video4linux2:  v4l2radio: Radio (video4linux2) Tuner
    video4linux2:  v4l2sink: Video (video4linux2) Sink
    video4linux2:  v4l2src: Video (video4linux2) Source
    video4linux2:  v4l2video2h264dec: V4L2 H264 Decoder
    video4linux2:  v4l2video2h265dec: V4L2 H265 Decoder
    video4linux2:  v4l2video3h264enc: V4L2 H.264 Encoder
    video4linux2:  v4l2video3h265enc: V4L2 H.265 Encoder
    root@j784s4-evm:~# v4l2h264enc
    

    因此、对于上面提到的 gstreamer 的当前使用情况、当前驱动器不支持 output-io-mode=dmabuf-import 选项、对吧?

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

    尊敬的 Sarabesh:

    您能帮助检查一下吗?

    BR、

    Biao

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

    你(们)好

    IO 模式 5 表示 DMA 导入。 这意味着其他一些上游插件将提供 dma buf 以供编码器导入。 在您的情况下、上游元素‘appsrc '不一定提供所需的 DMA buf。  

    此致、

    Adam

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

    你(们)好

    在我们的例子中, appsrc 可以通过某些配置提供 DMA 缓冲区吗?如果可能,我们应该怎么做?

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

    尊敬的 Hongyao:

    您可以尝试将图像大小更改为 1920x1080 吗? 这可能与我之前遇到的问题类似。

    此致、

    Adam

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

    您好:  

    如果有任何关于此问题的更新、请告诉我。 否则、我可以将该线程标记为已关闭。

    谢谢、
    Sarabesh S.

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

    你(们)好

    我们在 Linux SDK 文档中看到了以下用例。

    target # gst-launch-1.0 v4l2src device=/dev/video2 io-mode=dmabuf ! video/x-bayer,width=1920,height=1080, framerate=30/1, format=bggr ! tiovxisp sensor-name=SENSOR_SONY_IMX219_RPI dcc-isp-file=/opt/imaging/imx219/dcc_viss.bin sink_0::dcc-2a-file=/opt/imaging/imx219/dcc_2a.bin sink_0::device=/dev/v4l-subdev2 ! video/x-raw,format=NV12 ! v4l2h264enc output-io-mode=dmabuf-import extra-controls="controls,h264_i_frame_period=60" ! rtph264pay ! udpsink port=5000 host=<ip_address>

    在我们的用例中、appsrc 可以配置为 IO-mode=dmabuf 选项吗?

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

    您好:  

    是的、您应该能够使用 dma-buf 来参考带有摄像机 src 中缓冲器的编码器缓冲器。 让我来看看有关这个主题的任何资源。 我将在下周初提供最新信息。

    谢谢、
    Sarabesh S.

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

    尊敬的  Sarabesh S:

    您何时可以 提供演示?

    BR

    李云杰

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

    嗨 Yunjie、抱歉、上周带宽有限、所以我没时间查看 dma-buf 示例。 您能告诉我您使用的是 Linux 独立 SDK 还是 Linux+RTOS (Vision Apps) SDK 吗?

    谢谢、
    Sarabesh S.

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

    尊敬的  Sarabesh S:

    我使用 TDA4VH  SDK 11.0 Linux+FreeRTOS、具体版本为:11.00.00.06。

    是的、您应该能够使用 dma-buf 引用带有摄像机 src 中缓冲区的编码器缓冲区。 [/报价]

    如何将 appsrc 的缓冲器作为编码器的输入、 这对于我的架构至关重要、当前的 TDA4VH 演示会花费更多的 CPU 使用率、 大约   30fps 2M 视频占用单个内核 30%的 CPU。  我的要求是录制 4*3M+8M 30fps 的视频,所以我想知道参考缓冲区是否有意义,你能提前给我一个结论吗?  然后、演示将在稍后提供。

    谢谢

    李云杰  

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

    尊敬的 Yunjie:  

    是的、这确实有意义、但在过去、我们看到了使用 appsrc 和 dma-buf 时会出现问题。 使用 appsrc 而不是 v4l2src 的原因是什么?

    谢谢、

    Sarabesh S.

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

    尊敬的  Sarabesh S:

    感谢您的确认。

    我的管道的主干如下所示:

    对于 TDA4VH、我的应用是基于 tiovx 开发的 、图像由缩放器复制、一个用于 DL 模型、另一个用于 H264。

    谢谢!

    李云杰

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

    尊敬的 Yunjie:  

    要澄清您的 Appsrc 输入是直接来自 CSI 摄像头捕捉、还是只是 CSI 摄像头捕捉的文件记录?

    此致、
    Sarabesh S.

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

    尊敬的  Sarabesh S:

    更详细的架构、如下所示

    从 CSI 捕获图像、然后将其说明转发到其他过程。  因此、它更类似于从文件中读取数据。

    谢谢

    李云杰

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

    尊敬的 Yunjie:  

    我们有一个类似的 Vision-Apps 演示应用、同样适合您的用例。 您是否了解过引用 app-multi-cam-codec 演示(此处)

    谢谢、
    sarabesh S.

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

    您好、Sarabesh S.

    我参考该演示来组织我的流水线、 但 GST 需要更多 CPU、有关详细信息、您可以查看下面的链接。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1505491/tda4vh-q1-how-to-reduce-the-cpu-usage-of-the-app_multi_cam_codec-sample/5839091?tisearch=e2e-sitesearch&keymatch=%252520user%25253A533595#

    谢谢

    李云杰

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

    尊敬的 Yunjie:  

    开发团队提供了有关 appsrc 和 appsink 利用率的反馈。 本质上、具有 appsrc 和 appsink 的 GStreamer 框架具有相当严格的限制、并且无法在 app 和 gstreamer 插件之间轻松进行缓冲区处理。  

    看起来您的 appsrc 只是多个摄像机源、而您的 appsink 是一个文件写入。 这是正确的吗? 您能否进一步介绍一下 VPAC 的具体用途? 您是否尝试像在 app_multi_cam_codec 中一样马赛克摄像机输入?

    谢谢、
    Sarabesh S.

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

    您好 Sarabesh S.、

     

    似乎您的 appsrc 只是多个摄像机源、而您的 appsink 是一个文件写入。 这是正确的吗?

    是的、您是对的。

    您还能扩展您使用 VPAC 的具体用途吗?

    主函数:

    1.图像数据的格式转换

    2.网格变形 如下

    3.对图像进行衰减并调整其大小

    您是否尝试像在 app_multi_cam_codec 中一样马赛克摄像机输入?

    是的、 我会将调整后的图像拼合成一个图像以进行数据记录。

    谢谢

    李云杰

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

    感谢您提供的信息。 我将继续研究这一点、但由于其他一些正在进行的任务、本周可能会出现一些延迟。

    此致、
    Sarabesh S.

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

    您好  Sarabesh S.、

    任何更新?

    谢谢

    李云杰

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

    尊敬的 Yunjie:  

    我们还想看看此用例中还需要哪些其他演示来提供帮助。