summaryrefslogtreecommitdiff
path: root/libavformat/rdt.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2008-11-17 14:32:01 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2008-11-17 14:32:01 +0000
commit43af8b2b42fb6c8affe9261d5212d25fef53a773 (patch)
treedda19727cb45940471a1c26ffe70a09a0a017e63 /libavformat/rdt.c
parent6bafd6f53e4da709580164e698aca1c3a647b7ba (diff)
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.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/libavformat/rdt.c b/libavformat/rdt.c
index f47147f5fe..b1e5d25133 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;