X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fac3dec.h;h=cad207748b8939e209efd22e40d8953ec2fdcae6;hb=f38e450746ca52c7965146ebdbcdd4cc30ad1fd9;hp=76f9a9ff5b85f9ad2b59d0daae8454b594a8cf93;hpb=14b7062829968e3e6f8974cbea1bbdbf6e83e095;p=ffmpeg diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h index 76f9a9ff5b8..cad207748b8 100644 --- a/libavcodec/ac3dec.h +++ b/libavcodec/ac3dec.h @@ -20,17 +20,16 @@ */ /** - * @file ac3.h + * @file libavcodec/ac3.h * Common code between the AC-3 and E-AC-3 decoders. */ -#ifndef FFMPEG_AC3DEC_H -#define FFMPEG_AC3DEC_H +#ifndef AVCODEC_AC3DEC_H +#define AVCODEC_AC3DEC_H -#include "libavutil/random.h" -#include "ac3tab.h" +#include "libavutil/lfg.h" #include "ac3.h" -#include "bitstream.h" +#include "get_bits.h" #include "dsputil.h" /* override ac3.h to include coupling channel */ @@ -58,6 +57,7 @@ typedef struct { int sample_rate; ///< sample frequency, in Hz int num_blocks; ///< number of audio blocks 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 center_mix_level; ///< Center mix level index @@ -81,9 +81,8 @@ typedef struct { int channel_in_cpl[AC3_MAX_CHANNELS]; ///< channel in coupling (chincpl) int phase_flags_in_use; ///< phase flags in use (phsflginu) int phase_flags[18]; ///< phase flags (phsflg) - int num_cpl_subbands; ///< number of coupling sub bands (ncplsubnd) int num_cpl_bands; ///< number of coupling bands (ncplbnd) - int cpl_band_struct[18]; ///< coupling band structure (cplbndstrc) + uint8_t cpl_band_sizes[18]; ///< number of coeffs in each coupling band int firstchincpl; ///< first channel in coupling int first_cpl_coords[AC3_MAX_CHANNELS]; ///< first coupling coordinates states (firstcplcos) int cpl_coords[AC3_MAX_CHANNELS][18]; ///< coupling coordinates (cplco) @@ -99,7 +98,6 @@ typedef struct { int channels; ///< number of total channels int lfe_ch; ///< index of LFE channel float downmix_coeffs[AC3_MAX_CHANNELS][2]; ///< stereo downmix coefficients - float downmix_coeff_adjust[2]; ///< adjustment needed for each output channel when downmixing int downmixed; ///< indicates if coeffs are currently downmixed int output_mode; ///< output channel configuration int out_channels; ///< number of output channels @@ -142,15 +140,14 @@ typedef struct { ///@} ///@defgroup dithering zero-mantissa dithering - int dither_all; ///< true if all channels are dithered int dither_flag[AC3_MAX_CHANNELS]; ///< dither flags (dithflg) - AVRandomState dith_state; ///< for dither generation + AVLFG dith_state; ///< for dither generation ///@} ///@defgroup imdct IMDCT int block_switch[AC3_MAX_CHANNELS]; ///< block switch flags (blksw) - MDCTContext imdct_512; ///< for 512 sample IMDCT - MDCTContext imdct_256; ///< for 256 sample IMDCT + FFTContext imdct_512; ///< for 512 sample IMDCT + FFTContext imdct_256; ///< for 256 sample IMDCT ///@} ///@defgroup opt optimization @@ -159,17 +156,26 @@ typedef struct { float mul_bias; ///< scaling for float_to_int16 conversion ///@} - int fixed_coeffs[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///> fixed-point transform coefficients - ///@defgroup arrays aligned arrays + DECLARE_ALIGNED_16(int, fixed_coeffs[AC3_MAX_CHANNELS][AC3_MAX_COEFS]); ///> fixed-point transform coefficients DECLARE_ALIGNED_16(float, transform_coeffs[AC3_MAX_CHANNELS][AC3_MAX_COEFS]); ///< transform coefficients DECLARE_ALIGNED_16(float, delay[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]); ///< delay - added to the next block DECLARE_ALIGNED_16(float, window[AC3_BLOCK_SIZE]); ///< window coefficients - DECLARE_ALIGNED_16(float, tmp_output[AC3_BLOCK_SIZE*2]); ///< temporary storage for output before windowing - DECLARE_ALIGNED_16(float, tmp_imdct[AC3_BLOCK_SIZE]); ///< temporary storage for imdct transform + DECLARE_ALIGNED_16(float, tmp_output[AC3_BLOCK_SIZE]); ///< temporary storage for output before windowing DECLARE_ALIGNED_16(float, output[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]); ///< output after imdct transform and windowing - DECLARE_ALIGNED_16(short, int_output[AC3_MAX_CHANNELS-1][AC3_BLOCK_SIZE]); ///< final 16-bit integer output ///@} } AC3DecodeContext; -#endif /* FFMPEG_AC3DEC_H */ +/** + * Parse the E-AC-3 frame header. + * This parses both the bit stream info and audio frame header. + */ +int ff_eac3_parse_header(AC3DecodeContext *s); + +/** + * Decode mantissas in a single channel for the entire frame. + * This is used when AHT mode is enabled. + */ +void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch); + +#endif /* AVCODEC_AC3DEC_H */