vvdec: add VVdeC decoder element

Carlos Bentzen requested to merge cadubentzen/gst-plugins-rs:vvdec into main

Closes #380

This MR adds a new vvdec element which decodes VVC streams using the safe bindings to the VVdeC library from vvdec-rs.

To manually test playback the easiest way is to start a gst-env with a patch to the TS demuxer to support VVC. It should become easier to test in future gstreamer versions when there's an H.266 parser (work started in gst-plugins-bad!2364 and is maybe in progress)

It works both with a manual pipeline such as

gst-launch-1.0 filesrc location=vvc.ts ! tsdemux ! h266parse ! vvdec ! videoconvert ! autovideosink

or via gst-play-1.0 vvc.ts.

Some input files can be obtained here.

Seeking also works, although sluggish: after flushing, the first newly decoded frame is displayed quickly but it then takes up to 2 seconds for playback to continue smoothly.

Some possible improvements to it which I'm not tackling here yet:

  • Grayscale support: Although VVdeC reports supporting YUV400, I couldn't find streams to test it with nor was I successful to encode an asset with VVenC easily to test. So I'm not claiming support for it yet.
  • Latency query: It's clear that there's some latency in the decoder but it's not yet clear to me about how to retrieve or calculate it yet so I didn't dare to implement the query yet. In VVdeC, they use interchangeably the number of parser threads as the "parser frames delay", but I've seen cases where I had 8 parser threads and decoded frames were only returned after pushing 20 frames.
Edited by Carlos Bentzen

Merge request reports