diff --git a/libavcodec/alac.c b/libavcodec/alac.c index a99f024ceb..11e9847b44 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -146,7 +146,14 @@ static inline int count_leading_zeros(int32_t input) } -static inline int decode_postfix(GetBitContext *gb, int x, int k, int limit){ +static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsamplesize){ + /* read x - number of 1s before 0 represent the rice */ + int x = get_unary_0_9(gb); + + if (x > 8) { /* RICE THRESHOLD */ + /* use alternative encoding */ + x = get_bits(gb, readsamplesize); + } else { if (k >= limit) k = limit; @@ -162,6 +169,7 @@ static inline int decode_postfix(GetBitContext *gb, int x, int k, int limit){ } else skip_bits(gb, k - 1); } + } return x; } @@ -184,20 +192,12 @@ static void bastardized_rice_decompress(ALACContext *alac, int32_t x_modified; int32_t final_val; - /* read x - number of 1s before 0 represent the rice */ - x = get_unary_0_9(&alac->gb); - - if (x > 8) { /* RICE THRESHOLD */ - /* use alternative encoding */ - x = get_bits(&alac->gb, readsamplesize); - } else { /* standard rice encoding */ int k; /* size of extra bits */ /* read k, that is bits as is */ k = 31 - count_leading_zeros((history >> 9) + 3); - x= decode_postfix(&alac->gb, x, k, rice_kmodifier); - } + x= decode_scalar(&alac->gb, k, rice_kmodifier, readsamplesize); x_modified = sign_modifier + x; final_val = (x_modified + 1) / 2; @@ -216,21 +216,13 @@ static void bastardized_rice_decompress(ALACContext *alac, /* special case: there may be compressed blocks of 0 */ if ((history < 128) && (output_count+1 < output_size)) { - int block_size; + int block_size, k; sign_modifier = 1; - x = get_unary_0_9(&alac->gb); - - if (x > 8) { - block_size = get_bits(&alac->gb, 16); - } else { - int k; - k = count_leading_zeros(history) + ((history + 16) >> 6 /* / 64 */) - 24; - block_size= decode_postfix(&alac->gb, x, k, rice_kmodifier); - } + block_size= decode_scalar(&alac->gb, k, rice_kmodifier, 16); if (block_size > 0) { memset(&output_buffer[output_count+1], 0, block_size * 4);