0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MPSoC VCU调试方法和调试流程

笑过就走 来源:笑过就走 作者:笑过就走 2022-08-02 09:29 次阅读

概要介绍
MPSoC VCU在很多产品中得到了应用。在不同产品的调试过程中,有一些共同的办法。

首先看看Video子系统的简单框图,其中包含视频输入、编解码、视频输出等模块。视频输入模块,硬件可能是HDMI-RX和FrmBufWrite; 软件一般是Linux V4L2。编解码模块是VCU,配套的软件是GStreamer,或者Ctrl-SW。视频输出模块,硬件可能是HDMI-TX和FrmBufRead; 软件一般是Linux DRM。

pYYBAGGYHP2AKmn9AACMyWnjsGU738.png

调试时,根据上述框图,逐个检查其中的模块的输入输出。

视频输入模块
检查视频输入源
调试VCU时,首先检查视频输入模块的输出是否正常。如果Linux V4L2管理视频输入模块的硬件,则会创建Linux的media/video设备,可以使用工具media-ctl查看它们的信息。对于HDMI-Rx,可以看到有没有连接源设备,视频输入源的分辨率、格式等。

#media-ctl -p -d /dev/media0 
 
Media controller API version 0.1.0
  
Media device information
------------------------
driver          xilinx-video
model           Xilinx Video Composite Device
serial
bus info
hw revision     0x0
driver version  0.0.0
  
Device topology
- entity 1: vcap_hdmi output 0 (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video0
        pad0: Sink
                <- "a0000000.v_hdmi_rx_ss":0 [ENABLED]
  
- entity 5: a0000000.v_hdmi_rx_ss (1 pad, 1 link)
            type V4L2 subdev subtype Unknown flags 0
            device node name /dev/v4l-subdev0
        pad0: Source
                [fmt:RBG24/1920x1080 field:none]
                [dv.caps:BT.656/1120 min:0x0@25000000 max:4096x2160@297000000 stds:CEA-861,DMT,CVT,GTF caps:progressive,reduced-blanking,custom]
                [dv.detect:BT.656/1120 1920x1080p60 (2200x1125) stds:CEA-861 flags:CE-video]
                -> "vcap_hdmi output 0":0 [ENABLED]

抓取原始图像
在确保视频输入源的工作正常、分辨率和格式正确后,可以再继续使用yavta来抓取原始图像,从而检查图像内容。

#yavta -n 3 -c10 -f UYVY -f UYVY -s 1920x1080 --skip 7 -F /dev/video0
Device /dev/video0 opened.
Device `vcap_hdmi output 0' on `platform:vcap_hdmi:0' is a video output (without mplanes)[63898.159475] xilinx-frmbuf a0010000.v_frmbuf_wr: Framebuffer not configured for fourcc 0x59565955
 device.
Video format set: UYVY (59565955) 1920x1080 field none[63898.173868] xilinx-frmbuf a0010000.v_frmbuf_wr: Framebuffer not configured for fourcc 0x59565955
, 1 planes:
 * Stride 3840, buffer size 4147200
Video format:[63898.188189] xilinx-frmbuf a0010000.v_frmbuf_wr: Framebuffer not configured for fourcc 0x59565955
 UYVY (59565955) 1920x1080 field none, 1 planes:
 * Stride 3840, buffer size 4147200
3 buffers requested.
length: 1 offset: 3444933696 timestamp type/source: mono/EoF
Buffer 0/0 mapped at address 0x7fa84b0000.
length: 1 offset: 3444933696 timestamp type/source: mono/EoF
Buffer 1/0 mapped at address 0x7fa80bb000.
length: 1 offset: 3444933696 timestamp type/source: mono/EoF
Buffer 2/0 mapped at address 0x7fa7cc6000.
Unable to start streaming: Invalid argument (22).
3 buffers released.

检查原始图像
接下来再使用YUV Player或者YUV Player github 分支检查原始图像是否正确。需要根据图像源,正确设置分辨率和YUV格式。如果图像轮廓就时错误的,这表明Y数据就是错误的,或者分辨率的行宽是错误的,如果轮廓正确、颜色错误,这表明Y数据是对的,分辨率的高不对,或色彩格式不对。大块的连续色彩错误,有可能是把Y数据,当成了UV数据。

Encoder
得到了正确的YUV数据后,继续使用Encoder编码。如果有问题,保存Encoder输出的码流,传送到PC机上,使用FFMpeg检查。首先可以使用ffplay播放,用肉眼观察图像。

Microsoft Windows [Version 10.0.18363.1801]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\prj>ffplay vcu_example.h265
ffplay version N-89369-g5a93a85fd0 Copyright (c) 2003-2017 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
  libavutil      56.  4.100 / 56.  4.100
  libavcodec     58.  6.102 / 58.  6.102
  libavformat    58.  2.103 / 58.  2.103
  libavdevice    58.  0.100 / 58.  0.100
  libavfilter     7.  6.100 /  7.  6.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
[hevc @ 000001b016710180] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, hevc, from 'vcu_example.h265':=    0KB sq=    0B f=0/0
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv, unknown/bt709/unknown), 3840x2160, 45 fps, 45 tbr, 1200k tbn, 45 tbc
    nan M-V:    nan fd=   2 aq=    0KB vq=  844KB sq=    0B f=0/0

