00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00050 #ifndef AVCODEC_AC3DEC_H
00051 #define AVCODEC_AC3DEC_H
00052
00053 #include "libavutil/lfg.h"
00054 #include "ac3.h"
00055 #include "get_bits.h"
00056 #include "dsputil.h"
00057 #include "fft.h"
00058 #include "fmtconvert.h"
00059
00060
00061 #undef AC3_MAX_CHANNELS
00062 #define AC3_MAX_CHANNELS 7
00063 #define CPL_CH 0
00064
00065 #define AC3_OUTPUT_LFEON 8
00066
00067 #define SPX_MAX_BANDS 17
00068
00069 typedef struct {
00070 AVCodecContext *avctx;
00071 GetBitContext gbc;
00072 uint8_t *input_buffer;
00073
00076 int frame_type;
00077 int substreamid;
00078 int frame_size;
00079 int bit_rate;
00080 int sample_rate;
00081 int num_blocks;
00082 int channel_mode;
00083 int channel_layout;
00084 int lfe_on;
00085 int channel_map;
00086 int center_mix_level;
00087 int surround_mix_level;
00088 int eac3;
00089
00090
00092 int snr_offset_strategy;
00093 int block_switch_syntax;
00094 int dither_flag_syntax;
00095 int bit_allocation_syntax;
00096 int fast_gain_syntax;
00097 int dba_syntax;
00098 int skip_syntax;
00099
00100
00102 int cpl_in_use[AC3_MAX_BLOCKS];
00103 int cpl_strategy_exists[AC3_MAX_BLOCKS];
00104 int channel_in_cpl[AC3_MAX_CHANNELS];
00105 int phase_flags_in_use;
00106 int phase_flags[AC3_MAX_CPL_BANDS];
00107 int num_cpl_bands;
00108 uint8_t cpl_band_sizes[AC3_MAX_CPL_BANDS];
00109 int firstchincpl;
00110 int first_cpl_coords[AC3_MAX_CHANNELS];
00111 int cpl_coords[AC3_MAX_CHANNELS][AC3_MAX_CPL_BANDS];
00112
00113
00116 int spx_in_use;
00117 uint8_t channel_uses_spx[AC3_MAX_CHANNELS];
00118 int8_t spx_atten_code[AC3_MAX_CHANNELS];
00119 int spx_src_start_freq;
00120 int spx_dst_end_freq;
00121 int spx_dst_start_freq;
00122
00123 int num_spx_bands;
00124 uint8_t spx_band_sizes[SPX_MAX_BANDS];
00125 uint8_t first_spx_coords[AC3_MAX_CHANNELS];
00126 float spx_noise_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS];
00127 float spx_signal_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS];
00128
00129
00131 int channel_uses_aht[AC3_MAX_CHANNELS];
00132 int pre_mantissa[AC3_MAX_CHANNELS][AC3_MAX_COEFS][AC3_MAX_BLOCKS];
00133
00134
00136 int fbw_channels;
00137 int channels;
00138 int lfe_ch;
00139 float downmix_coeffs[AC3_MAX_CHANNELS][2];
00140 int downmixed;
00141 int output_mode;
00142 int out_channels;
00143
00144
00146 float dynamic_range[2];
00147
00148
00150 int start_freq[AC3_MAX_CHANNELS];
00151 int end_freq[AC3_MAX_CHANNELS];
00152
00153
00155 int num_rematrixing_bands;
00156 int rematrixing_flags[4];
00157
00158
00160 int num_exp_groups[AC3_MAX_CHANNELS];
00161 int8_t dexps[AC3_MAX_CHANNELS][AC3_MAX_COEFS];
00162 int exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS];
00163
00164
00166 AC3BitAllocParameters bit_alloc_params;
00167 int first_cpl_leak;
00168 int snr_offset[AC3_MAX_CHANNELS];
00169 int fast_gain[AC3_MAX_CHANNELS];
00170 uint8_t bap[AC3_MAX_CHANNELS][AC3_MAX_COEFS];
00171 int16_t psd[AC3_MAX_CHANNELS][AC3_MAX_COEFS];
00172 int16_t band_psd[AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS];
00173 int16_t mask[AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS];
00174 int dba_mode[AC3_MAX_CHANNELS];
00175 int dba_nsegs[AC3_MAX_CHANNELS];
00176 uint8_t dba_offsets[AC3_MAX_CHANNELS][8];
00177 uint8_t dba_lengths[AC3_MAX_CHANNELS][8];
00178 uint8_t dba_values[AC3_MAX_CHANNELS][8];
00179
00180
00182 int dither_flag[AC3_MAX_CHANNELS];
00183 AVLFG dith_state;
00184
00185
00187 int block_switch[AC3_MAX_CHANNELS];
00188 FFTContext imdct_512;
00189 FFTContext imdct_256;
00190
00191
00193 DSPContext dsp;
00194 FmtConvertContext fmt_conv;
00195 float mul_bias;
00196
00197
00199 DECLARE_ALIGNED(16, int, fixed_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS];
00200 DECLARE_ALIGNED(16, float, transform_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS];
00201 DECLARE_ALIGNED(16, float, delay)[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE];
00202 DECLARE_ALIGNED(16, float, window)[AC3_BLOCK_SIZE];
00203 DECLARE_ALIGNED(16, float, tmp_output)[AC3_BLOCK_SIZE];
00204 DECLARE_ALIGNED(16, float, output)[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE];
00205
00206 } AC3DecodeContext;
00207
00212 int ff_eac3_parse_header(AC3DecodeContext *s);
00213
00218 void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch);
00219
00220 void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2],
00221 int out_ch, int in_ch, int len);
00222
00228 void ff_eac3_apply_spectral_extension(AC3DecodeContext *s);
00229
00230 #endif