libavcodec/ac3enc.c File Reference

The simplest AC-3 encoder. More...

#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.


Detailed Description

The simplest AC-3 encoder.

Definition in file ac3enc.c.


Define Documentation

#define CMIXLEV_NUM_OPTIONS   3

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

Definition at line 63 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

#define FLT_OPTION_THRESHOLD   0.01

Definition at line 1791 of file ac3enc.c.

Referenced by validate_float_option().

#define SURMIXLEV_NUM_OPTIONS   3

Definition at line 58 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().


Function Documentation

static void ac3_output_frame_header ( AC3EncodeContext s  )  [static]

Definition at line 1328 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static av_cold int allocate_buffers ( AC3EncodeContext s  )  [static]

static int asym_quant ( int  c,
int  e,
int  qbits 
) [inline, static]

Asymmetric quantization on 2^qbits levels.

Parameters:
c unquantized coefficient
e exponent
qbits number of quantization bits
Returns:
quantized coefficient

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.

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

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]

Definition at line 758 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static void bit_alloc_masking ( AC3EncodeContext s  )  [static]

Definition at line 940 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static int cbr_bit_allocation ( AC3EncodeContext s  )  [static]

Definition at line 1094 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static void compute_exp_strategy ( AC3EncodeContext s  )  [static]

Definition at line 357 of file ac3enc.c.

Referenced by ff_ac3_process_exponents().

static int count_exponent_bits ( AC3EncodeContext s  )  [static]

Definition at line 546 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static void count_frame_bits ( AC3EncodeContext s  )  [static]

Definition at line 794 of file ac3enc.c.

Referenced by ff_ac3_compute_bit_allocation().

static void count_frame_bits_fixed ( AC3EncodeContext s  )  [static]

Definition at line 652 of file ac3enc.c.

Referenced by bit_alloc_init().

static int count_mantissa_bits ( AC3EncodeContext s  )  [static]

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

Parameters:
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]

Definition at line 1676 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static void encode_exponents ( AC3EncodeContext s  )  [static]

Definition at line 496 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] 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]

Definition at line 305 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

static void extract_exponents ( AC3EncodeContext s  )  [static]

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

Parameters:
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  ) 

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

Parameters:
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  ) 

Definition at line 2407 of file ac3enc.c.

Referenced by ac3_fixed_encode_init().

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:
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.

Parameters:
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.

Parameters:
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.

Parameters:
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.

Parameters:
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]

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

Referenced by ff_ac3_output_frame().

static void output_frame_end ( AC3EncodeContext s  )  [static]

Definition at line 1612 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 1595 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:
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]

Definition at line 970 of file ac3enc.c.

Referenced by bit_alloc(), and cbr_bit_allocation().

static av_cold void set_bandwidth ( AC3EncodeContext s  )  [static]

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

Parameters:
c unquantized coefficient
e exponent
levels number of quantization levels
Returns:
quantized coefficient

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]

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

Referenced by ff_ac3_validate_metadata().

static av_cold int validate_options ( AC3EncodeContext s  )  [static]

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

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 141 of file ac3enc.c.

const float cmixlev_options[CMIXLEV_NUM_OPTIONS] [static]

Initial value:

Definition at line 54 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

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 }
}
Table used to select exponent strategy based on exponent reuse block interval.

Definition at line 346 of file ac3enc.c.

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:

Definition at line 64 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().

const uint64_t ff_ac3_channel_layouts[19]

Initial value:

List of supported channel layouts.

Definition at line 80 of file ac3enc.c.

const float surmixlev_options[SURMIXLEV_NUM_OPTIONS] [static]

Initial value:

Definition at line 59 of file ac3enc.c.

Referenced by ff_ac3_validate_metadata().


Generated on Fri Oct 26 02:43:46 2012 for FFmpeg by  doxygen 1.5.8