rtph265pay: Fix reading timestamps from adapter
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 3 Oct 2018 18:14:17 +0000 (14:14 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 18 Dec 2018 18:30:05 +0000 (13:30 -0500)
The code was reading the timestamp from the adapter before pushing the
new buffer into it. As a side effect, if the adapter was empty, we'd end
up using an older timestamp. In alignment=au, it means that all
timestamp was likely one frame in the past, while in alignment=nal, with
multiple slices per frame, the first slice would have the timestamp of
the previous one.

gst/rtp/gstrtph265pay.c

index 812eeab..0cf94ee 100644 (file)
@@ -1134,16 +1134,13 @@ gst_rtp_h265_pay_handle_buffer (GstRTPBasePayload * basepayload,
     dts = GST_BUFFER_DTS (buffer);
     GST_DEBUG_OBJECT (basepayload, "got %" G_GSIZE_FORMAT " bytes", size);
   } else {
+    if (buffer)
+      gst_adapter_push (rtph265pay->adapter, buffer);
+
+    /* We want to use the first TS used to construct the following NAL */
     dts = gst_adapter_prev_dts (rtph265pay->adapter, NULL);
     pts = gst_adapter_prev_pts (rtph265pay->adapter, NULL);
-    if (buffer) {
-      if (!GST_CLOCK_TIME_IS_VALID (dts))
-        dts = GST_BUFFER_DTS (buffer);
-      if (!GST_CLOCK_TIME_IS_VALID (pts))
-        pts = GST_BUFFER_PTS (buffer);
 
-      gst_adapter_push (rtph265pay->adapter, buffer);
-    }
     size = gst_adapter_available (rtph265pay->adapter);
     /* Nothing to do here if the adapter is empty, e.g. on EOS */
     if (size == 0)