ac3dec.h
Go to the documentation of this file.
1 /*
2  * Common code between the AC-3 and E-AC-3 decoders
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
24  * Common code between the AC-3 and E-AC-3 decoders.
25  *
26  * Summary of MDCT Coefficient Grouping:
27  * The individual MDCT coefficient indices are often referred to in the
28  * (E-)AC-3 specification as frequency bins. These bins are grouped together
29  * into subbands of 12 coefficients each. The subbands are grouped together
30  * into bands as defined in the bitstream by the band structures, which
31  * determine the number of bands and the size of each band. The full spectrum
32  * of 256 frequency bins is divided into 1 DC bin + 21 subbands = 253 bins.
33  * This system of grouping coefficients is used for channel bandwidth, stereo
34  * rematrixing, channel coupling, enhanced coupling, and spectral extension.
35  *
36  * +-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-+
37  * |1| |12| | [12|12|12|12] | | | | | | | | | | | | |3|
38  * +-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-+
39  * ~~~ ~~~~ ~~~~~~~~~~~~~ ~~~
40  * | | | |
41  * | | | 3 unused frequency bins--+
42  * | | |
43  * | | +--1 band containing 4 subbands
44  * | |
45  * | +--1 subband of 12 frequency bins
46  * |
47  * +--DC frequency bin
48  */
49 
50 #ifndef AVCODEC_AC3DEC_H
51 #define AVCODEC_AC3DEC_H
52 
53 #include "libavutil/float_dsp.h"
54 #include "libavutil/lfg.h"
55 #include "ac3.h"
56 #include "ac3dsp.h"
57 #include "get_bits.h"
58 #include "dsputil.h"
59 #include "fft.h"
60 #include "fmtconvert.h"
61 
62 #define AC3_OUTPUT_LFEON 8
63 
64 #define SPX_MAX_BANDS 17
65 
66 /** Large enough for maximum possible frame size when the specification limit is ignored */
67 #define AC3_FRAME_BUFFER_SIZE 32768
68 
69 typedef struct AC3DecodeContext {
70  AVClass *class; ///< class for AVOptions
71  AVCodecContext *avctx; ///< parent context
72  GetBitContext gbc; ///< bitstream reader
73 
74 ///@name Bit stream information
75 ///@{
76  int frame_type; ///< frame type (strmtyp)
77  int substreamid; ///< substream identification
78  int frame_size; ///< current frame size, in bytes
79  int bit_rate; ///< stream bit rate, in bits-per-second
80  int sample_rate; ///< sample frequency, in Hz
81  int num_blocks; ///< number of audio blocks
82  int bitstream_mode; ///< bitstream mode (bsmod)
83  int channel_mode; ///< channel mode (acmod)
84  int channel_layout; ///< channel layout
85  int lfe_on; ///< lfe channel in use
86  int channel_map; ///< custom channel map
87  int center_mix_level; ///< Center mix level index
88  int surround_mix_level; ///< Surround mix level index
89  int eac3; ///< indicates if current frame is E-AC-3
90 ///@}
91 
92  int preferred_stereo_downmix;
93  float ltrt_center_mix_level;
94  float ltrt_surround_mix_level;
95  float loro_center_mix_level;
96  float loro_surround_mix_level;
97 
98 ///@name Frame syntax parameters
99  int snr_offset_strategy; ///< SNR offset strategy (snroffststr)
100  int block_switch_syntax; ///< block switch syntax enabled (blkswe)
101  int dither_flag_syntax; ///< dither flag syntax enabled (dithflage)
102  int bit_allocation_syntax; ///< bit allocation model syntax enabled (bamode)
103  int fast_gain_syntax; ///< fast gain codes enabled (frmfgaincode)
104  int dba_syntax; ///< delta bit allocation syntax enabled (dbaflde)
105  int skip_syntax; ///< skip field syntax enabled (skipflde)
106  ///@}
107 
108 ///@name Standard coupling
109  int cpl_in_use[AC3_MAX_BLOCKS]; ///< coupling in use (cplinu)
110  int cpl_strategy_exists[AC3_MAX_BLOCKS];///< coupling strategy exists (cplstre)
111  int channel_in_cpl[AC3_MAX_CHANNELS]; ///< channel in coupling (chincpl)
112  int phase_flags_in_use; ///< phase flags in use (phsflginu)
113  int phase_flags[AC3_MAX_CPL_BANDS]; ///< phase flags (phsflg)
114  int num_cpl_bands; ///< number of coupling bands (ncplbnd)
115  uint8_t cpl_band_sizes[AC3_MAX_CPL_BANDS]; ///< number of coeffs in each coupling band
116  int firstchincpl; ///< first channel in coupling
117  int first_cpl_coords[AC3_MAX_CHANNELS]; ///< first coupling coordinates states (firstcplcos)
118  int cpl_coords[AC3_MAX_CHANNELS][AC3_MAX_CPL_BANDS]; ///< coupling coordinates (cplco)
119 ///@}
120 
121 ///@name Spectral extension
122 ///@{
123  int spx_in_use; ///< spectral extension in use (spxinu)
124  uint8_t channel_uses_spx[AC3_MAX_CHANNELS]; ///< channel uses spectral extension (chinspx)
125  int8_t spx_atten_code[AC3_MAX_CHANNELS]; ///< spx attenuation code (spxattencod)
126  int spx_src_start_freq; ///< spx start frequency bin
127  int spx_dst_end_freq; ///< spx end frequency bin
128  int spx_dst_start_freq; ///< spx starting frequency bin for copying (copystartmant)
129  ///< the copy region ends at the start of the spx region.
130  int num_spx_bands; ///< number of spx bands (nspxbnds)
131  uint8_t spx_band_sizes[SPX_MAX_BANDS]; ///< number of bins in each spx band
132  uint8_t first_spx_coords[AC3_MAX_CHANNELS]; ///< first spx coordinates states (firstspxcos)
133  float spx_noise_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS]; ///< spx noise blending factor (nblendfact)
134  float spx_signal_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS];///< spx signal blending factor (sblendfact)
135 ///@}
136 
137 ///@name Adaptive hybrid transform
138  int channel_uses_aht[AC3_MAX_CHANNELS]; ///< channel AHT in use (chahtinu)
139  int pre_mantissa[AC3_MAX_CHANNELS][AC3_MAX_COEFS][AC3_MAX_BLOCKS]; ///< pre-IDCT mantissas
140 ///@}
141 
142 ///@name Channel
143  int fbw_channels; ///< number of full-bandwidth channels
144  int channels; ///< number of total channels
145  int lfe_ch; ///< index of LFE channel
146  float downmix_coeffs[AC3_MAX_CHANNELS][2]; ///< stereo downmix coefficients
147  int downmixed; ///< indicates if coeffs are currently downmixed
148  int output_mode; ///< output channel configuration
149  int out_channels; ///< number of output channels
150 ///@}
151 
152 ///@name Dynamic range
153  float dynamic_range[2]; ///< dynamic range
154  float drc_scale; ///< percentage of dynamic range compression to be applied
155 ///@}
156 
157 ///@name Bandwidth
158  int start_freq[AC3_MAX_CHANNELS]; ///< start frequency bin (strtmant)
159  int end_freq[AC3_MAX_CHANNELS]; ///< end frequency bin (endmant)
160 ///@}
161 
162 ///@name Rematrixing
163  int num_rematrixing_bands; ///< number of rematrixing bands (nrematbnd)
164  int rematrixing_flags[4]; ///< rematrixing flags (rematflg)
165 ///@}
166 
167 ///@name Exponents
168  int num_exp_groups[AC3_MAX_CHANNELS]; ///< Number of exponent groups (nexpgrp)
169  int8_t dexps[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< decoded exponents
170  int exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS]; ///< exponent strategies (expstr)
171 ///@}
172 
173 ///@name Bit allocation
174  AC3BitAllocParameters bit_alloc_params; ///< bit allocation parameters
175  int first_cpl_leak; ///< first coupling leak state (firstcplleak)
176  int snr_offset[AC3_MAX_CHANNELS]; ///< signal-to-noise ratio offsets (snroffst)
177  int fast_gain[AC3_MAX_CHANNELS]; ///< fast gain values/SMR's (fgain)
178  uint8_t bap[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< bit allocation pointers
179  int16_t psd[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< scaled exponents
180  int16_t band_psd[AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS]; ///< interpolated exponents
181  int16_t mask[AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS]; ///< masking curve values
182  int dba_mode[AC3_MAX_CHANNELS]; ///< delta bit allocation mode
183  int dba_nsegs[AC3_MAX_CHANNELS]; ///< number of delta segments
184  uint8_t dba_offsets[AC3_MAX_CHANNELS][8]; ///< delta segment offsets
185  uint8_t dba_lengths[AC3_MAX_CHANNELS][8]; ///< delta segment lengths
186  uint8_t dba_values[AC3_MAX_CHANNELS][8]; ///< delta values for each segment
187 ///@}
188 
189 ///@name Zero-mantissa dithering
190  int dither_flag[AC3_MAX_CHANNELS]; ///< dither flags (dithflg)
191  AVLFG dith_state; ///< for dither generation
192 ///@}
193 
194 ///@name IMDCT
195  int block_switch[AC3_MAX_CHANNELS]; ///< block switch flags (blksw)
196  FFTContext imdct_512; ///< for 512 sample IMDCT
197  FFTContext imdct_256; ///< for 256 sample IMDCT
198 ///@}
199 
200 ///@name Optimization
201  DSPContext dsp; ///< for optimization
202  AVFloatDSPContext fdsp;
203  AC3DSPContext ac3dsp;
204  FmtConvertContext fmt_conv; ///< optimized conversion functions
205 ///@}
206 
207  float *outptr[AC3_MAX_CHANNELS];
208  float *xcfptr[AC3_MAX_CHANNELS];
209  float *dlyptr[AC3_MAX_CHANNELS];
210 
211 ///@name Aligned arrays
212  DECLARE_ALIGNED(16, int, fixed_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< fixed-point transform coefficients
213  DECLARE_ALIGNED(32, float, transform_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; ///< transform coefficients
214  DECLARE_ALIGNED(32, float, delay)[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]; ///< delay - added to the next block
215  DECLARE_ALIGNED(32, float, window)[AC3_BLOCK_SIZE]; ///< window coefficients
216  DECLARE_ALIGNED(32, float, tmp_output)[AC3_BLOCK_SIZE]; ///< temporary storage for output before windowing
217  DECLARE_ALIGNED(32, float, output)[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]; ///< output after imdct transform and windowing
218  DECLARE_ALIGNED(32, uint8_t, input_buffer)[AC3_FRAME_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; ///< temp buffer to prevent overread
219 ///@}
220 } AC3DecodeContext;
221 
222 /**
223  * Parse the E-AC-3 frame header.
224  * This parses both the bit stream info and audio frame header.
225  */
226 int ff_eac3_parse_header(AC3DecodeContext *s);
227 
228 /**
229  * Decode mantissas in a single channel for the entire frame.
230  * This is used when AHT mode is enabled.
231  */
232 void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch);
233 
234 /**
235  * Apply spectral extension to each channel by copying lower frequency
236  * coefficients to higher frequency bins and applying side information to
237  * approximate the original high frequency signal.
238  */
239 void ff_eac3_apply_spectral_extension(AC3DecodeContext *s);
240 
241 #endif /* AVCODEC_AC3DEC_H */
Definition: lfg.h:25
const char * s
Definition: avisynth_c.h:668
#define AC3_MAX_COEFS
Definition: ac3.h:34
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:59
uint8_t
static const int fixed_coeffs[3][3]
Definition: shorten.c:268
bitstream reader API header.
static const uint8_t frame_size[4]
Definition: g723_1_data.h:58
static const uint16_t mask[17]
Definition: lzw.c:37
#define AC3_MAX_CHANNELS
maximum number of channels, including coupling channel
Definition: ac3.h:31
overlapping window(triangular window to avoid too much overlapping) ovidx
#define AC3_BLOCK_SIZE
Definition: ac3.h:35
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
Definition: fft.h:62
void ff_eac3_apply_spectral_extension(AC3DecodeContext *s)
Definition: eac3dec.c:66
int ff_eac3_parse_header(AC3DecodeContext *s)
Definition: eac3dec.c:291
sample_rate
main external API structure.
#define AC3_CRITICAL_BANDS
Definition: ac3.h:39
Describe the class of an AVClass context structure.
Definition: log.h:50
#define AC3_MAX_BLOCKS
Definition: ac3.h:36
#define AC3_MAX_CPL_BANDS
Definition: ac3.h:40
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
DSP utils.
void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
Definition: eac3dec.c:198
Common code between the AC-3 encoder and decoder.
DSPContext.
Definition: dsputil.h:127