gstdepay: check for correct fragment offset
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 1 Nov 2012 11:58:57 +0000 (11:58 +0000)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 1 Nov 2012 12:09:47 +0000 (12:09 +0000)
Make sure we only insert the rtp packet in the adapter when the
frag_offset matches. When the first packet of a fragment is dropped,
it avoids putting the remaining packets in the adapter and processing
the partial fragment.

Conflicts:
gst/rtp/gstrtpgstdepay.c

gst/rtp/gstrtpgstdepay.c

index 16a7540..49a3d73 100644 (file)
@@ -190,7 +190,7 @@ gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
   GstBuffer *subbuf, *outbuf = NULL;
   gint payload_len;
   guint8 *payload;
-  guint CV;
+  guint CV, frag_offset, avail;
   GstRTPBuffer rtp = { NULL };
 
   rtpgstdepay = GST_RTP_GST_DEPAY (depayload);
@@ -219,9 +219,12 @@ gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
    * |                          Frag_offset                          |
    * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    */
-  /* frag_offset =
-   *   (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7];
-   */
+  frag_offset =
+      (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7];
+
+  avail = gst_adapter_available (rtpgstdepay->adapter);
+  if (avail != frag_offset)
+    goto wrong_frag;
 
   /* subbuffer skipping the 8 header bytes */
   subbuf = gst_rtp_buffer_get_payload_subbuffer (&rtp, 8, -1);
@@ -324,6 +327,13 @@ empty_packet:
     gst_rtp_buffer_unmap (&rtp);
     return NULL;
   }
+wrong_frag:
+  {
+    gst_adapter_clear (rtpgstdepay->adapter);
+    gst_rtp_buffer_unmap (&rtp);
+    GST_LOG_OBJECT (rtpgstdepay, "wrong fragment, skipping");
+    return NULL;
+  }
 too_small:
   {
     GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE,