summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward@collabora.com>2012-11-08 17:15:26 +0100
committerEdward Hervey <edward@collabora.com>2012-11-09 12:16:41 +0100
commit9167b4557948795ee85f98afa412b4559f6e9862 (patch)
treebfc08eaa557c4c6ed76c5338a9d1632d73b89d0d
parentaa201826bb75e4a988c4ab78becd258b0baa9a01 (diff)
mpegts: Only use timestamp-based PCR/PTS estimation when needed
When dealing with non-time based push-mode streams, we need to revert to using the offset-based PCR/PTS estimation logic of packetizer. This solves uses cases such as: pushfile:// ! tsdemux src ! queue ! tsdemux https://bugzilla.gnome.org/show_bug.cgi?id=687178
-rw-r--r--gst/mpegtsdemux/mpegtsbase.c11
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.c3
2 files changed, 12 insertions, 2 deletions
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index bd73884ba..63ef1c42e 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -1340,6 +1340,14 @@ mpegts_base_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEGMENT:
gst_event_copy_segment (event, &base->segment);
+ /* Check if we need to switch PCR/PTS handling */
+ if (base->segment.format == GST_FORMAT_TIME) {
+ base->packetizer->calculate_offset = FALSE;
+ base->packetizer->calculate_skew = TRUE;
+ } else {
+ base->packetizer->calculate_offset = TRUE;
+ base->packetizer->calculate_skew = FALSE;
+ }
gst_event_unref (event);
break;
case GST_EVENT_STREAM_START:
@@ -1779,13 +1787,14 @@ mpegts_base_sink_activate_mode (GstPad * pad, GstObject * parent,
switch (mode) {
case GST_PAD_MODE_PUSH:
base->mode = BASE_MODE_PUSHING;
- base->packetizer->calculate_skew = TRUE;
res = TRUE;
break;
case GST_PAD_MODE_PULL:
if (active) {
base->mode = BASE_MODE_SCANNING;
+ /* When working pull-based, we always use offsets for estimation */
base->packetizer->calculate_offset = TRUE;
+ base->packetizer->calculate_skew = FALSE;
res =
gst_pad_start_task (pad, (GstTaskFunction) mpegts_base_loop, base,
NULL);
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c
index 42966a060..64c0ce46e 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.c
+++ b/gst/mpegtsdemux/mpegtspacketizer.c
@@ -3672,7 +3672,8 @@ mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, GstClockTime pts,
if (G_UNLIKELY (pts < pcrtable->first_pcr_ts))
pts += MPEGTIME_TO_GSTTIME (PTS_DTS_MAX_VALUE);
res = pts - pcrtable->first_pcr_ts;
- }
+ } else
+ GST_WARNING ("Not enough information to calculate proper timestamp");
GST_DEBUG ("Returning timestamp %" GST_TIME_FORMAT " for pts %"
GST_TIME_FORMAT " pcr_pid:0x%04x", GST_TIME_ARGS (res),