diff options
author | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2012-01-04 10:56:51 +0100 |
---|---|---|
committer | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2012-01-04 11:16:18 +0100 |
commit | c4abaf1428c5fdd9b30b20ee982ee04722cd5a87 (patch) | |
tree | 9ec7aef6c2ddf36a87199b4cdb620d480a17de64 /gst/videoparsers | |
parent | 9d0c7d054eafc6b92402d283a2e6cdd8cfa5cb1f (diff) | |
download | gstreamer-plugins-bad-c4abaf1428c5fdd9b30b20ee982ee04722cd5a87.tar.gz |
h264parse: fix and tweak frame timestamping
... to run with properly init'ed variables, and to only perform interpolation
in safe cases.
Diffstat (limited to 'gst/videoparsers')
-rw-r--r-- | gst/videoparsers/gsth264parse.c | 31 | ||||
-rw-r--r-- | gst/videoparsers/gsth264parse.h | 1 |
2 files changed, 29 insertions, 3 deletions
diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index 5ac459970..505def9a6 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -215,6 +215,10 @@ gst_h264_parse_reset (GstH264Parse * h264parse) h264parse->have_pps = 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->force_key_unit_event = NULL; @@ -1238,9 +1242,12 @@ gst_h264_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) gst_h264_parse_update_src_caps (h264parse, NULL); - gst_h264_parse_get_timestamp (h264parse, - &GST_BUFFER_TIMESTAMP (buffer), &GST_BUFFER_DURATION (buffer), - h264parse->frame_start); + /* 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_BUFFER_TIMESTAMP (buffer), &GST_BUFFER_DURATION (buffer), + h264parse->frame_start); if (h264parse->keyframe) GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); @@ -1728,6 +1735,24 @@ gst_h264_parse_event (GstBaseParse * parse, GstEvent * event) gst_event_replace (&h264parse->force_key_unit_event, event); 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: break; } diff --git a/gst/videoparsers/gsth264parse.h b/gst/videoparsers/gsth264parse.h index 4800092b3..1064ff8bb 100644 --- a/gst/videoparsers/gsth264parse.h +++ b/gst/videoparsers/gsth264parse.h @@ -92,6 +92,7 @@ struct _GstH264Parse GstClockTime dts; /* dts at start of last buffering period */ GstClockTime ts_trn_nb; + gboolean do_ts; /* frame parsing */ /*guint last_nal_pos;*/ |