int cpe_base_channel;
int is_signs[30];
+ int reuseable;
+
} ATRAC9BlockData;
typedef struct ATRAC9Context {
}
b->grad_boundary = get_bits(gb, 4);
- if (grad_range[0] >= grad_range[1] || grad_range[1] > 47)
- return AVERROR_INVALIDDATA;
-
- if (grad_value[0] > 31 || grad_value[1] > 31)
+ if (grad_range[0] >= grad_range[1] || grad_range[1] > 31)
return AVERROR_INVALIDDATA;
if (b->grad_boundary > b->q_unit_cnt)
int ext_band = 0;
if (b->has_band_ext) {
+ if (b->q_unit_cnt < 13)
+ return AVERROR_INVALIDDATA;
ext_band = at9_tab_band_ext_group[b->q_unit_cnt - 13][2];
if (stereo) {
b->channel[1].band_ext = get_bits(gb, 2);
ATRAC9ChannelData *c, GetBitContext *gb,
int channel_idx, int first_in_pkt)
{
- static const int mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
+ static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
const int mode = mode_map[channel_idx][get_bits(gb, 2)];
memset(c->scalefactors, 0, sizeof(c->scalefactors));
at9_q_unit_to_coeff_idx[g_units[3]],
};
- if (!b->has_band_ext || !b->has_band_ext_data)
- return;
-
for (int ch = 0; ch <= stereo; ch++) {
ATRAC9ChannelData *c = &b->channel[ch];
if (!reuse_params) {
int stereo_band, ext_band;
const int min_band_count = s->samplerate_idx > 7 ? 1 : 3;
+ b->reuseable = 0;
b->band_count = get_bits(gb, 4) + min_band_count;
b->q_unit_cnt = at9_tab_band_q_unit_map[b->band_count];
}
b->band_ext_q_unit = at9_tab_band_q_unit_map[ext_band];
}
+ b->reuseable = 1;
+ }
+ if (!b->reuseable) {
+ av_log(s->avctx, AV_LOG_ERROR, "invalid block reused!\n");
+ return AVERROR_INVALIDDATA;
}
/* Calculate bit alloc gradient */
apply_intensity_stereo(s, b, stereo);
apply_scalefactors (s, b, stereo);
- apply_band_extension (s, b, stereo);
+
+ if (b->has_band_ext && b->has_band_ext_data)
+ apply_band_extension (s, b, stereo);
imdct:
for (int i = 0; i <= stereo; i++) {
av_lfg_init(&s->lfg, 0xFBADF00D);
+ if (avctx->block_align <= 0) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid block align\n");
+ return AVERROR_INVALIDDATA;
+ }
+
if (avctx->extradata_size != 12) {
av_log(avctx, AV_LOG_ERROR, "Invalid extradata length!\n");
return AVERROR_INVALIDDATA;
s->block_config = &at9_block_layout[block_config_idx];
avctx->channel_layout = s->block_config->channel_layout;
+ avctx->channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
if (get_bits1(&gb)) {