Mercurial > libavformat.hg
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;