diff options
Diffstat (limited to 'libavcodec/wmalosslessdec.c')
-rw-r--r-- | libavcodec/wmalosslessdec.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index 56e9aad..485cab2 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -5,20 +5,20 @@ * Copyright (c) 2011 Andreas Ă–man * Copyright (c) 2011 - 2012 Mashiat Sarker Shakkhar * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -127,8 +127,8 @@ typedef struct WmallDecodeCtx { int8_t mclms_scaling; int16_t mclms_coeffs[128]; int16_t mclms_coeffs_cur[4]; - int16_t mclms_prevvalues[64]; - int16_t mclms_updates[64]; + int16_t mclms_prevvalues[WMALL_MAX_CHANNELS * 2 * 32]; + int16_t mclms_updates[WMALL_MAX_CHANNELS * 2 * 32]; int mclms_recent; int movave_scaling; @@ -158,14 +158,14 @@ typedef struct WmallDecodeCtx { int ave_sum[2]; - int channel_residues[2][2048]; + int channel_residues[2][WMALL_BLOCK_MAX_SIZE]; int lpc_coefs[2][40]; int lpc_order; int lpc_scaling; int lpc_intbits; - int channel_coeffs[2][2048]; + int channel_coeffs[2][WMALL_BLOCK_MAX_SIZE]; } WmallDecodeCtx; @@ -174,7 +174,7 @@ static av_cold int decode_init(AVCodecContext *avctx) WmallDecodeCtx *s = avctx->priv_data; uint8_t *edata_ptr = avctx->extradata; unsigned int channel_mask; - int i, log2_max_num_subframes; + int i, bits, log2_max_num_subframes; s->avctx = avctx; init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); @@ -213,8 +213,12 @@ static av_cold int decode_init(AVCodecContext *avctx) s->len_prefix = s->decode_flags & 0x40; /* get frame len */ - s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate, - 3, s->decode_flags); + bits = ff_wma_get_frame_len_bits(avctx->sample_rate, 3, s->decode_flags); + if (bits > WMALL_BLOCK_MAX_BITS) { + av_log_missing_feature(avctx, "big-bits block sizes", 1); + return AVERROR_INVALIDDATA; + } + s->samples_per_frame = 1 << bits; /* init previous block len */ for (i = 0; i < avctx->channels; i++) @@ -403,7 +407,7 @@ static void decode_ac_filter(WmallDecodeCtx *s) s->acfilter_scaling = get_bits(&s->gb, 4); for (i = 0; i < s->acfilter_order; i++) - s->acfilter_coeffs[i] = get_bits(&s->gb, s->acfilter_scaling) + 1; + s->acfilter_coeffs[i] = (s->acfilter_scaling ? get_bits(&s->gb, s->acfilter_scaling) : 0) + 1; } static void decode_mclms(WmallDecodeCtx *s) @@ -496,9 +500,9 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size) if (s->seekable_tile) { if (s->do_inter_ch_decorr) - s->channel_residues[ch][0] = get_sbits(&s->gb, s->bits_per_sample + 1); + s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample + 1); else - s->channel_residues[ch][0] = get_sbits(&s->gb, s->bits_per_sample); + s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample); i++; } for (; i < tile_size; i++) { @@ -516,7 +520,7 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size) residue = quo; else { rem_bits = av_ceil_log2(ave_mean); - rem = rem_bits ? get_bits(&s->gb, rem_bits) : 0; + rem = get_bits_long(&s->gb, rem_bits); residue = (quo << rem_bits) + rem; } @@ -946,7 +950,7 @@ static int decode_subframe(WmallDecodeCtx *s) bits * s->num_channels * subframe_len, get_bits_count(&s->gb)); for (i = 0; i < s->num_channels; i++) for (j = 0; j < subframe_len; j++) - s->channel_coeffs[i][j] = get_sbits(&s->gb, bits); + s->channel_coeffs[i][j] = get_sbits_long(&s->gb, bits); } else { for (i = 0; i < s->num_channels; i++) if (s->is_channel_coded[i]) { @@ -1225,6 +1229,7 @@ static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr, /* Reset number of saved bits so that the decoder does not start * to decode incomplete frames in the s->len_prefix == 0 case. */ s->num_saved_bits = 0; + init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); s->packet_loss = 0; } @@ -1274,6 +1279,7 @@ static void flush(AVCodecContext *avctx) s->packet_loss = 1; s->packet_done = 0; s->num_saved_bits = 0; + init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); s->frame_offset = 0; s->next_packet_start = 0; s->cdlms[0][0].order = 0; |