mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-23 23:58:17 +00:00
baseparse: fix (regression in) newsegment handling
(aacparse, amrparse, flacparse). Fixes #580133.
This commit is contained in:
parent
4b80afc22c
commit
f5379229a0
1 changed files with 8 additions and 16 deletions
|
@ -206,7 +206,6 @@ struct _GstBaseParsePrivate
|
||||||
gboolean flushing;
|
gboolean flushing;
|
||||||
|
|
||||||
gint64 offset;
|
gint64 offset;
|
||||||
gint64 pending_offset;
|
|
||||||
|
|
||||||
GList *pending_events;
|
GList *pending_events;
|
||||||
|
|
||||||
|
@ -547,7 +546,7 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
{
|
{
|
||||||
gdouble rate, applied_rate;
|
gdouble rate, applied_rate;
|
||||||
GstFormat format;
|
GstFormat format;
|
||||||
gint64 start, stop, pos;
|
gint64 start, stop, pos, offset = 0;
|
||||||
gboolean update;
|
gboolean update;
|
||||||
|
|
||||||
gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate,
|
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 */
|
/* stop time is allowed to be open-ended, but not start & pos */
|
||||||
seg_stop = GST_CLOCK_TIME_NONE;
|
seg_stop = GST_CLOCK_TIME_NONE;
|
||||||
parse->priv->pending_offset = pos;
|
offset = pos;
|
||||||
|
|
||||||
if (gst_base_parse_bytepos_to_time (parse, start, &seg_start) &&
|
if (gst_base_parse_bytepos_to_time (parse, start, &seg_start) &&
|
||||||
gst_base_parse_bytepos_to_time (parse, pos, &seg_pos)) {
|
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_replace (eventp, event);
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
handled = TRUE;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -873,19 +878,6 @@ gst_base_parse_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
parse = GST_BASE_PARSE (GST_OBJECT_PARENT (pad));
|
parse = GST_BASE_PARSE (GST_OBJECT_PARENT (pad));
|
||||||
bclass = GST_BASE_PARSE_GET_CLASS (parse);
|
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)) {
|
if (G_LIKELY (buffer)) {
|
||||||
GST_LOG_OBJECT (parse, "buffer size: %d, offset = %lld",
|
GST_LOG_OBJECT (parse, "buffer size: %d, offset = %lld",
|
||||||
GST_BUFFER_SIZE (buffer), GST_BUFFER_OFFSET (buffer));
|
GST_BUFFER_SIZE (buffer), GST_BUFFER_OFFSET (buffer));
|
||||||
|
|
Loading…
Reference in a new issue