AAC encoder: in IS, fix index of sf_idx, band_type
Correct addressing of sf_idx and band_type arrays in I/S code. Both arrays don't guarantee valid values for subwindows at all times, depending on which coder is being used, which could result in reading of garbage values. Instead, only the first subwindow in the window group has to be used, ie: use w*16+g instead of (w+w2)*16+g
This commit is contained in:
@@ -53,7 +53,7 @@ struct AACISError ff_aac_is_encoding_err(AACEncContext *s, ChannelElement *cpe,
|
|||||||
for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
|
for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
|
||||||
FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g];
|
FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g];
|
||||||
FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g];
|
FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g];
|
||||||
int is_band_type, is_sf_idx = FFMAX(1, sce0->sf_idx[(w+w2)*16+g]-4);
|
int is_band_type, is_sf_idx = FFMAX(1, sce0->sf_idx[w*16+g]-4);
|
||||||
float e01_34 = phase*pow(ener1/ener0, 3.0/4.0);
|
float e01_34 = phase*pow(ener1/ener0, 3.0/4.0);
|
||||||
float maxval, dist_spec_err = 0.0f;
|
float maxval, dist_spec_err = 0.0f;
|
||||||
float minthr = FFMIN(band0->threshold, band1->threshold);
|
float minthr = FFMIN(band0->threshold, band1->threshold);
|
||||||
@@ -66,13 +66,13 @@ struct AACISError ff_aac_is_encoding_err(AACEncContext *s, ChannelElement *cpe,
|
|||||||
is_band_type = find_min_book(maxval, is_sf_idx);
|
is_band_type = find_min_book(maxval, is_sf_idx);
|
||||||
dist1 += quantize_band_cost(s, &L[start + (w+w2)*128], L34,
|
dist1 += quantize_band_cost(s, &L[start + (w+w2)*128], L34,
|
||||||
sce0->ics.swb_sizes[g],
|
sce0->ics.swb_sizes[g],
|
||||||
sce0->sf_idx[(w+w2)*16+g],
|
sce0->sf_idx[w*16+g],
|
||||||
sce0->band_type[(w+w2)*16+g],
|
sce0->band_type[w*16+g],
|
||||||
s->lambda / band0->threshold, INFINITY, NULL, NULL, 0);
|
s->lambda / band0->threshold, INFINITY, NULL, NULL, 0);
|
||||||
dist1 += quantize_band_cost(s, &R[start + (w+w2)*128], R34,
|
dist1 += quantize_band_cost(s, &R[start + (w+w2)*128], R34,
|
||||||
sce1->ics.swb_sizes[g],
|
sce1->ics.swb_sizes[g],
|
||||||
sce1->sf_idx[(w+w2)*16+g],
|
sce1->sf_idx[w*16+g],
|
||||||
sce1->band_type[(w+w2)*16+g],
|
sce1->band_type[w*16+g],
|
||||||
s->lambda / band1->threshold, INFINITY, NULL, NULL, 0);
|
s->lambda / band1->threshold, INFINITY, NULL, NULL, 0);
|
||||||
dist2 += quantize_band_cost(s, IS, I34, sce0->ics.swb_sizes[g],
|
dist2 += quantize_band_cost(s, IS, I34, sce0->ics.swb_sizes[g],
|
||||||
is_sf_idx, is_band_type,
|
is_sf_idx, is_band_type,
|
||||||
@@ -118,11 +118,6 @@ void ff_aac_search_for_is(AACEncContext *s, AVCodecContext *avctx, ChannelElemen
|
|||||||
ff_sfdelta_can_remove_band(sce1, nextband1, prev_sf1, w*16+g)) {
|
ff_sfdelta_can_remove_band(sce1, nextband1, prev_sf1, w*16+g)) {
|
||||||
float ener0 = 0.0f, ener1 = 0.0f, ener01 = 0.0f, ener01p = 0.0f;
|
float ener0 = 0.0f, ener1 = 0.0f, ener01 = 0.0f, ener01p = 0.0f;
|
||||||
struct AACISError ph_err1, ph_err2, *best;
|
struct AACISError ph_err1, ph_err2, *best;
|
||||||
if (sce0->band_type[w*16+g] == NOISE_BT ||
|
|
||||||
sce1->band_type[w*16+g] == NOISE_BT) {
|
|
||||||
start += sce0->ics.swb_sizes[g];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
|
for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
|
||||||
for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
|
for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
|
||||||
float coef0 = fabsf(sce0->coeffs[start+(w+w2)*128+i]);
|
float coef0 = fabsf(sce0->coeffs[start+(w+w2)*128+i]);
|
||||||
|
|||||||
Reference in New Issue
Block a user