1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

alsdec: Fix the clipping range

mcc_weightings is only 32 elements.

Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
This commit is contained in:
Luca Barbato 2013-07-12 23:02:25 +02:00
parent 69e6702c01
commit 70ecc175c7

View File

@ -1152,6 +1152,12 @@ static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame,
return 0; return 0;
} }
static inline int als_weighting(GetBitContext *gb, int k, int off)
{
int idx = av_clip(decode_rice(gb, k) + off,
0, FF_ARRAY_ELEMS(mcc_weightings) - 1);
return mcc_weightings[idx];
}
/** Read the channel data. /** Read the channel data.
*/ */
@ -1172,14 +1178,14 @@ static int read_channel_data(ALSDecContext *ctx, ALSChannelData *cd, int c)
if (current->master_channel != c) { if (current->master_channel != c) {
current->time_diff_flag = get_bits1(gb); current->time_diff_flag = get_bits1(gb);
current->weighting[0] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; current->weighting[0] = als_weighting(gb, 1, 16);
current->weighting[1] = mcc_weightings[av_clip(decode_rice(gb, 2) + 14, 0, 32)]; current->weighting[1] = als_weighting(gb, 2, 14);
current->weighting[2] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; current->weighting[2] = als_weighting(gb, 1, 16);
if (current->time_diff_flag) { if (current->time_diff_flag) {
current->weighting[3] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; current->weighting[3] = als_weighting(gb, 1, 16);
current->weighting[4] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; current->weighting[4] = als_weighting(gb, 1, 16);
current->weighting[5] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)]; current->weighting[5] = als_weighting(gb, 1, 16);
current->time_diff_sign = get_bits1(gb); current->time_diff_sign = get_bits1(gb);
current->time_diff_index = get_bits(gb, ctx->ltp_lag_length - 3) + 3; current->time_diff_index = get_bits(gb, ctx->ltp_lag_length - 3) + 3;