mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-22 01:31:03 +00:00
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/7745>
This commit is contained in:
parent
899792a5ef
commit
8f5dca9611
1 changed files with 25 additions and 21 deletions
|
@ -567,8 +567,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);
|
||||||
|
@ -734,27 +734,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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue