From: <wt...@ke...> - 2007-06-11 11:32:48
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Mon Jun 11 2007 11:32:40 UTC Log message: Based on patch by: Thiago Sousa Santos <thiagossantos at gmail dot com> * gst/playback/gstqueue2.c: (gst_queue_peer_query), (gst_queue_handle_src_query): Wait for preroll before attempting to forward a duration query upstream. Fixes #445505. Modified files: . : ChangeLog gst/playback : gstqueue2.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.3362&r2=1.3363 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstqueue2.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.3362 retrieving revision 1.3363 diff -u -d -r1.3362 -r1.3363 --- ChangeLog 7 Jun 2007 21:08:38 -0000 1.3362 +++ ChangeLog 11 Jun 2007 11:32:26 -0000 1.3363 @@ -1,3 +1,12 @@ +2007-06-11 Wim Taymans <wi...@fl...> + + Based on patch by: Thiago Sousa Santos <thiagossantos at gmail dot com> + * gst/playback/gstqueue2.c: (gst_queue_peer_query), + (gst_queue_handle_src_query): + Wait for preroll before attempting to forward a duration query upstream. + Fixes #445505. 2007-06-07 Sebastien Moutte <seb...@mo...> * gst-libs/gst/rtp/gstbasertpdepayload.c: Index: gstqueue2.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstqueue2.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstqueue2.c 7 Jun 2007 09:11:27 -0000 1.8 +++ gstqueue2.c 11 Jun 2007 11:32:26 -0000 1.9 @@ -1391,19 +1391,24 @@ } static gboolean -gst_queue_handle_src_query (GstPad * pad, GstQuery * query) +gst_queue_peer_query (GstQueue * queue, GstPad * pad, GstQuery * query) { - GstQueue *queue = GST_QUEUE (GST_PAD_PARENT (pad)); + gboolean ret = FALSE; GstPad *peer; - gboolean res; - if (!(peer = gst_pad_get_peer (queue->sinkpad))) - return FALSE; + if ((peer = gst_pad_get_peer (pad))) { + ret = gst_pad_query (peer, query); + gst_object_unref (peer); + } + return ret; +} - res = gst_pad_query (peer, query); - gst_object_unref (peer); - if (!res) +static gboolean +gst_queue_handle_src_query (GstPad * pad, GstQuery * query) +{ + GstQueue *queue; + queue = GST_QUEUE (GST_PAD_PARENT (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: @@ -1411,6 +1416,9 @@ gint64 peer_pos; GstFormat format; + if (!gst_queue_peer_query (queue, queue->sinkpad, query)) + goto peer_failed; /* get peer position */ gst_query_parse_position (query, &format, &peer_pos); @@ -1431,12 +1439,45 @@ gst_query_set_position (query, format, peer_pos); break; } + case GST_QUERY_DURATION: + { + GST_DEBUG_OBJECT (queue, "waiting for preroll in duration query"); + GST_QUEUE_MUTEX_LOCK (queue); + /* we have to wait until the upstream element is at least paused, which + * happened when we received a first item. */ + while (gst_queue_is_empty (queue)) { + GST_QUEUE_WAIT_ADD_CHECK (queue, flushing); + } + GST_QUEUE_MUTEX_UNLOCK (queue); + GST_DEBUG_OBJECT (queue, "peer query success"); + break; + } default: /* peer handled other queries */ } return TRUE; + /* ERRORS */ +peer_failed: + { + GST_DEBUG_OBJECT (queue, "failed peer query"); + return FALSE; +flushing: + GST_DEBUG_OBJECT (queue, "flushing while waiting for query"); + GST_QUEUE_MUTEX_UNLOCK (queue); static GstFlowReturn |