diff options
| author | Edward Hervey <edward@collabora.com> | 2012-11-08 17:15:26 +0100 |
|---|---|---|
| committer | Edward Hervey <edward@collabora.com> | 2012-11-09 12:16:41 +0100 |
| commit | 9167b4557948795ee85f98afa412b4559f6e9862 (patch) | |
| tree | bfc08eaa557c4c6ed76c5338a9d1632d73b89d0d | |
| parent | aa201826bb75e4a988c4ab78becd258b0baa9a01 (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.c | 11 | ||||
| -rw-r--r-- | gst/mpegtsdemux/mpegtspacketizer.c | 3 |
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), |
