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

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.


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 validate_metadata().

#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

Definition at line 63 of file ac3enc.c.

Referenced by validate_metadata().

#define FLT_OPTION_THRESHOLD   0.01

Definition at line 1729 of file ac3enc.c.

Referenced by validate_float_option().

#define SURMIXLEV_NUM_OPTIONS   3

Definition at line 58 of file ac3enc.c.

Referenced by validate_metadata().


Function Documentation

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]

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.

Returns:
the number of bits needed for mantissas if the given SNR offset is is used.

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.

Returns:
non-zero if downgrade was unsuccessful

Definition at line 1032 of file ac3enc.c.

Referenced by compute_bit_allocation().

static void dprint_options ( AVCodecContext avctx  )  [static]

Definition at line 1615 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

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 
)

Encode a single AC-3 frame.

Definition at line 1881 of file ac3enc.c.

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]

Definition at line 1520 of file ac3enc.c.

Referenced by output_frame_end(), and pow_poly().

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]

Definition at line 1537 of file ac3enc.c.

Referenced by ff_ac3_encode_init().

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]

Definition at line 1731 of file ac3enc.c.

Referenced by validate_mix_level().

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]

Definition at line 1747 of file ac3enc.c.

Referenced by validate_metadata().

static av_cold int validate_options ( AVCodecContext avctx,
AC3EncodeContext s 
) [static]

Definition at line 2019 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 validate_metadata().

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:

Definition at line 64 of file ac3enc.c.

Referenced by validate_metadata().

const int64_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 validate_metadata().


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