mpegtsmux: Start last_ts with GST_CLOCK_TIME_NONE
authorJan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
Mon, 7 Mar 2022 17:46:55 +0000 (18:46 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 8 Mar 2022 10:57:44 +0000 (10:57 +0000)
And use the output segment position for the outgoing timestamp while it
is. This is needed to delay the calculation of `output_ts_offset` until
we actually have a usable timestamp, as tsmux will output a few initial
packets while `last_ts` is still unset.

Without this, the calculation would use the initial `0` value, which did
not have the intended effect of making VBR mode behave like CBR mode,
but always calculated an offset equal to the selected start time.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1884>

subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c

index 56b22bb..aa56908 100644 (file)
@@ -310,7 +310,7 @@ gst_base_ts_mux_reset (GstBaseTsMux * mux, gboolean alloc)
 
   mux->first = TRUE;
   mux->last_flow_ret = GST_FLOW_OK;
-  mux->last_ts = 0;
+  mux->last_ts = GST_CLOCK_TIME_NONE;
   mux->is_delta = TRUE;
   mux->is_header = FALSE;
 
@@ -1148,10 +1148,13 @@ new_packet_cb (GstBuffer * buf, void *user_data, gint64 new_pcr)
     }
 
     GST_BUFFER_PTS (buf) += mux->output_ts_offset;
-  }
 
-  if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buf))) {
     agg_segment->position = GST_BUFFER_PTS (buf);
+  } else if (agg_segment->position == -1
+      || agg_segment->position < agg_segment->start) {
+    GST_BUFFER_PTS (buf) = agg_segment->start;
+  } else {
+    GST_BUFFER_PTS (buf) = agg_segment->position;
   }
 
   /* do common init (flags and streamheaders) */