tsparse: fix timestamps not updating after a PMT change
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 26 Mar 2015 13:46:16 +0000 (13:46 +0000)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 9 Apr 2015 14:44:20 +0000 (15:44 +0100)
The PCRs stay locked onto the same PID as before the change,
but the relevant PID has no reason to be the same after it.

https://bugzilla.gnome.org/show_bug.cgi?id=745102

gst/mpegtsdemux/mpegtsparse.c
gst/mpegtsdemux/mpegtsparse.h

index d306e486c879d26acb8e939a6579e1c82bb3fde2..743da4f0d664fd05e416edef91af7b344760edd6 100644 (file)
@@ -234,8 +234,10 @@ mpegts_parse_reset (MpegTSBase * base)
 
   parse->current_pcr = GST_CLOCK_TIME_NONE;
   parse->previous_pcr = GST_CLOCK_TIME_NONE;
+  parse->base_pcr = GST_CLOCK_TIME_NONE;
   parse->bytes_since_pcr = 0;
   parse->pcr_pid = parse->user_pcr_pid;
+  parse->ts_offset = 0;
 }
 
 static void
@@ -360,6 +362,9 @@ push_event (MpegTSBase * base, GstEvent * event)
   if (G_UNLIKELY (GST_EVENT_TYPE (event) == GST_EVENT_EOS))
     drain_pending_buffers (parse, TRUE);
 
+  if (G_UNLIKELY (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT))
+    parse->ts_offset = 0;
+
   for (tmp = parse->srcpads; tmp; tmp = tmp->next) {
     GstPad *pad = (GstPad *) tmp->data;
     if (pad) {
@@ -680,8 +685,12 @@ mpegts_parse_inspect_packet (MpegTSBase * base, MpegTSPacketizerPacket * packet)
     if (parse->pcr_pid == -1)
       parse->pcr_pid = packet->pid;
     /* Check the PCR-PID matches the program we want for multiple programs */
-    if (parse->pcr_pid == packet->pid)
+    if (parse->pcr_pid == packet->pid) {
       parse->current_pcr = PCRTIME_TO_GSTTIME (packet->pcr);
+      if (parse->base_pcr == GST_CLOCK_TIME_NONE) {
+        parse->base_pcr = parse->current_pcr;
+      }
+    }
   }
 }
 
@@ -807,8 +816,8 @@ drain_pending_buffers (MpegTSParse2 * parse, gboolean drain_all)
         "InputTS %" GST_TIME_FORMAT " out %" GST_TIME_FORMAT,
         GST_TIME_ARGS (GST_BUFFER_PTS (buffer)), GST_TIME_ARGS (out_ts));
 
-    GST_BUFFER_PTS (buffer) = out_ts;
-    GST_BUFFER_DTS (buffer) = out_ts;
+    GST_BUFFER_PTS (buffer) = out_ts + parse->ts_offset;
+    GST_BUFFER_DTS (buffer) = out_ts + parse->ts_offset;
     if (ret == GST_FLOW_OK)
       ret = gst_pad_push (parse->srcpad, buffer);
     else
@@ -914,6 +923,10 @@ mpegts_parse_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program)
     tspad->program = NULL;
     parseprogram->tspad = NULL;
   }
+
+  parse->pcr_pid = -1;
+  parse->ts_offset += parse->current_pcr - parse->base_pcr;
+  parse->base_pcr = GST_CLOCK_TIME_NONE;
 }
 
 static gboolean
index b1253bfc72ec5f20b00e5888530de5de5966646d..d3bc6a2d29bbbc7189f86916e9d7da48494653ce 100644 (file)
@@ -52,6 +52,8 @@ struct _MpegTSParse2 {
   guint group_id;
 
   GstClockTime smoothing_latency;
+  GstClockTime base_pcr;
+  GstClockTime ts_offset;
   GstClockTime current_pcr;
   gint user_pcr_pid;
   gint pcr_pid;