/*! \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 ); }
/*! \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); }