mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 04:36:20 +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
2c238705a1
commit
971ac61c36
1 changed files with 8 additions and 4 deletions
|
@ -980,16 +980,17 @@ static GstFlowReturn
|
||||||
gst_base_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
gst_base_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
||||||
{
|
{
|
||||||
GstBuffer *buffer = frame->buffer;
|
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_CLOCK_TIME_IS_VALID (parse->priv->next_pts)) {
|
||||||
GST_BUFFER_PTS (buffer) = 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_CLOCK_TIME_IS_VALID (parse->priv->next_dts)) {
|
||||||
GST_BUFFER_DTS (buffer) = 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_CLOCK_TIME_IS_VALID (parse->priv->frame_duration)) {
|
||||||
GST_BUFFER_DURATION (buffer) = 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;
|
gint skip = -1;
|
||||||
guint min_size, av;
|
guint min_size, av;
|
||||||
GstClockTime pts, dts;
|
GstClockTime pts, dts;
|
||||||
|
gboolean is_header;
|
||||||
|
|
||||||
parse = GST_BASE_PARSE (parent);
|
parse = GST_BASE_PARSE (parent);
|
||||||
bclass = GST_BASE_PARSE_GET_CLASS (parse);
|
bclass = GST_BASE_PARSE_GET_CLASS (parse);
|
||||||
GST_DEBUG_OBJECT (parent, "chain");
|
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 */
|
/* early out for speed, if we need to skip */
|
||||||
if (buffer && GST_BUFFER_IS_DISCONT (buffer))
|
if (buffer && GST_BUFFER_IS_DISCONT (buffer))
|
||||||
parse->priv->skip = 0;
|
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,
|
/* already inform subclass what timestamps we have planned,
|
||||||
* at least if provided by time-based upstream */
|
* 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);
|
tmpbuf = gst_buffer_make_writable (tmpbuf);
|
||||||
GST_BUFFER_PTS (tmpbuf) = parse->priv->next_pts;
|
GST_BUFFER_PTS (tmpbuf) = parse->priv->next_pts;
|
||||||
GST_BUFFER_DTS (tmpbuf) = parse->priv->next_dts;
|
GST_BUFFER_DTS (tmpbuf) = parse->priv->next_dts;
|
||||||
|
|
Loading…
Reference in a new issue