[gst-devel] Re : gstoggmux EOS handling issue

Aurelien Grimaud gstelzz at yahoo.fr
Tue Aug 12 00:48:01 CEST 2008


Attached here are :

recordtwice.2.py : slightly different from the initial one you provide. It blocks tee src pad, send eos and release tee request pad.
It also has a timeoverlay on video.
With patch http://bugzilla.gnome.org/show_bug.cgi?id=474016 (relaying newsegment for new tee src pad), it works fine.

The only problem is that first buffer timestamp is running timestamp. 
totem just play the to recorded files fine.
mplayer also, though when printing elapsed time, it start with running timestamp recorded, not 0
xine plays it ok too, but waits for initial timestamp (3secs, 10 secs) with frozen video before playing.

gst-launch -v filesrc location=output1.ogg ! decodebin ! fakesink sync=TRUE
Définition du pipeline à PAUSED...
/pipeline0/decodebin0/typefind.src: caps = application/ogg
Le pipeline est en phase de PREROLL...
/pipeline0/decodebin0/queue0.sink: caps = video/x-theora
/pipeline0/decodebin0/queue0.src: caps = video/x-theora
/pipeline0/decodebin0/theoradec1.sink: caps = video/x-theora
/pipeline0/decodebin0/theoradec1.src: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/fakesink1.sink: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/decodebin0.src0: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/decodebin0.src0.proxypad1: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/fakesink1: last-message = "preroll   ******* "
Le pipeline a terminé la phase PREROLL...
Passage du pipeline à la phase PLAYING...
/pipeline0/fakesink1: last-message = "event   ******* E (type: 102, GstEventNewsegment, update=(boolean)false, rate=(double)1, applied_rate=(double)1, format=(GstFormat)GST_FORMAT_TIME, start=(gint64)0, stop=(gint64)9000000000, position=(gint64)0;) 0x86edd18"
/pipeline0/fakesink1: last-message = "event   ******* E (type: 118, taglist, encoder=(string)\"Xiph.Org\\ libTheora\\ I\\ 20070915\\ 3\\ 2\\ 1\", encoder-version=(guint)3, video-codec=(string)Theora;) 0x8861f40"
New clock: GstSystemClock
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:00.000000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1, flags: 32) 0x87eec50"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:04.000000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1, flags: 32) 0x87eecf0"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:04.100000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1, flags: 0) 0x87eeca0"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:04.200000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1, flags: 0) 0x87eeaa0"

When you get rid of timeoverlay, behavior changes.
The first buffer timestamp is now 0, but the second one is the timestamp of record start.
This makes :
totem, mplayer and xine waits for second timestamp with frozen video.


gst-launch -v filesrc location=output1.ogg ! decodebin ! fakesink sync=TRUE
Définition du pipeline à PAUSED...
/pipeline0/decodebin0/typefind.src: caps = application/ogg
Le pipeline est en phase de PREROLL...
/pipeline0/decodebin0/queue0.sink: caps = video/x-theora
/pipeline0/decodebin0/queue0.src: caps = video/x-theora
/pipeline0/decodebin0/theoradec1.sink: caps = video/x-theora
/pipeline0/decodebin0/theoradec1.src: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/fakesink1.sink: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/decodebin0.src0: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/decodebin0.src0.proxypad1: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)10/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/fakesink1: last-message = "preroll   ******* "
Le pipeline a terminé la phase PREROLL...
Passage du pipeline à la phase PLAYING...
/pipeline0/fakesink1: last-message = "event   ******* E (type: 102, GstEventNewsegment, update=(boolean)false, rate=(double)1, applied_rate=(double)1, format=(GstFormat)GST_FORMAT_TIME, start=(gint64)3900000000, stop=(gint64)8900000000, position=(gint64)0;) 0x9965d18"
/pipeline0/fakesink1: last-message = "event   ******* E (type: 118, taglist, encoder=(string)\"Xiph.Org\\ libTheora\\ I\\ 20070915\\ 3\\ 2\\ 1\", encoder-version=(guint)3, video-codec=(string)Theora;) 0x9ad9f40"
New clock: GstSystemClock
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:03.900000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1, flags: 32) 0x9a66b90"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:04.000000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1, flags: 0) 0x9a66c00"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:04.100000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1, flags: 0) 0x9a66c50"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:04.200000000, duration: 0:00:00.100000000, offset: -1, offset_end: -1

