mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-23 15:48:23 +00:00
rtpjitterbuffer: Consider timers len to compare with RTP_MAX_DROPOUT
When there are a lot of small gaps, we can consider that there is a big gap (too losses) to reset the buffer. https://bugzilla.gnome.org/show_bug.cgi?id=751636
This commit is contained in:
parent
3df0cce65d
commit
5ae672fd22
1 changed files with 17 additions and 3 deletions
|
@ -2039,12 +2039,13 @@ update_timers (GstRtpJitterBuffer * jitterbuffer, guint16 seqnum,
|
||||||
delay = get_rtx_delay (priv);
|
delay = get_rtx_delay (priv);
|
||||||
|
|
||||||
/* and update/install timer for next seqnum */
|
/* and update/install timer for next seqnum */
|
||||||
if (timer)
|
if (timer) {
|
||||||
reschedule_timer (jitterbuffer, timer, priv->next_in_seqnum, expected,
|
reschedule_timer (jitterbuffer, timer, priv->next_in_seqnum, expected,
|
||||||
delay, TRUE);
|
delay, TRUE);
|
||||||
else
|
} else {
|
||||||
add_timer (jitterbuffer, TIMER_TYPE_EXPECTED, priv->next_in_seqnum, 0,
|
add_timer (jitterbuffer, TIMER_TYPE_EXPECTED, priv->next_in_seqnum, 0,
|
||||||
expected, delay, priv->packet_spacing);
|
expected, delay, priv->packet_spacing);
|
||||||
|
}
|
||||||
} else if (timer && timer->type != TIMER_TYPE_DEADLINE) {
|
} else if (timer && timer->type != TIMER_TYPE_DEADLINE) {
|
||||||
/* if we had a timer, remove it, we don't know when to expect the next
|
/* if we had a timer, remove it, we don't know when to expect the next
|
||||||
* packet. */
|
* packet. */
|
||||||
|
@ -2465,7 +2466,20 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* new packet, we are missing some packets */
|
/* new packet, we are missing some packets */
|
||||||
if (G_UNLIKELY (gap >= RTP_MAX_DROPOUT)) {
|
if (G_UNLIKELY (priv->timers->len >= RTP_MAX_DROPOUT)) {
|
||||||
|
/* If we have timers for more than RTP_MAX_DROPOUT packets
|
||||||
|
* pending this means that we have a huge gap overall. We can
|
||||||
|
* reset the jitterbuffer at this point because there's
|
||||||
|
* just too much data missing to be able to do anything
|
||||||
|
* sensible with the past data. Just try again from the
|
||||||
|
* next packet */
|
||||||
|
GST_WARNING_OBJECT (jitterbuffer,
|
||||||
|
"%d pending timers > %d - resetting", priv->timers->len,
|
||||||
|
RTP_MAX_DROPOUT);
|
||||||
|
reset = TRUE;
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
|
buffer = NULL;
|
||||||
|
} else if (G_UNLIKELY (gap >= RTP_MAX_DROPOUT)) {
|
||||||
reset =
|
reset =
|
||||||
handle_big_gap_buffer (jitterbuffer, TRUE, buffer, pt, seqnum,
|
handle_big_gap_buffer (jitterbuffer, TRUE, buffer, pt, seqnum,
|
||||||
gap);
|
gap);
|
||||||
|
|
Loading…
Reference in a new issue