X-Git-Url: http://git.ffmpeg.org/gitweb/ffmpeg.git/blobdiff_plain/cc0591dab0a5508518413260c77750577c30b0d6..bb5c0988eac1d75245675d92554b9a0ef4124b5c:/libavcodec/aac.h diff --git a/libavcodec/aac.h b/libavcodec/aac.h index ebf2218..32e7224 100644 --- a/libavcodec/aac.h +++ b/libavcodec/aac.h @@ -21,15 +21,16 @@ */ /** - * @file aac.h + * @file libavcodec/aac.h * AAC definitions and structures * @author Oded Shimon ( ods15 ods15 dyndns org ) * @author Maxim Gavrilov ( maxim.gavrilov gmail com ) */ -#ifndef FFMPEG_AAC_H -#define FFMPEG_AAC_H +#ifndef AVCODEC_AAC_H +#define AVCODEC_AAC_H +#include "libavutil/internal.h" #include "avcodec.h" #include "dsputil.h" #include "mpeg4audio.h" @@ -43,8 +44,9 @@ size); #define MAX_CHANNELS 64 +#define MAX_ELEM_ID 16 -#define IVQUANT_SIZE 1024 +#define TNS_MAX_ORDER 20 enum AudioObjectType { AOT_NULL, @@ -76,6 +78,17 @@ enum AudioObjectType { AOT_SSC, ///< N SinuSoidal Coding }; +enum RawDataBlockType { + TYPE_SCE, + TYPE_CPE, + TYPE_CCE, + TYPE_LFE, + TYPE_DSE, + TYPE_PCE, + TYPE_FIL, + TYPE_END, +}; + enum ExtensionPayloadID { EXT_FILL, EXT_FILL_DATA, @@ -111,10 +124,79 @@ enum ChannelPosition { AAC_CHANNEL_CC = 5, }; +/** + * The point during decoding at which channel coupling is applied. + */ +enum CouplingPoint { + BEFORE_TNS, + BETWEEN_TNS_AND_IMDCT, + AFTER_IMDCT = 3, +}; + +/** + * Predictor State + */ +typedef struct { + float cor0; + float cor1; + float var0; + float var1; + float r0; + float r1; +} PredictorState; + +#define MAX_PREDICTORS 672 + +/** + * Individual Channel Stream + */ +typedef struct { + uint8_t max_sfb; ///< number of scalefactor bands per group + enum WindowSequence window_sequence[2]; + uint8_t use_kb_window[2]; ///< If set, use Kaiser-Bessel window, otherwise use a sinus window. + int num_window_groups; + uint8_t group_len[8]; + const uint16_t *swb_offset; ///< table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular window + int num_swb; ///< number of scalefactor window bands + int num_windows; + int tns_max_bands; + int predictor_present; + int predictor_initialized; + int predictor_reset_group; + uint8_t prediction_used[41]; +} IndividualChannelStream; + +/** + * Temporal Noise Shaping + */ +typedef struct { + int present; + int n_filt[8]; + int length[8][4]; + int direction[8][4]; + int order[8][4]; + float coef[8][4][TNS_MAX_ORDER]; +} TemporalNoiseShaping; + +/** + * Dynamic Range Control - decoded from the bitstream but not processed further. + */ +typedef struct { + int pce_instance_tag; ///< Indicates with which program the DRC info is associated. + int dyn_rng_sgn[17]; ///< DRC sign information; 0 - positive, 1 - negative + int dyn_rng_ctl[17]; ///< DRC magnitude information + int exclude_mask[MAX_CHANNELS]; ///< Channels to be excluded from DRC processing. + int band_incr; ///< Number of DRC bands greater than 1 having DRC info. + int interpolation_scheme; ///< Indicates the interpolation scheme used in the SBR QMF domain. + int band_top[17]; ///< Indicates the top of the i-th DRC band in units of 4 spectral lines. + int prog_ref_level; /**< A reference level for the long-term program audio level for all + * channels combined. + */ +} DynamicRangeControl; + typedef struct { int num_pulse; - int start; - int offset[4]; + int pos[4]; int amp[4]; } Pulse; @@ -122,6 +204,42 @@ typedef struct { * coupling parameters */ typedef struct { + enum CouplingPoint coupling_point; ///< The point during decoding at which coupling is applied. + int num_coupled; ///< number of target elements + enum RawDataBlockType type[8]; ///< Type of channel element to be coupled - SCE or CPE. + int id_select[8]; ///< element id + int ch_select[8]; /**< [0] shared list of gains; [1] list of gains for right channel; + * [2] list of gains for left channel; [3] lists of gains for both channels + */ + float gain[16][120]; +} ChannelCoupling; + +/** + * Single Channel Element - used for both SCE and LFE elements. + */ +typedef struct { + IndividualChannelStream ics; + TemporalNoiseShaping tns; + enum BandType band_type[120]; ///< band types + int band_type_run_end[120]; ///< band type run end points + float sf[120]; ///< scalefactors + DECLARE_ALIGNED_16(float, coeffs[1024]); ///< coefficients for IMDCT + DECLARE_ALIGNED_16(float, saved[512]); ///< overlap + DECLARE_ALIGNED_16(float, ret[1024]); ///< PCM output + PredictorState predictor_state[MAX_PREDICTORS]; +} SingleChannelElement; + +/** + * channel element - generic struct for SCE/CPE/CCE/LFE + */ +typedef struct { + // CPE specific + uint8_t ms_mask[120]; ///< Set if mid/side stereo is used for each scalefactor window band + // shared + SingleChannelElement ch[2]; + // CCE specific + ChannelCoupling coup; +} ChannelElement; /** * main AAC context @@ -134,9 +252,24 @@ typedef struct { int is_saved; ///< Set if elements have stored overlap from previous frame. DynamicRangeControl che_drc; + /** + * @defgroup elements Channel element related data. + * @{ + */ enum ChannelPosition che_pos[4][MAX_ELEM_ID]; /**< channel element channel mapping with the * first index as the first 4 raw data block types */ + ChannelElement * che[4][MAX_ELEM_ID]; + ChannelElement * tag_che_map[4][MAX_ELEM_ID]; + int tags_mapped; + /** @} */ + + /** + * @defgroup temporary aligned temporary buffers (We do not want to have these on the stack.) + * @{ + */ + DECLARE_ALIGNED_16(float, buf_mdct[1024]); + /** @} */ /** * @defgroup tables Computed / set up during initialization. @@ -145,6 +278,7 @@ typedef struct { MDCTContext mdct; MDCTContext mdct_small; DSPContext dsp; + int random_state; /** @} */ /** @@ -157,6 +291,7 @@ typedef struct { int sf_offset; ///< offset into pow2sf_tab as appropriate for dsp.float_to_int16 /** @} */ + DECLARE_ALIGNED(16, float, temp[128]); } AACContext; -#endif /* FFMPEG_AAC_H */ +#endif /* AVCODEC_AAC_H */