gst-record.cc is recordtwice.2.py written in C++, without pad block or clockoverlay.
It works the same as py with clockoverlay (fine but first timestamp is not 0)

gst-launch -v filesrc location=output1.ogg ! decodebin ! fakesink sync=TRUE
Définition du pipeline à PAUSED...
/pipeline0/decodebin0/typefind.src: caps = application/ogg
Le pipeline est en phase de PREROLL...
/pipeline0/decodebin0/queue0.sink: caps = video/x-theora
/pipeline0/decodebin0/queue0.src: caps = video/x-theora
/pipeline0/decodebin0/theoradec1.sink: caps = video/x-theora
/pipeline0/decodebin0/theoradec1.src: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/fakesink1.sink: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/decodebin0.src0: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/decodebin0.src0.proxypad1: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, width=(int)320, height=(int)240
/pipeline0/fakesink1: last-message = "preroll   ******* "
Le pipeline a terminé la phase PREROLL...
Passage du pipeline à la phase PLAYING...
/pipeline0/fakesink1: last-message = "event   ******* E (type: 102, GstEventNewsegment, update=(boolean)false, rate=(double)1, applied_rate=(double)1, format=(GstFormat)GST_FORMAT_TIME, start=(gint64)3933333333, stop=(gint64)8933333333, position=(gint64)0;) 0x8ad7d40"
/pipeline0/fakesink1: last-message = "event   ******* E (type: 118, taglist, encoder=(string)\"Xiph.Org\\ libTheora\\ I\\ 20070915\\ 3\\ 2\\ 1\", encoder-version=(guint)3, video-codec=(string)Theora;) 0x8ad7d68"
New clock: GstSystemClock
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:03.933333333, duration: 0:00:00.033333333, offset: -1, offset_end: -1, flags: 32) 0x8a64c50"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:03.966666666, duration: 0:00:00.033333334, offset: -1, offset_end: -1, flags: 0) 0x8a64cf0"
/pipeline0/fakesink1: last-message = "chain   ******* < (115200 bytes, timestamp: 0:00:04.000000000, duration: 0:00:00.033333333, offset: -1, offset_end: -1, flags: 0) 0x8a64ca0"


Why the initial timestamp  difference with timeoverlay ?
What is in python binding which makes its behavior change from C ?
Something with freeing gstreamer elements (such as ghost pads or request pads) ?
I noticed you have to be extra careful with request pads when working with dynamic pipeline.
You have to release them when you do not use them anymore.

Aurelien


----- Message d'origine ----
De : Daniel Drake <dsd at laptop.org>
À : Tim-Philipp Müller <t.i.m at zen.co.uk>
Cc : gstreamer-devel at lists.sourceforge.net
Envoyé le : Lundi, 11 Août 2008, 17h27mn 08s
Objet : Re: [gst-devel] gstoggmux EOS handling issue

On Fri, 2008-08-08 at 14:11 +0100, Tim-Philipp Müller wrote:
> (Btw, not sure what exactly you were trying to fix, and I only had a
> very quick look at your code, but at first glance the shutdown sequence
> doesn't seem ideal: as far as I can see it won't shut down cleanly with
> an EOS making it through the recording bin; for ogg this just means that
> in the worst case you're losing a few frames at the end; with other
> muxers you might get slightly broken and/or indexless files).

Tim explained this on IRC. Cleanly shutting down the recording stream
works around the bug I found (if it is indeed a bug).

In case it helps others, the process for cleanly stopping a live capture
is as follows:
- send an EOS on the live capture element(s) using
   gst_element_send_event(gst_event_new_eos())
- connect a watch handler to the bus of the pipeline and wait for
   GST_MESSAGE_EOS
- when EOS arrives, set the pipeline state to NULL

Working code here:
http://dev.laptop.org/~dsd/20080811/recordtwice.txt

Daniel



-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



      _____________________________________________________________________________ 
Envoyez avec Yahoo! Mail. Une boite mail plus intelligente http://mail.yahoo.fr
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20080811/0da977d6/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: gst-record-twice.cc
Type: text/x-c++src
Size: 3866 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20080811/0da977d6/attachment-0001.cc>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: recordtwice.2.py
Type: text/x-python
Size: 6116 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20080811/0da977d6/attachment-0001.py>


More information about the gstreamer-devel mailing list