[gst-devel] Jerky audio and video at reconnect to dvbbase bin

Marco Ballesio gibrovacco at gmail.com
Sun May 9 10:06:12 CEST 2010


Hi,

On Thu, Apr 29, 2010 at 10:25 PM, Dr. Peter G. Baum <peter at dr-baum.net>wrote:

> Hi,
>
> I want to play video and audio from dvbbasebin with the help of decodebin.
> When I construct the pipeline for the first time it works perfectly, but
> when I disconnect decodebin from dvbbasebin and then reconnect, the
> audio is sometimes OK and sometimes jerky, the video is always jerky.
>

sorry, it's not clear to me whether you're reusing the same pipeline or not.


>
> The details follow below.
>
> Many thanks for the help,
>
> Peter
>
>
> My pipeline looks if I'm connected like this:
> dvbbasebin0 (PLAYING):
> -> program_16418
>    queue7 (PLAYING):
>    -> src
>       tee4 (PLAYING):
>       -> src0
>          fakesink5 (PLAYING):
> -> program_16407
>    queue6 (PLAYING):
>    -> src
>       tee3 (PLAYING):
>       -> src0
>          fakesink4 (PLAYING):
> -> program_16406
>    queue5 (PLAYING):
>    -> src
>       tee2 (PLAYING):
>       -> src0
>          fakesink3 (PLAYING):
> -> program_16405
>    queue4 (PLAYING):
>    -> src
>       tee1 (PLAYING):
>       -> src1
>          decodebin0 (PLAYING):
>          -> src1
>             audioSink (PLAYING):
>          -> src0
>             videoSink (PLAYING):
>       -> src0
>          fakesink2 (PLAYING):
> -> program_0
>    queue3 (PLAYING):
>    -> src
>       tee0 (PLAYING):
>       -> src0
>          fakesink1 (PLAYING):
>

looks like you have many sources connected to a tee, only one branch of the
latter is connected to a sink which is a fakesink. Either you can simplify
the pipeline or it's not completely reported here.

Can you generate a dotfile out of it?

You can do ti by calling GST_DEBUG_BIN_TO_DOT_FILE_
WITH_TS(bin, details, file_name). Run your app using
GST_DEBUG_DUMP_DOT_DIR=$PWD, convert the generated dot file to svg or png
and look at it / attach it here.


>
>
> Video and audio sinks are bins:
>       # make bin for audio sink
>       self._audioSink = gst.Bin( "audioSink" )
>       # not quite sure whether queue is necessary
>       queue = gst.element_factory_make( "queue" )
>       queue.set_property( "max-size-buffers", 0 )
>       queue.set_property( "max-size-time", 0 )
>

What if you do not set the max-size properties?

Regards


>       sink = gst.element_factory_make( "pulsesink" )
>       self._audioSink.add( queue, sink )
>       gst.element_link_many( queue, sink )
>       ghostpad = gst.GhostPad( "sink", queue.get_pad( 'sink' ) )
>       self._audioSink.add_pad( ghostpad )
>
>       # make bin for video sink
>       self._videoSink = gst.Bin( "videoSink" )
>       # not quite sure whether queue is necessary
>       queue = gst.element_factory_make( "queue" )
>       queue.set_property( "max-size-buffers", 0 )
>       queue.set_property( "max-size-time", 0 )
>       color = gst.element_factory_make( "ffmpegcolorspace" )
>       # this takes a lot of CPU, but improves quality tremendously
>       deinterlace = gst.element_factory_make( "deinterlace" )
>       sink = gst.element_factory_make( "xvimagesink" )
>       self._videoSink.add( queue, color, deinterlace, sink )
>       gst.element_link_many( queue, color, deinterlace, sink )
>       ghostpad = gst.GhostPad( "sink", queue.get_pad( 'sink' ) )
>       self._videoSink.add_pad( ghostpad )
>
>
> To disconnect I do:
>             teePad = chanInf.pad
>             peer = teePad.get_peer()
>             teePad.set_blocked( True )
>             teePad.unlink( peer )
>             teePad.set_blocked( False )
>             tee = teePad.get_parent_element( )
>             tee.release_request_pad( teePad )
>
>         self._decodebin.unlink( self._audioSink )
>          self._decodebin.unlink( self._videoSink )
>          self._decodebin.set_state( gst.STATE_READY )
>          self._audioSink.set_state( gst.STATE_READY )
>          self._videoSink.set_state( gst.STATE_READY )
>
>
> To reconnect I do:
>   def __onProgPadAdded( self, id, pad, new ):
>       pad.link( self._decodebin.get_pad( 'sink' ) )
>       self._decodebin.set_state( gst.STATE_PLAYING )
>
> And:
>    def __onMuxPadAdded( self, obj, pad ):
>       if pad.can_link( self._audioSink.get_pad( 'sink' ) ):
>          print "linking audio"
>          pad.link( self._audioSink.get_pad( 'sink' ) )
>          self._audioSink.set_state( gst.STATE_PLAYING )
>       elif pad.can_link( self._videoSink.get_pad( 'sink' ) ):
>          print "linking video"
>          pad.link( self._videoSink.get_pad( 'sink' ) )
>          self._videoSink.set_state( gst.STATE_PLAYING )
>
>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20100509/13c637f9/attachment.htm>


More information about the gstreamer-devel mailing list