ac3enc.c File Reference

The simplest AC-3 encoder. More...

#include <stdint.h>
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
#include "libavutil/crc.h"
#include "libavutil/internal.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "put_bits.h"
#include "ac3dsp.h"
#include "ac3.h"
#include "fft.h"
#include "ac3enc.h"
#include "eac3enc.h"
Include dependency graph for ac3enc.c:

Go to the source code of this file.

Data Structures

struct  AC3Mant
 

Macros

#define CMIXLEV_NUM_OPTIONS   3
 
#define SURMIXLEV_NUM_OPTIONS   3
 
#define EXTMIXLEV_NUM_OPTIONS   8
 
#define EXP_DIFF_THRESHOLD   500
 Exponent Difference Threshold. More...
 
#define CRC16_POLY   ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16))
 CRC-16 Polynomial. More...
 
#define FLT_OPTION_THRESHOLD   0.01
 

Typedefs

typedef struct AC3Mant AC3Mant
 

Functions

void ff_ac3_adjust_frame_size (AC3EncodeContext *s)
 Adjust the frame size to make the average bit rate match the target bit rate. More...
 
void ff_ac3_compute_coupling_strategy (AC3EncodeContext *s)
 Set the initial coupling strategy parameters prior to coupling analysis. More...
 
void ff_ac3_apply_rematrixing (AC3EncodeContext *s)
 Apply stereo rematrixing to coefficients based on rematrixing flags. More...
 
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. More...
 
static void encode_exponents (AC3EncodeContext *s)
 
static int count_exponent_bits (AC3EncodeContext *s)
 
void ff_ac3_group_exponents (AC3EncodeContext *s)
 Group exponents. More...
 
void ff_ac3_process_exponents (AC3EncodeContext *s)
 Calculate final exponents from the supplied MDCT coefficients and exponent shift. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
static int asym_quant (int c, int e, int qbits)
 Asymmetric quantization on 2^qbits levels. More...
 
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. More...
 
void ff_ac3_quantize_mantissas (AC3EncodeContext *s)
 Quantize mantissas using coefficients, exponents, and bit allocation pointers. More...
 
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. More...
 
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. More...
 
av_cold int ff_ac3_encode_close (AVCodecContext *avctx)
 Finalize encoding and free any memory allocated by the encoder. More...
 
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. More...
 
const uint64_t ff_ac3_channel_layouts [19]
 List of supported channel layouts. More...
 
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. More...
 
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. More...
 
static const uint8_t exp_strategy_reuse_tab [4][6]
 Table used to select exponent strategy based on exponent reuse block interval. More...
 

Detailed Description

The simplest AC-3 encoder.

Definition in file ac3enc.c.

Macro Definition Documentation

#define CMIXLEV_NUM_OPTIONS   3

Definition at line 52 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

#define CRC16_POLY   ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16))

CRC-16 Polynomial.

Definition at line 1573 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 340 of file ac3enc.c.

Referenced by compute_exp_strategy().

#define EXTMIXLEV_NUM_OPTIONS   8

Definition at line 62 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

#define FLT_OPTION_THRESHOLD   0.01

Definition at line 1789 of file ac3enc.c.

Referenced by validate_float_option().

#define SURMIXLEV_NUM_OPTIONS   3

Definition at line 57 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

Typedef Documentation

typedef struct AC3Mant AC3Mant

Function Documentation

static void ac3_output_frame_header ( AC3EncodeContext s)
static

Definition at line 1327 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static av_cold int allocate_buffers ( AC3EncodeContext s)
static

Definition at line 2317 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static int asym_quant ( int  c,
int  e,
int  qbits 
)
inlinestatic

Asymmetric quantization on 2^qbits levels.

Parameters
cunquantized coefficient
eexponent
qbitsnumber of quantization bits
Returns
quantized coefficient

Definition at line 1180 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.

Parameters
sAC-3 encoder private context
snr_offsetSNR offset, 0 to 1023
Returns
the number of bits needed for mantissas if the given SNR offset is is used.

Definition at line 1062 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

Definition at line 757 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static void bit_alloc_masking ( AC3EncodeContext s)
static

