#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 | |
static void | adjust_frame_size (AC3EncodeContext *s) |
Adjust the frame size to make the average bit rate match the target bit rate. | |
static void | compute_coupling_strategy (AC3EncodeContext *s) |
static void | apply_rematrixing (AC3EncodeContext *s) |
Apply stereo rematrixing to coefficients based on rematrixing flags. | |
static av_cold void | exponent_init (AC3EncodeContext *s) |
Initialize exponent tables. | |
static void | extract_exponents (AC3EncodeContext *s) |
Extract exponents from the MDCT coefficients. | |
static void | compute_exp_strategy (AC3EncodeContext *s) |
Calculate exponent strategies for all channels. | |
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) |
Encode exponents from original extracted form to what the decoder will see. | |
static void | group_exponents (AC3EncodeContext *s) |
Group exponents. | |
static void | process_exponents (AC3EncodeContext *s) |
Calculate final exponents from the supplied MDCT coefficients and exponent shift. | |
static void | count_frame_bits_fixed (AC3EncodeContext *s) |
Count frame bits that are based solely on fixed parameters. | |
static void | bit_alloc_init (AC3EncodeContext *s) |
Initialize bit allocation. | |
static void | count_frame_bits (AC3EncodeContext *s) |
Count the bits used to encode the frame, minus exponents and mantissas. | |
static void | bit_alloc_masking (AC3EncodeContext *s) |
Calculate masking curve based on the final exponents. | |
static void | reset_block_bap (AC3EncodeContext *s) |
Ensure that bap for each block and channel point to the current bap_buffer. | |
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) |
Count the number of mantissa bits in the frame based on the bap values. | |
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) |
Constant bitrate bit allocation search. | |
static int | downgrade_exponents (AC3EncodeContext *s) |
Downgrade exponent strategies to reduce the bits used by the exponents. | |
static int | compute_bit_allocation (AC3EncodeContext *s) |
Perform bit allocation search. | |
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, uint16_t *qmant, int start_freq, int end_freq) |
Quantize a set of mantissas for a single channel in a single block. | |
static void | quantize_mantissas (AC3EncodeContext *s) |
Quantize mantissas using coefficients, exponents, and bit allocation pointers. | |
static void | ac3_output_frame_header (AC3EncodeContext *s) |
Write the AC-3 frame header to the output bitstream. | |
static void | output_audio_block (AC3EncodeContext *s, int blk) |
Write one audio block to the output bitstream. | |
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) |
Fill the end of the frame with 0's and compute the two CRCs. | |
static void | output_frame (AC3EncodeContext *s, unsigned char *frame) |
Write the frame to the output bitstream. | |
static void | dprint_options (AVCodecContext *avctx) |
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) |
static int | validate_metadata (AVCodecContext *avctx) |
Validate metadata options as set by AVOption system. | |
int | ff_ac3_encode_frame (AVCodecContext *avctx, unsigned char *frame, int buf_size, void *data) |
Encode a single AC-3 frame. | |
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, int64_t *channel_layout) |
Set channel information during initialization. | |
static av_cold int | validate_options (AVCodecContext *avctx, AC3EncodeContext *s) |
static av_cold void | set_bandwidth (AC3EncodeContext *s) |
Set bandwidth for all channels. | |
static av_cold int | allocate_buffers (AVCodecContext *avctx) |
av_cold int | ff_ac3_encode_init (AVCodecContext *avctx) |
Initialize the encoder. | |
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 int64_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. |
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 1517 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 326 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] |
Write the AC-3 frame header to the output bitstream.
Definition at line 1270 of file ac3enc.c.
Referenced by ff_ac3_encode_init().
static void adjust_frame_size | ( | AC3EncodeContext * | s | ) | [static] |
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.
Definition at line 180 of file ac3enc.c.
Referenced by ff_ac3_encode_frame().
static av_cold int allocate_buffers | ( | AVCodecContext * | avctx | ) | [static] |
Definition at line 2212 of file ac3enc.c.
Referenced by alac_set_info(), decode_frame(), ff_ac3_encode_init(), flac_decode_init(), parse_streaminfo(), and shorten_decode_frame().
static void apply_rematrixing | ( | AC3EncodeContext * | s | ) | [static] |
Apply stereo rematrixing to coefficients based on rematrixing flags.
Definition at line 257 of file ac3enc.c.
Referenced by compute_bit_allocation(), and ff_ac3_encode_frame().
static int asym_quant | ( | int | c, | |
int | e, | |||
int | qbits | |||
) | [inline, static] |
Asymmetric quantization on 2^qbits levels.
Definition at line 1124 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.
Definition at line 949 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] |
Initialize bit allocation.
Set default parameter codes and calculate parameter values.
Definition at line 685 of file ac3enc.c.
Referenced by ff_ac3_encode_init().
static void bit_alloc_masking | ( | AC3EncodeContext * | s | ) | [static] |
Calculate masking curve based on the final exponents.
Also calculate the power spectral densities to use in future calculations.
Definition at line 837 of file ac3enc.c.
Referenced by compute_bit_allocation().
static int cbr_bit_allocation | ( | AC3EncodeContext * | s | ) | [static] |
Constant bitrate bit allocation search.
Find the largest SNR offset that will allow data to fit in the frame.
Definition at line 980 of file ac3enc.c.
Referenced by compute_bit_allocation().
static int compute_bit_allocation | ( | AC3EncodeContext * | s | ) | [static] |
Perform bit allocation search.
Finds the SNR offset value that maximizes quality and fits in the specified frame size. Output is the SNR offset and a set of bit allocation pointers used to quantize the mantissas.
Definition at line 1072 of file ac3enc.c.
Referenced by ff_ac3_encode_frame(), and MPA_encode_frame().
static void compute_coupling_strategy | ( | AC3EncodeContext * | s | ) | [static] |
Definition at line 193 of file ac3enc.c.
Referenced by compute_bit_allocation(), and ff_ac3_encode_frame().
static void compute_exp_strategy | ( | AC3EncodeContext * | s | ) | [static] |
Calculate exponent strategies for all channels.
Array arrangement is reversed to simplify the per-channel calculation.
Definition at line 333 of file ac3enc.c.
Referenced by process_exponents().
static void count_frame_bits | ( | AC3EncodeContext * | s | ) | [static] |
Count the bits used to encode the frame, minus exponents and mantissas.
Bits based on fixed parameters have already been counted, so now we just have to add the bits based on parameters that change during encoding.
Definition at line 721 of file ac3enc.c.
Referenced by compute_bit_allocation().
static void count_frame_bits_fixed | ( | AC3EncodeContext * | s | ) | [static] |
Count frame bits that are based solely on fixed parameters.
This only has to be run once when the encoder is initialized.
Definition at line 591 of file ac3enc.c.
Referenced by bit_alloc_init().
static int count_mantissa_bits | ( | AC3EncodeContext * | s | ) | [static] |
Count the number of mantissa bits in the frame based on the bap values.
Definition at line 926 of file ac3enc.c.
Referenced by bit_alloc().
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.
Definition at line 890 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.
Definition at line 906 of file ac3enc.c.
Referenced by count_mantissa_bits().
static int downgrade_exponents | ( | AC3EncodeContext * | s | ) | [static] |
Downgrade exponent strategies to reduce the bits used by the exponents.
This is a fallback for when bit allocation fails with the normal exponent strategies. Each time this function is run it only downgrades the strategy in 1 channel of 1 block.
Definition at line 1032 of file ac3enc.c.
Referenced by compute_bit_allocation().
static void dprint_options | ( | AVCodecContext * | avctx | ) | [static] |
static void encode_exponents | ( | AC3EncodeContext * | s | ) | [static] |
Encode exponents from original extracted form to what the decoder will see.
This copies and groups exponents based on exponent strategy and reduces deltas between adjacent exponent groups so that they can be differentially encoded.
Definition at line 461 of file ac3enc.c.
Referenced by compute_bit_allocation(), and process_exponents().
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.
Definition at line 388 of file ac3enc.c.
Referenced by encode_exponents().
static av_cold void exponent_init | ( | AC3EncodeContext * | s | ) | [static] |
Initialize exponent tables.
Definition at line 291 of file ac3enc.c.
Referenced by ff_ac3_encode_init().
static void extract_exponents | ( | AC3EncodeContext * | s | ) | [static] |
Extract exponents from the MDCT coefficients.
This takes into account the normalization that was done to the input samples by adjusting the exponents by the exponent shift values.
Definition at line 312 of file ac3enc.c.
Referenced by compute_bit_allocation(), and process_exponents().
av_cold int ff_ac3_encode_close | ( | AVCodecContext * | avctx | ) |
Finalize encoding and free any memory allocated by the encoder.
Definition at line 1932 of file ac3enc.c.
Referenced by ff_ac3_encode_init().
int ff_ac3_encode_frame | ( | AVCodecContext * | avctx, | |
unsigned char * | frame, | |||
int | buf_size, | |||
void * | data | |||
) |
av_cold int ff_ac3_encode_init | ( | AVCodecContext * | avctx | ) |
Initialize the encoder.
Definition at line 2315 of file ac3enc.c.
Referenced by ac3_fixed_encode_init().
static void group_exponents | ( | AC3EncodeContext * | s | ) | [static] |
Group exponents.
3 delta-encoded exponents are in each 7-bit group. The number of groups varies depending on exponent strategy and bandwidth.
Definition at line 513 of file ac3enc.c.
Referenced by compute_bit_allocation(), and process_exponents().
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] |
Write one audio block to the output bitstream.
Definition at line 1326 of file ac3enc.c.
Referenced by output_frame().
static void output_frame | ( | AC3EncodeContext * | s, | |
unsigned char * | frame | |||
) | [static] |
Write the frame to the output bitstream.
Definition at line 1600 of file ac3enc.c.
Referenced by ff_ac3_encode_frame().
static void output_frame_end | ( | AC3EncodeContext * | s | ) | [static] |
Fill the end of the frame with 0's and compute the two CRCs.
Definition at line 1554 of file ac3enc.c.
Referenced by output_frame().
static unsigned int pow_poly | ( | unsigned int | a, | |
unsigned int | n, | |||
unsigned int | poly | |||
) | [static] |
static void process_exponents | ( | AC3EncodeContext * | s | ) | [static] |
Calculate final exponents from the supplied MDCT coefficients and exponent shift.
Extract exponents from MDCT coefficients, calculate exponent strategies, and encode final exponents.
Definition at line 573 of file ac3enc.c.
Referenced by compute_bit_allocation(), and ff_ac3_encode_frame().
static void quantize_mantissas | ( | AC3EncodeContext * | s | ) | [static] |
Quantize mantissas using coefficients, exponents, and bit allocation pointers.
Definition at line 1241 of file ac3enc.c.
Referenced by ff_ac3_encode_frame().
static void quantize_mantissas_blk_ch | ( | AC3Mant * | s, | |
int32_t * | fixed_coef, | |||
uint8_t * | exp, | |||
uint8_t * | bap, | |||
uint16_t * | qmant, | |||
int | start_freq, | |||
int | end_freq | |||
) | [static] |
Quantize a set of mantissas for a single channel in a single block.
Definition at line 1146 of file ac3enc.c.
Referenced by quantize_mantissas().
static void reset_block_bap | ( | AC3EncodeContext * | s | ) | [static] |
Ensure that bap for each block and channel point to the current bap_buffer.
They may have been switched during the bit allocation search.
Definition at line 867 of file ac3enc.c.
Referenced by bit_alloc(), and cbr_bit_allocation().
static av_cold void set_bandwidth | ( | AC3EncodeContext * | s | ) | [static] |
Set bandwidth for all channels.
The user can optionally supply a cutoff frequency. Otherwise an appropriate default value will be used.
Definition at line 2145 of file ac3enc.c.
Referenced by ff_ac3_encode_init().
static av_cold int set_channel_info | ( | AC3EncodeContext * | s, | |
int | channels, | |||
int64_t * | channel_layout | |||
) | [static] |
Set channel information during initialization.
Definition at line 1974 of file ac3enc.c.
Referenced by validate_options().
static int sym_quant | ( | int | c, | |
int | e, | |||
int | levels | |||
) | [inline, static] |
Symmetric quantization on 'levels' levels.
Definition at line 1113 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 int validate_metadata | ( | AVCodecContext * | avctx | ) | [static] |
Validate metadata options as set by AVOption system.
These values can optionally be changed per-frame.
Definition at line 1769 of file ac3enc.c.
Referenced by ff_ac3_encode_frame(), and validate_options().
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 | ( | AVCodecContext * | avctx, | |
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] |
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 encode_exponents_blk_ch(), exponent_init(), 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 validate_metadata().
const int64_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] |