rtpjitterbuffer: Only unschedule timers for late packets if they're not RTX packets...
authorSebastian Dröge <sebastian@centricular.com>
Fri, 2 Sep 2022 09:17:39 +0000 (12:17 +0300)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 3 Sep 2022 09:26:24 +0000 (09:26 +0000)
Timers for RTX packets are dealt with later in update_rtx_timers(), and
timers for non-RTX packets would potentially also be unscheduled a
second time from there so avoid that.

Also don't shadow the timer variable from the outer scope but instead
make use of it directly.

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

subprojects/gst-plugins-good/gst/rtpmanager/gstrtpjitterbuffer.c

index 79209bf3646d44402785df37d47f916c0e1e5d4e..40e0ed2187e3db06b5e94499952742a686e56128 100644 (file)
@@ -3364,13 +3364,13 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
         do_next_seqnum = FALSE;
 
         /* If an out of order packet arrives before its lost timer has expired
-         * remove it to avoid false positive statistics. */
-        RtpTimer *timer = rtp_timer_queue_find (priv->timers, seqnum);
-        if (timer && timer->queued && timer->type == RTP_TIMER_LOST) {
+         * remove it to avoid false positive statistics. If this is an RTX
+         * packet then the timer will be updated later as part of update_rtx_timers() */
+        if (!is_rtx && timer && timer->type == RTP_TIMER_LOST) {
           rtp_timer_queue_unschedule (priv->timers, timer);
           GST_DEBUG_OBJECT (jitterbuffer,
               "removing lost timer for late seqnum #%u", seqnum);
-          rtp_timer_free (timer);
+          rtp_timer_free (g_steal_pointer (&timer));
         }
       }