diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2008-11-17 14:32:01 +0000 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2008-11-17 14:32:01 +0000 |
commit | 43af8b2b42fb6c8affe9261d5212d25fef53a773 (patch) | |
tree | dda19727cb45940471a1c26ffe70a09a0a017e63 /libavformat/rdt.c | |
parent | 6bafd6f53e4da709580164e698aca1c3a647b7ba (diff) | |
download | ffmpeg-streaming-43af8b2b42fb6c8affe9261d5212d25fef53a773.zip ffmpeg-streaming-43af8b2b42fb6c8affe9261d5212d25fef53a773.tar.gz |
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".
Originally committed as revision 15853 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rdt.c')
-rw-r--r-- | libavformat/rdt.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/libavformat/rdt.c b/libavformat/rdt.c index f47147f..b1e5d25 100644 --- a/libavformat/rdt.c +++ b/libavformat/rdt.c @@ -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; |