123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
-
- #include "coder.h"
- #include "assembly.h"
- static void StereoProcessGroup(int *coefL, int *coefR, const int *sfbTab,
- int msMaskPres, unsigned char *msMaskPtr, int msMaskOffset, int maxSFB,
- unsigned char *cbRight, short *sfRight, int *gbCurrent)
- {
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wnarrowing"
- static const int pow14[2][4] PROGMEM = {
- { 0xc0000000, 0xb3e407d7, 0xa57d8666, 0x945d819b },
- { 0x40000000, 0x4c1bf829, 0x5a82799a, 0x6ba27e65 }
- };
- #pragma GCC diagnostic pop
- int sfb, width, cbIdx, sf, cl, cr, scalef, scalei;
- int gbMaskL, gbMaskR;
- unsigned char msMask;
- msMask = (*msMaskPtr++) >> msMaskOffset;
- gbMaskL = 0;
- gbMaskR = 0;
- for (sfb = 0; sfb < maxSFB; sfb++) {
- width = sfbTab[sfb+1] - sfbTab[sfb];
- cbIdx = cbRight[sfb];
- if (cbIdx == 14 || cbIdx == 15) {
-
- if (msMaskPres == 1 && (msMask & 0x01))
- cbIdx ^= 0x01;
- sf = -sfRight[sfb];
- cbIdx &= 0x01;
- scalef = pow14[cbIdx][sf & 0x03];
- scalei = (sf >> 2) + 2;
-
- if (scalei > 0) {
- if (scalei > 30)
- scalei = 30;
- do {
- cr = MULSHIFT32(*coefL++, scalef);
- CLIP_2N(cr, 31-scalei);
- cr <<= scalei;
- gbMaskR |= FASTABS(cr);
- *coefR++ = cr;
- } while (--width);
- } else {
- scalei = -scalei;
- if (scalei > 31)
- scalei = 31;
- do {
- cr = MULSHIFT32(*coefL++, scalef) >> scalei;
- gbMaskR |= FASTABS(cr);
- *coefR++ = cr;
- } while (--width);
- }
- } else if ( cbIdx != 13 && ((msMaskPres == 1 && (msMask & 0x01)) || msMaskPres == 2) ) {
-
- do {
- cl = *coefL;
- cr = *coefR;
- if ( (FASTABS(cl) | FASTABS(cr)) >> 30 ) {
-
- cl >>= 1;
- sf = cl + (cr >> 1); CLIP_2N(sf, 30); sf <<= 1;
- cl = cl - (cr >> 1); CLIP_2N(cl, 30); cl <<= 1;
- } else {
-
- sf = cl + cr;
- cl -= cr;
- }
- *coefL++ = sf;
- gbMaskL |= FASTABS(sf);
- *coefR++ = cl;
- gbMaskR |= FASTABS(cl);
- } while (--width);
- } else {
-
- coefL += width;
- coefR += width;
- }
-
- msMask >>= 1;
- if (++msMaskOffset == 8) {
- msMask = *msMaskPtr++;
- msMaskOffset = 0;
- }
- }
- cl = CLZ(gbMaskL) - 1;
- if (gbCurrent[0] > cl)
- gbCurrent[0] = cl;
- cr = CLZ(gbMaskR) - 1;
- if (gbCurrent[1] > cr)
- gbCurrent[1] = cr;
- return;
- }
- int StereoProcess(AACDecInfo *aacDecInfo)
- {
- PSInfoBase *psi;
- ICSInfo *icsInfo;
- int gp, win, nSamps, msMaskOffset;
- int *coefL, *coefR;
- unsigned char *msMaskPtr;
- const int *sfbTab;
-
- if (!aacDecInfo || !aacDecInfo->psInfoBase)
- return -1;
- psi = (PSInfoBase *)(aacDecInfo->psInfoBase);
-
- if (psi->commonWin != 1 || aacDecInfo->currBlockID != AAC_ID_CPE)
- return 0;
-
- if (!psi->msMaskPresent && !psi->intensityUsed[1])
- return 0;
- icsInfo = &(psi->icsInfo[0]);
- if (icsInfo->winSequence == 2) {
- sfbTab = sfBandTabShort + sfBandTabShortOffset[psi->sampRateIdx];
- nSamps = NSAMPS_SHORT;
- } else {
- sfbTab = sfBandTabLong + sfBandTabLongOffset[psi->sampRateIdx];
- nSamps = NSAMPS_LONG;
- }
- coefL = psi->coef[0];
- coefR = psi->coef[1];
-
- msMaskOffset = 0;
- msMaskPtr = psi->msMaskBits;
- for (gp = 0; gp < icsInfo->numWinGroup; gp++) {
- for (win = 0; win < icsInfo->winGroupLen[gp]; win++) {
- StereoProcessGroup(coefL, coefR, sfbTab, psi->msMaskPresent,
- msMaskPtr, msMaskOffset, icsInfo->maxSFB, psi->sfbCodeBook[1] + gp*icsInfo->maxSFB,
- psi->scaleFactors[1] + gp*icsInfo->maxSFB, psi->gbCurrent);
- coefL += nSamps;
- coefR += nSamps;
- }
-
- msMaskPtr += (msMaskOffset + icsInfo->maxSFB) >> 3;
- msMaskOffset = (msMaskOffset + icsInfo->maxSFB) & 0x07;
- }
- ASSERT(coefL == psi->coef[0] + 1024);
- ASSERT(coefR == psi->coef[1] + 1024);
- return 0;
- }
|