#include <stdint.h>
#include "libavutil/audioconvert.h"
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/crc.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "put_bits.h"
#include "dsputil.h"
#include "ac3dsp.h"
#include "ac3.h"
#include "audioconvert.h"
#include "fft.h"
#include "ac3enc.h"
#include "eac3enc.h"
Go to the source code of this file.
Data Structures | |
struct | AC3Mant |
Defines | |
#define | CMIXLEV_NUM_OPTIONS 3 |
#define | SURMIXLEV_NUM_OPTIONS 3 |
#define | EXTMIXLEV_NUM_OPTIONS 8 |
#define | EXP_DIFF_THRESHOLD 500 |
Exponent Difference Threshold. | |
#define | CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) |
CRC-16 Polynomial. | |
#define | FLT_OPTION_THRESHOLD 0.01 |
Functions | |
void | ff_ac3_adjust_frame_size (AC3EncodeContext *s) |
Adjust the frame size to make the average bit rate match the target bit rate. | |
void | ff_ac3_compute_coupling_strategy (AC3EncodeContext *s) |
Set the initial coupling strategy parameters prior to coupling analysis. | |
void | ff_ac3_apply_rematrixing (AC3EncodeContext *s) |
Apply stereo rematrixing to coefficients based on rematrixing flags. | |
static av_cold void | exponent_init (AC3EncodeContext *s) |
static void | extract_exponents (AC3EncodeContext *s) |
static void | compute_exp_strategy (AC3EncodeContext *s) |
static void | encode_exponents_blk_ch (uint8_t *exp, int nb_exps, int exp_strategy, int cpl) |
Update the exponents so that they are the ones the decoder will decode. | |
static void | encode_exponents (AC3EncodeContext *s) |
static int | count_exponent_bits (AC3EncodeContext *s) |
void | ff_ac3_group_exponents (AC3EncodeContext *s) |
Group exponents. | |
void | ff_ac3_process_exponents (AC3EncodeContext *s) |
Calculate final exponents from the supplied MDCT coefficients and exponent shift. | |
static void | count_frame_bits_fixed (AC3EncodeContext *s) |
static void | bit_alloc_init (AC3EncodeContext *s) |
static void | count_frame_bits (AC3EncodeContext *s) |
static void | bit_alloc_masking (AC3EncodeContext *s) |
static void | reset_block_bap (AC3EncodeContext *s) |
static void | count_mantissa_bits_init (uint16_t mant_cnt[AC3_MAX_BLOCKS][16]) |
Initialize mantissa counts. | |
static void | count_mantissa_bits_update_ch (AC3EncodeContext *s, int ch, uint16_t mant_cnt[AC3_MAX_BLOCKS][16], int start, int end) |
Update mantissa bit counts for all blocks in 1 channel in a given bandwidth range. | |
static int | count_mantissa_bits (AC3EncodeContext *s) |
static int | bit_alloc (AC3EncodeContext *s, int snr_offset) |
Run the bit allocation with a given SNR offset. | |
static int | cbr_bit_allocation (AC3EncodeContext *s) |
int | ff_ac3_compute_bit_allocation (AC3EncodeContext *s) |
static int | sym_quant (int c, int e, int levels) |
Symmetric quantization on 'levels' levels. | |
static int | asym_quant (int c, int e, int qbits) |
Asymmetric quantization on 2^qbits levels. | |
static void | quantize_mantissas_blk_ch (AC3Mant *s, int32_t *fixed_coef, uint8_t *exp, uint8_t *bap, int16_t *qmant, int start_freq, int end_freq) |
Quantize a set of mantissas for a single channel in a single block. | |
void | ff_ac3_quantize_mantissas (AC3EncodeContext *s) |
Quantize mantissas using coefficients, exponents, and bit allocation pointers. | |
static void | ac3_output_frame_header (AC3EncodeContext *s) |
static void | output_audio_block (AC3EncodeContext *s, int blk) |
static unsigned int | mul_poly (unsigned int a, unsigned int b, unsigned int poly) |
static unsigned int | pow_poly (unsigned int a, unsigned int n, unsigned int poly) |
static void | output_frame_end (AC3EncodeContext *s) |
void | ff_ac3_output_frame (AC3EncodeContext *s, unsigned char *frame) |
Write the frame to the output bitstream. | |
static void | dprint_options (AC3EncodeContext *s) |
static int | validate_float_option (float v, const float *v_list, int v_list_size) |
static void | validate_mix_level (void *log_ctx, const char *opt_name, float *opt_param, const float *list, int list_size, int default_value, int min_value, int *ctx_param) |
int | ff_ac3_validate_metadata (AC3EncodeContext *s) |
Validate metadata options as set by AVOption system. | |
av_cold int | ff_ac3_encode_close (AVCodecContext *avctx) |
Finalize encoding and free any memory allocated by the encoder. | |
static av_cold int | set_channel_info (AC3EncodeContext *s, int channels, uint64_t *channel_layout) |
static av_cold int | validate_options (AC3EncodeContext *s) |
static av_cold void | set_bandwidth (AC3EncodeContext *s) |
static av_cold int | allocate_buffers (AC3EncodeContext *s) |
av_cold int | ff_ac3_encode_init (AVCodecContext *avctx) |
Variables | |
static const float | cmixlev_options [CMIXLEV_NUM_OPTIONS] |
static const float | surmixlev_options [SURMIXLEV_NUM_OPTIONS] |
static const float | extmixlev_options [EXTMIXLEV_NUM_OPTIONS] |
static uint8_t | exponent_group_tab [2][3][256] |
LUT for number of exponent groups. | |
const uint64_t | ff_ac3_channel_layouts [19] |
List of supported channel layouts. | |
static const uint8_t | ac3_bandwidth_tab [5][3][19] |
LUT to select the bandwidth code based on the bit rate, sample rate, and number of full-bandwidth channels. | |
static const int8_t | ac3_coupling_start_tab [6][3][19] |
LUT to select the coupling start band based on the bit rate, sample rate, and number of full-bandwidth channels. | |
static const uint8_t | exp_strategy_reuse_tab [4][6] |
Table used to select exponent strategy based on exponent reuse block interval. |
Definition in file ac3enc.c.
#define CMIXLEV_NUM_OPTIONS 3 |
#define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) |
CRC-16 Polynomial.
Definition at line 1575 of file ac3enc.c.
Referenced by ff_ac3_encode_init(), and output_frame_end().
#define EXP_DIFF_THRESHOLD 500 |
Exponent Difference Threshold.
New exponents are sent if their SAD exceed this number.
Definition at line 341 of file ac3enc.c.
Referenced by compute_exp_strategy().
#define EXTMIXLEV_NUM_OPTIONS 8 |
#define FLT_OPTION_THRESHOLD 0.01 |
#define SURMIXLEV_NUM_OPTIONS 3 |
static void ac3_output_frame_header | ( | AC3EncodeContext * | s | ) | [static] |
static av_cold int allocate_buffers | ( | AC3EncodeContext * | s | ) | [static] |
Definition at line 2305 of file ac3enc.c.
Referenced by alac_decode_init(), decode_frame(), ff_ac3_encode_init(), flac_decode_init(), parse_streaminfo(), and read_header().
static int asym_quant | ( | int | c, | |
int | e, | |||
int | qbits | |||
) | [inline, static] |
Asymmetric quantization on 2^qbits levels.
c | unquantized coefficient | |
e | exponent | |
qbits | number of quantization bits |
Definition at line 1181 of file ac3enc.c.
Referenced by quantize_mantissas_blk_ch().
static int bit_alloc | ( | AC3EncodeContext * | s, | |
int | snr_offset | |||
) | [static] |
Run the bit allocation with a given SNR offset.
This calculates the bit allocation pointers that will be used to determine the quantization of each mantissa.
s | AC-3 encoder private context | |
snr_offset | SNR offset, 0 to 1023 |
Definition at line 1063 of file ac3enc.c.
Referenced by cbr_bit_allocation(), compute_bit_allocation(), encode_frame(), mp_decode_layer2(), and MPA_encode_frame().
static void bit_alloc_init | ( | AC3EncodeContext * | s | ) | [static] |
static void bit_alloc_masking | ( | AC3EncodeContext * | s | ) | [static] |
static int cbr_bit_allocation | ( | AC3EncodeContext * | s | ) | [static] |
static void compute_exp_strategy | ( | AC3EncodeContext * | s | ) | [static] |
static int count_exponent_bits | ( | AC3EncodeContext * | s | ) | [static] |
static void count_frame_bits | ( | AC3EncodeContext * | s | ) | [static] |
static void count_frame_bits_fixed | ( | AC3EncodeContext * | s | ) | [static] |
static int count_mantissa_bits | ( | AC3EncodeContext * | s | ) | [static] |
static void count_mantissa_bits_init | ( | uint16_t | mant_cnt[AC3_MAX_BLOCKS][16] | ) | [static] |
Initialize mantissa counts.
These are set so that they are padded to the next whole group size when bits are counted in compute_mantissa_size.
[in,out] | mant_cnt | running counts for each bap value for each block |
Definition at line 995 of file ac3enc.c.
Referenced by count_mantissa_bits().
static void count_mantissa_bits_update_ch | ( | AC3EncodeContext * | s, | |
int | ch, | |||
uint16_t | mant_cnt[AC3_MAX_BLOCKS][16], | |||
int | start, | |||
int | end | |||
) | [static] |
Update mantissa bit counts for all blocks in 1 channel in a given bandwidth range.
s | AC-3 encoder private context | |
ch | channel index | |
[in,out] | mant_cnt | running counts for each bap value for each block |
start | starting coefficient bin | |
end | ending coefficient bin |
Definition at line 1017 of file ac3enc.c.
Referenced by count_mantissa_bits().
static void dprint_options | ( | AC3EncodeContext * | s | ) | [static] |
static void encode_exponents | ( | AC3EncodeContext * | s | ) | [static] |
static void encode_exponents_blk_ch | ( | uint8_t * | exp, | |
int | nb_exps, | |||
int | exp_strategy, | |||
int | cpl | |||
) | [static] |
Update the exponents so that they are the ones the decoder will decode.
[in,out] | exp | array of exponents for 1 block in 1 channel |
nb_exps | number of exponents in active bandwidth | |
exp_strategy | exponent strategy for the block | |
cpl | indicates if the block is in the coupling channel |
Definition at line 423 of file ac3enc.c.
Referenced by encode_exponents().
static av_cold void exponent_init | ( | AC3EncodeContext * | s | ) | [static] |
static void extract_exponents | ( | AC3EncodeContext * | s | ) | [static] |
void ff_ac3_adjust_frame_size | ( | AC3EncodeContext * | s | ) |
Adjust the frame size to make the average bit rate match the target bit rate.
This is only needed for 11025, 22050, and 44100 sample rates or any E-AC-3.
s | AC-3 encoder private context |
Definition at line 182 of file ac3enc.c.
Referenced by encode_frame().
void ff_ac3_apply_rematrixing | ( | AC3EncodeContext * | s | ) |
Apply stereo rematrixing to coefficients based on rematrixing flags.
s | AC-3 encoder private context |
Definition at line 271 of file ac3enc.c.
Referenced by encode_frame().
int ff_ac3_compute_bit_allocation | ( | AC3EncodeContext * | s | ) |
void ff_ac3_compute_coupling_strategy | ( | AC3EncodeContext * | s | ) |
Set the initial coupling strategy parameters prior to coupling analysis.
s | AC-3 encoder private context |
Definition at line 200 of file ac3enc.c.
Referenced by encode_frame().
av_cold int ff_ac3_encode_close | ( | AVCodecContext * | avctx | ) |
Finalize encoding and free any memory allocated by the encoder.
avctx | Codec context |
Definition at line 2017 of file ac3enc.c.
Referenced by ff_ac3_encode_init().
av_cold int ff_ac3_encode_init | ( | AVCodecContext * | avctx | ) |
void ff_ac3_group_exponents | ( | AC3EncodeContext * | s | ) |
Group exponents.
3 delta-encoded exponents are in each 7-bit group. The number of groups varies depending on exponent strategy and bandwidth.
s | AC-3 encoder private context |
Definition at line 578 of file ac3enc.c.
Referenced by encode_frame().
void ff_ac3_output_frame | ( | AC3EncodeContext * | s, | |
unsigned char * | frame | |||
) |
Write the frame to the output bitstream.
s | AC-3 encoder private context | |
frame | output data buffer |
Definition at line 1661 of file ac3enc.c.
Referenced by encode_frame().
void ff_ac3_process_exponents | ( | AC3EncodeContext * | s | ) |
Calculate final exponents from the supplied MDCT coefficients and exponent shift.
Extract exponents from MDCT coefficients, calculate exponent strategies, and encode final exponents.
s | AC-3 encoder private context |
Definition at line 636 of file ac3enc.c.
Referenced by encode_frame().
void ff_ac3_quantize_mantissas | ( | AC3EncodeContext * | s | ) |
Quantize mantissas using coefficients, exponents, and bit allocation pointers.
s | AC-3 encoder private context |
Definition at line 1299 of file ac3enc.c.
Referenced by encode_frame().
int ff_ac3_validate_metadata | ( | AC3EncodeContext * | s | ) |
Validate metadata options as set by AVOption system.
These values can optionally be changed per-frame.
s | AC-3 encoder private context |
Definition at line 1833 of file ac3enc.c.
Referenced by encode_frame(), and validate_options().
static unsigned int mul_poly | ( | unsigned int | a, | |
unsigned int | b, | |||
unsigned int | poly | |||
) | [static] |
static void output_audio_block | ( | AC3EncodeContext * | s, | |
int | blk | |||
) | [static] |
static void output_frame_end | ( | AC3EncodeContext * | s | ) | [static] |
static unsigned int pow_poly | ( | unsigned int | a, | |
unsigned int | n, | |||
unsigned int | poly | |||
) | [static] |
static void quantize_mantissas_blk_ch | ( | AC3Mant * | s, | |
int32_t * | fixed_coef, | |||
uint8_t * | exp, | |||
uint8_t * | bap, | |||
int16_t * | qmant, | |||
int | start_freq, | |||
int | end_freq | |||
) | [static] |
Quantize a set of mantissas for a single channel in a single block.
s | Mantissa count context | |
fixed_coef | unquantized fixed-point coefficients | |
exp | exponents | |
bap | bit allocation pointer indices | |
[out] | qmant | quantized coefficients |
start_freq | starting coefficient bin | |
end_freq | ending coefficient bin |
Definition at line 1205 of file ac3enc.c.
Referenced by ff_ac3_quantize_mantissas().
static void reset_block_bap | ( | AC3EncodeContext * | s | ) | [static] |
static av_cold void set_bandwidth | ( | AC3EncodeContext * | s | ) | [static] |
static av_cold int set_channel_info | ( | AC3EncodeContext * | s, | |
int | channels, | |||
uint64_t * | channel_layout | |||
) | [static] |
static int sym_quant | ( | int | c, | |
int | e, | |||
int | levels | |||
) | [inline, static] |
Symmetric quantization on 'levels' levels.
c | unquantized coefficient | |
e | exponent | |
levels | number of quantization levels |
Definition at line 1165 of file ac3enc.c.
Referenced by quantize_mantissas_blk_ch().
static int validate_float_option | ( | float | v, | |
const float * | v_list, | |||
int | v_list_size | |||
) | [static] |
static void validate_mix_level | ( | void * | log_ctx, | |
const char * | opt_name, | |||
float * | opt_param, | |||
const float * | list, | |||
int | list_size, | |||
int | default_value, | |||
int | min_value, | |||
int * | ctx_param | |||
) | [static] |
static av_cold int validate_options | ( | AC3EncodeContext * | s | ) | [static] |
const uint8_t ac3_bandwidth_tab[5][3][19] [static] |
Initial value:
{ { { 0, 0, 0, 12, 16, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }, { 0, 0, 0, 16, 20, 36, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56 }, { 0, 0, 0, 32, 40, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60 } }, { { 0, 0, 0, 0, 0, 0, 0, 20, 24, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48 }, { 0, 0, 0, 0, 0, 0, 4, 24, 28, 36, 56, 56, 56, 56, 56, 56, 56, 56, 56 }, { 0, 0, 0, 0, 0, 0, 20, 44, 52, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60 } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 24, 32, 40, 48, 48, 48, 48, 48, 48 }, { 0, 0, 0, 0, 0, 0, 0, 0, 4, 20, 28, 36, 44, 56, 56, 56, 56, 56, 56 }, { 0, 0, 0, 0, 0, 0, 0, 0, 20, 40, 48, 60, 60, 60, 60, 60, 60, 60, 60 } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 24, 32, 48, 48, 48, 48, 48, 48 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 28, 36, 56, 56, 56, 56, 56, 56 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 48, 60, 60, 60, 60, 60, 60, 60 } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 20, 32, 40, 48, 48, 48, 48 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 24, 36, 44, 56, 56, 56, 56 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 44, 60, 60, 60, 60, 60, 60 } } }
bandwidth_tab[fbw_channels-1][sample rate code][bit rate code]
const int8_t ac3_coupling_start_tab[6][3][19] [static] |
LUT to select the coupling start band based on the bit rate, sample rate, and number of full-bandwidth channels.
-1 = coupling off ac3_coupling_start_tab[channel_mode-2][sample rate code][bit rate code]
TODO: more testing for optimal parameters. multi-channel tests at 44.1kHz and 32kHz.
const float cmixlev_options[CMIXLEV_NUM_OPTIONS] [static] |
const uint8_t exp_strategy_reuse_tab[4][6] [static] |
Initial value:
{ { EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15 }, { EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15 }, { EXP_D25, EXP_D25, EXP_D15, EXP_D15, EXP_D15, EXP_D15 }, { EXP_D45, EXP_D25, EXP_D25, EXP_D15, EXP_D15, EXP_D15 } }
uint8_t exponent_group_tab[2][3][256] [static] |
LUT for number of exponent groups.
exponent_group_tab[coupling][exponent strategy-1][number of coefficients]
Definition at line 74 of file ac3enc.c.
Referenced by count_exponent_bits(), encode_exponents_blk_ch(), exponent_init(), ff_ac3_group_exponents(), and output_audio_block().
const float extmixlev_options[EXTMIXLEV_NUM_OPTIONS] [static] |
Initial value:
{ LEVEL_PLUS_3DB, LEVEL_PLUS_1POINT5DB, LEVEL_ONE, LEVEL_MINUS_4POINT5DB, LEVEL_MINUS_3DB, LEVEL_MINUS_4POINT5DB, LEVEL_MINUS_6DB, LEVEL_ZERO }
Definition at line 64 of file ac3enc.c.
Referenced by ff_ac3_validate_metadata().
const uint64_t ff_ac3_channel_layouts[19] |
Initial value:
{ AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_2_1, AV_CH_LAYOUT_SURROUND, AV_CH_LAYOUT_2_2, AV_CH_LAYOUT_QUAD, AV_CH_LAYOUT_4POINT0, AV_CH_LAYOUT_5POINT0, AV_CH_LAYOUT_5POINT0_BACK, (AV_CH_LAYOUT_MONO | AV_CH_LOW_FREQUENCY), (AV_CH_LAYOUT_STEREO | AV_CH_LOW_FREQUENCY), (AV_CH_LAYOUT_2_1 | AV_CH_LOW_FREQUENCY), (AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY), (AV_CH_LAYOUT_2_2 | AV_CH_LOW_FREQUENCY), (AV_CH_LAYOUT_QUAD | AV_CH_LOW_FREQUENCY), (AV_CH_LAYOUT_4POINT0 | AV_CH_LOW_FREQUENCY), AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_5POINT1_BACK, 0 }
const float surmixlev_options[SURMIXLEV_NUM_OPTIONS] [static] |