mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 20:42:30 +00:00
h264parse: fix and tweak frame timestamping
... to run with properly init'ed variables, and to only perform interpolation in safe cases.
This commit is contained in:
parent
9d0c7d054e
commit
c4abaf1428
2 changed files with 29 additions and 3 deletions
|
@ -215,6 +215,10 @@ gst_h264_parse_reset (GstH264Parse * h264parse)
|
||||||
h264parse->have_pps = FALSE;
|
h264parse->have_pps = FALSE;
|
||||||
h264parse->have_sps = FALSE;
|
h264parse->have_sps = FALSE;
|
||||||
|
|
||||||
|
h264parse->dts = GST_CLOCK_TIME_NONE;
|
||||||
|
h264parse->ts_trn_nb = GST_CLOCK_TIME_NONE;
|
||||||
|
h264parse->do_ts = TRUE;
|
||||||
|
|
||||||
h264parse->pending_key_unit_ts = GST_CLOCK_TIME_NONE;
|
h264parse->pending_key_unit_ts = GST_CLOCK_TIME_NONE;
|
||||||
h264parse->force_key_unit_event = NULL;
|
h264parse->force_key_unit_event = NULL;
|
||||||
|
|
||||||
|
@ -1238,6 +1242,9 @@ gst_h264_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
||||||
|
|
||||||
gst_h264_parse_update_src_caps (h264parse, NULL);
|
gst_h264_parse_update_src_caps (h264parse, NULL);
|
||||||
|
|
||||||
|
/* don't mess with timestamps if provided by upstream,
|
||||||
|
* particularly since our ts not that good they handle seeking etc */
|
||||||
|
if (h264parse->do_ts)
|
||||||
gst_h264_parse_get_timestamp (h264parse,
|
gst_h264_parse_get_timestamp (h264parse,
|
||||||
&GST_BUFFER_TIMESTAMP (buffer), &GST_BUFFER_DURATION (buffer),
|
&GST_BUFFER_TIMESTAMP (buffer), &GST_BUFFER_DURATION (buffer),
|
||||||
h264parse->frame_start);
|
h264parse->frame_start);
|
||||||
|
@ -1728,6 +1735,24 @@ gst_h264_parse_event (GstBaseParse * parse, GstEvent * event)
|
||||||
gst_event_replace (&h264parse->force_key_unit_event, event);
|
gst_event_replace (&h264parse->force_key_unit_event, event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GST_EVENT_FLUSH_STOP:
|
||||||
|
h264parse->dts = GST_CLOCK_TIME_NONE;
|
||||||
|
h264parse->ts_trn_nb = GST_CLOCK_TIME_NONE;
|
||||||
|
break;
|
||||||
|
case GST_EVENT_NEWSEGMENT:
|
||||||
|
{
|
||||||
|
gdouble rate, applied_rate;
|
||||||
|
GstFormat format;
|
||||||
|
gint64 start;
|
||||||
|
|
||||||
|
gst_event_parse_new_segment_full (event, NULL, &rate, &applied_rate,
|
||||||
|
&format, &start, NULL, NULL);
|
||||||
|
/* don't try to mess with more subtle cases (e.g. seek) */
|
||||||
|
if (format == GST_FORMAT_TIME &&
|
||||||
|
(start != 0 || rate != 1.0 || applied_rate != 1.0))
|
||||||
|
h264parse->do_ts = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ struct _GstH264Parse
|
||||||
GstClockTime dts;
|
GstClockTime dts;
|
||||||
/* dts at start of last buffering period */
|
/* dts at start of last buffering period */
|
||||||
GstClockTime ts_trn_nb;
|
GstClockTime ts_trn_nb;
|
||||||
|
gboolean do_ts;
|
||||||
|
|
||||||
/* frame parsing */
|
/* frame parsing */
|
||||||
/*guint last_nal_pos;*/
|
/*guint last_nal_pos;*/
|
||||||
|
|
Loading…
Reference in a new issue