mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
baseparse: do not overwrite header buffer timestamps
baseparse tries to preserve timestamps from upstream if it is running on a time segment and write that to output buffers. It assumes the first DTS is going to be segment.start and sets that to the first buffers. In case the buffer is a header buffer, it had no timestamps and will have only the DTS set due to this mechanism. This patch prevents this by skipping this behavior for header buffers. https://bugzilla.gnome.org/show_bug.cgi?id=757961
This commit is contained in:
parent
842ffa69b6
commit
2c475a0355
1 changed files with 8 additions and 4 deletions
|
@ -980,16 +980,17 @@ static GstFlowReturn
|
|||
gst_base_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
||||
{
|
||||
GstBuffer *buffer = frame->buffer;
|
||||
gboolean is_header = GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_HEADER);
|
||||
|
||||
if (!GST_BUFFER_PTS_IS_VALID (buffer) &&
|
||||
if (!GST_BUFFER_PTS_IS_VALID (buffer) && !is_header &&
|
||||
GST_CLOCK_TIME_IS_VALID (parse->priv->next_pts)) {
|
||||
GST_BUFFER_PTS (buffer) = parse->priv->next_pts;
|
||||
}
|
||||
if (!GST_BUFFER_DTS_IS_VALID (buffer) &&
|
||||
if (!GST_BUFFER_DTS_IS_VALID (buffer) && !is_header &&
|
||||
GST_CLOCK_TIME_IS_VALID (parse->priv->next_dts)) {
|
||||
GST_BUFFER_DTS (buffer) = parse->priv->next_dts;
|
||||
}
|
||||
if (!GST_BUFFER_DURATION_IS_VALID (buffer) &&
|
||||
if (!GST_BUFFER_DURATION_IS_VALID (buffer) && !is_header &&
|
||||
GST_CLOCK_TIME_IS_VALID (parse->priv->frame_duration)) {
|
||||
GST_BUFFER_DURATION (buffer) = parse->priv->frame_duration;
|
||||
}
|
||||
|
@ -2878,11 +2879,14 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
|||
gint skip = -1;
|
||||
guint min_size, av;
|
||||
GstClockTime pts, dts;
|
||||
gboolean is_header;
|
||||
|
||||
parse = GST_BASE_PARSE (parent);
|
||||
bclass = GST_BASE_PARSE_GET_CLASS (parse);
|
||||
GST_DEBUG_OBJECT (parent, "chain");
|
||||
|
||||
is_header = buffer && GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_HEADER);
|
||||
|
||||
/* early out for speed, if we need to skip */
|
||||
if (buffer && GST_BUFFER_IS_DISCONT (buffer))
|
||||
parse->priv->skip = 0;
|
||||
|
@ -3078,7 +3082,7 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
|||
|
||||
/* already inform subclass what timestamps we have planned,
|
||||
* at least if provided by time-based upstream */
|
||||
if (parse->priv->upstream_format == GST_FORMAT_TIME) {
|
||||
if (parse->priv->upstream_format == GST_FORMAT_TIME && !is_header) {
|
||||
tmpbuf = gst_buffer_make_writable (tmpbuf);
|
||||
GST_BUFFER_PTS (tmpbuf) = parse->priv->next_pts;
|
||||
GST_BUFFER_DTS (tmpbuf) = parse->priv->next_dts;
|
||||
|
|
Loading…
Reference in a new issue