Definition at line 939 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static int cbr_bit_allocation ( AC3EncodeContext s)
static

Definition at line 1093 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static void compute_exp_strategy ( AC3EncodeContext s)
static

Definition at line 356 of file ac3enc.c.

Referenced by ff_ac3_process_exponents().

static int count_exponent_bits ( AC3EncodeContext s)
static

Definition at line 545 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static void count_frame_bits ( AC3EncodeContext s)
static

Definition at line 793 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static void count_frame_bits_fixed ( AC3EncodeContext s)
static

Definition at line 651 of file ac3enc.c.

Referenced by bit_alloc_init().

static int count_mantissa_bits ( AC3EncodeContext s)
static

Definition at line 1036 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.

Parameters
[in,out]mant_cntrunning counts for each bap value for each block

Definition at line 994 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.

Parameters
sAC-3 encoder private context
chchannel index
[in,out]mant_cntrunning counts for each bap value for each block
startstarting coefficient bin
endending coefficient bin

Definition at line 1016 of file ac3enc.c.

Referenced by count_mantissa_bits().

static void dprint_options ( AC3EncodeContext s)
static

Definition at line 1674 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static void encode_exponents ( AC3EncodeContext s)
static

Definition at line 495 of file ac3enc.c.

Referenced by ff_ac3_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.

Parameters
[in,out]exparray of exponents for 1 block in 1 channel
nb_expsnumber of exponents in active bandwidth
exp_strategyexponent strategy for the block
cplindicates if the block is in the coupling channel

Definition at line 422 of file ac3enc.c.

Referenced by encode_exponents().

static av_cold void exponent_init ( AC3EncodeContext s)
static

Definition at line 304 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static void extract_exponents ( AC3EncodeContext s)
static

Definition at line 326 of file ac3enc.c.

Referenced by ff_ac3_process_exponents().

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.

Parameters
sAC-3 encoder private context

Definition at line 181 of file ac3enc.c.

Referenced by encode_frame().

void ff_ac3_apply_rematrixing ( AC3EncodeContext s)

Apply stereo rematrixing to coefficients based on rematrixing flags.

Parameters
sAC-3 encoder private context

Definition at line 270 of file ac3enc.c.

Referenced by encode_frame().

int ff_ac3_compute_bit_allocation ( AC3EncodeContext s)

Definition at line 1144 of file ac3enc.c.

Referenced by encode_frame().

void ff_ac3_compute_coupling_strategy ( AC3EncodeContext s)

Set the initial coupling strategy parameters prior to coupling analysis.

Parameters
sAC-3 encoder private context

Definition at line 199 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.

Parameters
avctxCodec context

Definition at line 2015 of file ac3enc.c.

Referenced by calc_cpl_coord(), ff_ac3_encode_init(), and ff_eac3_output_frame_header().

av_cold int ff_ac3_encode_init ( AVCodecContext avctx)

Definition at line 2419 of file ac3enc.c.

Referenced by ac3_fixed_encode_init(), calc_cpl_coord(), and ff_eac3_output_frame_header().

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.

Parameters
sAC-3 encoder private context

Definition at line 577 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.

Parameters
sAC-3 encoder private context
frameoutput data buffer

Definition at line 1659 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.

Parameters
sAC-3 encoder private context

Definition at line 635 of file ac3enc.c.

Referenced by encode_frame().

void ff_ac3_quantize_mantissas ( AC3EncodeContext s)

Quantize mantissas using coefficients, exponents, and bit allocation pointers.

Parameters
sAC-3 encoder private context

Definition at line 1298 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.

Parameters
sAC-3 encoder private context

Definition at line 1831 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

Definition at line 1576 of file ac3enc.c.

Referenced by output_frame_end(), and pow_poly().

static void output_audio_block ( AC3EncodeContext s,
int  blk 
)
static

Definition at line 1383 of file ac3enc.c.

Referenced by ff_ac3_output_frame().

static void output_frame_end ( AC3EncodeContext s)
static

Definition at line 1610 of file ac3enc.c.

Referenced by ff_ac3_output_frame().

static unsigned int pow_poly ( unsigned int  a,
unsigned int  n,
unsigned int  poly 
)
static

