From 44a697deba829cb97c67829a666dd8b5078910b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 12 Jun 2019 14:57:24 +0300 Subject: [PATCH] rtpgstdepay: Only store the current caps and drop old caps immediately Otherwise it can happen that we already collected 7 caps, miss the 8th caps packet (packet loss) and then re-use the 1st caps for the following buffers instead of the 8th caps which will likely cause errors further downstream unless both caps are accidentally the same. Keeping old caps around does not seem to have any value other than potentially causing errors. We would always receive new caps whenever they change (even if they were previous ones) and it's very unlikely that they happen to be exactly the same as the previous ones. Also after having received new caps or a buffer with a next caps version, no buffers with old caps version will arrive anymore. --- gst/rtp/gstrtpgstdepay.c | 44 ++++++++++------------------------------ gst/rtp/gstrtpgstdepay.h | 2 +- 2 files changed, 12 insertions(+), 34 deletions(-) diff --git a/gst/rtp/gstrtpgstdepay.c b/gst/rtp/gstrtpgstdepay.c index 489f6a8bc8..0f081776ea 100644 --- a/gst/rtp/gstrtpgstdepay.c +++ b/gst/rtp/gstrtpgstdepay.c @@ -116,31 +116,13 @@ gst_rtp_gst_depay_finalize (GObject * object) G_OBJECT_CLASS (parent_class)->finalize (object); } -static gboolean -store_cache (GstRtpGSTDepay * rtpgstdepay, guint CV, GstCaps * caps) -{ - gboolean changed = FALSE; - - if (caps && rtpgstdepay->CV_cache[CV]) - changed = !gst_caps_is_strictly_equal (caps, rtpgstdepay->CV_cache[CV]); - - if (rtpgstdepay->CV_cache[CV]) - gst_caps_unref (rtpgstdepay->CV_cache[CV]); - rtpgstdepay->CV_cache[CV] = caps; - - return changed; -} - static void gst_rtp_gst_depay_reset (GstRtpGSTDepay * rtpgstdepay, gboolean full) { - guint i; - gst_adapter_clear (rtpgstdepay->adapter); if (full) { rtpgstdepay->current_CV = 0; - for (i = 0; i < 8; i++) - store_cache (rtpgstdepay, i, NULL); + gst_caps_replace (&rtpgstdepay->current_caps, NULL); g_free (rtpgstdepay->stream_id); rtpgstdepay->stream_id = NULL; if (rtpgstdepay->tags) @@ -189,14 +171,14 @@ gst_rtp_gst_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps) } /* store in cache */ rtpgstdepay->current_CV = CV; - gst_caps_ref (outcaps); - store_cache (rtpgstdepay, CV, outcaps); + gst_caps_replace (&rtpgstdepay->current_caps, outcaps); res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); } else { GST_WARNING_OBJECT (depayload, "no caps given"); rtpgstdepay->current_CV = -1; + gst_caps_replace (&rtpgstdepay->current_caps, NULL); res = TRUE; } @@ -471,8 +453,12 @@ gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp) GST_DEBUG_OBJECT (rtpgstdepay, "inline caps %u, length %u, %" GST_PTR_FORMAT, CV, size, outcaps); - if (store_cache (rtpgstdepay, CV, outcaps)) + if (!rtpgstdepay->current_caps + || !gst_caps_is_strictly_equal (rtpgstdepay->current_caps, outcaps)) gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_replace (&rtpgstdepay->current_caps, outcaps); + gst_caps_unref (outcaps); + rtpgstdepay->current_CV = CV; /* skip caps */ offset += size; @@ -512,17 +498,9 @@ gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp) /* see what caps we need */ if (CV != rtpgstdepay->current_CV) { - /* we need to switch caps, check if we have the caps */ - if ((outcaps = rtpgstdepay->CV_cache[CV]) == NULL) - goto missing_caps; - - GST_DEBUG_OBJECT (rtpgstdepay, - "need caps switch from %u to %u, %" GST_PTR_FORMAT, - rtpgstdepay->current_CV, CV, outcaps); - - /* and set caps */ - if (gst_pad_set_caps (depayload->srcpad, outcaps)) - rtpgstdepay->current_CV = CV; + /* we need to switch caps but didn't receive the new caps yet */ + gst_caps_replace (&rtpgstdepay->current_caps, NULL); + goto missing_caps; } if (payload[0] & 0x8) diff --git a/gst/rtp/gstrtpgstdepay.h b/gst/rtp/gstrtpgstdepay.h index 4b8f2c62e6..9ea9ec6c91 100644 --- a/gst/rtp/gstrtpgstdepay.h +++ b/gst/rtp/gstrtpgstdepay.h @@ -46,7 +46,7 @@ struct _GstRtpGSTDepay GstAdapter *adapter; guint current_CV; - GstCaps *CV_cache[8]; + GstCaps *current_caps; GstTagList *tags; gchar *stream_id;