Read optional components of the RDT packet header, such as extended setID
authorRonald S. Bultje <rsbultje@gmail.com>
Mon, 17 Nov 2008 14:32:01 +0000 (14:32 +0000)
committerRonald S. Bultje <rsbultje@gmail.com>
Mon, 17 Nov 2008 14:32:01 +0000 (14:32 +0000)
and streamID and the length. of the packet in case of packet concatenation.
Discussed in ML thread "[PATCH] RDT/Realmedia patches #2".

Originally committed as revision 15853 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/rdt.c

index f47147f5feb25853895cb1cf5940c975a1324fa9..b1e5d251332852fc95b3a36cd94d00370e985f46 100644 (file)
@@ -177,7 +177,8 @@ ff_rdt_parse_header(const uint8_t *buf, int len,
                     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 @@ ff_rdt_parse_header(const uint8_t *buf, int len,
         len -= pkt_len;
         consumed += pkt_len;
     }
-    if (len < 10)
+    if (len < 16)
         return -1;
     /**
      * Layout of the header (in bits):
@@ -246,15 +247,23 @@ ff_rdt_parse_header(const uint8_t *buf, int len,
      *     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;