Definition at line 1593 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

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.

Parameters
sMantissa count context
fixed_coefunquantized fixed-point coefficients
expexponents
bapbit allocation pointer indices
[out]qmantquantized coefficients
start_freqstarting coefficient bin
end_freqending coefficient bin

Definition at line 1204 of file ac3enc.c.

Referenced by ff_ac3_quantize_mantissas().

static void reset_block_bap ( AC3EncodeContext s)
static

Definition at line 969 of file ac3enc.c.

Referenced by bit_alloc(), and cbr_bit_allocation().

static av_cold void set_bandwidth ( AC3EncodeContext s)
static

Definition at line 2247 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static av_cold int set_channel_info ( AC3EncodeContext s,
int  channels,
uint64_t *  channel_layout 
)
static

Definition at line 2059 of file ac3enc.c.

Referenced by validate_options().

static int sym_quant ( int  c,
int  e,
int  levels 
)
inlinestatic

Symmetric quantization on 'levels' levels.

Parameters
cunquantized coefficient
eexponent
levelsnumber of quantization levels
Returns
quantized coefficient

Definition at line 1164 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

Definition at line 1791 of file ac3enc.c.

Referenced by validate_mix_level().

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

Definition at line 1807 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

static av_cold int validate_options ( AC3EncodeContext s)
static

Definition at line 2104 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

Variable Documentation

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 } }
}

LUT to select the bandwidth code based on the bit rate, sample rate, and number of full-bandwidth channels.

bandwidth_tab[fbw_channels-1][sample rate code][bit rate code]

Definition at line 107 of file ac3enc.c.

Referenced by set_bandwidth().

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.

Definition at line 140 of file ac3enc.c.

Referenced by set_bandwidth().

const float cmixlev_options[CMIXLEV_NUM_OPTIONS]
static
Initial value:
= {
}
#define LEVEL_MINUS_3DB
Definition: ac3.h:58
#define LEVEL_MINUS_4POINT5DB
Definition: ac3.h:59
#define LEVEL_MINUS_6DB
Definition: ac3.h:60

Definition at line 53 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

const uint8_t exp_strategy_reuse_tab[4][6]
static
Initial value:
= {
}
#define EXP_D25
Definition: ac3.h:51
#define EXP_D15
Definition: ac3.h:50
#define EXP_D45
Definition: ac3.h:52

Table used to select exponent strategy based on exponent reuse block interval.

Definition at line 345 of file ac3enc.c.

Referenced by compute_exp_strategy().

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 73 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:
= {
}
#define LEVEL_PLUS_1POINT5DB
Definition: ac3.h:56
#define LEVEL_MINUS_3DB
Definition: ac3.h:58
#define LEVEL_MINUS_4POINT5DB
Definition: ac3.h:59
#define LEVEL_ZERO
Definition: ac3.h:62
#define LEVEL_ONE
Definition: ac3.h:63
#define LEVEL_PLUS_3DB
Definition: ac3.h:55
#define LEVEL_MINUS_6DB
Definition: ac3.h:60

Definition at line 63 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

const uint64_t ff_ac3_channel_layouts[19]
Initial value:
= {
(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),
0
}
#define AV_CH_LAYOUT_SURROUND
#define AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_5POINT0
#define AV_CH_LOW_FREQUENCY
#define AV_CH_LAYOUT_5POINT1
#define AV_CH_LAYOUT_QUAD
#define AV_CH_LAYOUT_2_1
#define AV_CH_LAYOUT_2_2
#define AV_CH_LAYOUT_5POINT1_BACK
#define AV_CH_LAYOUT_5POINT0_BACK
#define AV_CH_LAYOUT_MONO

List of supported channel layouts.

Definition at line 79 of file ac3enc.c.

Referenced by calc_cpl_coord(), and ff_eac3_output_frame_header().

const float surmixlev_options[SURMIXLEV_NUM_OPTIONS]
static
Initial value:
= {
}
#define LEVEL_MINUS_3DB
Definition: ac3.h:58
#define LEVEL_ZERO
Definition: ac3.h:62
#define LEVEL_MINUS_6DB
Definition: ac3.h:60

Definition at line 58 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().