summaryrefslogtreecommitdiffstats
path: root/gst/amrparse/gstbaseparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/amrparse/gstbaseparse.c')
-rw-r--r--gst/amrparse/gstbaseparse.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/gst/amrparse/gstbaseparse.c b/gst/amrparse/gstbaseparse.c
index 00e2d7f8..7483c2b9 100644
--- a/gst/amrparse/gstbaseparse.c
+++ b/gst/amrparse/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));