summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-12-23 16:42:54 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-12-23 16:42:54 +0000
commitc42fa080857f4e37e190918550ab14ad1ac57d79 (patch)
tree3ee5920d28c482e9617492e2a1a622e841120a08 /libmpdemux
parent99ad62f36f9ddb5172e97709552a25937fe5dd41 (diff)
downloadmpv-c42fa080857f4e37e190918550ab14ad1ac57d79.tar.bz2
mpv-c42fa080857f4e37e190918550ab14ad1ac57d79.tar.xz
Add a read_varlen function to reduce some code duplication
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25515 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_asf.c68
1 files changed, 24 insertions, 44 deletions
diff --git a/libmpdemux/demux_asf.c b/libmpdemux/demux_asf.c
index 18504e500e..5eb0e04e3d 100644
--- a/libmpdemux/demux_asf.c
+++ b/libmpdemux/demux_asf.c
@@ -42,6 +42,23 @@ extern int read_asf_header(demuxer_t *demuxer,struct asf_priv* asf);
// based on asf file-format doc by Eugene [http://divx.euro.ru]
+/**
+ * \brief reads int stored in number of bytes given by len
+ * \param ptr pointer to read from, is incremented appropriately
+ * \param len lowest 2 bits indicate number of bytes to read
+ * \param def default value to return if len is invalid
+ */
+static inline unsigned read_varlen(uint8_t **ptr, int len, int def) {
+ const uint8_t *p = *ptr;
+ len &= 3;
+ switch (len) {
+ case 1: *ptr += 1; return *p;
+ case 2: *ptr += 2; return LOAD_LE16(p);
+ case 3: *ptr += 4; return LOAD_LE32(p);
+ }
+ return def;
+}
+
static void asf_descrambling(unsigned char **src,unsigned len, struct asf_priv* asf){
unsigned char *dst=malloc(len);
unsigned char *s2=*src;
@@ -374,30 +391,13 @@ static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
p+=2; // skip flags & segtype
// Read packet size (plen):
- switch((flags>>5)&3){
- case 3: plen=LOAD_LE32(p);p+=4;break; // dword
- case 2: plen=LOAD_LE16(p);p+=2;break; // word
- case 1: plen=p[0];p++;break; // byte
- default: plen=0;
- //plen==0 is handled later
- //mp_msg(MSGT_DEMUX,MSGL_V,"Invalid plen type! assuming plen=0\n");
- }
+ plen = read_varlen(&p, flags >> 5, 0);
// Read sequence:
- switch((flags>>1)&3){
- case 3: sequence=LOAD_LE32(p);p+=4;break; // dword
- case 2: sequence=LOAD_LE16(p);p+=2;break; // word
- case 1: sequence=p[0];p++;break; // byte
- default: sequence=0;
- }
+ sequence = read_varlen(&p, flags >> 1, 0);
// Read padding size (padding):
- switch((flags>>3)&3){
- case 3: padding=LOAD_LE32(p);p+=4;break; // dword
- case 2: padding=LOAD_LE16(p);p+=2;break; // word
- case 1: padding=p[0];p++;break; // byte
- default: padding=0;
- }
+ padding = read_varlen(&p, flags >> 3, 0);
if(((flags>>5)&3)!=0){
// Explicit (absoulte) packet size
@@ -450,28 +450,13 @@ static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
p++;
// Read media object number (seq):
- switch((segtype>>4)&3){
- case 3: seq=LOAD_LE32(p);p+=4;break; // dword
- case 2: seq=LOAD_LE16(p);p+=2;break; // word
- case 1: seq=p[0];p++;break; // byte
- default: seq=0;
- }
+ seq = read_varlen(&p, segtype >> 4, 0);
// Read offset or timestamp:
- switch((segtype>>2)&3){
- case 3: x=LOAD_LE32(p);p+=4;break; // dword
- case 2: x=LOAD_LE16(p);p+=2;break; // word
- case 1: x=p[0];p++;break; // byte
- default: x=0;
- }
+ x = read_varlen(&p, segtype >> 2, 0);
// Read replic.data len:
- switch((segtype)&3){
- case 3: rlen=LOAD_LE32(p);p+=4;break; // dword
- case 2: rlen=LOAD_LE16(p);p+=2;break; // word
- case 1: rlen=p[0];p++;break; // byte
- default: rlen=0;
- }
+ rlen = read_varlen(&p, segtype, 0);
// printf("### rlen=%d \n",rlen);
@@ -496,12 +481,7 @@ static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
if(flags&1){
// multiple segments
- switch(segsizetype){
- case 3: len=LOAD_LE32(p);p+=4;break; // dword
- case 2: len=LOAD_LE16(p);p+=2;break; // word
- case 1: len=p[0];p++;break; // byte
- default: len=plen-(p-asf->packet); // ???
- }
+ len = read_varlen(&p, segsizetype, plen-(p-asf->packet));
} else {
// single segment
len=plen-(p-asf->packet);