From ff6a5fc1f0a3db6ea949e1c8738def0cfebbf57e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Reimar=20D=C3=B6ffinger?= Date: Thu, 2 Sep 2010 19:17:46 +0000 Subject: [PATCH] Optimize/simplify ebml_read_num. Originally committed as revision 25026 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/matroskadec.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 27dd9b2e0..5de60fa18 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -538,8 +538,8 @@ static int ebml_level_end(MatroskaDemuxContext *matroska) static int ebml_read_num(MatroskaDemuxContext *matroska, ByteIOContext *pb, int max_size, uint64_t *number) { - int len_mask = 0x80, read = 1, n = 1; - int64_t total = 0; + int read = 1, n = 1; + uint64_t total = 0; /* The first byte tells us the length in bytes - get_byte() can normally * return 0, but since that's not a valid first ebmlID byte, we can @@ -556,10 +556,7 @@ static int ebml_read_num(MatroskaDemuxContext *matroska, ByteIOContext *pb, } /* get the length of the EBML number */ - while (read <= max_size && !(total & len_mask)) { - read++; - len_mask >>= 1; - } + read = 8 - ff_log2_tab[total]; if (read > max_size) { int64_t pos = url_ftell(pb) - 1; av_log(matroska->ctx, AV_LOG_ERROR, @@ -569,7 +566,7 @@ static int ebml_read_num(MatroskaDemuxContext *matroska, ByteIOContext *pb, } /* read out length */ - total &= ~len_mask; + total ^= 1 << ff_log2_tab[total]; while (n++ < read) total = (total << 8) | get_byte(pb); -- 2.11.0