其次可以使用ffprobe导出码流信息,查看各帧的类型和大小。

C:\prj>ffprobe vcu_example.h265 > vcu_example.h265.txt
ffprobe version N-89369-g5a93a85fd0 Copyright (c) 2007-2017 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
  libavutil      56.  4.100 / 56.  4.100
  libavcodec     58.  6.102 / 58.  6.102
  libavformat    58.  2.103 / 58.  2.103
  libavdevice    58.  0.100 / 58.  0.100
  libavfilter     7.  6.100 /  7.  6.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
[hevc @ 0000019dfe94cd80] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, hevc, from 'vcu_example.h265':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv, unknown/bt709/unknown), 3840x2160, 45 fps, 45 tbr, 1200k tbn, 45 tbc

还可以使用ffmpeg把每一帧转换成bmp图片,仔细查看。

C:\prj>ffmpeg  -i vcu_example.h265  -frames 10 vcu_example.%04d.bmp
ffmpeg version N-89369-g5a93a85fd0 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
  libavutil      56.  4.100 / 56.  4.100
  libavcodec     58.  6.102 / 58.  6.102
  libavformat    58.  2.103 / 58.  2.103
  libavdevice    58.  0.100 / 58.  0.100
  libavfilter     7.  6.100 /  7.  6.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
[hevc @ 000002bda8bd9880] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, hevc, from 'vcu_example.h265':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv, unknown/bt709/unknown), 3840x2160, 45 fps, 45 tbr, 1200k tbn, 45 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> bmp (native))
Press [q] to stop, [?] for help
Output #0, image2, to 'vcu_example.%04d.bmp':
  Metadata:
    encoder         : Lavf58.2.103
    Stream #0:0: Video: bmp, bgr24, 3840x2160, q=2-31, 200 kb/s, 45 fps, 45 tbn, 45 tbc
    Metadata:
      encoder         : Lavc58.6.102 bmp
frame=   10 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.22 bitrate=N/A speed=0.568x
video:243001kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

有问题时,再使用保存的YUV文件,使用xilinx发布的ctrlsw_encoder在ZCU106单板上编码,对比效果。也可以试试Xilinx提供的配置文件。如果有区别,再对比实际代码和xilinx发布的ctrlsw_encoder、配置文件的区别。

Decoder
检查完encoder的输出,再检查decoder的输出。ctrlsw_decoder默认输出I420(YUV420)/I422(YUV422)格式的YUV输出。如果需要,可以参考VCU Ctrl-SW 2020.2输出 NV12 的 YUV 文件,使ctrlsw_decoder输出NV12/NV16的文件。输出后,也可以使用YUV Player或者YUV Player github 分支检查解码后的YUV图像是否正确。

图像质量
如果图像质量有问题,建议使用大的显示器或电视机查看。显示器或电视机要真实支持检查的分辨率,在显示中不能有缩放,避免缩放引起新的问题。也可以使用ffmpeg的下面命令,将码流转换为bmp图片,一帧一帧查看。

C:\prj>ffmpeg  -i vcu_example.h265  -frames 10 vcu_example.%04d.bmp
ffmpeg version N-89369-g5a93a85fd0 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
  libavutil      56.  4.100 / 56.  4.100
  libavcodec     58.  6.102 / 58.  6.102
  libavformat    58.  2.103 / 58.  2.103
  libavdevice    58.  0.100 / 58.  0.100
  libavfilter     7.  6.100 /  7.  6.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
[hevc @ 000001bb953e9880] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, hevc, from 'vcu_example.h265':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv, unknown/bt709/unknown), 3840x2160, 45 fps, 45 tbr, 1200k tbn, 45 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> bmp (native))
Press [q] to stop, [?] for help
Output #0, image2, to 'vcu_example.%04d.bmp':
  Metadata:
    encoder         : Lavf58.2.103
    Stream #0:0: Video: bmp, bgr24, 3840x2160, q=2-31, 200 kb/s, 45 fps, 45 tbn, 45 tbc
    Metadata:yo
      encoder         : Lavc58.6.102 bmp
frame=   10 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.22 bitrate=N/A speed=0.553x
video:243001kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

通常,增大码率、减小QP值、使用VBR、使用跳帧等,可以优化图像质量。

VCU性能
如果检查VCU性能,建议使用实际视频输入输出,因为文件操作有耗时内存拷贝。如果用文件,也一定要把文件放在Linux的ramdisk上,不能使用sd等存放。

测试性能时,千万记住,不能使用软件复制Video数据,包括Gstreamer的tee插件。

案例
使用VBR优化图像质量
有项目反应图像质量与参考的视频有差距。拿到VCU编码的视频码流和参考视频码流后,使用ffprobe分析,得到每一帧的大小。发现VCU的视频码流的I帧小于150KByte,而参考视频码流的视频码流的I帧有400KByte。建议使用VBR。应用VBR后,图像质量明显改善。

解决I帧小导致的图像质量问题
有项目反应图像质量与参考的视频有差距。拿到VCU编码的视频码流和参考视频码流后,使用ffprobe分析,得到每一帧的大小。发现VCU的视频码流的I帧大约时是180KByte,而参考视频码流的视频码流的I帧有1000KByte。该项目使用VBR后,I帧图像也没有增大。检查VCU的配置,发现配置文件了有“MaxPictureSize = 1500”,相当于180KByte。建议客户设置“MaxPictureSize = 20000”,或者移除这一条后,图像质量明显改善。MaxPictureSize用于限制帧编码后的最大大小,目的是减少码率波动,会限制I帧的质量。

建议
分析VCU的问题时,请提供VCU的视频码流、参考视频码流、原始码流、配置文件。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • MPSoC
    +关注

    关注

    0

    文章

    194

    浏览量

    24115
  • VCU
    VCU
    +关注

    关注

    17

    文章

    70

    浏览量

    20174
