2018-02-26 20:17:00 +01:00
|
|
|
/* -----------------------------------------------------------------------------
|
2012-07-11 19:15:24 +02:00
|
|
|
Software License for The Fraunhofer FDK AAC Codec Library for Android
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
|
|
|
|
Forschung e.V. All rights reserved.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
1. INTRODUCTION
|
2018-02-26 20:17:00 +01:00
|
|
|
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.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
2. COPYRIGHT LICENSE
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
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:
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
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.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
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
|
2012-07-11 19:15:24 +02:00
|
|
|
modifications thereto to recipients of copies in binary form.
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
The name of Fraunhofer may not be used to endorse or promote products derived
|
|
|
|
from this library without prior written permission.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
You may not charge copyright license fees for anyone to use, copy or distribute
|
|
|
|
the FDK AAC Codec software or your modifications thereto.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
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."
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
3. NO PATENT LICENSE
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
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.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
You may use this FDK AAC Codec software or modifications thereto only for
|
|
|
|
purposes that are authorized by appropriate patent licenses.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
4. DISCLAIMER
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
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.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
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
|
2018-02-26 20:17:00 +01:00
|
|
|
----------------------------------------------------------------------------- */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
/**************************** AAC decoder library ******************************
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
Author(s): Josef Hoepfl
|
2018-02-26 20:17:00 +01:00
|
|
|
|
2012-07-11 19:15:24 +02:00
|
|
|
Description: individual channel stream info
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
*******************************************************************************/
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
#ifndef CHANNELINFO_H
|
|
|
|
#define CHANNELINFO_H
|
|
|
|
|
|
|
|
#include "common_fix.h"
|
|
|
|
|
|
|
|
#include "aac_rom.h"
|
|
|
|
#include "aacdecoder_lib.h"
|
|
|
|
#include "FDK_bitstream.h"
|
|
|
|
#include "overlapadd.h"
|
|
|
|
|
|
|
|
#include "mdct.h"
|
|
|
|
#include "stereo.h"
|
|
|
|
#include "pulsedata.h"
|
|
|
|
#include "aacdec_tns.h"
|
|
|
|
|
|
|
|
#include "aacdec_pns.h"
|
|
|
|
|
|
|
|
#include "aacdec_hcr_types.h"
|
|
|
|
#include "rvlc_info.h"
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
#include "usacdec_acelp.h"
|
|
|
|
#include "usacdec_const.h"
|
|
|
|
#include "usacdec_rom.h"
|
|
|
|
|
|
|
|
#include "ac_arith_coder.h"
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
#include "conceal_types.h"
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
#include "aacdec_drc_types.h"
|
|
|
|
|
|
|
|
#define WB_SECTION_SIZE (1024 * 2)
|
|
|
|
|
|
|
|
#define DRM_BS_BUFFER_SIZE \
|
|
|
|
(512) /* size of the dynamic buffer which is used to reverse the bits of \
|
|
|
|
the DRM SBR payload */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/* Output rendering mode */
|
|
|
|
typedef enum {
|
|
|
|
AACDEC_RENDER_INVALID = 0,
|
|
|
|
AACDEC_RENDER_IMDCT,
|
|
|
|
AACDEC_RENDER_ELDFB,
|
|
|
|
AACDEC_RENDER_LPD,
|
|
|
|
AACDEC_RENDER_INTIMDCT
|
|
|
|
} AACDEC_RENDER_MODE;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
enum { MAX_QUANTIZED_VALUE = 8191 };
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
typedef enum { FD_LONG, FD_SHORT, LPD } USAC_COREMODE;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
typedef struct {
|
2012-07-11 19:15:24 +02:00
|
|
|
const SHORT *ScaleFactorBands_Long;
|
|
|
|
const SHORT *ScaleFactorBands_Short;
|
|
|
|
UCHAR NumberOfScaleFactorBands_Long;
|
|
|
|
UCHAR NumberOfScaleFactorBands_Short;
|
|
|
|
UINT samplingRateIndex;
|
|
|
|
UINT samplingRate;
|
|
|
|
} SamplingRateInfo;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
typedef struct {
|
2012-07-11 19:15:24 +02:00
|
|
|
UCHAR CommonWindow;
|
|
|
|
UCHAR GlobalGain;
|
|
|
|
|
|
|
|
} CRawDataInfo;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
typedef struct {
|
2012-07-11 19:15:24 +02:00
|
|
|
UCHAR WindowGroupLength[8];
|
|
|
|
UCHAR WindowGroups;
|
|
|
|
UCHAR Valid;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
UCHAR WindowShape; /* 0: sine window, 1: KBD, 2: low overlap */
|
|
|
|
BLOCK_TYPE WindowSequence; /* mdct.h; 0: long, 1: start, 2: short, 3: stop */
|
2012-07-11 19:15:24 +02:00
|
|
|
UCHAR MaxSfBands;
|
2018-02-26 20:17:00 +01:00
|
|
|
UCHAR max_sfb_ste;
|
2012-07-11 19:15:24 +02:00
|
|
|
UCHAR ScaleFactorGrouping;
|
|
|
|
|
|
|
|
UCHAR TotalSfBands;
|
|
|
|
|
|
|
|
} CIcsInfo;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
enum {
|
2012-07-11 19:15:24 +02:00
|
|
|
ZERO_HCB = 0,
|
2018-02-26 20:17:00 +01:00
|
|
|
ESCBOOK = 11,
|
2012-07-11 19:15:24 +02:00
|
|
|
NSPECBOOKS = ESCBOOK + 1,
|
2018-02-26 20:17:00 +01:00
|
|
|
BOOKSCL = NSPECBOOKS,
|
|
|
|
NOISE_HCB = 13,
|
2012-07-11 19:15:24 +02:00
|
|
|
INTENSITY_HCB2 = 14,
|
2018-02-26 20:17:00 +01:00
|
|
|
INTENSITY_HCB = 15,
|
2012-07-11 19:15:24 +02:00
|
|
|
LAST_HCB
|
|
|
|
};
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
/* This struct holds the persistent data shared by both channels of a CPE.
|
|
|
|
It needs to be allocated for each CPE. */
|
|
|
|
typedef struct {
|
|
|
|
CJointStereoPersistentData jointStereoPersistentData;
|
|
|
|
} CpePersistentData;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This struct must be allocated one for every channel and must be persistent.
|
|
|
|
*/
|
2018-02-26 20:17:00 +01:00
|
|
|
typedef struct {
|
2012-07-11 19:15:24 +02:00
|
|
|
FIXP_DBL *pOverlapBuffer;
|
|
|
|
mdct_t IMdct;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
CArcoData *hArCo;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
INT pnsCurrentSeed;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
/* LPD memory */
|
|
|
|
FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR];
|
|
|
|
INT old_T_pf[SYN_SFD];
|
|
|
|
FIXP_DBL old_gain_pf[SYN_SFD];
|
|
|
|
FIXP_DBL mem_bpf[L_FILT + L_SUBFR];
|
|
|
|
UCHAR
|
|
|
|
old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe
|
|
|
|
*/
|
|
|
|
|
|
|
|
USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous
|
|
|
|
frame. (not signalled by the bitstream, see
|
|
|
|
CAacDecoderChannelInfo::core_mode_last !! )
|
|
|
|
*/
|
|
|
|
UCHAR last_lpd_mode; /* LPD mode used by the decoder in last LPD subframe
|
|
|
|
(not signalled by the bitstream, see
|
|
|
|
CAacDecoderChannelInfo::lpd_mode_last !! ) */
|
|
|
|
UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe
|
|
|
|
(not signalled by the bitstream) */
|
|
|
|
UCHAR last_lpc_lost; /* Flag indicating that the previous LPC is lost */
|
|
|
|
|
|
|
|
FIXP_LPC
|
|
|
|
lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */
|
|
|
|
FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC
|
|
|
|
coefficients in LSF domain
|
|
|
|
for concealment. */
|
|
|
|
FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER]; /* Last LPC coefficients in LP
|
|
|
|
domain. lp_coeff_old[0] is lpc4 (coeffs for
|
|
|
|
right folding point of last tcx frame),
|
|
|
|
lp_coeff_old[1] are coeffs for left folding
|
|
|
|
point of last tcx frame */
|
|
|
|
INT lp_coeff_old_exp[2];
|
|
|
|
|
|
|
|
FIXP_SGL
|
|
|
|
oldStability; /* LPC coeff stability value from last frame (required for
|
|
|
|
TCX concealment). */
|
|
|
|
UINT numLostLpdFrames; /* Number of consecutive lost subframes. */
|
|
|
|
|
|
|
|
/* TCX memory */
|
|
|
|
FIXP_DBL last_tcx_gain;
|
|
|
|
INT last_tcx_gain_e;
|
|
|
|
FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */
|
|
|
|
SHORT last_tcx_pitch;
|
|
|
|
UCHAR last_tcx_noise_factor;
|
|
|
|
|
|
|
|
/* ACELP memory */
|
|
|
|
CAcelpStaticMem acelp;
|
|
|
|
|
|
|
|
ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */
|
|
|
|
|
|
|
|
CDrcChannelData drcData;
|
2012-07-11 19:15:24 +02:00
|
|
|
CConcealmentInfo concealmentInfo;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
CpePersistentData *pCpeStaticData;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
} CAacDecoderStaticChannelInfo;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This union must be allocated for every element (up to 2 channels).
|
|
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
/* Common bit stream data */
|
2018-02-26 20:17:00 +01:00
|
|
|
SHORT aScaleFactor[(
|
|
|
|
8 * 16)]; /* Spectral scale factors for each sfb in each window. */
|
|
|
|
SHORT aSfbScale[(8 * 16)]; /* could be free after ApplyTools() */
|
|
|
|
UCHAR
|
|
|
|
aCodeBook[(8 * 16)]; /* section data: codebook for each window and sfb. */
|
|
|
|
UCHAR band_is_noise[(8 * 16)];
|
|
|
|
CTnsData TnsData;
|
|
|
|
CRawDataInfo RawDataInfo;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
shouldBeUnion {
|
|
|
|
struct {
|
|
|
|
CPulseData PulseData;
|
2018-02-26 20:17:00 +01:00
|
|
|
SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels
|
|
|
|
except for Drm syntax */
|
|
|
|
UCHAR
|
|
|
|
aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for
|
|
|
|
Drm syntax. Same as "aCodeBook" ? */
|
2012-07-11 19:15:24 +02:00
|
|
|
SHORT lenOfReorderedSpectralData;
|
|
|
|
SCHAR lenOfLongestCodeword;
|
|
|
|
SCHAR numberSection;
|
|
|
|
SCHAR rvlcCurrentScaleFactorOK;
|
|
|
|
SCHAR rvlcIntensityUsed;
|
|
|
|
} aac;
|
2018-02-26 20:17:00 +01:00
|
|
|
struct {
|
|
|
|
UCHAR fd_noise_level_and_offset;
|
|
|
|
UCHAR tns_active;
|
|
|
|
UCHAR tns_on_lr;
|
|
|
|
UCHAR tcx_noise_factor[4];
|
|
|
|
UCHAR tcx_global_gain[4];
|
|
|
|
} usac;
|
|
|
|
}
|
|
|
|
specificTo;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
} CAacDecoderDynamicData;
|
|
|
|
|
|
|
|
typedef shouldBeUnion {
|
2018-02-26 20:17:00 +01:00
|
|
|
UCHAR DrmBsBuffer[DRM_BS_BUFFER_SIZE];
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
/* Common signal data, can be used once the bit stream data from above is not
|
|
|
|
* used anymore. */
|
2012-07-11 19:15:24 +02:00
|
|
|
FIXP_DBL mdctOutTemp[1024];
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)];
|
|
|
|
|
|
|
|
FIXP_DBL workBuffer[WB_SECTION_SIZE];
|
|
|
|
}
|
|
|
|
CWorkBufferCore1;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/* Common data referenced by all channels */
|
|
|
|
typedef struct {
|
2018-02-26 20:17:00 +01:00
|
|
|
CAacDecoderDynamicData pAacDecoderDynamicData[2];
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
CPnsInterChannelData pnsInterChannelData;
|
2018-02-26 20:17:00 +01:00
|
|
|
INT pnsRandomSeed[(8 * 16)];
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
CJointStereoData jointStereoData; /* One for one element */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
shouldBeUnion {
|
|
|
|
struct {
|
|
|
|
CErHcrInfo erHcrInfo;
|
|
|
|
CErRvlcInfo erRvlcInfo;
|
2018-02-26 20:17:00 +01:00
|
|
|
SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */
|
|
|
|
SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */
|
|
|
|
SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */
|
2012-07-11 19:15:24 +02:00
|
|
|
} aac;
|
2018-02-26 20:17:00 +01:00
|
|
|
}
|
|
|
|
overlay;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
} CAacDecoderCommonData;
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
typedef struct {
|
|
|
|
CWorkBufferCore1 *pWorkBufferCore1;
|
|
|
|
CCplxPredictionData *cplxPredictionData;
|
|
|
|
} CAacDecoderCommonStaticData;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/*
|
2018-02-26 20:17:00 +01:00
|
|
|
* This struct must be allocated one for every channel of every element and must
|
|
|
|
* be persistent. Among its members, the following memory areas can be
|
|
|
|
* overwritten under the given conditions:
|
|
|
|
* - pSpectralCoefficient The memory pointed to can be overwritten after time
|
|
|
|
* signal rendering.
|
2012-07-11 19:15:24 +02:00
|
|
|
* - data can be overwritten after time signal rendering.
|
2018-02-26 20:17:00 +01:00
|
|
|
* - pDynData memory pointed to can be overwritten after each
|
|
|
|
* CChannelElement_Decode() call.
|
|
|
|
* - pComData->overlay memory pointed to can be overwritten after each
|
|
|
|
* CChannelElement_Decode() call..
|
2012-07-11 19:15:24 +02:00
|
|
|
*/
|
2018-02-26 20:17:00 +01:00
|
|
|
typedef struct {
|
2012-07-11 19:15:24 +02:00
|
|
|
shouldBeUnion {
|
2018-02-26 20:17:00 +01:00
|
|
|
struct {
|
|
|
|
FIXP_DBL fac_data0[LFAC];
|
2018-06-29 16:32:28 +02:00
|
|
|
SCHAR fac_data_e[4];
|
2018-02-26 20:17:00 +01:00
|
|
|
FIXP_DBL
|
|
|
|
*fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */
|
|
|
|
|
|
|
|
UCHAR core_mode; /* current core mode */
|
|
|
|
USAC_COREMODE
|
|
|
|
core_mode_last; /* previous core mode, signalled in the bitstream
|
|
|
|
(not done by the decoder, see
|
|
|
|
CAacDecoderStaticChannelInfo::last_core_mode !!)*/
|
|
|
|
UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream
|
|
|
|
(not done by the decoder, see
|
|
|
|
CAacDecoderStaticChannelInfo::last_core_mode !!)*/
|
|
|
|
UCHAR mod[4];
|
|
|
|
UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current
|
|
|
|
superframe */
|
|
|
|
|
|
|
|
FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction
|
|
|
|
coefficients in LSP domain */
|
|
|
|
FIXP_LPC
|
|
|
|
lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in
|
|
|
|
LP domain */
|
|
|
|
INT lp_coeff_exp[5];
|
|
|
|
FIXP_LPC lsf_adaptive_mean_cand
|
|
|
|
[M_LP_FILTER_ORDER]; /* concealment: is copied to
|
|
|
|
CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is
|
|
|
|
assumed to be correct*/
|
|
|
|
FIXP_SGL aStability[4]; /* LPC coeff stability values required for ACELP
|
|
|
|
and TCX (concealment) */
|
|
|
|
|
|
|
|
CAcelpChannelData acelp[4];
|
|
|
|
|
|
|
|
FIXP_DBL tcx_gain[4];
|
|
|
|
SCHAR tcx_gain_e[4];
|
|
|
|
} usac;
|
|
|
|
|
2012-07-11 19:15:24 +02:00
|
|
|
struct {
|
|
|
|
CPnsData PnsData; /* Not required for USAC */
|
|
|
|
} aac;
|
2018-02-26 20:17:00 +01:00
|
|
|
}
|
|
|
|
data;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */
|
|
|
|
SHORT specScale[8]; /* Scale shift values of each spectrum window */
|
|
|
|
CIcsInfo icsInfo;
|
|
|
|
INT granuleLength; /* Size of smallest spectrum piece */
|
|
|
|
UCHAR ElementInstanceTag;
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */
|
|
|
|
|
|
|
|
CAacDecoderDynamicData *
|
|
|
|
pDynData; /* Data required for one element and discarded after decoding */
|
|
|
|
CAacDecoderCommonData
|
|
|
|
*pComData; /* Data required for one channel at a time during decode */
|
|
|
|
CAacDecoderCommonStaticData *pComStaticData; /* Persistent data required for
|
|
|
|
one channel at a time during
|
|
|
|
decode */
|
|
|
|
|
|
|
|
int currAliasingSymmetry; /* required for RSVD60 MCT */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
} CAacDecoderChannelInfo;
|
|
|
|
|
|
|
|
/* channelinfo.cpp */
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame,
|
|
|
|
UINT samplingRateIndex,
|
|
|
|
UINT samplingRate);
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Read max SFB from bit stream and assign TotalSfBands according
|
|
|
|
* to the window sequence and sample rate.
|
|
|
|
* \param hBs bit stream handle as data source
|
2018-02-26 20:17:00 +01:00
|
|
|
* \param pIcsInfo IcsInfo structure to read the window sequence and store
|
|
|
|
* MaxSfBands and TotalSfBands
|
2012-07-11 19:15:24 +02:00
|
|
|
* \param pSamplingRateInfo read only
|
|
|
|
*/
|
2018-02-26 20:17:00 +01:00
|
|
|
AAC_DECODER_ERROR IcsReadMaxSfb(HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo,
|
|
|
|
const SamplingRateInfo *pSamplingRateInfo);
|
|
|
|
|
|
|
|
AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo,
|
|
|
|
const SamplingRateInfo *SamplingRateInfoTable,
|
|
|
|
const UINT flags);
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/* stereo.cpp, only called from this file */
|
|
|
|
|
|
|
|
/*!
|
2018-02-26 20:17:00 +01:00
|
|
|
\brief Applies MS stereo.
|
|
|
|
|
2012-07-11 19:15:24 +02:00
|
|
|
The function applies MS stereo.
|
|
|
|
|
|
|
|
\param pAacDecoderChannelInfo aac channel info.
|
|
|
|
\param pScaleFactorBandOffsets pointer to scalefactor band offsets.
|
|
|
|
\param pWindowGroupLength pointer to window group length array.
|
|
|
|
\param windowGroups number of window groups.
|
2018-02-26 20:17:00 +01:00
|
|
|
\param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in
|
|
|
|
left channel. \param scaleFactorBandsTransmittedR number of transmitted
|
|
|
|
scalefactor bands in right channel. May differ from
|
|
|
|
scaleFactorBandsTransmittedL only for USAC. \return none
|
2012-07-11 19:15:24 +02:00
|
|
|
*/
|
2018-02-26 20:17:00 +01:00
|
|
|
void CJointStereo_ApplyMS(
|
|
|
|
CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
|
|
|
|
CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2],
|
|
|
|
FIXP_DBL *spectrumL, FIXP_DBL *spectrumR, SHORT *SFBleftScale,
|
|
|
|
SHORT *SFBrightScale, SHORT *specScaleL, SHORT *specScaleR,
|
|
|
|
const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength,
|
|
|
|
const int windowGroups, const int max_sfb_ste_outside,
|
|
|
|
const int scaleFactorBandsTransmittedL,
|
|
|
|
const int scaleFactorBandsTransmittedR, FIXP_DBL *store_dmx_re_prev,
|
|
|
|
SHORT *store_dmx_re_prev_e, const int mainband_flag);
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Applies intensity stereo
|
|
|
|
|
|
|
|
The function applies intensity stereo.
|
|
|
|
|
|
|
|
\param pAacDecoderChannelInfo aac channel info.
|
|
|
|
\param pScaleFactorBandOffsets pointer to scalefactor band offsets.
|
|
|
|
\param pWindowGroupLength pointer to window group length array.
|
|
|
|
\param windowGroups number of window groups.
|
|
|
|
\param scaleFactorBandsTransmitted number of transmitted scalefactor bands.
|
|
|
|
\return none
|
|
|
|
*/
|
|
|
|
void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
|
|
|
|
const short *pScaleFactorBandOffsets,
|
|
|
|
const UCHAR *pWindowGroupLength,
|
|
|
|
const int windowGroups,
|
2018-05-04 15:51:23 +02:00
|
|
|
const int scaleFactorBandsTransmitted);
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
/* aacdec_pns.cpp */
|
2018-02-26 20:17:00 +01:00
|
|
|
int CPns_IsPnsUsed(const CPnsData *pPnsData, const int group, const int band);
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band,
|
2012-07-11 19:15:24 +02:00
|
|
|
const int outofphase);
|
|
|
|
|
|
|
|
/****************** inline functions ******************/
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; }
|
2012-07-11 19:15:24 +02:00
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) {
|
|
|
|
return (pIcsInfo->WindowSequence != BLOCK_SHORT);
|
2012-07-11 19:15:24 +02:00
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return pIcsInfo->WindowShape;
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline BLOCK_TYPE GetWindowSequence(const CIcsInfo *pIcsInfo) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return pIcsInfo->WindowSequence;
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline const SHORT *GetScaleFactorBandOffsets(
|
|
|
|
const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
|
|
|
|
if (IsLongBlock(pIcsInfo)) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return samplingRateInfo->ScaleFactorBands_Long;
|
2018-02-26 20:17:00 +01:00
|
|
|
} else {
|
2012-07-11 19:15:24 +02:00
|
|
|
return samplingRateInfo->ScaleFactorBands_Short;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR GetNumberOfScaleFactorBands(
|
|
|
|
const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
|
|
|
|
if (IsLongBlock(pIcsInfo)) {
|
|
|
|
return samplingRateInfo->NumberOfScaleFactorBands_Long;
|
|
|
|
} else {
|
|
|
|
return samplingRateInfo->NumberOfScaleFactorBands_Short;
|
|
|
|
}
|
2012-07-11 19:15:24 +02:00
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) {
|
|
|
|
return (pIcsInfo->WindowSequence == BLOCK_SHORT) ? 8 : 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return pIcsInfo->WindowGroups;
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return pIcsInfo->WindowGroupLength[index];
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return pIcsInfo->WindowGroupLength;
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return pIcsInfo->MaxSfBands;
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0,
|
|
|
|
const CIcsInfo *pIcsInfo1) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands);
|
|
|
|
}
|
|
|
|
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return pIcsInfo->TotalSfBands;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Note: This function applies to AAC-LC only ! */
|
2018-02-26 20:17:00 +01:00
|
|
|
inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo,
|
|
|
|
const int samplingRateIndex) {
|
2012-07-11 19:15:24 +02:00
|
|
|
return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)];
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* #ifndef CHANNELINFO_H */
|