rtpvorbisdepay: handle packets > 0xffff
authorWim Taymans <wtaymans@redhat.com>
Thu, 21 Nov 2013 10:32:15 +0000 (11:32 +0100)
committerWim Taymans <wtaymans@redhat.com>
Thu, 21 Nov 2013 10:32:15 +0000 (11:32 +0100)
Handle input packet sizes larger than 16 bits in the depayloader.
Remove size restrictions on the payloader.

gst/rtp/gstrtpvorbisdepay.c
gst/rtp/gstrtpvorbispay.c

index 7709751..313a6ed 100644 (file)
@@ -446,6 +446,7 @@ gst_rtp_vorbis_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
   guint32 header, ident;
   guint8 F, VDT, packets;
   GstRTPBuffer rtp = { NULL };
+  guint length;
 
   rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (depayload);
 
@@ -539,10 +540,14 @@ gst_rtp_vorbis_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
     /* construct assembled buffer */
     payload_len = gst_adapter_available (rtpvorbisdepay->adapter);
     payload = gst_adapter_take (rtpvorbisdepay->adapter, payload_len);
-    /* fix the length */
-    payload[0] = ((payload_len - 2) >> 8) & 0xff;
-    payload[1] = (payload_len - 2) & 0xff;
+
+    /* use this length */
+    length = payload_len - 2;
+
     to_free = payload;
+  } else {
+    /* read length from data */
+    length = 0;
   }
 
   GST_DEBUG_OBJECT (depayload, "assemble done");
@@ -567,9 +572,9 @@ gst_rtp_vorbis_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
    * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*
    */
   while (payload_len > 2) {
-    guint16 length;
+    if (length == 0)
+      length = GST_READ_UINT16_BE (payload);
 
-    length = GST_READ_UINT16_BE (payload);
     payload += 2;
     payload_len -= 2;
 
@@ -604,6 +609,8 @@ gst_rtp_vorbis_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
 
     payload += length;
     payload_len -= length;
+    /* make sure to read next length */
+    length = 0;
 
     ret = gst_rtp_base_depayload_push (depayload, outbuf);
     if (ret != GST_FLOW_OK)
index b7ff2cc..7272e12 100644 (file)
@@ -727,7 +727,7 @@ gst_rtp_vorbis_pay_handle_buffer (GstRTPBasePayload * basepayload,
   GST_LOG_OBJECT (rtpvorbispay, "size %" G_GSIZE_FORMAT
       ", duration %" GST_TIME_FORMAT, size, GST_TIME_ARGS (duration));
 
-  if (G_UNLIKELY (size < 1 || size > 0xffff))
+  if (G_UNLIKELY (size < 1))
     goto wrong_size;
 
   /* find packet type */
@@ -822,8 +822,7 @@ done:
 wrong_size:
   {
     GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE,
-        ("Invalid packet size (1 < %" G_GSIZE_FORMAT " <= 0xffff)", size),
-        (NULL));
+        ("Invalid packet size (1 < %" G_GSIZE_FORMAT ")", size), (NULL));
     gst_buffer_unmap (buffer, &map);
     gst_buffer_unref (buffer);
     return GST_FLOW_OK;