收藏 人收藏

    评论

    相关推荐

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

      如何调试Zynq UltraScale+ MPSoC VCU DDR控制器  Zynq UltraScale+ MPSoC VCU DD
    发表于 01-07 16:02

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

    如何调试 Zynq UltraScale+ MPSoC VCU DDR 控制器?
    发表于 01-22 06:29

    乐华21b2调试方法

    乐华21b2调试内容和调试方法
    发表于 10-10 11:42 16次下载
    乐华21b2<b class='flag-5'>调试</b><b class='flag-5'>方法</b>

    Profibus调试方法

    Profibus调试方法
    发表于 04-27 08:50 9次下载

    Xilinx Zynq UltraScale+ MPSoC的同步调试和跟踪演示

    Lauterbach演示了Zynq UltraScale + MPSoC上的ARM Cortex-A53和Cortex-R5内核在2015年嵌入式世界中首次使用其TRACE32产品进行同步调试和跟踪。
    的头像 发表于 11-27 06:48 3611次阅读

    浅谈Xilinx MPSoC常见的调试思路

    在嵌入式系统里,以太网是一个基本的接口,既用于调试,也用于数据传输。所以在单板调试过程中,以太网是一个基本的任务。如果以太网工作正常,也可以说是一个重要的里程碑。 Xilinx MPSoC支持多个
    的头像 发表于 11-06 15:07 2763次阅读

    DDR PHY 与电路板调试

    UltraScale+ MPSoC VCU(H.264/H.265 视频编解码器)连用。 因此,调试将不同于 MIG 等传统 Xilinx DDR 控制器。 DDR PHY 与电路板调试
    的头像 发表于 02-08 15:51 1470次阅读

    如何调试 Zynq UltraScale+ MPSoC VCU DDR 控制器?

    UltraScale+ MPSoC VCU(H.264/H.265 视频编解码器)连用。 因此,调试将不同于 MIG 等传统 Xilinx DDR 控制器。 DDR PHY 与电路板调试
    发表于 02-23 06:00 15次下载
    如何<b class='flag-5'>调试</b> Zynq UltraScale+ <b class='flag-5'>MPSoC</b> <b class='flag-5'>VCU</b> DDR 控制器?

    简述MPSoC VCU调试方法调试流程

    概要介绍 MPSoC VCU在很多产品中得到了应用。在不同产品的调试过程中,有一些共同的办法。 首先看看Video子系统的简单框图,其中包含视频输入、编解码、视频输出等模块。视频输入模块,硬件可能是
    的头像 发表于 10-13 10:43 1557次阅读
    简述<b class='flag-5'>MPSoC</b> <b class='flag-5'>VCU</b><b class='flag-5'>调试</b><b class='flag-5'>方法</b>和<b class='flag-5'>调试</b><b class='flag-5'>流程</b>

    焊接机器人调试流程有哪些?调试不当该如何解决?

    焊接机器人调试流程一共分七步,正确的调试流程能够明确产品的生产流程,代替人工在恶劣的环境中进行工作,实现稳定生产。
    的头像 发表于 03-06 12:56 1305次阅读
    焊接机器人<b class='flag-5'>调试</b><b class='flag-5'>流程</b>有哪些?<b class='flag-5'>调试</b>不当该如何解决?

    投入式液位计的调试方法,如何调试

    会出现数值不准确的问题。 当出现这些问题的时候,需要对投入式液位计进行再次调试调试无问题后,再开始使用,今天来给大家说一说投入式液位计的调试方法,如何
    的头像 发表于 03-15 14:09 3162次阅读

    教程 8:调试方法

    教程 8:调试方法
    发表于 03-16 19:00 1次下载
    教程 8:<b class='flag-5'>调试</b><b class='flag-5'>方法</b>

    单片机常用的调试方法

    在单片机程序调试过程中,串口打印调试方法是非常重要的手段,在使用串口调试时,我们更多的是使用printf。但是下面我们不介绍printf,介绍一下另外几种我们常用的
    的头像 发表于 04-04 14:58 3772次阅读

    教程 8:调试方法

    教程 8:调试方法
    发表于 07-06 19:46 0次下载
    教程 8:<b class='flag-5'>调试</b><b class='flag-5'>方法</b>

    硬件调试流程介绍

    最近在调试产品,正好看到前人总结的一个调试流程图,总结了本文,供大家交流学习。首先我们看看如下这个流程图。 调试
    的头像 发表于 09-10 10:16 920次阅读
    硬件<b class='flag-5'>调试</b><b class='flag-5'>流程</b>介绍