From 9bbacae78f5750825bd79ec332c0ff0105552c0f Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Mon, 27 Apr 2009 22:39:15 +0200 Subject: baseparse: fix (regression in) newsegment handling (aacparse, amrparse, flacparse). Fixes #580133. --- gst/aacparse/gstbaseparse.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'gst/aacparse/gstbaseparse.c') diff --git a/gst/aacparse/gstbaseparse.c b/gst/aacparse/gstbaseparse.c index 3c322709..3224f445 100644 --- a/gst/aacparse/gstbaseparse.c +++ b/gst/aacparse/gstbaseparse.c @@ -206,7 +206,6 @@ struct _GstBaseParsePrivate gboolean flushing; gint64 offset; - gint64 pending_offset; GList *pending_events; @@ -547,7 +546,7 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event) { gdouble rate, applied_rate; GstFormat format; - gint64 start, stop, pos; + gint64 start, stop, pos, offset = 0; gboolean update; gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, @@ -559,7 +558,7 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event) /* stop time is allowed to be open-ended, but not start & pos */ seg_stop = GST_CLOCK_TIME_NONE; - parse->priv->pending_offset = pos; + offset = pos; if (gst_base_parse_bytepos_to_time (parse, start, &seg_start) && gst_base_parse_bytepos_to_time (parse, pos, &seg_pos)) { @@ -600,6 +599,12 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event) gst_event_replace (eventp, event); gst_event_unref (event); handled = TRUE; + + /* but finish the current segment */ + GST_DEBUG_OBJECT (parse, "draining current segment"); + gst_base_parse_drain (parse); + gst_adapter_clear (parse->adapter); + parse->priv->offset = offset; break; } @@ -873,19 +878,6 @@ gst_base_parse_chain (GstPad * pad, GstBuffer * buffer) parse = GST_BASE_PARSE (GST_OBJECT_PARENT (pad)); bclass = GST_BASE_PARSE_GET_CLASS (parse); - if (G_UNLIKELY (parse->pending_segment)) { - parse->priv->offset = parse->priv->pending_offset; - - /* Make sure that adapter doesn't have any old data after - newsegment has been pushed */ - - /* FIXME: when non-flushing seek occurs, chain is still processing the - data from old segment. If this processing loop is then interrupted - (e.g. paused), chain function exists and next time it gets called - all this old data gets lost and playback continues from new segment */ - gst_adapter_clear (parse->adapter); - } - if (G_LIKELY (buffer)) { GST_LOG_OBJECT (parse, "buffer size: %d, offset = %lld", GST_BUFFER_SIZE (buffer), GST_BUFFER_OFFSET (buffer)); -- cgit v1.2.1