# HG changeset patch # User reimar # Date 1283455066 0 # Node ID 9ba950e0e021b8b93f8526400326c0f68de53558 # Parent ad3c08bb5e68374a2c2f86cd84c961028c4cfd30 Optimize/simplify ebml_read_num. diff -r ad3c08bb5e68 -r 9ba950e0e021 matroskadec.c --- a/matroskadec.c Thu Sep 02 11:53:09 2010 +0000 +++ b/matroskadec.c Thu Sep 02 19:17:46 2010 +0000 @@ -538,8 +538,8 @@ 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 @@ } /* 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 @@ } /* read out length */ - total &= ~len_mask; + total ^= 1 << ff_log2_tab[total]; while (n++ < read) total = (total << 8) | get_byte(pb);