mirror of https://git.ffmpeg.org/ffmpeg.git
aaccoder: fix M/S coding
There were some mistakes in the code for M/S stereo, this commit fixes them. The start variable was not being reset for every window and every access to the coefficients was incorrect as well. This fixes that by properly addressing the coefficients using both windows and setting the start on every window to zero. Reviewed-by: Claudio Freire <klaussfreire@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
8e607c747e
commit
57848ef3c6
|
@ -1166,6 +1166,7 @@ static void search_for_ms(AACEncContext *s, ChannelElement *cpe,
|
||||||
if (!cpe->common_window)
|
if (!cpe->common_window)
|
||||||
return;
|
return;
|
||||||
for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
|
for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
|
||||||
|
start = 0;
|
||||||
for (g = 0; g < sce0->ics.num_swb; g++) {
|
for (g = 0; g < sce0->ics.num_swb; g++) {
|
||||||
if (!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]) {
|
if (!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]) {
|
||||||
float dist1 = 0.0f, dist2 = 0.0f;
|
float dist1 = 0.0f, dist2 = 0.0f;
|
||||||
|
@ -1175,22 +1176,22 @@ static void search_for_ms(AACEncContext *s, ChannelElement *cpe,
|
||||||
float minthr = FFMIN(band0->threshold, band1->threshold);
|
float minthr = FFMIN(band0->threshold, band1->threshold);
|
||||||
float maxthr = FFMAX(band0->threshold, band1->threshold);
|
float maxthr = FFMAX(band0->threshold, band1->threshold);
|
||||||
for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
|
for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
|
||||||
M[i] = (sce0->pcoeffs[start+w2*128+i]
|
M[i] = (sce0->pcoeffs[start+(w+w2)*128+i]
|
||||||
+ sce1->pcoeffs[start+w2*128+i]) * 0.5;
|
+ sce1->pcoeffs[start+(w+w2)*128+i]) * 0.5;
|
||||||
S[i] = M[i]
|
S[i] = M[i]
|
||||||
- sce1->pcoeffs[start+w2*128+i];
|
- sce1->pcoeffs[start+(w+w2)*128+i];
|
||||||
}
|
}
|
||||||
abs_pow34_v(L34, sce0->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
|
abs_pow34_v(L34, sce0->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]);
|
||||||
abs_pow34_v(R34, sce1->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
|
abs_pow34_v(R34, sce1->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]);
|
||||||
abs_pow34_v(M34, M, sce0->ics.swb_sizes[g]);
|
abs_pow34_v(M34, M, sce0->ics.swb_sizes[g]);
|
||||||
abs_pow34_v(S34, S, sce0->ics.swb_sizes[g]);
|
abs_pow34_v(S34, S, sce0->ics.swb_sizes[g]);
|
||||||
dist1 += quantize_band_cost(s, sce0->coeffs + start + w2*128,
|
dist1 += quantize_band_cost(s, sce0->coeffs + start + (w+w2)*128,
|
||||||
L34,
|
L34,
|
||||||
sce0->ics.swb_sizes[g],
|
sce0->ics.swb_sizes[g],
|
||||||
sce0->sf_idx[(w+w2)*16+g],
|
sce0->sf_idx[(w+w2)*16+g],
|
||||||
sce0->band_type[(w+w2)*16+g],
|
sce0->band_type[(w+w2)*16+g],
|
||||||
lambda / band0->threshold, INFINITY, NULL);
|
lambda / band0->threshold, INFINITY, NULL);
|
||||||
dist1 += quantize_band_cost(s, sce1->coeffs + start + w2*128,
|
dist1 += quantize_band_cost(s, sce1->coeffs + start + (w+w2)*128,
|
||||||
R34,
|
R34,
|
||||||
sce1->ics.swb_sizes[g],
|
sce1->ics.swb_sizes[g],
|
||||||
sce1->sf_idx[(w+w2)*16+g],
|
sce1->sf_idx[(w+w2)*16+g],
|
||||||
|
|
Loading…
Reference in New Issue