gst-libs/gst/rtp/gstbasertpdepayload.c: Handle timestamp wraparound.

Original commit message from CVS:
* gst-libs/gst/rtp/gstbasertpdepayload.c:
(gst_base_rtp_depayload_setcaps),
(gst_base_rtp_depayload_set_gst_timestamp),
(gst_base_rtp_depayload_change_state):
Handle timestamp wraparound.
This commit is contained in:
Wim Taymans 2007-06-05 16:19:30 +00:00
parent d4bb17ab7a
commit 9dac555993
2 changed files with 40 additions and 5 deletions

View file

@ -1,3 +1,11 @@
2007-06-05 Wim Taymans <wim@fluendo.com>
* gst-libs/gst/rtp/gstbasertpdepayload.c:
(gst_base_rtp_depayload_setcaps),
(gst_base_rtp_depayload_set_gst_timestamp),
(gst_base_rtp_depayload_change_state):
Handle timestamp wraparound.
2007-06-05 Wim Taymans <wim@fluendo.com>
* gst/playback/gsturidecodebin.c: (no_more_pads_full),

View file

@ -45,6 +45,9 @@ struct _GstBaseRTPDepayloadPrivate
GstClockTime npt_stop;
gdouble play_speed;
gdouble play_scale;
GstClockTime ts_wraparound;
GstClockTime prev_timestamp;
};
/* Filter signals and args */
@ -223,6 +226,8 @@ gst_base_rtp_depayload_setcaps (GstPad * pad, GstCaps * caps)
else
priv->play_scale = 1.0;
priv->prev_timestamp = -1;
if (bclass->set_caps)
res = bclass->set_caps (filter, caps);
else
@ -476,8 +481,9 @@ static void
gst_base_rtp_depayload_set_gst_timestamp (GstBaseRTPDepayload * filter,
guint32 timestamp, GstBuffer * buf)
{
GstClockTime ts, adjusted;
GstClockTime ts, adjusted, exttimestamp;
GstBaseRTPDepayloadPrivate *priv;
guint64 diff;
priv = filter->priv;
@ -485,14 +491,34 @@ gst_base_rtp_depayload_set_gst_timestamp (GstBaseRTPDepayload * filter,
if (priv->clock_base == -1)
priv->clock_base = timestamp;
/* FIXME, timestamp wraparound */
if (priv->prev_timestamp == -1) {
priv->prev_timestamp = timestamp;
priv->ts_wraparound = 0;
}
/* check for timestamp wraparound */
exttimestamp = timestamp + priv->ts_wraparound;
if (exttimestamp < priv->prev_timestamp)
diff = priv->prev_timestamp - exttimestamp;
else
diff = exttimestamp - priv->prev_timestamp;
if (diff > G_MAXINT32) {
/* timestamp went backwards more than allowed, we wrap around and get
* updated extended timestamp. */
priv->ts_wraparound += (1LL << 32);
exttimestamp = timestamp + priv->ts_wraparound;
}
priv->prev_timestamp = exttimestamp;
/* rtp timestamps are based on the clock_rate
* gst timesamps are in nanoseconds */
ts = gst_util_uint64_scale_int (timestamp, GST_SECOND, filter->clock_rate);
ts = gst_util_uint64_scale_int (exttimestamp, GST_SECOND, filter->clock_rate);
GST_DEBUG_OBJECT (filter, "ts : timestamp : %u, clockrate : %u",
timestamp, filter->clock_rate);
GST_DEBUG_OBJECT (filter,
"timestamp: %u, wrap %" G_GUINT64_FORMAT ", clockrate : %u", timestamp,
priv->ts_wraparound, filter->clock_rate);
/* add delay to timestamp */
adjusted = ts + (filter->queue_delay * GST_MSECOND);
@ -668,6 +694,7 @@ gst_base_rtp_depayload_change_state (GstElement * element,
/* clock_rate needs to be overwritten by child */
filter->clock_rate = 0;
filter->priv->clock_base = -1;
filter->priv->ts_wraparound = 0;
filter->need_newsegment = TRUE;
break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING: