]> git.sesse.net Git - ffmpeg/blob - libavcodec/ac3dec.h
196541ac493dcdc533d4695ab6f0242630ffc184
[ffmpeg] / libavcodec / ac3dec.h
1 /*
2  * Common code between AC3 and E-AC3 decoder
3  * Copyright (c) 2007 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file ac3.h
24  * Common code between AC3 and E-AC3 decoder.
25  */
26
27 #ifndef FFMPEG_AC3DEC_H
28 #define FFMPEG_AC3DEC_H
29
30 #include "libavutil/random.h"
31 #include "ac3tab.h"
32 #include "ac3.h"
33 #include "bitstream.h"
34 #include "dsputil.h"
35
36 /* override ac3.h to include coupling channel */
37 #undef AC3_MAX_CHANNELS
38 #define AC3_MAX_CHANNELS 7
39 #define CPL_CH 0
40
41 #define AC3_OUTPUT_LFEON  8
42
43 typedef struct {
44     AVCodecContext *avctx;                  ///< parent context
45     GetBitContext gbc;                      ///< bitstream reader
46     uint8_t *input_buffer;                  ///< temp buffer to prevent overread
47
48 ///@defgroup bsi bit stream information
49 ///@{
50     int frame_type;                         ///< frame type (strmtyp)
51     int substreamid;                        ///< substream identification
52     int frame_size;                         ///< current frame size, in bytes
53     int bit_rate;                           ///< stream bit rate, in bits-per-second
54     int sample_rate;                        ///< sample frequency, in Hz
55     int num_blocks;                         ///< number of audio blocks
56     int channel_mode;                       ///< channel mode (acmod)
57     int lfe_on;                             ///< lfe channel in use
58     int center_mix_level;                   ///< Center mix level index
59     int surround_mix_level;                 ///< Surround mix level index
60 ///@}
61
62 ///@defgroup cpl standard coupling
63     int cpl_in_use;                         ///< coupling in use
64     int channel_in_cpl[AC3_MAX_CHANNELS];   ///< channel in coupling
65     int phase_flags_in_use;                 ///< phase flags in use
66     int phase_flags[18];                    ///< phase flags
67     int num_cpl_subbands;                   ///< number of coupling sub bands
68     int num_cpl_bands;                      ///< number of coupling bands
69     int cpl_band_struct[18];                ///< coupling band structure
70     int cpl_coords[AC3_MAX_CHANNELS][18];   ///< coupling coordinates
71 ///@}
72
73 ///@defgroup channel channel
74     int fbw_channels;                           ///< number of full-bandwidth channels
75     int channels;                               ///< number of total channels
76     int lfe_ch;                                 ///< index of LFE channel
77     float downmix_coeffs[AC3_MAX_CHANNELS][2];  ///< stereo downmix coefficients
78     float downmix_coeff_adjust[2];              ///< adjustment needed for each output channel when downmixing
79     int downmixed;                              ///< indicates if coeffs are currently downmixed
80     int output_mode;                            ///< output channel configuration
81     int out_channels;                           ///< number of output channels
82 ///@}
83
84 ///@defgroup dynrng dynamic range
85     float dynamic_range[2];                 ///< dynamic range
86 ///@}
87
88 ///@defgroup bandwidth bandwidth
89     int start_freq[AC3_MAX_CHANNELS];       ///< start frequency bin
90     int end_freq[AC3_MAX_CHANNELS];         ///< end frequency bin
91 ///@}
92
93 ///@defgroup rematrixing rematrixing
94     int num_rematrixing_bands;              ///< number of rematrixing bands
95     int rematrixing_flags[4];               ///< rematrixing flags
96 ///@}
97
98 ///@defgroup exponents exponents
99     int num_exp_groups[AC3_MAX_CHANNELS];   ///< Number of exponent groups
100     int8_t dexps[AC3_MAX_CHANNELS][256];    ///< decoded exponents
101     int exp_strategy[AC3_MAX_CHANNELS];     ///< exponent strategies
102 ///@}
103
104 ///@defgroup bitalloc bit allocation
105     AC3BitAllocParameters bit_alloc_params;     ///< bit allocation parameters
106     int snr_offset[AC3_MAX_CHANNELS];           ///< signal-to-noise ratio offsets
107     int fast_gain[AC3_MAX_CHANNELS];            ///< fast gain values (signal-to-mask ratio)
108     uint8_t bap[AC3_MAX_CHANNELS][256];         ///< bit allocation pointers
109     int16_t psd[AC3_MAX_CHANNELS][256];         ///< scaled exponents
110     int16_t band_psd[AC3_MAX_CHANNELS][50];     ///< interpolated exponents
111     int16_t mask[AC3_MAX_CHANNELS][50];         ///< masking curve values
112     int dba_mode[AC3_MAX_CHANNELS];             ///< delta bit allocation mode
113     int dba_nsegs[AC3_MAX_CHANNELS];            ///< number of delta segments
114     uint8_t dba_offsets[AC3_MAX_CHANNELS][8];   ///< delta segment offsets
115     uint8_t dba_lengths[AC3_MAX_CHANNELS][8];   ///< delta segment lengths
116     uint8_t dba_values[AC3_MAX_CHANNELS][8];    ///< delta values for each segment
117 ///@}
118
119 ///@defgroup dithering zero-mantissa dithering
120     int dither_all;                         ///< true if all channels are dithered
121     int dither_flag[AC3_MAX_CHANNELS];      ///< dither flags
122     AVRandomState dith_state;               ///< for dither generation
123 ///@}
124
125 ///@defgroup imdct IMDCT
126     int block_switch[AC3_MAX_CHANNELS];     ///< block switch flags
127     MDCTContext imdct_512;                  ///< for 512 sample IMDCT
128     MDCTContext imdct_256;                  ///< for 256 sample IMDCT
129 ///@}
130
131 ///@defgroup opt optimization
132     DSPContext dsp;                         ///< for optimization
133     float add_bias;                         ///< offset for float_to_int16 conversion
134     float mul_bias;                         ///< scaling for float_to_int16 conversion
135 ///@}
136
137     int fixed_coeffs[AC3_MAX_CHANNELS][256];    ///> fixed-point transform coefficients
138
139 ///@defgroup arrays aligned arrays
140     DECLARE_ALIGNED_16(float, transform_coeffs[AC3_MAX_CHANNELS][256]); ///< transform coefficients
141     DECLARE_ALIGNED_16(float, delay[AC3_MAX_CHANNELS][256]);            ///< delay - added to the next block
142     DECLARE_ALIGNED_16(float, window[256]);                             ///< window coefficients
143     DECLARE_ALIGNED_16(float, tmp_output[512]);                         ///< temporary storage for output before windowing
144     DECLARE_ALIGNED_16(float, tmp_imdct[256]);                          ///< temporary storage for imdct transform
145     DECLARE_ALIGNED_16(float, output[AC3_MAX_CHANNELS][256]);           ///< output after imdct transform and windowing
146     DECLARE_ALIGNED_16(short, int_output[AC3_MAX_CHANNELS-1][256]);     ///< final 16-bit integer output
147 ///@}
148 } AC3DecodeContext;
149
150 #endif /* FFMPEG_AC3DEC_H */