summaryrefslogtreecommitdiff
path: root/gst/videoparsers
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-01-04 10:56:51 +0100
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-01-04 11:16:18 +0100
commitc4abaf1428c5fdd9b30b20ee982ee04722cd5a87 (patch)
tree9ec7aef6c2ddf36a87199b4cdb620d480a17de64 /gst/videoparsers
parent9d0c7d054eafc6b92402d283a2e6cdd8cfa5cb1f (diff)
downloadgstreamer-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.c31
-rw-r--r--gst/videoparsers/gsth264parse.h1
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;*/