void CBlock_ScaleSpectralData(CAacDecoderChannelInfo *pAacDecoderChannelInfo, SamplingRateInfo *pSamplingRateInfo) { int band; int window; const SHORT * RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale; SHORT * RESTRICT pSpecScale = pAacDecoderChannelInfo->specScale; int groupwin,group; const SHORT * RESTRICT BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); SPECTRAL_PTR RESTRICT pSpectralCoefficient = pAacDecoderChannelInfo->pSpectralCoefficient; FDKmemclear(pSpecScale, 8*sizeof(SHORT)); int max_band = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); for (window=0, group=0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { for (groupwin=0; groupwin < GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); groupwin++, window++) { int SpecScale_window = pSpecScale[window]; FIXP_DBL *pSpectrum = SPEC(pSpectralCoefficient, window, pAacDecoderChannelInfo->granuleLength); /* find scaling for current window */ for (band=0; band < max_band; band++) { SpecScale_window = fMax(SpecScale_window, (int)pSfbScale[window*16+band]); } if (pAacDecoderChannelInfo->pDynData->TnsData.Active) { SpecScale_window += TNS_SCALE; } /* store scaling of current window */ pSpecScale[window] = SpecScale_window; #ifdef FUNCTION_CBlock_ScaleSpectralData_func1 CBlock_ScaleSpectralData_func1(pSpectrum, max_band, BandOffsets, SpecScale_window, pSfbScale, window); #else /* FUNCTION_CBlock_ScaleSpectralData_func1 */ for (band=0; band < max_band; band++) { int scale = SpecScale_window - pSfbScale[window*16+band]; if (scale) { /* following relation can be used for optimizations: (BandOffsets[i]%4) == 0 for all i */ int max_index = BandOffsets[band+1]; for (int index = BandOffsets[band]; index < max_index; index++) { pSpectrum[index] >>= scale; } } } #endif /* FUNCTION_CBlock_ScaleSpectralData_func1 */ } } }
/*! \brief Decode channel pair element The function decodes a channel pair element. \return none */ void CChannelElement_Decode( CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], /*!< pointer to aac decoder channel info */ CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2], SamplingRateInfo *pSamplingRateInfo, UINT flags, int el_channels) { int ch, maybe_jstereo = 0; maybe_jstereo = (el_channels > 1); for (ch = 0; ch < el_channels; ch++) { if ( pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_IMDCT || pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_ELDFB ) { CBlock_InverseQuantizeSpectralData(pAacDecoderChannelInfo[ch], pSamplingRateInfo); } } if (maybe_jstereo) { /* apply ms */ if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) { int maxSfBandsL = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo); int maxSfBandsR = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[R]->icsInfo); if (pAacDecoderChannelInfo[L]->data.aac.PnsData.PnsActive || pAacDecoderChannelInfo[R]->data.aac.PnsData.PnsActive) { MapMidSideMaskToPnsCorrelation(pAacDecoderChannelInfo); } CJointStereo_ApplyMS(pAacDecoderChannelInfo, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo, pSamplingRateInfo), GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo), GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), maxSfBandsL, maxSfBandsR); } /* apply intensity stereo */ /* modifies pAacDecoderChannelInfo[]->aSpecSfb */ CJointStereo_ApplyIS(pAacDecoderChannelInfo, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo, pSamplingRateInfo), GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo), GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo), pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow ? 1 : 0); } for (ch = 0; ch < el_channels; ch++) { { /* write pAacDecoderChannelInfo[ch]->specScale */ CBlock_ScaleSpectralData(pAacDecoderChannelInfo[ch], pSamplingRateInfo); ApplyTools (pAacDecoderChannelInfo, pSamplingRateInfo, flags, ch); } } CRvlc_ElementCheck( pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, flags, el_channels ); }
AAC_DECODER_ERROR CBlock_ReadSectionData(HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, const UINT flags) { int top, band; int sect_len, sect_len_incr; int group; UCHAR sect_cb; UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* HCR input (long) */ SHORT *pNumLinesInSec = pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr; int numLinesInSecIdx = 0; UCHAR *pHcrCodeBook = pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr; const SHORT *BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection = 0; AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; FDKmemclear(pCodeBook, sizeof(UCHAR)*(8*16)); const int nbits = (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) == 1) ? 5 : 3; int sect_esc_val = (1 << nbits) - 1 ; UCHAR ScaleFactorBandsTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); for (group=0; group<GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { for (band=0; band < ScaleFactorBandsTransmitted; ) { sect_len = 0; if ( flags & AC_ER_VCB11 ) { sect_cb = (UCHAR) FDKreadBits(bs,5); } else sect_cb = (UCHAR) FDKreadBits(bs,4); if ( ((flags & AC_ER_VCB11) == 0) || ( sect_cb < 11 ) || ((sect_cb > 11) && (sect_cb < 16)) ) { sect_len_incr = FDKreadBits(bs, nbits); while (sect_len_incr == sect_esc_val) { sect_len += sect_esc_val; sect_len_incr = FDKreadBits(bs, nbits); } } else { sect_len_incr = 1; } sect_len += sect_len_incr; top = band + sect_len; if (flags & AC_ER_HCR) { /* HCR input (long) -- collecting sideinfo (for HCR-_long_ only) */ if (numLinesInSecIdx >= MAX_SFB_HCR) { return AAC_DEC_PARSE_ERROR; } pNumLinesInSec[numLinesInSecIdx] = BandOffsets[top] - BandOffsets[band]; numLinesInSecIdx++; if (sect_cb == BOOKSCL) { return AAC_DEC_INVALID_CODE_BOOK; } else { *pHcrCodeBook++ = sect_cb; } pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection++; } /* Check spectral line limits */ if (IsLongBlock( &(pAacDecoderChannelInfo->icsInfo) )) { if (top > 64) { return AAC_DEC_DECODE_FRAME_ERROR; } } else { /* short block */ if (top + group*16 > (8 * 16)) { return AAC_DEC_DECODE_FRAME_ERROR; } } /* Check if decoded codebook index is feasible */ if ( (sect_cb == BOOKSCL) || ( (sect_cb == INTENSITY_HCB || sect_cb == INTENSITY_HCB2) && pAacDecoderChannelInfo->pDynData->RawDataInfo.CommonWindow == 0) ) { return AAC_DEC_INVALID_CODE_BOOK; } /* Store codebook index */ for (; band < top; band++) { pCodeBook[group*16+band] = sect_cb; } } } return ErrorStatus; }
/*! \brief Decode channel pair element The function decodes a channel pair element. \return none */ void CChannelElement_Decode( CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], /*!< pointer to aac decoder channel info */ CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2], SamplingRateInfo *pSamplingRateInfo, UINT flags, UINT elFlags, int el_channels) { int ch = 0; int maxSfBandsL = 0, maxSfBandsR = 0; int maybe_jstereo = (el_channels > 1); if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA) && el_channels == 2) { if (pAacDecoderChannelInfo[L]->data.usac.core_mode || pAacDecoderChannelInfo[R]->data.usac.core_mode) { maybe_jstereo = 0; } } if (maybe_jstereo) { maxSfBandsL = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo); maxSfBandsR = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[R]->icsInfo); /* apply ms */ if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) { if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) { if (pAacDecoderChannelInfo[L]->data.aac.PnsData.PnsActive || pAacDecoderChannelInfo[R]->data.aac.PnsData.PnsActive) { MapMidSideMaskToPnsCorrelation(pAacDecoderChannelInfo); } } /* if tns_on_lr == 1 run MS */ /* && (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_active == 1) */ if (((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr == 1)) || ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) == 0)) { int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste); CJointStereo_ApplyMS( pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, pAacDecoderChannelInfo[L]->pSpectralCoefficient, pAacDecoderChannelInfo[R]->pSpectralCoefficient, pAacDecoderChannelInfo[L]->pDynData->aSfbScale, pAacDecoderChannelInfo[R]->pDynData->aSfbScale, pAacDecoderChannelInfo[L]->specScale, pAacDecoderChannelInfo[R]->specScale, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo, pSamplingRateInfo), GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo), GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), max_sfb_ste, maxSfBandsL, maxSfBandsR, pAacDecoderChannelInfo[L] ->pComData->jointStereoData.store_dmx_re_prev, &(pAacDecoderChannelInfo[L] ->pComData->jointStereoData.store_dmx_re_prev_e), 1); } /* if ( ((elFlags & AC_EL_USAC_CP_POSSIBLE).... */ } /* if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow)*/ /* apply intensity stereo */ /* modifies pAacDecoderChannelInfo[]->aSpecSfb */ if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) { if ((pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow == 1) && (el_channels == 2)) { CJointStereo_ApplyIS( pAacDecoderChannelInfo, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo, pSamplingRateInfo), GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo), GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), GetScaleFactorBandsTransmitted( &pAacDecoderChannelInfo[L]->icsInfo)); } } } /* maybe_stereo */ for (ch = 0; ch < el_channels; ch++) { if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_LPD) { /* Decode LPD data */ CLpdChannelStream_Decode(pAacDecoderChannelInfo[ch], pAacDecoderStaticChannelInfo[ch], flags); } else { UCHAR noSfbs = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[ch]->icsInfo); /* For USAC common window: max_sfb of both channels may differ * (common_max_sfb == 0). */ if ((maybe_jstereo == 1) && (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow == 1)) { noSfbs = fMax(maxSfBandsL, maxSfBandsR); } int CP_active = 0; if (elFlags & AC_EL_USAC_CP_POSSIBLE) { CP_active = pAacDecoderChannelInfo[ch] ->pComData->jointStereoData.cplx_pred_flag; } /* Omit writing of pAacDecoderChannelInfo[ch]->specScale for complex stereo prediction since scaling has already been carried out. */ int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste); if ((!CP_active) || (CP_active && (max_sfb_ste < noSfbs)) || ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr == 0))) { CBlock_ScaleSpectralData(pAacDecoderChannelInfo[ch], noSfbs, pSamplingRateInfo); /*Active for the case of TNS applied before MS/CP*/ if ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr == 0)) { if (IsLongBlock(&pAacDecoderChannelInfo[ch]->icsInfo)) { for (int i = 0; i < noSfbs; i++) { pAacDecoderChannelInfo[ch]->pDynData->aSfbScale[i] = pAacDecoderChannelInfo[ch]->specScale[0]; } } else { for (int i = 0; i < 8; i++) { for (int j = 0; j < noSfbs; j++) { pAacDecoderChannelInfo[ch]->pDynData->aSfbScale[i * 16 + j] = pAacDecoderChannelInfo[ch]->specScale[i]; } } } } } } } /* End "for (ch = 0; ch < el_channels; ch++)" */ if (maybe_jstereo) { /* apply ms */ if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) { } /* CommonWindow */ else { if (elFlags & AC_EL_USAC_CP_POSSIBLE) { FDKmemclear( pAacDecoderStaticChannelInfo[L] ->pCpeStaticData->jointStereoPersistentData.alpha_q_re_prev, JointStereoMaximumGroups * JointStereoMaximumBands * sizeof(SHORT)); FDKmemclear( pAacDecoderStaticChannelInfo[L] ->pCpeStaticData->jointStereoPersistentData.alpha_q_im_prev, JointStereoMaximumGroups * JointStereoMaximumBands * sizeof(SHORT)); } } } /* if (maybe_jstereo) */ for (ch = 0; ch < el_channels; ch++) { if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_LPD) { } else { if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) { /* Use same seed for coupled channels (CPE) */ int pnsCh = (ch > 0) ? L : ch; CPns_UpdateNoiseState( &pAacDecoderChannelInfo[ch]->data.aac.PnsData, pAacDecoderChannelInfo[pnsCh]->data.aac.PnsData.currentSeed, pAacDecoderChannelInfo[ch]->pComData->pnsRandomSeed); } if ((!(flags & (AC_USAC))) || ((flags & (AC_USAC)) && (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_active == 1)) || (maybe_jstereo == 0)) { ApplyTools( pAacDecoderChannelInfo, pSamplingRateInfo, flags, elFlags, ch, pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow); } } /* End "} else" */ } /* End "for (ch = 0; ch < el_channels; ch++)" */ if (maybe_jstereo) { /* apply ms */ if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) { /* if tns_on_lr == 0 run MS */ if ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr == 0)) { int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste); CJointStereo_ApplyMS( pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, pAacDecoderChannelInfo[L]->pSpectralCoefficient, pAacDecoderChannelInfo[R]->pSpectralCoefficient, pAacDecoderChannelInfo[L]->pDynData->aSfbScale, pAacDecoderChannelInfo[R]->pDynData->aSfbScale, pAacDecoderChannelInfo[L]->specScale, pAacDecoderChannelInfo[R]->specScale, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo, pSamplingRateInfo), GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo), GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), max_sfb_ste, maxSfBandsL, maxSfBandsR, pAacDecoderChannelInfo[L] ->pComData->jointStereoData.store_dmx_re_prev, &(pAacDecoderChannelInfo[L] ->pComData->jointStereoData.store_dmx_re_prev_e), 1); } } /* if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) */ } /* if (maybe_jstereo) */ for (ch = 0; ch < el_channels; ch++) { if (elFlags & AC_EL_USAC_CP_POSSIBLE) { pAacDecoderStaticChannelInfo[L] ->pCpeStaticData->jointStereoPersistentData.clearSpectralCoeffs = 0; } } CRvlc_ElementCheck(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, flags, el_channels); }
int CShortBlock_ReadSpectralData(HANDLE_BIT_BUF bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo) { int i,index,step; int window,group,groupwin,groupoffset,band; int scfExp,scfMod; int *QuantizedCoef; char *pCodeBook = pAacDecoderChannelInfo->pCodeBook; short *pScaleFactor = pAacDecoderChannelInfo->pScaleFactor; float *pSpectralCoefficient = pAacDecoderChannelInfo->pSpectralCoefficient; const short *BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->IcsInfo); const CodeBookDescription *hcb; COUNT_sub_start("CShortBlock_ReadSpectralData"); QuantizedCoef = (int*)pSpectralCoefficient; PTR_INIT(5); INDIRECT(4); FUNC(1); /* counting previous operations */ LOOP(1); for (window=0; window < MaximumWindows; window++) { PTR_INIT(1); /* pointer for QuantizedCoef[] */ LOOP(1); for (index=0; index < MaximumBinsShort; index++) { MOVE(1); QuantizedCoef[window*MaximumBinsShort+index] = 0; } } MOVE(1); groupoffset = 0; INDIRECT(1); FUNC(1); LOOP(1); for (group=0; group < GetWindowGroups(&pAacDecoderChannelInfo->IcsInfo); group++) { PTR_INIT(1); /* pointer for pCodeBook[] */ INDIRECT(1); FUNC(1); LOOP(1); for (band=0; band < GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->IcsInfo); band++) { PTR_INIT(1); hcb = &HuffmanCodeBooks[pCodeBook[group*MaximumScaleFactorBandsShort+band]]; INDIRECT(1); FUNC(1); LOOP(1); for (groupwin=0; groupwin < GetWindowGroupLength(&pAacDecoderChannelInfo->IcsInfo,group); groupwin++) { ADD(1); window = groupoffset + groupwin; ADD(4); LOGIC(3); BRANCH(1); if ( (pCodeBook[group*MaximumScaleFactorBandsShort+band] == ZERO_HCB) ||(pCodeBook[group*MaximumScaleFactorBandsShort+band] == INTENSITY_HCB) ||(pCodeBook[group*MaximumScaleFactorBandsShort+band] == INTENSITY_HCB2) ||(pCodeBook[group*MaximumScaleFactorBandsShort+band] == NOISE_HCB)) continue; MOVE(1); step = 0 ; PTR_INIT(2); /* pointer for BandOffsets[], QuantizedCoef[] */ LOOP(1); for (index=BandOffsets[band]; index < BandOffsets[band+1]; index+=step) { INDIRECT(1); FUNC(2); PTR_INIT(1); FUNC(3); step = CBlock_UnpackIndex(CBlock_DecodeHuffmanWord(bs,hcb->CodeBook),&QuantizedCoef[window*MaximumBinsShort+index],hcb); INDIRECT(1); BRANCH(1); if (hcb->Offset == 0) { PTR_INIT(1); /* pointer for QuantizedCoef[] */ LOOP(1); for (i=0; i < step; i++) { BRANCH(1); if (QuantizedCoef[window*MaximumBinsShort+index+i]) { FUNC(2); if (GetBits(bs,1)) /* sign bit */ { MULT(1); STORE(1); QuantizedCoef [window*MaximumBinsShort+index+i] = -QuantizedCoef [window*MaximumBinsShort+index+i]; } } } } ADD(1); BRANCH(1); if (pCodeBook[group*MaximumScaleFactorBandsShort+band] == ESCBOOK) { FUNC(2); STORE(1); QuantizedCoef[window*MaximumBinsShort+index] = CBlock_GetEscape(bs,QuantizedCoef[window*MaximumBinsShort+index]); FUNC(2); STORE(1); QuantizedCoef[window*MaximumBinsShort+index+1] = CBlock_GetEscape(bs,QuantizedCoef[window*MaximumBinsShort+index+1]); FUNC(1); FUNC(1); ADD(2); LOGIC(1); BRANCH(1); if (abs(QuantizedCoef[window*MaximumBinsShort+index]) > MAX_QUANTIZED_VALUE || abs(QuantizedCoef[window*MaximumBinsShort+index+1]) > MAX_QUANTIZED_VALUE) { COUNT_sub_end(); return (AAC_DEC_DECODE_FRAME_ERROR); } } } } } INDIRECT(1); ADD(1); groupoffset += GetWindowGroupLength(&pAacDecoderChannelInfo->IcsInfo,group); } INDIRECT(1); FUNC(1); LOOP(1); for (window=0, group=0; group < GetWindowGroups(&pAacDecoderChannelInfo->IcsInfo); group++) { INDIRECT(1); FUNC(1); LOOP(1); for (groupwin=0; groupwin < GetWindowGroupLength(&pAacDecoderChannelInfo->IcsInfo,group); groupwin++, window++) { MOVE(1); index = 0; PTR_INIT(2); /* pointer for BandOffsets[], pScaleFactor */ INDIRECT(1); FUNC(1); LOOP(1) ; /* quantize & apply scalefactors */ for (band=0; band < GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->IcsInfo); band++) { /* scalefactor exponents and scalefactor mantissa for current band */ SHIFT(1); scfExp = pScaleFactor[group*MaximumScaleFactorBandsShort+band] >> 2; LOGIC(1); scfMod = pScaleFactor[group*MaximumScaleFactorBandsShort+band] & 3; PTR_INIT(2); /* pointer for QuantizedCoef[], pSpectralCoefficient */ LOOP(1); for (index=BandOffsets[band]; index < BandOffsets[band+1] ;index++) { ADD(1); FUNC(3); STORE(1); pSpectralCoefficient[window*MaximumBinsShort+index] = CBlock_Quantize(QuantizedCoef[window*MaximumBinsShort+index],scfMod,scfExp-6); } } PTR_INIT(1); /* pointer for pSpectralCoefficient */ LOOP(1); for (; index < MaximumBinsShort; index++) { MOVE(1); pSpectralCoefficient[window*MaximumBinsShort+index] = 0.0; } } } COUNT_sub_end(); return (AAC_DEC_OK); }