mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-18 07:47:17 +00:00
baseparse: ensure to preserve upstream timestamps
... rather than have subclass coming up with an internally parsed one. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=707230
This commit is contained in:
parent
19c98d0b79
commit
d544b074b3
1 changed files with 16 additions and 0 deletions
|
@ -305,6 +305,7 @@ struct _GstBaseParsePrivate
|
||||||
gboolean upstream_seekable;
|
gboolean upstream_seekable;
|
||||||
gboolean upstream_has_duration;
|
gboolean upstream_has_duration;
|
||||||
gint64 upstream_size;
|
gint64 upstream_size;
|
||||||
|
GstFormat upstream_format;
|
||||||
/* minimum distance between two index entries */
|
/* minimum distance between two index entries */
|
||||||
GstClockTimeDiff idx_interval;
|
GstClockTimeDiff idx_interval;
|
||||||
guint64 idx_byte_interval;
|
guint64 idx_byte_interval;
|
||||||
|
@ -820,6 +821,7 @@ gst_base_parse_reset (GstBaseParse * parse)
|
||||||
parse->priv->upstream_seekable = FALSE;
|
parse->priv->upstream_seekable = FALSE;
|
||||||
parse->priv->upstream_size = 0;
|
parse->priv->upstream_size = 0;
|
||||||
parse->priv->upstream_has_duration = FALSE;
|
parse->priv->upstream_has_duration = FALSE;
|
||||||
|
parse->priv->upstream_format = GST_FORMAT_UNDEFINED;
|
||||||
parse->priv->idx_interval = 0;
|
parse->priv->idx_interval = 0;
|
||||||
parse->priv->idx_byte_interval = 0;
|
parse->priv->idx_byte_interval = 0;
|
||||||
parse->priv->exact_position = TRUE;
|
parse->priv->exact_position = TRUE;
|
||||||
|
@ -1008,6 +1010,7 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (parse, "segment %" GST_SEGMENT_FORMAT, in_segment);
|
GST_DEBUG_OBJECT (parse, "segment %" GST_SEGMENT_FORMAT, in_segment);
|
||||||
|
|
||||||
|
parse->priv->upstream_format = in_segment->format;
|
||||||
if (in_segment->format == GST_FORMAT_BYTES) {
|
if (in_segment->format == GST_FORMAT_BYTES) {
|
||||||
GstBaseParseSeek *seek = NULL;
|
GstBaseParseSeek *seek = NULL;
|
||||||
GSList *node;
|
GSList *node;
|
||||||
|
@ -2057,6 +2060,12 @@ gst_base_parse_handle_and_push_frame (GstBaseParse * parse,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* track upstream time if provided, not subclass' internal notion of it */
|
||||||
|
if (parse->priv->upstream_format == GST_FORMAT_TIME) {
|
||||||
|
GST_BUFFER_PTS (frame->buffer) = GST_CLOCK_TIME_NONE;
|
||||||
|
GST_BUFFER_DTS (frame->buffer) = GST_CLOCK_TIME_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
/* interpolating and no valid pts yet,
|
/* interpolating and no valid pts yet,
|
||||||
* start with dts and carry on from there */
|
* start with dts and carry on from there */
|
||||||
if (parse->priv->infer_ts && parse->priv->pts_interpolate
|
if (parse->priv->infer_ts && parse->priv->pts_interpolate
|
||||||
|
@ -2822,6 +2831,13 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
tmpbuf = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY |
|
tmpbuf = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY |
|
||||||
GST_MEMORY_FLAG_NO_SHARE, (gpointer) data, av, 0, av, NULL, NULL);
|
GST_MEMORY_FLAG_NO_SHARE, (gpointer) data, av, 0, av, NULL, NULL);
|
||||||
|
|
||||||
|
/* already inform subclass what timestamps we have planned,
|
||||||
|
* at least if provided by time-based upstream */
|
||||||
|
if (parse->priv->upstream_format == GST_FORMAT_TIME) {
|
||||||
|
GST_BUFFER_PTS (tmpbuf) = parse->priv->next_pts;
|
||||||
|
GST_BUFFER_DTS (tmpbuf) = parse->priv->next_dts;
|
||||||
|
}
|
||||||
|
|
||||||
/* keep the adapter mapped, so keep track of what has to be flushed */
|
/* keep the adapter mapped, so keep track of what has to be flushed */
|
||||||
ret = gst_base_parse_handle_buffer (parse, tmpbuf, &skip, &flush);
|
ret = gst_base_parse_handle_buffer (parse, tmpbuf, &skip, &flush);
|
||||||
tmpbuf = NULL;
|
tmpbuf = NULL;
|
||||||
|
|
Loading…
Reference in a new issue