rtponviftimestamp: Fix drop-out-of-segment=false mode
authorSeungha Yang <seungha@centricular.com>
Thu, 27 Jul 2023 15:39:46 +0000 (00:39 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 9 Dec 2023 15:41:26 +0000 (15:41 +0000)
Fixing unexpected buffer dropping and flow error in case that:
* use-reference-timestamps=false
* drop-out-of-segment=false
* Calculated utc offset is not valid because buffer is out-of-segment

The above case should be considered as a valid data flow without returning
errors.

Fixing regression introduced by
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1683

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

subprojects/gst-plugins-bad/gst/onvif/gstrtponviftimestamp.c

index 5070666..83f59da 100644 (file)
@@ -632,27 +632,24 @@ handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf)
     }
   } else if (GST_BUFFER_PTS_IS_VALID (buf) || GST_BUFFER_DTS_IS_VALID (buf)) {
     time = get_utc_from_offset (self, buf);
-    if (self->prop_drop_out_of_segment && time == GST_CLOCK_TIME_NONE) {
-      GST_ERROR_OBJECT (self, "Failed to get stream time");
-      gst_rtp_buffer_unmap (&rtp);
-      return FALSE;
-    }
   } else {
     GST_INFO_OBJECT (self,
         "Buffer doesn't contain any valid DTS or PTS timestamp");
     goto done;
   }
 
-  if (time == GST_CLOCK_TIME_NONE) {
-    GST_ERROR_OBJECT (self, "failed calculating timestamp");
+  if (self->prop_drop_out_of_segment && !GST_CLOCK_TIME_IS_VALID (time)) {
+    GST_ERROR_OBJECT (self, "Failed to get stream time");
     gst_rtp_buffer_unmap (&rtp);
     return FALSE;
   }
 
   /* convert to NTP time. upper 32 bits should contain the seconds
    * and the lower 32 bits, the fractions of a second. */
-  time = gst_util_uint64_scale (time, (G_GINT64_CONSTANT (1) << 32),
-      GST_SECOND);
+  if (GST_CLOCK_TIME_IS_VALID (time)) {
+    time = gst_util_uint64_scale (time, (G_GINT64_CONSTANT (1) << 32),
+        GST_SECOND);
+  }
 
   GST_DEBUG_OBJECT (self, "timestamp: %" G_GUINT64_FORMAT, time);