From 6bafd6f53e4da709580164e698aca1c3a647b7ba Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Mon, 17 Nov 2008 14:30:31 +0000 Subject: [PATCH] Change header reading implementation to using get_bits() instead of directly accessing the data array. This allows to easily read optionally available header bits without causing pains. See discussion in "[PATCH] RDT/Realmedia patches #2" thread on ML. Originally committed as revision 15852 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/rdt.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/libavformat/rdt.c b/libavformat/rdt.c index 2907692823..f47147f5fe 100644 --- a/libavformat/rdt.c +++ b/libavformat/rdt.c @@ -33,6 +33,7 @@ #include "libavutil/md5.h" #include "rm.h" #include "internal.h" +#include struct RDTDemuxContext { AVFormatContext *ic; @@ -175,7 +176,9 @@ ff_rdt_parse_header(const uint8_t *buf, int len, int *pset_id, int *pseq_no, int *pstream_id, int *pis_keyframe, uint32_t *ptimestamp) { - int consumed = 10; + GetBitContext gb; + int consumed = 0, set_id, seq_no, stream_id, is_keyframe; + uint32_t timestamp; /* skip status packets */ while (len >= 5 && buf[1] == 0xFF /* status packet */) { @@ -242,13 +245,24 @@ ff_rdt_parse_header(const uint8_t *buf, int len, * [2] http://www.wireshark.org/docs/dfref/r/rdt.html and * http://anonsvn.wireshark.org/viewvc/trunk/epan/dissectors/packet-rdt.c */ - if (pset_id) *pset_id = (buf[0]>>1) & 0x1f; - if (pseq_no) *pseq_no = AV_RB16(buf+1); - if (ptimestamp) *ptimestamp = AV_RB32(buf+4); - if (pstream_id) *pstream_id = (buf[3]>>1) & 0x1f; - if (pis_keyframe) *pis_keyframe = !(buf[3] & 0x1); + init_get_bits(&gb, buf, len << 3); + skip_bits(&gb, 2); + set_id = get_bits(&gb, 5); + skip_bits(&gb, 1); + seq_no = get_bits(&gb, 16); + skip_bits(&gb, 2); + stream_id = get_bits(&gb, 5); + is_keyframe = !get_bits1(&gb); + timestamp = get_bits_long(&gb, 32); + skip_bits(&gb, 16); - return consumed; + if (pset_id) *pset_id = set_id; + if (pseq_no) *pseq_no = seq_no; + if (pstream_id) *pstream_id = stream_id; + if (pis_keyframe) *pis_keyframe = is_keyframe; + if (ptimestamp) *ptimestamp = timestamp; + + return consumed + (get_bits_count(&gb) >> 3); } /**< return 0 on packet, no more left, 1 on packet, 1 on partial packet... */