rtmp2sink: Initialize base_ts / last_ts with the actual first observed timestamp

Initializing it with zero can falsely trigger the overflow / underflow detection
code if the first observed timestamp is a big integer.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7786>
This commit is contained in:
Sebastian Dröge 2024-10-25 16:37:15 +03:00 committed by GStreamer Marge Bot
parent 5dd2a497be
commit 5b6c76008b

View file

@ -533,8 +533,8 @@ gst_rtmp2_sink_start (GstBaseSink * sink)
self->running = TRUE; self->running = TRUE;
self->cancellable = g_cancellable_new (); self->cancellable = g_cancellable_new ();
self->stream_id = 0; self->stream_id = 0;
self->last_ts = 0; self->last_ts = GST_CLOCK_TIME_NONE;
self->base_ts = 0; self->base_ts = GST_CLOCK_TIME_NONE;
if (async) { if (async) {
gst_task_start (self->task); gst_task_start (self->task);
@ -700,27 +700,31 @@ buffer_to_message (GstRtmp2Sink * self, GstBuffer * buffer, GstBuffer ** outbuf)
/* flvmux timestamps roll over after about 49 days */ /* flvmux timestamps roll over after about 49 days */
timestamp = header.timestamp; timestamp = header.timestamp;
if (timestamp + self->base_ts + G_MAXINT32 < self->last_ts) { if (self->base_ts == GST_CLOCK_TIME_NONE) {
GST_WARNING_OBJECT (self, "Timestamp regression %" G_GUINT64_FORMAT self->last_ts = self->base_ts = timestamp;
" -> %" G_GUINT64_FORMAT "; assuming overflow", self->last_ts, } else {
timestamp + self->base_ts); if (timestamp + self->base_ts + G_MAXINT32 < self->last_ts) {
self->base_ts += G_MAXUINT32; GST_WARNING_OBJECT (self, "Timestamp regression %" G_GUINT64_FORMAT
self->base_ts += 1; " -> %" G_GUINT64_FORMAT "; assuming overflow", self->last_ts,
} else if (timestamp + self->base_ts > self->last_ts + G_MAXINT32) { timestamp + self->base_ts);
GST_WARNING_OBJECT (self, "Timestamp jump %" G_GUINT64_FORMAT self->base_ts += G_MAXUINT32;
" -> %" G_GUINT64_FORMAT "; assuming underflow", self->last_ts, self->base_ts += 1;
timestamp + self->base_ts); } else if (timestamp + self->base_ts > self->last_ts + G_MAXINT32) {
if (self->base_ts > 0) { GST_WARNING_OBJECT (self, "Timestamp jump %" G_GUINT64_FORMAT
self->base_ts -= G_MAXUINT32; " -> %" G_GUINT64_FORMAT "; assuming underflow", self->last_ts,
self->base_ts -= 1; timestamp + self->base_ts);
} else { if (self->base_ts > 0) {
GST_WARNING_OBJECT (self, "Cannot regress further;" self->base_ts -= G_MAXUINT32;
" forcing timestamp to zero"); self->base_ts -= 1;
timestamp = 0; } else {
GST_WARNING_OBJECT (self, "Cannot regress further;"
" forcing timestamp to zero");
timestamp = 0;
}
} }
timestamp += self->base_ts;
self->last_ts = timestamp;
} }
timestamp += self->base_ts;
self->last_ts = timestamp;
gst_buffer_unmap (buffer, &info); gst_buffer_unmap (buffer, &info);
} }