summaryrefslogtreecommitdiff
path: root/libavformat
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
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')
-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;