#include "libavutil/attributes.h"
#include "libavutil/avassert.h"
+#include "libavutil/mem_internal.h"
#include "avcodec.h"
#include "internal.h"
int transient_pos[WMALL_MAX_CHANNELS];
int seekable_tile;
- int ave_sum[WMALL_MAX_CHANNELS];
+ unsigned ave_sum[WMALL_MAX_CHANNELS];
int channel_residues[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE];
unsigned int channel_mask;
int i, log2_max_num_subframes;
- if (avctx->block_align <= 0) {
+ if (avctx->block_align <= 0 || avctx->block_align > (1<<21)) {
av_log(avctx, AV_LOG_ERROR, "block_align is not set or invalid\n");
return AVERROR(EINVAL);
}
for (i = 0; i < ich; i++)
pred[ich] += (uint32_t)s->channel_residues[i][icoef] *
s->mclms_coeffs_cur[i + num_channels * ich];
- pred[ich] += (1 << s->mclms_scaling) >> 1;
+ pred[ich] += (1U << s->mclms_scaling) >> 1;
pred[ich] >>= s->mclms_scaling;
s->channel_residues[ich][icoef] += (unsigned)pred[ich];
}
static void revert_cdlms ## bits (WmallDecodeCtx *s, int ch, \
int coef_begin, int coef_end) \
{ \
- int icoef, pred, ilms, num_lms, residue, input; \
+ int icoef, ilms, num_lms, residue, input; \
+ unsigned pred;\
\
num_lms = s->cdlms_ttl[ch]; \
for (ilms = num_lms - 1; ilms >= 0; ilms--) { \
s->cdlms[ch][ilms].recent, \
FFALIGN(s->cdlms[ch][ilms].order, ROUND), \
WMASIGN(residue)); \
- input = residue + (unsigned)(pred >> s->cdlms[ch][ilms].scaling); \
+ input = residue + (unsigned)((int)pred >> s->cdlms[ch][ilms].scaling); \
lms_update ## bits(s, ch, ilms, input); \
s->channel_residues[ch][icoef] = input; \
} \
else if (s->is_channel_coded[0] || s->is_channel_coded[1]) {
int icoef;
for (icoef = 0; icoef < tile_size; icoef++) {
- s->channel_residues[0][icoef] -= s->channel_residues[1][icoef] >> 1;
- s->channel_residues[1][icoef] += s->channel_residues[0][icoef];
+ s->channel_residues[0][icoef] -= (unsigned)(s->channel_residues[1][icoef] >> 1);
+ s->channel_residues[1][icoef] += (unsigned) s->channel_residues[0][icoef];
}
}
}
s->do_lpc = 0;
}
+ if (get_bits_left(&s->gb) < 1)
+ return AVERROR_INVALIDDATA;
if (get_bits1(&s->gb))
padding_zeroes = get_bits(&s->gb, 5);
if (s->bits_per_sample == 16) {
*s->samples_16[c]++ = (int16_t) s->channel_residues[c][j] * (1 << padding_zeroes);
} else {
- *s->samples_32[c]++ = s->channel_residues[c][j] * (256 << padding_zeroes);
+ *s->samples_32[c]++ = s->channel_residues[c][j] * (256U << padding_zeroes);
}
}
}
s->num_saved_bits += len;
if (!append) {
- avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
+ ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
s->num_saved_bits);
} else {
int align = 8 - (get_bits_count(gb) & 7);
align = FFMIN(align, len);
put_bits(&s->pb, align, get_bits(gb, align));
len -= align;
- avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
+ ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
}
skip_bits_long(gb, len);
return 0;
}
-AVCodec ff_wmalossless_decoder = {
+const AVCodec ff_wmalossless_decoder = {
.name = "wmalossless",
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio Lossless"),
.type = AVMEDIA_TYPE_AUDIO,