fix for pred_dir=1

This commit is contained in:
Christian R. Helmrich
2020-04-21 00:00:53 +02:00
parent 3f9151cca2
commit ac1baf4923

View File

@@ -307,8 +307,8 @@ unsigned StereoProcessor::applyPredJointStereo (int32_t* const mdctSpectrum1, in
} }
else b = UCHAR_MAX; // previous correlation data unavailable, assume maximum value else b = UCHAR_MAX; // previous correlation data unavailable, assume maximum value
if ((b > SCHAR_MAX) && (sfbEv < __max (grp.sfbsPerGroup, groupingData2.sfbsPerGroup)) && if ((b > SCHAR_MAX && sfbStereoData[sfbEv + numSwbFrame * gr] != 16) || // signi-
(sfbStereoData[sfbEv + numSwbFrame * gr] != 16)) (2 <= abs ( (int) sfbStereoData[sfbEv + numSwbFrame * gr] - 16))) // ficant?
{ {
nonZeroPredCoef = true; nonZeroPredCoef = true;
} }
@@ -349,7 +349,8 @@ unsigned StereoProcessor::applyPredJointStereo (int32_t* const mdctSpectrum1, in
const uint64_t bandSumM = (applyPredSte ? (uint64_t) rmsSfbM[0] + (uint64_t) rmsSfbM[1] : bandSum1) >> 1; const uint64_t bandSumM = (applyPredSte ? (uint64_t) rmsSfbM[0] + (uint64_t) rmsSfbM[1] : bandSum1) >> 1;
const uint64_t bandSumS = (applyPredSte ? (uint64_t) rmsSfbS[0] + (uint64_t) rmsSfbS[1] : bandSum2) >> 1; const uint64_t bandSumS = (applyPredSte ? (uint64_t) rmsSfbS[0] + (uint64_t) rmsSfbS[1] : bandSum2) >> 1;
if (__min (bandSumM, bandSumS) * __max (bandSumL, bandSumR) >= __min (bandSumL, bandSumR) * __max (bandSumM, bandSumS)) if ((__min (bandSumM, bandSumS) * __max (bandSumL, bandSumR) >= __min (bandSumL, bandSumR) * __max (bandSumM, bandSumS)) ||
(nonZeroPredCoef && (abs ( (int) sfbStereoData[sfbEv + numSwbFrame * gr] - 16) >= 10)))
{ {
const uint16_t sfbOffEv = grpOff[sfbEv]; const uint16_t sfbOffEv = grpOff[sfbEv];
const uint16_t cpyWidth = (grpOff[sfb + 1] - sfbOffEv) * sizeof (int32_t); const uint16_t cpyWidth = (grpOff[sfb + 1] - sfbOffEv) * sizeof (int32_t);
@@ -367,7 +368,7 @@ unsigned StereoProcessor::applyPredJointStereo (int32_t* const mdctSpectrum1, in
grpRms2[idx] = rmsSfbR[b]; grpRms2[idx] = rmsSfbR[b];
if (applyPredSte) sfbStereoData[idx + numSwbFrame * gr] = 0; // zeroed ms_used if (applyPredSte) sfbStereoData[idx + numSwbFrame * gr] = 0; // zeroed ms_used
} }
continue; continue; // M/S is not used
} }
} }
#endif #endif
@@ -443,7 +444,6 @@ unsigned StereoProcessor::applyPredJointStereo (int32_t* const mdctSpectrum1, in
for (uint16_t sfb = 0; sfb < maxSfbSte; sfb++) for (uint16_t sfb = 0; sfb < maxSfbSte; sfb++)
{ {
const uint16_t sfbEv = sfb & 0xFFFE; // even SFB index const uint16_t sfbEv = sfb & 0xFFFE; // even SFB index
const uint16_t sfbStart = grpOff[sfb]; const uint16_t sfbStart = grpOff[sfb];
const uint16_t sfbWidth = grpOff[sfb + 1] - sfbStart; const uint16_t sfbWidth = grpOff[sfb + 1] - sfbStart;
const int64_t alphaRe = (grpSData[sfbEv] > 0 ? (int) grpSData[sfbEv] - 16 : 0) * SP_0_DOT_1_16BIT; const int64_t alphaRe = (grpSData[sfbEv] > 0 ? (int) grpSData[sfbEv] - 16 : 0) * SP_0_DOT_1_16BIT;
@@ -518,12 +518,15 @@ unsigned StereoProcessor::applyPredJointStereo (int32_t* const mdctSpectrum1, in
if (alterPredDir) // swap channel data when pred_dir = 1 if (alterPredDir) // swap channel data when pred_dir = 1
{ {
int32_t* sfbMdct1 = &mdctSpectrum1[grpOff[0]];
int32_t* sfbMdct2 = &mdctSpectrum2[grpOff[0]];
for (uint16_t sfb = 0; sfb < maxSfbSte; sfb++) for (uint16_t sfb = 0; sfb < maxSfbSte; sfb++)
{ {
for (uint16_t s = grpOff[sfb + 1] - grpOff[sfb]; s > 0; s--) const uint16_t sfbStart = grpOff[sfb];
int32_t* sfbMdct1 = &mdctSpectrum1[sfbStart];
int32_t* sfbMdct2 = &mdctSpectrum2[sfbStart];
if (grpSData[sfb] == 0) continue; // M/S is not used
for (uint16_t s = grpOff[sfb + 1] - sfbStart; s > 0; s--)
{ {
const int32_t i = *sfbMdct1; const int32_t i = *sfbMdct1;
*(sfbMdct1++) = *sfbMdct2; *(sfbMdct1++) = *sfbMdct2;