Deinterlace plugin working backwards ?

Nicolas Dufresne nicolas at ndufresne.ca
Wed Oct 28 14:50:33 UTC 2020


Le mercredi 28 octobre 2020 à 12:54 +0100, Rob Heig a écrit :
> Yes, sure, the same as above but it says that the input file is at 25
> Hz and the output of deinterlace is at 50 Hz :(
> On Wed, 28 Oct 2020 at 12:51, Tony Houghton <h at realh.co.uk> wrote:
> > Have you also tried framerate=25/1?
> > 
> > On Wed, 28 Oct 2020 at 11:37, Rob Heig <robhhh6 at gmail.com> wrote:
> > > Thanks for your reply! Yes I've did that, what I get is that
> > > window that gets displayed has two frames one on top of the
> > > other, still doubling the frame rate:
> > > 
> > > gst-launch-1.0 -v filesrc location=vvvv.raw ! videoparse
> > > width=768 height=576 format=4 framerate=50/1 interlaced=true !
> > > videoconvert ! deinterlace ! autovideosink

Appparently videoparse (same for rawvideoparse, it's replacement), only
gives you a boolean for interlacing. While in practice, GStreamer caps
uses an enum, interlace-mode={progressive, interleaved, alternate}.

The last is only supported in 1.18+ and that method seems to be what
you have in your raw video data according to the field height hack you
have done.

Progressive content is not interlaved. The most common way to store
interlaced content is "interleaved", what is being assumed by
rawvideoparse. In this mode, top and bottom fields are stored in the
same buffer with full height, you'd have top fields line on even lines,
and bottom field lines on odds lines (you have to set the field-order=
in the caps if you have bottom field first).

What you seem to have instead of alternate interlaced. In this case,
each fields is passed as an half height image, alternating between
images. This was added recently in gstreamer under a caps setter.
Perhaps the author forgot to update and test with rawvideoparse, but I
would try using upstream caps filter to communicate the settings
properly to the parser (by enabling use-sink-caps property).

  ... ! video/x-raw\(format:Interlaced\),interlace-mode=alternate,format=YUY2,width=768,height=576 ! rawvideoparse use-sink-caps=1 ! ...

Ideally we could deprecate the bookean property and add a new property
"interlace-mode" with the enum inside rawvideoparse. I'm not totally
sure that this caps filter method will actually work. If not, please
open an issue against gst-plugins-good.

> > > 
> > > Setting pipeline to PAUSED ...
> > > Pipeline is PREROLLING ...
> > > /GstPipeline:pipeline0/GstVideoParse:videoparse0/GstRawVideoParse
> > > :inner_rawvideoparse.GstPad:src: caps = video/x-raw,
> > > format=(string)YUY2, width=(int)768, height=(int)576, interlace-
> > > mode=(string)interleaved, pixel-aspect-ratio=(fraction)1/1,
> > > chroma-site=(string)jpeg, colorimetry=(string)bt601,
> > > framerate=(fraction)50/1
> > > /GstPipeline:pipeline0/GstVideoParse:videoparse0.GstGhostPad:src:
> > > caps = video/x-raw, format=(string)YUY2, width=(int)768,
> > > height=(int)576, interlace-mode=(string)interleaved, pixel-
> > > aspect-ratio=(fraction)1/1, chroma-site=(string)jpeg,
> > > colorimetry=(string)bt601, framerate=(fraction)50/1
> > > /GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:src:
> > > caps = video/x-raw, width=(int)768, height=(int)576, interlace-
> > > mode=(string)interleaved, pixel-aspect-ratio=(fraction)1/1,
> > > framerate=(fraction)50/1, format=(string)YV12
> > > /GstPipeline:pipeline0/GstDeinterlace:deinterlace0.GstPad:src:
> > > caps = video/x-raw, width=(int)768, height=(int)576, interlace-
> > > mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1,
> > > framerate=(fraction)100/1, format=(string)YV12
> > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGhostPa
> > > d:sink.GstProxyPad:proxypad2: caps = video/x-raw, width=(int)768,
> > > height=(int)576, interlace-mode=(string)progressive, pixel-
> > > aspect-ratio=(fraction)1/1, framerate=(fraction)100/1,
> > > format=(string)YV12
> > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstXvImage
> > > Sink:autovideosink0-actual-sink-xvimage.GstPad:sink: caps =
> > > video/x-raw, width=(int)768, height=(int)576, interlace-
> > > mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1,
> > > framerate=(fraction)100/1, format=(string)YV12
> > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGhostPa
> > > d:sink: caps = video/x-raw, width=(int)768, height=(int)576,
> > > interlace-mode=(string)progressive, pixel-aspect-
> > > ratio=(fraction)1/1, framerate=(fraction)100/1,
> > > format=(string)YV12
> > > /GstPipeline:pipeline0/GstDeinterlace:deinterlace0.GstPad:sink:
> > > caps = video/x-raw, width=(int)768, height=(int)576, interlace-
> > > mode=(string)interleaved, pixel-aspect-ratio=(fraction)1/1,
> > > framerate=(fraction)50/1, format=(string)YV12
> > > /GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:sink:
> > > caps = video/x-raw, format=(string)YUY2, width=(int)768,
> > > height=(int)576, interlace-mode=(string)interleaved, pixel-
> > > aspect-ratio=(fraction)1/1, chroma-site=(string)jpeg,
> > > colorimetry=(string)bt601, framerate=(fraction)50/1
> > > /GstPipeline:pipeline0/GstVideoParse:videoparse0.GstGhostPad:src.
> > > GstProxyPad:proxypad1: caps = video/x-raw, format=(string)YUY2,
> > > width=(int)768, height=(int)576, interlace-
> > > mode=(string)interleaved, pixel-aspect-ratio=(fraction)1/1,
> > > chroma-site=(string)jpeg, colorimetry=(string)bt601,
> > > framerate=(fraction)50/1
> > > Pipeline is PREROLLED ...
> > > Setting pipeline to PLAYING ...
> > > New clock: GstSystemClock
> > > Got EOS from element "pipeline0".
> > > Execution ended after 0:00:03.000241651
> > > Setting pipeline to PAUSED ...
> > > Setting pipeline to READY ...
> > > Setting pipeline to NULL ...
> > > Freeing pipeline ...
> > > 
> > > On Wed, 28 Oct 2020 at 12:11, Tony Houghton <h at realh.co.uk>
> > > wrote:
> > > > It seems more conventional to refer to the total frame height
> > > > rather than the height of each field, so have you tried using
> > > > "height=576" instead?
> > > > 
> > > > On Wed, 28 Oct 2020 at 11:00, Rob Heig <robhhh6 at gmail.com>
> > > > wrote:
> > > > > Hello,
> > > > > I'm trying to deinterlace an interlaced raw video, but
> > > > > despite having spent 2 days on this I am still stuck. The
> > > > > interesting thing is that, by looking at the output of gst-
> > > > > launch, I see weird results:
> > > > > 
> > > > > gst-launch-1.0 -v filesrc location=vvvv.raw ! videoparse
> > > > > width=768 height=288 format=4 framerate=50/1 interlaced=true
> > > > > ! videoconvert ! deinterlace ! autovideosink
> > > > > 
> > > > > Setting pipeline to PAUSED ...
> > > > > Pipeline is PREROLLING ...
> > > > > /GstPipeline:pipeline0/GstVideoParse:videoparse0/GstRawVideoP
> > > > > arse:inner_rawvideoparse.GstPad:src: caps = video/x-raw,
> > > > > format=(string)YUY2, width=(int)768, height=(int)288,
> > > > > interlace-mode=(string)interleaved, pixel-aspect-
> > > > > ratio=(fraction)1/1, chroma-site=(string)jpeg,
> > > > > colorimetry=(string)bt601, framerate=(fraction)50/1
> > > > > /GstPipeline:pipeline0/GstVideoParse:videoparse0.GstGhostPad:
> > > > > src: caps = video/x-raw, format=(string)YUY2, width=(int)768,
> > > > > height=(int)288, interlace-mode=(string)interleaved, pixel-
> > > > > aspect-ratio=(fraction)1/1, chroma-site=(string)jpeg,
> > > > > colorimetry=(string)bt601, framerate=(fraction)50/1
> > > > > /GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:s
> > > > > rc: caps = video/x-raw, width=(int)768, height=(int)288,
> > > > > interlace-mode=(string)interleaved, pixel-aspect-
> > > > > ratio=(fraction)1/1, framerate=(fraction)50/1,
> > > > > format=(string)YV12
> > > > > /GstPipeline:pipeline0/GstDeinterlace:deinterlace0.GstPad:src
> > > > > : caps = video/x-raw, width=(int)768, height=(int)288,
> > > > > interlace-mode=(string)progressive, pixel-aspect-
> > > > > ratio=(fraction)1/1, framerate=(fraction)100/1,
> > > > > format=(string)YV12
> > > > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGho
> > > > > stPad:sink.GstProxyPad:proxypad2: caps = video/x-raw,
> > > > > width=(int)768, height=(int)288, interlace-
> > > > > mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1,
> > > > > framerate=(fraction)100/1, format=(string)YV12
> > > > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstXvI
> > > > > mageSink:autovideosink0-actual-sink-xvimage.GstPad:sink: caps
> > > > > = video/x-raw, width=(int)768, height=(int)288, interlace-
> > > > > mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1,
> > > > > framerate=(fraction)100/1, format=(string)YV12
> > > > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGho
> > > > > stPad:sink: caps = video/x-raw, width=(int)768,
> > > > > height=(int)288, interlace-mode=(string)progressive, pixel-
> > > > > aspect-ratio=(fraction)1/1, framerate=(fraction)100/1,
> > > > > format=(string)YV12
> > > > > /GstPipeline:pipeline0/GstDeinterlace:deinterlace0.GstPad:sin
> > > > > k: caps = video/x-raw, width=(int)768, height=(int)288,
> > > > > interlace-mode=(string)interleaved, pixel-aspect-
> > > > > ratio=(fraction)1/1, framerate=(fraction)50/1,
> > > > > format=(string)YV12
> > > > > /GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:s
> > > > > ink: caps = video/x-raw, format=(string)YUY2, width=(int)768,
> > > > > height=(int)288, interlace-mode=(string)interleaved, pixel-
> > > > > aspect-ratio=(fraction)1/1, chroma-site=(string)jpeg,
> > > > > colorimetry=(string)bt601, framerate=(fraction)50/1
> > > > > /GstPipeline:pipeline0/GstVideoParse:videoparse0.GstGhostPad:
> > > > > src.GstProxyPad:proxypad1: caps = video/x-raw,
> > > > > format=(string)YUY2, width=(int)768, height=(int)288,
> > > > > interlace-mode=(string)interleaved, pixel-aspect-
> > > > > ratio=(fraction)1/1, chroma-site=(string)jpeg,
> > > > > colorimetry=(string)bt601, framerate=(fraction)50/1
> > > > > Pipeline is PREROLLED ...
> > > > > Setting pipeline to PLAYING ...
> > > > > New clock: GstSystemClock
> > > > > ERROR: from element
> > > > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstXvI
> > > > > mageSink:autovideosink0-actual-sink-xvimage: Output window
> > > > > was closed
> > > > > Additional debug info:
> > > > > xvimagesink.c(555): gst_xv_image_sink_handle_xevents ():
> > > > > /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstXvI
> > > > > mageSink:autovideosink0-actual-sink-xvimage
> > > > > Execution ended after 0:00:02.956028008
> > > > > Setting pipeline to PAUSED ...
> > > > > Setting pipeline to READY ...
> > > > > Setting pipeline to NULL ...
> > > > > Freeing pipeline ...
> > > > > 
> > > > > I would naively expect the deinterlace plugin to take a 50
> > > > > Hz, 720x288 interlaced video and give as output a 25 Hz,
> > > > > 720x576 one.
> > > > > Instead, the resolution stays the same, while the frame rate
> > > > > doubles.... ????
> > > > > I have tested this on gstreamer 1.45 and gstreamer 1.6.
> > > > > Am I missing anything?
> > > > > Thanks in advance for all suggestions!
> > > > > Best,
> > > > > Rob
> > > > > 
> > > > > _______________________________________________
> > > > > gstreamer-devel mailing list
> > > > > gstreamer-devel at lists.freedesktop.org
> > > > >  
> > > > > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> > > > 
> > > > 
> > > > -- 
> > > > TH
> > > > _______________________________________________
> > > > gstreamer-devel mailing list
> > > > gstreamer-devel at lists.freedesktop.org
> > > > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> > > _______________________________________________
> > > gstreamer-devel mailing list
> > > gstreamer-devel at lists.freedesktop.org
> > > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> > 
> > 
> > _______________________________________________
> > gstreamer-devel mailing list
> > gstreamer-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel




More information about the gstreamer-devel mailing list