changeset 4040:b22f5462903e libavformat

Read optional components of the RDT packet header, such as extended setID and streamID and the length. of the packet in case of packet concatenation. Discussed in ML thread "[PATCH] RDT/Realmedia patches #2".
author rbultje
date Mon, 17 Nov 2008 14:32:01 +0000
parents c126ba3df59c
children 8281f6046ab2
files rdt.c
diffstat 1 files changed, 12 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/rdt.c	Mon Nov 17 14:30:31 2008 +0000
+++ b/rdt.c	Mon Nov 17 14:32:01 2008 +0000
@@ -177,7 +177,8 @@
                     int *pis_keyframe, uint32_t *ptimestamp)
 {
     GetBitContext gb;
-    int consumed = 0, set_id, seq_no, stream_id, is_keyframe;
+    int consumed = 0, set_id, seq_no, stream_id, is_keyframe,
+        len_included, need_reliable;
     uint32_t timestamp;
 
     /* skip status packets */
@@ -192,7 +193,7 @@
         len -= pkt_len;
         consumed += pkt_len;
     }
-    if (len < 10)
+    if (len < 16)
         return -1;
     /**
      * Layout of the header (in bits):
@@ -246,15 +247,23 @@
      *     http://anonsvn.wireshark.org/viewvc/trunk/epan/dissectors/packet-rdt.c
      */
     init_get_bits(&gb, buf, len << 3);
-    skip_bits(&gb, 2);
+    len_included  = get_bits1(&gb);
+    need_reliable = get_bits1(&gb);
     set_id        = get_bits(&gb, 5);
     skip_bits(&gb, 1);
     seq_no        = get_bits(&gb, 16);
+    if (len_included)
+        skip_bits(&gb, 16);
     skip_bits(&gb, 2);
     stream_id     = get_bits(&gb, 5);
     is_keyframe   = !get_bits1(&gb);
     timestamp     = get_bits_long(&gb, 32);
+    if (set_id == 0x1f)
+        set_id    = get_bits(&gb, 16);
+    if (need_reliable)
     skip_bits(&gb, 16);
+    if (stream_id == 0x1f)
+        stream_id = get_bits(&gb, 16);
 
     if (pset_id)      *pset_id      = set_id;
     if (pseq_no)      *pseq_no      = seq_no;