flvmux: Add negative runtime DTS support
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 10 Jun 2015 22:15:52 +0000 (18:15 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Fri, 12 Jun 2015 21:18:24 +0000 (17:18 -0400)
This is done by using new feature of the CollectPad clip function
which sets the DTS as a gint64 in the collected data. It also simplify
the code a bit.

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

gst/flv/gstflvmux.c
gst/flv/gstflvmux.h

index 7a5a9e5..e13b24f 100644 (file)
@@ -253,7 +253,7 @@ gst_flv_mux_reset (GstElement * element)
   mux->have_audio = mux->have_video = FALSE;
   mux->duration = GST_CLOCK_TIME_NONE;
   mux->new_tags = FALSE;
-  mux->first_timestamp = GST_CLOCK_TIME_NONE;
+  mux->first_timestamp = GST_CLOCK_STIME_NONE;
 
   mux->state = GST_FLV_MUX_STATE_HEADER;
 
@@ -531,6 +531,8 @@ gst_flv_mux_reset_pad (GstFlvMux * mux, GstFlvPad * cpad, gboolean video)
   cpad->video_codec_data = NULL;
   cpad->video_codec = G_MAXUINT;
   cpad->last_timestamp = 0;
+  cpad->pts = GST_CLOCK_STIME_NONE;
+  cpad->dts = GST_CLOCK_STIME_NONE;
 }
 
 static GstPad *
@@ -1006,25 +1008,21 @@ gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer,
   guint8 *data, *bdata;
   gsize bsize;
 
-  if (GST_BUFFER_DTS_IS_VALID (buffer))
-    dts = GST_BUFFER_DTS (buffer) / GST_MSECOND;
-  else if (GST_BUFFER_PTS_IS_VALID (buffer))
-    dts = GST_BUFFER_PTS (buffer) / GST_MSECOND;
-  else
-    dts = cpad->last_timestamp / GST_MSECOND;
-
-  if (GST_BUFFER_PTS_IS_VALID (buffer))
-    pts = GST_BUFFER_PTS (buffer) / GST_MSECOND;
-  else
-    pts = dts;
+  if (GST_CLOCK_STIME_IS_VALID (cpad->dts)) {
+    pts = dts = cpad->last_timestamp / GST_MSECOND;
+  } else {
+    pts = cpad->pts / GST_MSECOND;
+    dts = cpad->dts / GST_MSECOND;
+  }
 
+  /* Be safe in case TS are buggy */
   if (pts > dts)
     cts = pts - dts;
   else
     cts = 0;
 
   /* Timestamp must start at zero */
-  if (GST_CLOCK_TIME_IS_VALID (mux->first_timestamp)) {
+  if (GST_CLOCK_STIME_IS_VALID (mux->first_timestamp)) {
     dts -= mux->first_timestamp / GST_MSECOND;
     pts = dts + cts;
   }
@@ -1490,7 +1488,7 @@ gst_flv_mux_handle_buffer (GstCollectPads * pads, GstCollectData * cdata,
 {
   GstFlvMux *mux = GST_FLV_MUX (user_data);
   GstFlvPad *best;
-  GstClockTime best_time;
+  gint64 best_time;
   GstFlowReturn ret;
 
   if (mux->state == GST_FLV_MUX_STATE_HEADER) {
@@ -1505,8 +1503,8 @@ gst_flv_mux_handle_buffer (GstCollectPads * pads, GstCollectData * cdata,
       return ret;
     mux->state = GST_FLV_MUX_STATE_DATA;
 
-    if (GST_BUFFER_DTS_IS_VALID (buffer))
-      mux->first_timestamp = GST_BUFFER_DTS (buffer);
+    if (GST_COLLECT_PADS_DTS_IS_VALID (cdata))
+      mux->first_timestamp = GST_COLLECT_PADS_DTS (cdata);
     else
       mux->first_timestamp = 0;
   }
@@ -1521,15 +1519,27 @@ gst_flv_mux_handle_buffer (GstCollectPads * pads, GstCollectData * cdata,
   best = (GstFlvPad *) cdata;
   if (best) {
     g_assert (buffer);
-    best_time = GST_BUFFER_DTS (buffer);
+    best->dts = GST_COLLECT_PADS_DTS (cdata);
+
+    if (GST_CLOCK_STIME_IS_VALID (best->dts))
+      best_time = best->dts - mux->first_timestamp;
+
+    if (GST_BUFFER_PTS_IS_VALID (buffer))
+      best->pts = GST_BUFFER_PTS (buffer);
+    else
+      best->pts = best->dts;
+
+    GST_LOG_OBJECT (mux, "got buffer PTS %" GST_TIME_FORMAT " DTS %"
+        GST_STIME_FORMAT "\n", GST_TIME_ARGS (best->pts),
+        GST_STIME_ARGS (best->dts));
   } else {
-    best_time = GST_CLOCK_TIME_NONE;
+    best_time = GST_CLOCK_STIME_NONE;
   }
 
   /* The FLV timestamp is an int32 field. For non-live streams error out if a
      bigger timestamp is seen, for live the timestamp will get wrapped in
      gst_flv_mux_buffer_to_tag */
-  if (!mux->streamable && GST_CLOCK_TIME_IS_VALID (best_time)
+  if (!mux->streamable && (GST_CLOCK_STIME_IS_VALID (best_time))
       && best_time / GST_MSECOND > G_MAXINT32) {
     GST_WARNING_OBJECT (mux, "Timestamp larger than FLV supports - EOS");
     gst_buffer_unref (buffer);
index c08c5de..a87afcb 100644 (file)
@@ -53,6 +53,8 @@ typedef struct
   GstBuffer *video_codec_data;
 
   GstClockTime last_timestamp;
+  gint64 pts;
+  gint64 dts;
 } GstFlvPad;
 
 typedef enum
@@ -78,7 +80,7 @@ typedef struct _GstFlvMux {
   GList *index;
   guint64 byte_count;
   guint64 duration;
-  GstClockTime first_timestamp;
+  gint64 first_timestamp;
 } GstFlvMux;
 
 typedef struct _GstFlvMuxClass {