diff options
Diffstat (limited to 'libSBRdec/src/env_extr.cpp')
-rw-r--r-- | libSBRdec/src/env_extr.cpp | 1395 |
1 files changed, 0 insertions, 1395 deletions
diff --git a/libSBRdec/src/env_extr.cpp b/libSBRdec/src/env_extr.cpp deleted file mode 100644 index 6cb0b99..0000000 --- a/libSBRdec/src/env_extr.cpp +++ /dev/null @@ -1,1395 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. - All rights reserved. - - 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements -the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. -This FDK AAC Codec software is intended to be used on a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual -audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by -independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part -of the MPEG specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) -may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners -individually for the purpose of encoding or decoding bit streams in products that are compliant with -the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license -these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec -software may already be covered under those patent licenses when it is used for those licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, -are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional -applications information and documentation. - -2. COPYRIGHT LICENSE - -Redistribution and use in source and binary forms, with or without modification, are permitted without -payment of copyright license fees provided that you satisfy the following conditions: - -You must retain the complete text of this software license in redistributions of the FDK AAC Codec or -your modifications thereto in source code form. - -You must retain the complete text of this software license in the documentation and/or other materials -provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. -You must make available free of charge copies of the complete source code of the FDK AAC Codec and your -modifications thereto to recipients of copies in binary form. - -The name of Fraunhofer may not be used to endorse or promote products derived from this library without -prior written permission. - -You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec -software or your modifications thereto. - -Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software -and the date of any change. For modified versions of the FDK AAC Codec, the term -"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term -"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." - -3. NO PATENT LICENSE - -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, -ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with -respect to this software. - -You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized -by appropriate patent licenses. - -4. DISCLAIMER - -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors -"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties -of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, -including but not limited to procurement of substitute goods or services; loss of use, data, or profits, -or business interruption, however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence), arising in any way out of the use of this software, even if -advised of the possibility of such damage. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ - -/*! - \file - \brief Envelope extraction - The functions provided by this module are mostly called by applySBR(). After it is - determined that there is valid SBR data, sbrGetHeaderData() might be called if the current - SBR data contains an \ref SBR_HEADER_ELEMENT as opposed to a \ref SBR_STANDARD_ELEMENT. This function - may return various error codes as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET when decoder - settings need to be recalculated according to the SBR specifications. In that case applySBR() - will initiatite the required re-configuration. - - The header data is stored in a #SBR_HEADER_DATA structure. - - The actual SBR data for the current frame is decoded into SBR_FRAME_DATA stuctures by sbrGetChannelPairElement() - [for stereo streams] and sbrGetSingleChannelElement() [for mono streams]. There is no fractional arithmetic involved. - - Once the information is extracted, the data needs to be further prepared before the actual decoding process. - This is done in decodeSbrData(). - - \sa Description of buffer management in applySBR(). \ref documentationOverview - - <h1>About the SBR data format:</h1> - - Each frame includes SBR data (side chain information), and can be either the \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. - Parts of the data can be protected by a CRC checksum. - - \anchor SBR_HEADER_ELEMENT <h2>The SBR_HEADER_ELEMENT</h2> - - The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it typically is send every second or so. It contains fundamental - information such as SBR sampling frequency and frequency range as well as control signals that do not require frequent changes. It also - includes the \ref SBR_STANDARD_ELEMENT. - - Depending on the changes between the information in a current SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might need - to be reset and reconfigured (e.g. new tables need to be calculated). - - \anchor SBR_STANDARD_ELEMENT <h2>The SBR_STANDARD_ELEMENT</h2> - - This data can be subdivided into "side info" and "raw data", where side info is defined as signals needed to decode the raw data - and some decoder tuning signals. Raw data is referred to as PCM and Huffman coded envelope and noise floor estimates. The side info also - includes information about the time-frequency grid for the current frame. - - \sa \ref documentationOverview -*/ - -#include "env_extr.h" - -#include "sbr_ram.h" -#include "sbr_rom.h" -#include "huff_dec.h" - - -#include "psbitdec.h" - -#define DRM_PARAMETRIC_STEREO 0 -#define EXTENSION_ID_PS_CODING 2 - - -static int extractFrameInfo (HANDLE_FDK_BITSTREAM hBs, - HANDLE_SBR_HEADER_DATA hHeaderData, - HANDLE_SBR_FRAME_DATA h_frame_data, - const UINT nrOfChannels, - const UINT flags - ); - - -static int sbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, - HANDLE_SBR_FRAME_DATA h_frame_data, - HANDLE_FDK_BITSTREAM hBs, - const UINT flags); - -static void sbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA hFrameData, - HANDLE_FDK_BITSTREAM hBs); - -static void sbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData, - HANDLE_SBR_FRAME_DATA h_frame_data, - HANDLE_FDK_BITSTREAM hBs); - -static int checkFrameInfo (FRAME_INFO *pFrameInfo, int numberOfTimeSlots, int overlap, int timeStep); - -SBR_ERROR -initHeaderData ( - HANDLE_SBR_HEADER_DATA hHeaderData, - const int sampleRateIn, - const int sampleRateOut, - const int samplesPerFrame, - const UINT flags - ) -{ - HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; - SBR_ERROR sbrError = SBRDEC_OK; - int numAnalysisBands; - - if ( sampleRateIn == sampleRateOut ) { - hHeaderData->sbrProcSmplRate = sampleRateOut<<1; - numAnalysisBands = 32; - } else { - hHeaderData->sbrProcSmplRate = sampleRateOut; - if ( (sampleRateOut>>1) == sampleRateIn) { - /* 1:2 */ - numAnalysisBands = 32; - } else if ( (sampleRateOut>>2) == sampleRateIn ) { - /* 1:4 */ - numAnalysisBands = 32; - } else if ( (sampleRateOut*3)>>3 == (sampleRateIn*8)>>3 ) { - /* 3:8, 3/4 core frame length */ - numAnalysisBands = 24; - } else { - sbrError = SBRDEC_UNSUPPORTED_CONFIG; - goto bail; - } - } - - /* Fill in default values first */ - hHeaderData->syncState = SBR_NOT_INITIALIZED; - hHeaderData->status = 0; - hHeaderData->frameErrorFlag = 0; - - hHeaderData->bs_info.ampResolution = 1; - hHeaderData->bs_info.xover_band = 0; - hHeaderData->bs_info.sbr_preprocessing = 0; - - hHeaderData->bs_data.startFreq = 5; - hHeaderData->bs_data.stopFreq = 0; - hHeaderData->bs_data.freqScale = 2; - hHeaderData->bs_data.alterScale = 1; - hHeaderData->bs_data.noise_bands = 2; - hHeaderData->bs_data.limiterBands = 2; - hHeaderData->bs_data.limiterGains = 2; - hHeaderData->bs_data.interpolFreq = 1; - hHeaderData->bs_data.smoothingLength = 1; - - hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2; - - /* Setup pointers to frequency band tables */ - hFreq->freqBandTable[0] = hFreq->freqBandTableLo; - hFreq->freqBandTable[1] = hFreq->freqBandTableHi; - - /* Patch some entries */ - if (sampleRateOut > 24000) { /* Trigger an error if SBR is going to be processed without */ - hHeaderData->bs_data.startFreq = 7; /* having read these frequency values from bit stream before. */ - hHeaderData->bs_data.stopFreq = 3; - } - - /* One SBR timeslot corresponds to the amount of samples equal to the amount of analysis bands, divided by the timestep. */ - hHeaderData->numberTimeSlots = (samplesPerFrame/numAnalysisBands) >> (hHeaderData->timeStep - 1); - if (hHeaderData->numberTimeSlots > (16)) { - sbrError = SBRDEC_UNSUPPORTED_CONFIG; - } - - hHeaderData->numberOfAnalysisBands = numAnalysisBands; - -bail: - return sbrError; -} - - -/*! - \brief Initialize the SBR_PREV_FRAME_DATA struct -*/ -void -initSbrPrevFrameData (HANDLE_SBR_PREV_FRAME_DATA h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */ - int timeSlots) /*!< Framelength in SBR-timeslots */ -{ - int i; - - /* Set previous energy and noise levels to 0 for the case - that decoding starts in the middle of a bitstream */ - for (i=0; i < MAX_FREQ_COEFFS; i++) - h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0; - for (i=0; i < MAX_NOISE_COEFFS; i++) - h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0; - for (i=0; i < MAX_INVF_BANDS; i++) - h_prev_data->sbr_invf_mode[i] = INVF_OFF; - - h_prev_data->stopPos = timeSlots; - h_prev_data->coupling = COUPLING_OFF; - h_prev_data->ampRes = 0; -} - - -/*! - \brief Read header data from bitstream - - \return error status - 0 if ok -*/ -SBR_HEADER_STATUS -sbrGetHeaderData (HANDLE_SBR_HEADER_DATA hHeaderData, - HANDLE_FDK_BITSTREAM hBs, - const UINT flags, - const int fIsSbrData) -{ - SBR_HEADER_DATA_BS *pBsData; - SBR_HEADER_DATA_BS lastHeader; - SBR_HEADER_DATA_BS_INFO lastInfo; - int headerExtra1=0, headerExtra2=0; - - /* Copy SBR bit stream header to temporary header */ - lastHeader = hHeaderData->bs_data; - lastInfo = hHeaderData->bs_info; - - /* Read new header from bitstream */ - { - pBsData = &hHeaderData->bs_data; - } - - { - hHeaderData->bs_info.ampResolution = FDKreadBits (hBs, 1); - } - - pBsData->startFreq = FDKreadBits (hBs, 4); - pBsData->stopFreq = FDKreadBits (hBs, 4); - - { - hHeaderData->bs_info.xover_band = FDKreadBits (hBs, 3); - FDKreadBits (hBs, 2); - } - - headerExtra1 = FDKreadBits (hBs, 1); - headerExtra2 = FDKreadBits (hBs, 1); - - /* Handle extra header information */ - if( headerExtra1) - { - pBsData->freqScale = FDKreadBits (hBs, 2); - pBsData->alterScale = FDKreadBits (hBs, 1); - pBsData->noise_bands = FDKreadBits (hBs, 2); - } - else { - pBsData->freqScale = 2; - pBsData->alterScale = 1; - pBsData->noise_bands = 2; - } - - if (headerExtra2) { - pBsData->limiterBands = FDKreadBits (hBs, 2); - pBsData->limiterGains = FDKreadBits (hBs, 2); - pBsData->interpolFreq = FDKreadBits (hBs, 1); - pBsData->smoothingLength = FDKreadBits (hBs, 1); - } - else { - pBsData->limiterBands = 2; - pBsData->limiterGains = 2; - pBsData->interpolFreq = 1; - pBsData->smoothingLength = 1; - } - - /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */ - if(hHeaderData->syncState != SBR_ACTIVE || - lastHeader.startFreq != pBsData->startFreq || - lastHeader.stopFreq != pBsData->stopFreq || - lastHeader.freqScale != pBsData->freqScale || - lastHeader.alterScale != pBsData->alterScale || - lastHeader.noise_bands != pBsData->noise_bands || - lastInfo.xover_band != hHeaderData->bs_info.xover_band) { - return HEADER_RESET; /* New settings */ - } - - return HEADER_OK; -} - -/*! - \brief Get missing harmonics parameters (only used for AAC+SBR) - - \return error status - 0 if ok -*/ -int -sbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData, - HANDLE_SBR_FRAME_DATA hFrameData, - HANDLE_FDK_BITSTREAM hBs) -{ - int i, bitsRead = 0; - - int flag = FDKreadBits(hBs,1); - bitsRead++; - - if(flag){ - for(i=0;i<hHeaderData->freqBandData.nSfb[1];i++){ - hFrameData->addHarmonics[i] = FDKreadBits (hBs, 1 ); - bitsRead++; - } - } - else { - for(i=0; i<MAX_FREQ_COEFFS; i++) - hFrameData->addHarmonics[i] = 0; - } - return(bitsRead); -} - -/*! - \brief Reads extension data from the bitstream - - The bitstream format allows up to 4 kinds of extended data element. - Extended data may contain several elements, each identified by a 2-bit-ID. - So far, no extended data elements are defined hence the first 2 parameters - are unused. The data should be skipped in order to update the number - of read bits for the consistency check in applySBR(). -*/ -static int extractExtendedData( - HANDLE_SBR_HEADER_DATA hHeaderData, /*!< handle to SBR header */ - HANDLE_FDK_BITSTREAM hBs /*!< Handle to the bit buffer */ - ,HANDLE_PS_DEC hParametricStereoDec /*!< Parametric Stereo Decoder */ - ) { - INT nBitsLeft; - int extended_data; - int i, frameOk = 1; - - - extended_data = FDKreadBits(hBs, 1); - - if (extended_data) { - int cnt; - int bPsRead = 0; - - cnt = FDKreadBits(hBs, 4); - if (cnt == (1<<4)-1) - cnt += FDKreadBits(hBs, 8); - - - nBitsLeft = 8 * cnt; - - /* sanity check for cnt */ - if (nBitsLeft > (INT)FDKgetValidBits(hBs)) { - /* limit nBitsLeft */ - nBitsLeft = (INT)FDKgetValidBits(hBs); - /* set frame error */ - frameOk = 0; - } - - while (nBitsLeft > 7) { - int extension_id = FDKreadBits(hBs, 2); - nBitsLeft -= 2; - - switch(extension_id) { - - - - case EXTENSION_ID_PS_CODING: - - /* Read PS data from bitstream */ - - if (hParametricStereoDec != NULL) { - if(bPsRead && !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot].mpeg.bPsHeaderValid) { - cnt = nBitsLeft >> 3; /* number of remaining bytes */ - for (i=0; i<cnt; i++) - FDKreadBits(hBs, 8); - nBitsLeft -= cnt * 8; - } else { - nBitsLeft -= ReadPsData(hParametricStereoDec, hBs, nBitsLeft); - bPsRead = 1; - } - } - - /* parametric stereo detected, could set channelMode accordingly here */ - /* */ - /* "The usage of this parametric stereo extension to HE-AAC is */ - /* signalled implicitly in the bitstream. Hence, if an sbr_extension() */ - /* with bs_extension_id==EXTENSION_ID_PS is found in the SBR part of */ - /* the bitstream, a decoder supporting the combination of SBR and PS */ - /* shall operate the PS tool to generate a stereo output signal." */ - /* source: ISO/IEC 14496-3:2001/FDAM 2:2004(E) */ - - break; - - - default: - cnt = nBitsLeft >> 3; /* number of remaining bytes */ - for (i=0; i<cnt; i++) - FDKreadBits(hBs, 8); - nBitsLeft -= cnt * 8; - break; - } - } - - if (nBitsLeft < 0) { - frameOk = 0; - goto bail; - } - else { - /* Read fill bits for byte alignment */ - FDKreadBits(hBs, nBitsLeft); - } - } - -bail: - return (frameOk); -} - - -/*! - \brief Read bitstream elements of one channel - - \return SbrFrameOK: 1=ok, 0=error -*/ -int -sbrGetSingleChannelElement (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ - HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ - HANDLE_FDK_BITSTREAM hBs, /*!< Handle to struct BIT_BUF */ - HANDLE_PS_DEC hParametricStereoDec, /*!< Handle to PS decoder */ - const UINT flags, - const int overlap - ) -{ - int i; - - - hFrameData->coupling = COUPLING_OFF; - - { - /* Reserved bits */ - if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ - FDKreadBits(hBs, 4); - if (flags & SBRDEC_SYNTAX_SCAL) { - FDKreadBits(hBs, 4); - } - } - } - - if (flags & SBRDEC_SYNTAX_SCAL) { - FDKreadBits (hBs, 1); /* bs_coupling */ - } - - /* - Grid control - */ - if ( !extractFrameInfo ( hBs, hHeaderData, hFrameData, 1, flags) ) - return 0; - - if ( !checkFrameInfo (&hFrameData->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) - return 0; - - - /* - Fetch domain vectors (time or frequency direction for delta-coding) - */ - sbrGetDirectionControlData (hFrameData, hBs); - - for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { - hFrameData->sbr_invf_mode[i] = - (INVF_MODE) FDKreadBits (hBs, 2); - } - - - - /* raw data */ - if ( !sbrGetEnvelope (hHeaderData, hFrameData, hBs, flags) ) - return 0; - - - sbrGetNoiseFloorData (hHeaderData, hFrameData, hBs); - - sbrGetSyntheticCodedData(hHeaderData, hFrameData, hBs); - - { - /* sbr extended data */ - if (! extractExtendedData( - hHeaderData, - hBs - ,hParametricStereoDec - )) { - return 0; - } - } - - return 1; -} - - - -/*! - \brief Read bitstream elements of a channel pair - \return SbrFrameOK -*/ -int -sbrGetChannelPairElement (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ - HANDLE_SBR_FRAME_DATA hFrameDataLeft, /*!< Dynamic control data for first channel */ - HANDLE_SBR_FRAME_DATA hFrameDataRight,/*!< Dynamic control data for second channel */ - HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ - const UINT flags, - const int overlap ) -{ - int i, bit; - - - /* Reserved bits */ - if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ - FDKreadBits(hBs, 4); - FDKreadBits(hBs, 4); - } - - /* Read coupling flag */ - bit = FDKreadBits (hBs, 1); - - if (bit) { - hFrameDataLeft->coupling = COUPLING_LEVEL; - hFrameDataRight->coupling = COUPLING_BAL; - } - else { - hFrameDataLeft->coupling = COUPLING_OFF; - hFrameDataRight->coupling = COUPLING_OFF; - } - - - /* - Grid control - */ - if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataLeft, 2, flags) ) - return 0; - - if ( !checkFrameInfo (&hFrameDataLeft->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) - return 0; - - if (hFrameDataLeft->coupling) { - FDKmemcpy (&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo, sizeof(FRAME_INFO)); - hFrameDataRight->ampResolutionCurrentFrame = hFrameDataLeft->ampResolutionCurrentFrame; - } - else { - if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataRight, 2, flags) ) - return 0; - - if ( !checkFrameInfo (&hFrameDataRight->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) - return 0; - } - - /* - Fetch domain vectors (time or frequency direction for delta-coding) - */ - sbrGetDirectionControlData (hFrameDataLeft, hBs); - sbrGetDirectionControlData (hFrameDataRight, hBs); - - for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { - hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2); - } - - if (hFrameDataLeft->coupling) { - for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { - hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i]; - } - - - if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) ) { - return 0; - } - - sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs); - - if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) ) { - return 0; - } - } - else { - - for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) { - hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2); - } - - - - if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) ) - return 0; - - if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) ) - return 0; - - sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs); - - } - sbrGetNoiseFloorData (hHeaderData, hFrameDataRight, hBs); - - sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs); - sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs); - - { - if (! extractExtendedData( - hHeaderData, - hBs - ,NULL - ) ) { - return 0; - } - } - - return 1; -} - - - - -/*! - \brief Read direction control data from bitstream -*/ -void -sbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ - HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ -{ - int i; - - for (i = 0; i < h_frame_data->frameInfo.nEnvelopes; i++) { - h_frame_data->domain_vec[i] = FDKreadBits (hBs, 1); - } - - for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { - h_frame_data->domain_vec_noise[i] = FDKreadBits (hBs, 1); - } -} - - - -/*! - \brief Read noise-floor-level data from bitstream -*/ -void -sbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ - HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ - HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ -{ - int i,j; - int delta; - COUPLING_MODE coupling; - int noNoiseBands = hHeaderData->freqBandData.nNfb; - - Huffman hcb_noiseF; - Huffman hcb_noise; - int envDataTableCompFactor; - - coupling = h_frame_data->coupling; - - - /* - Select huffman codebook depending on coupling mode - */ - if (coupling == COUPLING_BAL) { - hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T; - hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F" */ - envDataTableCompFactor = 1; - } - else { - hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T; - hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F" */ - envDataTableCompFactor = 0; - } - - /* - Read raw noise-envelope data - */ - for (i=0; i<h_frame_data->frameInfo.nNoiseEnvelopes; i++) { - - - if (h_frame_data->domain_vec_noise[i] == 0) { - if (coupling == COUPLING_BAL) { - h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] = - (FIXP_SGL) (((int)FDKreadBits (hBs, 5)) << envDataTableCompFactor); - } - else { - h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] = - (FIXP_SGL) (int)FDKreadBits (hBs, 5); - } - - for (j = 1; j < noNoiseBands; j++) { - delta = DecodeHuffmanCW(hcb_noiseF, hBs); - h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor); - } - } - else { - for (j = 0; j < noNoiseBands; j++) { - delta = DecodeHuffmanCW(hcb_noise, hBs); - h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor); - } - } - } -} - - -/*! - \brief Read envelope data from bitstream -*/ -static int -sbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ - HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ - HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ - const UINT flags) -{ - int i, j; - UCHAR no_band[MAX_ENVELOPES]; - int delta = 0; - int offset = 0; - COUPLING_MODE coupling = h_frame_data->coupling; - int ampRes = hHeaderData->bs_info.ampResolution; - int nEnvelopes = h_frame_data->frameInfo.nEnvelopes; - int envDataTableCompFactor; - int start_bits, start_bits_balance; - Huffman hcb_t, hcb_f; - - h_frame_data->nScaleFactors = 0; - - if ( (h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1) ) { - if (flags & SBRDEC_ELD_GRID) - ampRes = h_frame_data->ampResolutionCurrentFrame; - else - ampRes = 0; - } - h_frame_data->ampResolutionCurrentFrame = ampRes; - - /* - Set number of bits for first value depending on amplitude resolution - */ - if(ampRes == 1) - { - start_bits = 6; - start_bits_balance = 5; - } - else - { - start_bits = 7; - start_bits_balance = 6; - } - - /* - Calculate number of values for each envelope and alltogether - */ - for (i = 0; i < nEnvelopes; i++) { - no_band[i] = hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]]; - h_frame_data->nScaleFactors += no_band[i]; - } - if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES) - return 0; - - /* - Select Huffman codebook depending on coupling mode and amplitude resolution - */ - if (coupling == COUPLING_BAL) { - envDataTableCompFactor = 1; - if (ampRes == 0) { - hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T; - hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F; - } - else { - hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T; - hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; - } - } - else { - envDataTableCompFactor = 0; - if (ampRes == 0) { - hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T; - hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F; - } - else { - hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T; - hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; - } - } - - /* - Now read raw envelope data - */ - for (j = 0, offset = 0; j < nEnvelopes; j++) { - - - if (h_frame_data->domain_vec[j] == 0) { - if (coupling == COUPLING_BAL) { - h_frame_data->iEnvelope[offset] = - (FIXP_SGL) (( (int)FDKreadBits(hBs, start_bits_balance)) << envDataTableCompFactor); - } - else { - h_frame_data->iEnvelope[offset] = - (FIXP_SGL) (int)FDKreadBits (hBs, start_bits); - } - } - - for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) { - - if (h_frame_data->domain_vec[j] == 0) { - delta = DecodeHuffmanCW(hcb_f, hBs); - } - else { - delta = DecodeHuffmanCW(hcb_t, hBs); - } - - h_frame_data->iEnvelope[offset + i] = (FIXP_SGL) (delta << envDataTableCompFactor); - } - offset += no_band[j]; - } - -#if ENV_EXP_FRACT - /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional part) */ - for (i = 0; i < h_frame_data->nScaleFactors; i++) { - h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT; - } -#endif - - return 1; -} - - -//static const FRAME_INFO v_frame_info1_8 = { 0, 1, {0, 8}, {1}, -1, 1, {0, 8} }; -static const FRAME_INFO v_frame_info2_8 = { 0, 2, {0, 4, 8}, {1, 1}, -1, 2, {0, 4, 8} }; -static const FRAME_INFO v_frame_info4_8 = { 0, 4, {0, 2, 4, 6, 8}, {1, 1, 1, 1}, -1, 2, {0, 4, 8} }; - -/***************************************************************************/ -/*! - \brief Generates frame info for FIXFIXonly frame class used for low delay version - - \return nothing - ****************************************************************************/ - static void generateFixFixOnly ( FRAME_INFO *hSbrFrameInfo, - int tranPosInternal, - int numberTimeSlots - ) -{ - int nEnv, i, tranIdx; - const int *pTable; - - switch (numberTimeSlots) { - case 8: - pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; - break; - case 15: - pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal]; - break; - case 16: - pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal]; - break; - default: - FDK_ASSERT(0); - } - - /* look number of envelopes in table */ - nEnv = pTable[0]; - /* look up envelope distribution in table */ - for (i=1; i<nEnv; i++) - hSbrFrameInfo->borders[i] = pTable[i+2]; - /* open and close frame border */ - hSbrFrameInfo->borders[0] = 0; - hSbrFrameInfo->borders[nEnv] = numberTimeSlots; - hSbrFrameInfo->nEnvelopes = nEnv; - - /* transient idx */ - tranIdx = hSbrFrameInfo->tranEnv = pTable[1]; - - /* add noise floors */ - hSbrFrameInfo->bordersNoise[0] = 0; - hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[tranIdx?tranIdx:1]; - hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; - /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) */ - hSbrFrameInfo->nNoiseEnvelopes = 2; -} - -/*! - \brief Extracts LowDelaySBR control data from the bitstream. - - \return zero for bitstream error, one for correct. -*/ -static int -extractLowDelayGrid (HANDLE_FDK_BITSTREAM hBitBuf, /*!< bitbuffer handle */ - HANDLE_SBR_HEADER_DATA hHeaderData, - HANDLE_SBR_FRAME_DATA h_frame_data, /*!< contains the FRAME_INFO struct to be filled */ - int timeSlots - ) -{ - FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo; - INT numberTimeSlots = hHeaderData->numberTimeSlots; - INT temp = 0, k; - - /* FIXFIXonly framing case */ - h_frame_data->frameInfo.frameClass = 0; - - /* get the transient position from the bitstream */ - switch (timeSlots){ - case 8: - /* 3bit transient position (temp={0;..;7}) */ - temp = FDKreadBits( hBitBuf, 3); - break; - - case 16: - case 15: - /* 4bit transient position (temp={0;..;15}) */ - temp = FDKreadBits( hBitBuf, 4); - break; - - default: - return 0; - } - - /* calculate borders according to the transient position */ - generateFixFixOnly ( pFrameInfo, - temp, - numberTimeSlots - ); - - /* decode freq res: */ - for (k = 0; k < pFrameInfo->nEnvelopes; k++) { - pFrameInfo->freqRes[k] = (UCHAR) FDKreadBits (hBitBuf, 1); /* f = F [1 bits] */ - } - - - return 1; -} - -/*! - \brief Extract the frame information (structure FRAME_INFO) from the bitstream - \return Zero for bitstream error, one for correct. -*/ -int -extractFrameInfo ( HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ - HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ - HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the frame-info will be stored */ - const UINT nrOfChannels, - const UINT flags - ) -{ - FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo; - int numberTimeSlots = hHeaderData->numberTimeSlots; - int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, - k, p, aL, aR, nL, nR, - temp = 0, staticFreqRes; - UCHAR frameClass; - - if (flags & SBRDEC_ELD_GRID) { - /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames and the LowDelayGrid for transient Frames */ - frameClass = FDKreadBits (hBs, 1); /* frameClass = [1 bit] */ - if ( frameClass == 1 ) { - /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal SBR-Grid for FIXIFX */ - /* extract the AACLD-Sbr-Grid */ - pFrameInfo->frameClass = frameClass; - extractLowDelayGrid (hBs, hHeaderData, h_frame_data, numberTimeSlots); - return 1; - } - } else - { - frameClass = FDKreadBits (hBs, 2); /* frameClass = C [2 bits] */ - } - - - switch (frameClass) { - case 0: - temp = FDKreadBits (hBs, 2); /* E [2 bits ] */ - nEnv = (int) (1 << temp); /* E -> e */ - - if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1)) - h_frame_data->ampResolutionCurrentFrame = FDKreadBits( hBs, 1); /* new ELD Syntax 07-11-09 */ - - staticFreqRes = FDKreadBits (hBs, 1); - - { - if (nEnv > MAX_ENVELOPES_HEAAC) - return 0; - } - - b = nEnv + 1; - switch (nEnv) { - case 1: - switch (numberTimeSlots) { - case 15: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15, sizeof(FRAME_INFO)); - break; - case 16: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16, sizeof(FRAME_INFO)); - break; - default: - FDK_ASSERT(0); - } - break; - case 2: - switch (numberTimeSlots) { - case 15: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15, sizeof(FRAME_INFO)); - break; - case 16: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16, sizeof(FRAME_INFO)); - break; - default: - FDK_ASSERT(0); - } - break; - case 4: - switch (numberTimeSlots) { - case 15: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15, sizeof(FRAME_INFO)); - break; - case 16: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16, sizeof(FRAME_INFO)); - break; - default: - FDK_ASSERT(0); - } - break; - case 8: -#if (MAX_ENVELOPES >= 8) - switch (numberTimeSlots) { - case 15: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15, sizeof(FRAME_INFO)); - break; - case 16: - FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16, sizeof(FRAME_INFO)); - break; - default: - FDK_ASSERT(0); - } - break; -#else - return 0; -#endif - } - /* Apply correct freqRes (High is default) */ - if (!staticFreqRes) { - for (i = 0; i < nEnv ; i++) - pFrameInfo->freqRes[i] = 0; - } - - break; - case 1: - case 2: - temp = FDKreadBits (hBs, 2); /* A [2 bits] */ - - n = FDKreadBits (hBs, 2); /* n = N [2 bits] */ - - nEnv = n + 1; /* # envelopes */ - b = nEnv + 1; /* # borders */ - - break; - } - - switch (frameClass) { - case 1: - /* Decode borders: */ - pFrameInfo->borders[0] = 0; /* first border */ - border = temp + numberTimeSlots; /* A -> aR */ - i = b-1; /* frame info index for last border */ - pFrameInfo->borders[i] = border; /* last border */ - - for (k = 0; k < n; k++) { - temp = FDKreadBits (hBs, 2);/* R [2 bits] */ - border -= (2 * temp + 2); /* R -> r */ - pFrameInfo->borders[--i] = border; - } - - - /* Decode pointer: */ - pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1)); - p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ - - if (p > n+1) - return 0; - - pFrameInfo->tranEnv = p ? n + 2 - p : -1; - - - /* Decode freq res: */ - for (k = n; k >= 0; k--) { - pFrameInfo->freqRes[k] = FDKreadBits (hBs, 1); /* f = F [1 bits] */ - } - - - /* Calculate noise floor middle border: */ - if (p == 0 || p == 1) - pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; - else - pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; - - break; - - case 2: - /* Decode borders: */ - border = temp; /* A -> aL */ - pFrameInfo->borders[0] = border; /* first border */ - - for (k = 1; k <= n; k++) { - temp = FDKreadBits (hBs, 2);/* R [2 bits] */ - border += (2 * temp + 2); /* R -> r */ - pFrameInfo->borders[k] = border; - } - pFrameInfo->borders[k] = numberTimeSlots; /* last border */ - - - /* Decode pointer: */ - pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1)); - p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ - if (p > n+1) - return 0; - - if (p == 0 || p == 1) - pFrameInfo->tranEnv = -1; - else - pFrameInfo->tranEnv = p - 1; - - - - /* Decode freq res: */ - for (k = 0; k <= n; k++) { - pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ - } - - - - /* Calculate noise floor middle border: */ - switch (p) { - case 0: - pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1]; - break; - case 1: - pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; - break; - default: - pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; - break; - } - - break; - - case 3: - /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */ - - aL = FDKreadBits (hBs, 2); /* AL [2 bits], AL -> aL */ - - aR = FDKreadBits (hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */ - - nL = FDKreadBits (hBs, 2); /* nL = NL [2 bits] */ - - nR = FDKreadBits (hBs, 2); /* nR = NR [2 bits] */ - - - - /*------------------------------------------------------------------------- - Calculate help variables - --------------------------------------------------------------------------*/ - - /* general: */ - nEnv = nL + nR + 1; /* # envelopes */ - if (nEnv > MAX_ENVELOPES) - return 0; - b = nEnv + 1; /* # borders */ - - - - /*------------------------------------------------------------------------- - Decode envelopes - --------------------------------------------------------------------------*/ - - - /* L-borders: */ - border = aL; /* first border */ - pFrameInfo->borders[0] = border; - - for (k = 1; k <= nL; k++) { - temp = FDKreadBits (hBs, 2);/* R [2 bits] */ - border += (2 * temp + 2); /* R -> r */ - pFrameInfo->borders[k] = border; - } - - - /* R-borders: */ - border = aR; /* last border */ - i = nEnv; - - pFrameInfo->borders[i] = border; - - for (k = 0; k < nR; k++) { - temp = FDKreadBits (hBs, 2);/* R [2 bits] */ - border -= (2 * temp + 2); /* R -> r */ - pFrameInfo->borders[--i] = border; - } - - - /* decode pointer: */ - pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL+nR+1)); - p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ - - if (p > nL+nR+1) - return 0; - - pFrameInfo->tranEnv = p ? b - p : -1; - - - - /* decode freq res: */ - for (k = 0; k < nEnv; k++) { - pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ - } - - - - /*------------------------------------------------------------------------- - Decode noise floors - --------------------------------------------------------------------------*/ - pFrameInfo->bordersNoise[0] = aL; - - if (nEnv == 1) { - /* 1 noise floor envelope: */ - pFrameInfo->bordersNoise[1] = aR; - } - else { - /* 2 noise floor envelopes */ - if (p == 0 || p == 1) - pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1]; - else - pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; - pFrameInfo->bordersNoise[2] = aR; - } - break; - } - - - /* - Store number of envelopes, noise floor envelopes and frame class - */ - pFrameInfo->nEnvelopes = nEnv; - - if (nEnv == 1) - pFrameInfo->nNoiseEnvelopes = 1; - else - pFrameInfo->nNoiseEnvelopes = 2; - - pFrameInfo->frameClass = frameClass; - - if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) { - /* calculate noise floor first and last borders: */ - pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0]; - pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] = pFrameInfo->borders[nEnv]; - } - - - return 1; -} - - -/*! - \brief Check if the frameInfo vector has reasonable values. - \return Zero for error, one for correct -*/ -static int -checkFrameInfo (FRAME_INFO * pFrameInfo, /*!< pointer to frameInfo */ - int numberOfTimeSlots, /*!< QMF time slots per frame */ - int overlap, /*!< Amount of overlap QMF time slots */ - int timeStep) /*!< QMF slots to SBR slots step factor */ -{ - int maxPos,i,j; - int startPos; - int stopPos; - int tranEnv; - int startPosNoise; - int stopPosNoise; - int nEnvelopes = pFrameInfo->nEnvelopes; - int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes; - - if(nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) - return 0; - - if(nNoiseEnvelopes > MAX_NOISE_ENVELOPES) - return 0; - - startPos = pFrameInfo->borders[0]; - stopPos = pFrameInfo->borders[nEnvelopes]; - tranEnv = pFrameInfo->tranEnv; - startPosNoise = pFrameInfo->bordersNoise[0]; - stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes]; - - if (overlap < 0 || overlap > (6)) { - return 0; - } - if (timeStep < 1 || timeStep > 2) { - return 0; - } - maxPos = numberOfTimeSlots + (overlap/timeStep); - - /* Check that the start and stop positions of the frame are reasonable values. */ - if( (startPos < 0) || (startPos >= stopPos) ) - return 0; - if( startPos > maxPos-numberOfTimeSlots ) /* First env. must start in or directly after the overlap buffer */ - return 0; - if( stopPos < numberOfTimeSlots ) /* One complete frame must be ready for output after processing */ - return 0; - if(stopPos > maxPos) - return 0; - - /* Check that the start border for every envelope is strictly later in time */ - for(i=0;i<nEnvelopes;i++) { - if(pFrameInfo->borders[i] >= pFrameInfo->borders[i+1]) - return 0; - } - - /* Check that the envelope to be shortened is actually among the envelopes */ - if(tranEnv>nEnvelopes) - return 0; - - - /* Check the noise borders */ - if(nEnvelopes==1 && nNoiseEnvelopes>1) - return 0; - - if(startPos != startPosNoise || stopPos != stopPosNoise) - return 0; - - - /* Check that the start border for every noise-envelope is strictly later in time*/ - for(i=0; i<nNoiseEnvelopes; i++) { - if(pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i+1]) - return 0; - } - - /* Check that every noise border is the same as an envelope border*/ - for(i=0; i<nNoiseEnvelopes; i++) { - startPosNoise = pFrameInfo->bordersNoise[i]; - - for(j=0; j<nEnvelopes; j++) { - if(pFrameInfo->borders[j] == startPosNoise) - break; - } - if(j==nEnvelopes) - return 0; - } - - return 1; -} |