# HG changeset patch # User rbultje # Date 1226932321 0 # Node ID b22f5462903e02e7863395e7dc69f5ed342d6e23 # Parent c126ba3df59ceab4580f34700cff41e9a4903957 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". diff -r c126ba3df59c -r b22f5462903e rdt.c --- 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;