Mercurial > libavcodec.hg
changeset 6625:1f4a86db7835 libavcodec
Factorize decode_postfix() out.
author | michael |
---|---|
date | Thu, 17 Apr 2008 03:08:25 +0000 |
parents | 2dc587201e38 |
children | a2f1a461dac6 |
files | alac.c |
diffstat | 1 files changed, 22 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/alac.c Thu Apr 17 03:00:08 2008 +0000 +++ b/alac.c Thu Apr 17 03:08:25 2008 +0000 @@ -145,6 +145,26 @@ return 31-av_log2(input); } + +static inline int decode_postfix(GetBitContext *gb, int x, int k, int limit){ + if (k >= limit) + k = limit; + + if (k != 1) { + int extrabits = show_bits(gb, k); + + /* multiply x by 2^k - 1, as part of their strange algorithm */ + x = (x << k) - x; + + if (extrabits > 1) { + x += extrabits - 1; + skip_bits(gb, k); + } else + skip_bits(gb, k - 1); + } + return x; +} + static void bastardized_rice_decompress(ALACContext *alac, int32_t *output_buffer, int output_size, @@ -172,27 +192,11 @@ x = get_bits(&alac->gb, readsamplesize); } else { /* standard rice encoding */ - int extrabits; int k; /* size of extra bits */ /* read k, that is bits as is */ k = 31 - count_leading_zeros((history >> 9) + 3); - - if (k >= rice_kmodifier) - k = rice_kmodifier; - - if (k != 1) { - extrabits = show_bits(&alac->gb, k); - - /* multiply x by 2^k - 1, as part of their strange algorithm */ - x = (x << k) - x; - - if (extrabits > 1) { - x += extrabits - 1; - skip_bits(&alac->gb, k); - } else - skip_bits(&alac->gb, k - 1); - } + x= decode_postfix(&alac->gb, x, k, rice_kmodifier); } x_modified = sign_modifier + x; @@ -222,24 +226,10 @@ block_size = get_bits(&alac->gb, 16); } else { int k; - int extrabits; k = count_leading_zeros(history) + ((history + 16) >> 6 /* / 64 */) - 24; - if (k >= rice_kmodifier) - k = rice_kmodifier; - - x = (x << k) - x; - - extrabits = show_bits(&alac->gb, k); - - if (extrabits < 2) { - skip_bits(&alac->gb, k - 1); - } else { - x += extrabits - 1; - skip_bits(&alac->gb, k); - } - block_size = x; + block_size= decode_postfix(&alac->gb, x, k, rice_kmodifier); } if (block_size > 0) {