Go to the documentation of this file.
1 /*
2  * AC-3 encoder & E-AC-3 encoder common header
3  * Copyright (c) 2000 Fabrice Bellard
4  * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
23 /**
24  * @file
25  * AC-3 encoder & E-AC-3 encoder common header
26  */
28 #ifndef AVCODEC_AC3ENC_H
29 #define AVCODEC_AC3ENC_H
31 #include <stdint.h>
33 #include "libavutil/float_dsp.h"
35 #include "ac3.h"
36 #include "ac3dsp.h"
37 #include "avcodec.h"
38 #include "fft.h"
39 #include "mathops.h"
40 #include "me_cmp.h"
41 #include "put_bits.h"
42 #include "audiodsp.h"
45 #define CONFIG_AC3ENC_FLOAT 0
46 #endif
48 #define OFFSET(param) offsetof(AC3EncodeContext, options.param)
51 #define AC3ENC_TYPE_AC3_FIXED 0
52 #define AC3ENC_TYPE_AC3 1
53 #define AC3ENC_TYPE_EAC3 2
56 #define AC3_NAME(x) ff_ac3_float_ ## x
57 #define MAC_COEF(d,a,b) ((d)+=(a)*(b))
58 #define COEF_MIN (-16777215.0/16777216.0)
59 #define COEF_MAX ( 16777215.0/16777216.0)
61 typedef float SampleType;
62 typedef float CoefType;
63 typedef float CoefSumType;
64 #else
65 #define AC3_NAME(x) ff_ac3_fixed_ ## x
66 #define MAC_COEF(d,a,b) MAC64(d,a,b)
67 #define COEF_MIN -16777215
68 #define COEF_MAX 16777215
69 #define NEW_CPL_COORD_THRESHOLD 503317
70 typedef int16_t SampleType;
71 typedef int32_t CoefType;
72 typedef int64_t CoefSumType;
73 #endif
75 /* common option values */
76 #define AC3ENC_OPT_NONE -1
77 #define AC3ENC_OPT_AUTO -1
78 #define AC3ENC_OPT_OFF 0
79 #define AC3ENC_OPT_ON 1
81 #define AC3ENC_OPT_MODE_ON 2
82 #define AC3ENC_OPT_MODE_OFF 1
85 /* specific option values */
86 #define AC3ENC_OPT_LARGE_ROOM 1
87 #define AC3ENC_OPT_SMALL_ROOM 2
90 #define AC3ENC_OPT_DOWNMIX_DPLII 3 // reserved value in A/52, but used by encoders to indicate DPL2
95 /**
96  * Encoding Options used by AVOption.
97  */
98 typedef struct AC3EncOptions {
99  /* AC-3 metadata options*/
109  int original;
123  /* other encoding options */
128 } AC3EncOptions;
130 /**
131  * Data for a single audio block.
132  */
133 typedef struct AC3Block {
134  CoefType **mdct_coef; ///< MDCT coefficients
135  int32_t **fixed_coef; ///< fixed-point MDCT coefficients
136  uint8_t **exp; ///< original exponents
137  uint8_t **grouped_exp; ///< grouped exponents
138  int16_t **psd; ///< psd per frequency bin
139  int16_t **band_psd; ///< psd per critical band
140  int16_t **mask; ///< masking curve
141  uint16_t **qmant; ///< quantized mantissas
142  uint8_t **cpl_coord_exp; ///< coupling coord exponents (cplcoexp)
143  uint8_t **cpl_coord_mant; ///< coupling coord mantissas (cplcomant)
144  uint8_t coeff_shift[AC3_MAX_CHANNELS]; ///< fixed-point coefficient shift values
145  uint8_t new_rematrixing_strategy; ///< send new rematrixing flags in this block
146  int num_rematrixing_bands; ///< number of rematrixing bands
147  uint8_t rematrixing_flags[4]; ///< rematrixing flags
148  int new_cpl_strategy; ///< send new coupling strategy
149  int cpl_in_use; ///< coupling in use for this block (cplinu)
150  uint8_t channel_in_cpl[AC3_MAX_CHANNELS]; ///< channel in coupling (chincpl)
151  int num_cpl_channels; ///< number of channels in coupling
152  uint8_t new_cpl_coords[AC3_MAX_CHANNELS]; ///< send new coupling coordinates (cplcoe)
153  uint8_t cpl_master_exp[AC3_MAX_CHANNELS]; ///< coupling coord master exponents (mstrcplco)
154  int new_snr_offsets; ///< send new SNR offsets
155  int new_cpl_leak; ///< send new coupling leak info
156  int end_freq[AC3_MAX_CHANNELS]; ///< end frequency bin (endmant)
157 } AC3Block;
159 /**
160  * AC-3 encoder private context.
161  */
162 typedef struct AC3EncodeContext {
163  AVClass *av_class; ///< AVClass used for AVOption
164  AC3EncOptions options; ///< encoding options
165  AVCodecContext *avctx; ///< parent AVCodecContext
166  PutBitContext pb; ///< bitstream writer context
170  AC3DSPContext ac3dsp; ///< AC-3 optimized functions
171  FFTContext mdct; ///< FFT context for MDCT calculation
172  const SampleType *mdct_window; ///< MDCT window function array
174  AC3Block blocks[AC3_MAX_BLOCKS]; ///< per-block info
176  int fixed_point; ///< indicates if fixed-point encoder is being used
177  int eac3; ///< indicates if this is E-AC-3 vs. AC-3
178  int bitstream_id; ///< bitstream id (bsid)
179  int bitstream_mode; ///< bitstream mode (bsmod)
181  int bit_rate; ///< target bit rate, in bits-per-second
182  int sample_rate; ///< sampling frequency, in Hz
184  int num_blks_code; ///< number of blocks code (numblkscod)
185  int num_blocks; ///< number of blocks per frame
186  int frame_size_min; ///< minimum frame size in case rounding is necessary
187  int frame_size; ///< current frame size in bytes
188  int frame_size_code; ///< frame size code (frmsizecod)
189  uint16_t crc_inv[2];
190  int64_t bits_written; ///< bit count (used to avg. bitrate)
191  int64_t samples_written; ///< sample count (used to avg. bitrate)
193  int fbw_channels; ///< number of full-bandwidth channels (nfchans)
194  int channels; ///< total number of channels (nchans)
195  int lfe_on; ///< indicates if there is an LFE channel (lfeon)
196  int lfe_channel; ///< channel index of the LFE channel
197  int has_center; ///< indicates if there is a center channel
198  int has_surround; ///< indicates if there are one or more surround channels
199  int channel_mode; ///< channel mode (acmod)
200  const uint8_t *channel_map; ///< channel map used to reorder channels
202  int center_mix_level; ///< center mix level code
203  int surround_mix_level; ///< surround mix level code
204  int ltrt_center_mix_level; ///< Lt/Rt center mix level code
205  int ltrt_surround_mix_level; ///< Lt/Rt surround mix level code
206  int loro_center_mix_level; ///< Lo/Ro center mix level code
207  int loro_surround_mix_level; ///< Lo/Ro surround mix level code
209  int cutoff; ///< user-specified cutoff frequency, in Hz
210  int bandwidth_code; ///< bandwidth code (0 to 60) (chbwcod)
211  int start_freq[AC3_MAX_CHANNELS]; ///< start frequency bin (strtmant)
212  int cpl_end_freq; ///< coupling channel end frequency bin
214  int cpl_on; ///< coupling turned on for this frame
215  int cpl_enabled; ///< coupling enabled for all frames
216  int num_cpl_subbands; ///< number of coupling subbands (ncplsubnd)
217  int num_cpl_bands; ///< number of coupling bands (ncplbnd)
218  uint8_t cpl_band_sizes[AC3_MAX_CPL_BANDS]; ///< number of coeffs in each coupling band
220  int rematrixing_enabled; ///< stereo rematrixing enabled
222  /* bitrate allocation control */
223  int slow_gain_code; ///< slow gain code (sgaincod)
224  int slow_decay_code; ///< slow decay code (sdcycod)
225  int fast_decay_code; ///< fast decay code (fdcycod)
226  int db_per_bit_code; ///< dB/bit code (dbpbcod)
227  int floor_code; ///< floor code (floorcod)
228  AC3BitAllocParameters bit_alloc; ///< bit allocation parameters
229  int coarse_snr_offset; ///< coarse SNR offsets (csnroffst)
230  int fast_gain_code[AC3_MAX_CHANNELS]; ///< fast gain codes (signal-to-mask ratio) (fgaincod)
231  int fine_snr_offset[AC3_MAX_CHANNELS]; ///< fine SNR offsets (fsnroffst)
232  int frame_bits_fixed; ///< number of non-coefficient bits for fixed parameters
233  int frame_bits; ///< all frame bits except exponents and mantissas
234  int exponent_bits; ///< number of bits used for exponents
244  int16_t *psd_buffer;
245  int16_t *band_psd_buffer;
246  int16_t *mask_buffer;
247  int16_t *qmant_buffer;
251  uint8_t exp_strategy[AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< exponent strategies
252  uint8_t frame_exp_strategy[AC3_MAX_CHANNELS]; ///< frame exp strategy index
253  int use_frame_exp_strategy; ///< indicates use of frame exp strategy
254  uint8_t exp_ref_block[AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< reference blocks for EXP_REUSE
255  uint8_t *ref_bap [AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< bit allocation pointers (bap)
256  int ref_bap_set; ///< indicates if ref_bap pointers have been set
260  /* fixed vs. float function pointers */
264  /* fixed vs. float templated function pointers */
267  /* AC-3 vs. E-AC-3 function pointers */
272 extern const uint64_t ff_ac3_channel_layouts[19];
295 void ff_ac3_output_frame(AC3EncodeContext *s, unsigned char *frame);
298 /* prototypes for functions in ac3enc_fixed.c and ac3enc_float.c */
307 /* prototypes for functions in ac3enc_template.c */
313  const AVFrame *frame, int *got_packet_ptr);
315  const AVFrame *frame, int *got_packet_ptr);
317 #endif /* AVCODEC_AC3ENC_H */
uint8_t new_rematrixing_strategy
send new rematrixing flags in this block
Definition: ac3enc.h:145
int eac3_mixing_metadata
Definition: ac3enc.h:120
AVFloatDSPContext * fdsp
Definition: ac3enc.h:168
int ff_ac3_encode_init(AVCodecContext *avctx)
Definition: ac3enc.c:2409
int dialogue_level
Definition: ac3enc.h:100
This structure describes decoded (raw) audio or video data.
Definition: frame.h:314
int db_per_bit_code
dB/bit code (dbpbcod)
Definition: ac3enc.h:226
int AC3_NAME() allocate_sample_buffers(AC3EncodeContext *s)
int slow_decay_code
slow decay code (sdcycod)
Definition: ac3enc.h:224
Encoding Options used by AVOption.
Definition: ac3enc.h:98
int ff_ac3_fixed_allocate_sample_buffers(AC3EncodeContext *s)
float loro_surround_mix_level
Definition: ac3enc.h:115
int channel_coupling
Definition: ac3enc.h:126
int dolby_surround_ex_mode
Definition: ac3enc.h:117
uint8_t ** cpl_coord_exp
coupling coord exponents (cplcoexp)
Definition: ac3enc.h:142
int bandwidth_code
bandwidth code (0 to 60) (chbwcod)
Definition: ac3enc.h:210
uint8_t * grouped_exp_buffer
Definition: ac3enc.h:243
int16_t ** psd
psd per frequency bin
Definition: ac3enc.h:138
int frame_size_code
frame size code (frmsizecod)
Definition: ac3enc.h:188
int frame_bits
all frame bits except exponents and mantissas
Definition: ac3enc.h:233
const uint64_t ff_ac3_channel_layouts[19]
List of supported channel layouts.
Definition: ac3enc.c:81
uint8_t ** cpl_coord_mant
coupling coord mantissas (cplcomant)
Definition: ac3enc.h:143
uint16_t ** qmant
quantized mantissas
Definition: ac3enc.h:141
int ff_ac3_validate_metadata(AC3EncodeContext *s)
Validate metadata options as set by AVOption system.
Definition: ac3enc.c:1833
PutBitContext pb
bitstream writer context
Definition: ac3enc.h:166
int num_cpl_channels
number of channels in coupling
Definition: ac3enc.h:151
AC3BitAllocParameters bit_alloc
bit allocation parameters
Definition: ac3enc.h:228
int ff_ac3_float_allocate_sample_buffers(AC3EncodeContext *s)
float ltrt_surround_mix_level
Definition: ac3enc.h:113
int ff_ac3_float_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int new_cpl_leak
send new coupling leak info
Definition: ac3enc.h:155
int rematrixing_enabled
stereo rematrixing enabled
Definition: ac3enc.h:220
int bitstream_mode
Definition: ac3enc.h:101
int ff_ac3_float_encode_init(AVCodecContext *avctx)
Definition: ac3enc_float.c:132
int channel_mode
channel mode (acmod)
Definition: ac3enc.h:199
int num_cpl_subbands
number of coupling subbands (ncplsubnd)
Definition: ac3enc.h:216
float surround_mix_level
Definition: ac3enc.h:103
int fbw_channels
number of full-bandwidth channels (nfchans)
Definition: ac3enc.h:193
int ff_ac3_compute_bit_allocation(AC3EncodeContext *s)
Definition: ac3enc.c:1146
uint8_t * bap1_buffer
Definition: ac3enc.h:239
int slow_gain_code
slow gain code (sgaincod)
Definition: ac3enc.h:223
uint8_t ** exp
original exponents
Definition: ac3enc.h:136
int num_rematrixing_bands
number of rematrixing bands
Definition: ac3enc.h:146
AC3DSPContext ac3dsp
AC-3 optimized functions.
Definition: ac3enc.h:170
int loro_center_mix_level
Lo/Ro center mix level code.
Definition: ac3enc.h:206
int num_cpl_bands
number of coupling bands (ncplbnd)
Definition: ac3enc.h:217
void ff_ac3_fixed_mdct_end(AC3EncodeContext *s)
Finalize MDCT and free allocated memory.
Definition: ac3enc_fixed.c:118
int lfe_channel
channel index of the LFE channel
Definition: ac3enc.h:196
int ref_bap_set
indicates if ref_bap pointers have been set
Definition: ac3enc.h:256
void ff_ac3_quantize_mantissas(AC3EncodeContext *s)
Quantize mantissas using coefficients, exponents, and bit allocation pointers.
Definition: ac3enc.c:1300
int new_snr_offsets
send new SNR offsets
Definition: ac3enc.h:154
void(* output_frame_header)(struct AC3EncodeContext *s)
Definition: ac3enc.h:268
int64_t CoefSumType
Definition: ac3enc.h:72
int loro_surround_mix_level
Lo/Ro surround mix level code.
Definition: ac3enc.h:207
CoefType ** mdct_coef
MDCT coefficients.
Definition: ac3enc.h:134
int eac3_info_metadata
Definition: ac3enc.h:121
int mixing_level
Definition: ac3enc.h:106
int num_blks_code
number of blocks code (numblkscod)
Definition: ac3enc.h:184
AC3EncOptions options
encoding options
Definition: ac3enc.h:164
int16_t ** band_psd
psd per critical band
Definition: ac3enc.h:139
AVClass * av_class
AVClass used for AVOption.
Definition: ac3enc.h:163
float ltrt_center_mix_level
Definition: ac3enc.h:112
int channels
total number of channels (nchans)
Definition: ac3enc.h:194
maximum number of channels, including coupling channel
Definition: ac3.h:32
int cpl_on
coupling turned on for this frame
Definition: ac3enc.h:214
int16_t * mask_buffer
Definition: ac3enc.h:246
int16_t * psd_buffer
Definition: ac3enc.h:244
int fixed_point
indicates if fixed-point encoder is being used
Definition: ac3enc.h:176
int ltrt_surround_mix_level
Lt/Rt surround mix level code.
Definition: ac3enc.h:205
int new_cpl_strategy
send new coupling strategy
Definition: ac3enc.h:148
int surround_mix_level
surround mix level code
Definition: ac3enc.h:203
int cpl_in_use
coupling in use for this block (cplinu)
Definition: ac3enc.h:149
int cpl_enabled
coupling enabled for all frames
Definition: ac3enc.h:215
int16_t SampleType
Definition: ac3enc.h:70
Data for a single audio block.
Definition: ac3enc.h:133
int floor_code
floor code (floorcod)
Definition: ac3enc.h:227
int bitstream_mode
bitstream mode (bsmod)
Definition: ac3enc.h:179
int has_surround
indicates if there are one or more surround channels
Definition: ac3enc.h:198
Definition: fft.h:88
AudioDSPContext adsp
Definition: ac3enc.h:167
int eac3
indicates if this is E-AC-3 vs. AC-3
Definition: ac3enc.h:177
void ff_ac3_apply_rematrixing(AC3EncodeContext *s)
Apply stereo rematrixing to coefficients based on rematrixing flags.
Definition: ac3enc.c:272
float loro_center_mix_level
Definition: ac3enc.h:114
int ff_ac3_float_mdct_init(AC3EncodeContext *s)
Initialize MDCT tables.
Definition: ac3enc_float.c:110
int ad_converter_type
Definition: ac3enc.h:119
void ff_ac3_process_exponents(AC3EncodeContext *s)
Calculate final exponents from the supplied MDCT coefficients and exponent shift. ...
Definition: ac3enc.c:637
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
void ff_ac3_compute_coupling_strategy(AC3EncodeContext *s)
Set the initial coupling strategy parameters prior to coupling analysis.
Definition: ac3enc.c:201
#define s(width, name)
Definition: cbs_vp9.c:257
int exponent_bits
number of bits used for exponents
Definition: ac3enc.h:234
int stereo_rematrixing
Definition: ac3enc.h:125
int coarse_snr_offset
coarse SNR offsets (csnroffst)
Definition: ac3enc.h:229
int16_t ** mask
masking curve
Definition: ac3enc.h:140
FFTContext mdct
FFT context for MDCT calculation.
Definition: ac3enc.h:171
const SampleType * mdct_window
MDCT window function array.
Definition: ac3enc.h:172
SampleType ** planar_samples
Definition: ac3enc.h:237
int fast_decay_code
fast decay code (fdcycod)
Definition: ac3enc.h:225
int16_t * qmant_buffer
Definition: ac3enc.h:247
Libavcodec external API header.
int audio_production_info
Definition: ac3enc.h:105
int dolby_surround_mode
Definition: ac3enc.h:104
main external API structure.
Definition: avcodec.h:531
int sample_rate
sampling frequency, in Hz
Definition: ac3enc.h:182
CoefType * mdct_coef_buffer
Definition: ac3enc.h:240
int has_center
indicates if there is a center channel
Definition: ac3enc.h:197
int bit_rate
target bit rate, in bits-per-second
Definition: ac3enc.h:181
const uint8_t * channel_map
channel map used to reorder channels
Definition: ac3enc.h:200
uint8_t * exp_buffer
Definition: ac3enc.h:242
int frame_bits_fixed
number of non-coefficient bits for fixed parameters
Definition: ac3enc.h:232
int warned_alternate_bitstream
Definition: ac3enc.h:258
Describe the class of an AVClass context structure.
Definition: log.h:67
int cpl_start
Definition: ac3enc.h:127
uint8_t * cpl_coord_exp_buffer
Definition: ac3enc.h:248
int ltrt_center_mix_level
Lt/Rt center mix level code.
Definition: ac3enc.h:204
int ff_ac3_fixed_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int center_mix_level
center mix level code
Definition: ac3enc.h:202
#define AC3_MAX_BLOCKS
Definition: ac3.h:37
AC-3 encoder private context.
Definition: ac3enc.h:162
SampleType * windowed_samples
Definition: ac3enc.h:236
int preferred_stereo_downmix
Definition: ac3enc.h:111
int num_blocks
number of blocks per frame
Definition: ac3enc.h:185
void ff_ac3_output_frame(AC3EncodeContext *s, unsigned char *frame)
Write the frame to the output bitstream.
Definition: ac3enc.c:1661
int ff_ac3_encode_close(AVCodecContext *avctx)
Finalize encoding and free any memory allocated by the encoder.
Definition: ac3enc.c:2016
float center_mix_level
Definition: ac3enc.h:102
int extended_bsi_2
Definition: ac3enc.h:116
int frame_size
current frame size in bytes
Definition: ac3enc.h:187
int room_type
Definition: ac3enc.h:107
uint8_t ** grouped_exp
grouped exponents
Definition: ac3enc.h:137
int cpl_end_freq
coupling channel end frequency bin
Definition: ac3enc.h:212
MECmpContext mecc
Definition: ac3enc.h:169
Definition: ac3.h:41
static void mdct_end(FFTContext *s)
Definition: fft.c:277
static void mdct_init(FFTContext **s, int nbits, int inverse, double scale)
Definition: fft.c:232
int64_t bits_written
bit count (used to avg. bitrate)
Definition: ac3enc.h:190
int bitstream_id
bitstream id (bsid)
Definition: ac3enc.h:178
int16_t * band_psd_buffer
Definition: ac3enc.h:245
int dolby_headphone_mode
Definition: ac3enc.h:118
AVCodecContext * avctx
parent AVCodecContext
Definition: ac3enc.h:165
int allow_per_frame_metadata
Definition: ac3enc.h:124
int original
Definition: ac3enc.h:109
uint8_t * bap_buffer
Definition: ac3enc.h:238
int frame_size_min
minimum frame size in case rounding is necessary
Definition: ac3enc.h:186
void ff_ac3_float_mdct_end(AC3EncodeContext *s)
Finalize MDCT and free allocated memory.
Definition: ac3enc_float.c:97
int64_t samples_written
sample count (used to avg. bitrate)
Definition: ac3enc.h:191
uint8_t * cpl_coord_mant_buffer
Definition: ac3enc.h:249
int use_frame_exp_strategy
indicates use of frame exp strategy
Definition: ac3enc.h:253
int ff_ac3_fixed_mdct_init(AC3EncodeContext *s)
Initialize MDCT tables.
Definition: ac3enc_fixed.c:130
int32_t CoefType
Definition: ac3enc.h:71
int cutoff
user-specified cutoff frequency, in Hz
Definition: ac3enc.h:209
void ff_ac3_adjust_frame_size(AC3EncodeContext *s)
Adjust the frame size to make the average bit rate match the target bit rate.
Definition: ac3enc.c:183
int lfe_on
indicates if there is an LFE channel (lfeon)
Definition: ac3enc.h:195
This structure stores compressed data.
Definition: packet.h:340
Common code between the AC-3 encoder and decoder.
int32_t * fixed_coef_buffer
Definition: ac3enc.h:241
int extended_bsi_1
Definition: ac3enc.h:110
void ff_ac3_group_exponents(AC3EncodeContext *s)
Group exponents.
Definition: ac3enc.c:579
int copyright
Definition: ac3enc.h:108
int32_t ** fixed_coef
fixed-point MDCT coefficients
Definition: ac3enc.h:135
bitstream writer API