#ifndef AVCODEC_AC3DEC_H
#define AVCODEC_AC3DEC_H
+#include "libavutil/float_dsp.h"
#include "libavutil/lfg.h"
#include "ac3.h"
#include "ac3dsp.h"
+#include "bswapdsp.h"
#include "get_bits.h"
-#include "dsputil.h"
#include "fft.h"
#include "fmtconvert.h"
/** Large enough for maximum possible frame size when the specification limit is ignored */
#define AC3_FRAME_BUFFER_SIZE 32768
-typedef struct {
+typedef struct AC3DecodeContext {
AVClass *class; ///< class for AVOptions
AVCodecContext *avctx; ///< parent context
- AVFrame frame; ///< AVFrame for decoded output
GetBitContext gbc; ///< bitstream reader
///@name Bit stream information
int bit_rate; ///< stream bit rate, in bits-per-second
int sample_rate; ///< sample frequency, in Hz
int num_blocks; ///< number of audio blocks
+ int bitstream_id; ///< bitstream id (bsid)
int bitstream_mode; ///< bitstream mode (bsmod)
int channel_mode; ///< channel mode (acmod)
- int channel_layout; ///< channel layout
int lfe_on; ///< lfe channel in use
int channel_map; ///< custom channel map
+ int preferred_downmix; ///< Preferred 2-channel downmix mode (dmixmod)
int center_mix_level; ///< Center mix level index
+ int center_mix_level_ltrt; ///< Center mix level index for Lt/Rt (ltrtcmixlev)
int surround_mix_level; ///< Surround mix level index
+ int surround_mix_level_ltrt; ///< Surround mix level index for Lt/Rt (ltrtsurmixlev)
+ int lfe_mix_level_exists; ///< indicates if lfemixlevcod is specified (lfemixlevcode)
+ int lfe_mix_level; ///< LFE mix level index (lfemixlevcod)
int eac3; ///< indicates if current frame is E-AC-3
+ int dolby_surround_mode; ///< dolby surround mode (dsurmod)
+ int dolby_surround_ex_mode; ///< dolby surround ex mode (dsurexmod)
+ int dolby_headphone_mode; ///< dolby headphone mode (dheadphonmod)
///@}
///@name Frame syntax parameters
///@}
///@name Optimization
- DSPContext dsp; ///< for optimization
+ BswapDSPContext bdsp;
+ AVFloatDSPContext fdsp;
AC3DSPContext ac3dsp;
FmtConvertContext fmt_conv; ///< optimized conversion functions
- float mul_bias; ///< scaling for float_to_int16 conversion
///@}
+ float *outptr[AC3_MAX_CHANNELS];
+ float *xcfptr[AC3_MAX_CHANNELS];
+ float *dlyptr[AC3_MAX_CHANNELS];
+
///@name Aligned arrays
- DECLARE_ALIGNED(16, int, fixed_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< fixed-point transform coefficients
+ DECLARE_ALIGNED(16, int32_t, fixed_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< fixed-point transform coefficients
DECLARE_ALIGNED(32, float, transform_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< transform coefficients
DECLARE_ALIGNED(32, float, delay)[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]; ///< delay - added to the next block
DECLARE_ALIGNED(32, float, window)[AC3_BLOCK_SIZE]; ///< window coefficients
*/
void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch);
-void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2],
- int out_ch, int in_ch, int len);
-
/**
* Apply spectral extension to each channel by copying lower frequency
* coefficients to higher frequency bins and applying side information to