rtpvp9depay: detect incomplete frames and bail out
authorKnut Saastad <Knut@bitflow.io>
Wed, 14 Oct 2020 21:17:53 +0000 (23:17 +0200)
committerMathieu Duponchelle <mathieu@centricular.com>
Thu, 29 Oct 2020 18:56:07 +0000 (19:56 +0100)
If a packet with the B bit set arrives but we haven't received
a packet with the marker or E bits set to end the previous frame,
we know the current frame was incomplete.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/769>

gst/rtp/gstrtpvp9depay.c

index b95eb5d..569fdc8 100644 (file)
@@ -313,6 +313,15 @@ gst_rtp_vp9_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp)
   if (G_UNLIKELY (hdrsize >= size))
     goto too_small;
 
+  /* If this is a start frame AND we are already processing a frame, we need to flush and wait for next start frame */
+  if (b_bit) {
+    if (G_UNLIKELY (self->started)) {
+      GST_DEBUG_OBJECT (depay, "Incomplete frame, flushing adapter");
+      gst_adapter_clear (self->adapter);
+      self->started = FALSE;
+    }
+  }
+
   if (G_UNLIKELY (!self->started)) {
     /* Check if this is the start of a VP9 layer frame, otherwise bail */
     if (!b_bit) {