summaryrefslogtreecommitdiff
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
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
-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;