Trying to match Raspberry Pi B MPEG2 decode performance on Nano

Trying to get the Jetson Nano to decode MPEG2 video that matches the quality and latency of what I’m able to do on the Raspberry Pi B. I’m running both boards in console mode and testing output directly to the HDMI console. The latency is simply being observed but is obvious when the camera is moved. Regardless of what I do, the Nano’s video quality is (slightly) worse and the latency in most cases its 250ms or more than the Pi.

On the Pi I’m using omxplayer and here’s a typical command:

user@pi:~ $ omxplayer --lavfdopts fflags:nobuffer --avdict flags:low_delay --avdict rtsp_transport:tcp udp://@239.255.235.14:4444

and on the Nano:

user@nano:~ $ gst-launch-1.0 pipeline. \( latency=0 udpsrc uri=udp://@239.255.235.14:4444 ! tsdemux ! queue ! mpegvideoparse ! omxmpeg2videodec ! nvoverlaysink sync=true \)

Having sync=false isn’t an option (unless something else can be tweaked) because it makes the video jerky.

I’ve tried adjusting the latency, playing with the queue, using playbin and uridecodebin but none of them can match the performance of omxplayer on the Pi.

Anyone have any suggestions as to other things to try?

Hi,
Please try nvv4l2decoder.

Thanks for the reply. I have tried that in many combinations. The pipeline I listed was an explicit one, I switched to using decodebin and it does select nvv4l2decoder. Here’s more information if it helps:

user@nano:~$ gst-launch-1.0 -v pipeline. \(  latency=0 udpsrc uri=udp://@239.255.133.60:4444 ! decodebin ! queue ! nvoverlaysink sync=true  \)
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstTypeFindElement:typefind.GstPad:src: caps = video/mpegts, systemstream=(boolean)true, packetsize=(int)188
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstTSDemux:tsdemux0.GstPad:sink: caps = video/mpegts, systemstream=(boolean)true, packetsize=(int)188
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstMultiQueue:multiqueue0.GstPad:src_0: caps = video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstMpegvParse:mpegvparse0.GstPad:sink: caps = video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstMultiQueue:multiqueue0: max-size-buffers = 5
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstMultiQueue:multiqueue0: max-size-time = 0
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstMultiQueue:multiqueue0: max-size-bytes = 2097152
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstMultiQueue:multiqueue0.GstMultiQueuePad:sink_0: caps = video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
Opening in BLOCKING MODE 
NvMMLiteOpen : Block : BlockType = 267 
NVMEDIA: Reading vendor.tegra.display-size : status: 6 
NvMMLiteBlockCreate : Block : BlockType = 267 
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/nvv4l2decoder:nvv4l2decoder0.GstPad:sink: caps = video/mpeg, mpegversion=(int)2, systemstream=(boolean)false, parsed=(boolean)true, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)8/9, codec_data=(buffer)000001b32d01e0240697a380000001b5148200010000, profile=(string)main, level=(string)main, interlace-mode=(string)mixed
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstMpegvParse:mpegvparse0.GstPad:src: caps = video/mpeg, mpegversion=(int)2, systemstream=(boolean)false, parsed=(boolean)true, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)8/9, codec_data=(buffer)000001b32d01e0240697a380000001b5148200010000, profile=(string)main, level=(string)main, interlace-mode=(string)mixed
NVMEDIA: NvMediaMixerInit: 119: frameWidth = 720, frameHeight = 480 
NVMEDIA: DeinterlaceThread: 782: DeinterlaceThread is created 
/GstPipeline:pipeline0/GstDecodeBin:decodebin0/nvv4l2decoder:nvv4l2decoder0.GstPad:src: caps = video/x-raw(memory:NVMM), format=(string)NV12, width=(int)720, height=(int)480, interlace-mode=(string)mixed, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)8/9, chroma-site=(string)jpeg, colorimetry=(string)bt601, framerate=(fraction)30000/1001
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:sink: caps = video/x-raw(memory:NVMM), format=(string)NV12, width=(int)720, height=(int)480, interlace-mode=(string)mixed, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)8/9, chroma-site=(string)jpeg, colorimetry=(string)bt601, framerate=(fraction)30000/1001
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:sink: caps = video/x-raw(memory:NVMM), format=(string)NV12, width=(int)720, height=(int)480, interlace-mode=(string)mixed, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)8/9, chroma-site=(string)jpeg, colorimetry=(string)bt601, framerate=(fraction)30000/1001
/GstPipeline:pipeline0/GstDecodeBin:decodebin0.GstDecodePad:src_0.GstProxyPad:proxypad2: caps = video/x-raw(memory:NVMM), format=(string)NV12, width=(int)720, height=(int)480, interlace-mode=(string)mixed, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)8/9, chroma-site=(string)jpeg, colorimetry=(string)bt601, framerate=(fraction)30000/1001
/GstPipeline:pipeline0/GstNvOverlaySink-nvoverlaysink:nvoverlaysink-nvoverlaysink0.GstPad:sink: caps = video/x-raw(memory:NVMM), format=(string)NV12, width=(int)720, height=(int)480, interlace-mode=(string)mixed, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)8/9, chroma-site=(string)jpeg, colorimetry=(string)bt601, framerate=(fraction)30000/1001
WARNING: from element /GstPipeline:pipeline0: GStreamer error: clock problem.
Additional debug info:
gstpipeline.c(663): gst_pipeline_do_latency (): /GstPipeline:pipeline0:
Configured latency is lower than detected minimum latency: configured 0:00:00.000000000 < min 0:00:00.733366666
:

I’ve tried turning as many knobs as possible but I can’t get it to be as good as the rPi WRT latency and image quality. Part of the problem is there really aren’t that many knobs to turn with this pipeline, the only one that can be adjusted is the queue and I haven’t been able to make it any better.

Any suggestions with the queue settings would be welcome. I’ve tried adjusting max-size-* all to 0 with no effect.

Is this just a difference between the ffmpeg decoding and using gstreamer?

Not sure, but this looks suspect…you may try to set a higher latency.