libavcodec/g723_1.c File Reference

G.723.1 compatible decoder. More...

#include "libavutil/channel_layout.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "internal.h"
#include "get_bits.h"
#include "acelp_vectors.h"
#include "celp_filters.h"
#include "celp_math.h"
#include "g723_1_data.h"
Include dependency graph for libavcodec/g723_1.c:

Go to the source code of this file.

Data Structures

struct  g723_1_context
 

Macros

#define BITSTREAM_READER_LE
 
#define CNG_RANDOM_SEED   12345
 
#define normalize_bits_int16(num)   normalize_bits(num, 15)
 
#define normalize_bits_int32(num)   normalize_bits(num, 31)
 
#define MULL2(a, b)   MULL(a,b,15)
 Bitexact implementation of 2ab scaled by 1/2^16. More...
 
#define iir_filter(fir_coef, iir_coef, src, dest, width)
 Perform IIR filtering. More...
 
#define OFFSET(x)   offsetof(G723_1_Context, x)
 
#define AD   AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 

Typedefs

typedef struct g723_1_context G723_1_Context
 

Functions

static av_cold int g723_1_decode_init (AVCodecContext *avctx)
 
static int unpack_bitstream (G723_1_Context *p, const uint8_t *buf, int buf_size)
 Unpack the frame into parameters. More...
 
static int16_t square_root (unsigned val)
 Bitexact implementation of sqrt(val/2). More...
 
static int normalize_bits (int num, int width)
 Calculate the number of left-shifts required for normalizing the input. More...
 
static int scale_vector (int16_t *dst, const int16_t *vector, int length)
 Scale vector contents based on the largest of their absolutes. More...
 
static void inverse_quant (int16_t *cur_lsp, int16_t *prev_lsp, uint8_t *lsp_index, int bad_frame)
 Perform inverse quantization of LSP frequencies. More...
 
static void lsp2lpc (int16_t *lpc)
 Convert LSP frequencies to LPC coefficients. More...
 
static void lsp_interpolate (int16_t *lpc, int16_t *cur_lsp, int16_t *prev_lsp)
 Quantize LSP frequencies by interpolation and convert them to the corresponding LPC coefficients. More...
 
static void gen_dirac_train (int16_t *buf, int pitch_lag)
 Generate a train of dirac functions with period as pitch lag. More...
 
static void gen_fcb_excitation (int16_t *vector, G723_1_Subframe *subfrm, enum Rate cur_rate, int pitch_lag, int index)
 Generate fixed codebook excitation vector. More...
 
static void get_residual (int16_t *residual, int16_t *prev_excitation, int lag)
 Get delayed contribution from the previous excitation vector. More...
 
static int dot_product (const int16_t *a, const int16_t *b, int length)
 
static void gen_acb_excitation (int16_t *vector, int16_t *prev_excitation, int pitch_lag, G723_1_Subframe *subfrm, enum Rate cur_rate)
 Generate adaptive codebook excitation. More...
 
static int autocorr_max (const int16_t *buf, int offset, int *ccr_max, int pitch_lag, int length, int dir)
 Estimate maximum auto-correlation around pitch lag. More...
 
static void comp_ppf_gains (int lag, PPFParam *ppf, enum Rate cur_rate, int tgt_eng, int ccr, int res_eng)
 Calculate pitch postfilter optimal and scaling gains. More...
 
static void comp_ppf_coeff (G723_1_Context *p, int offset, int pitch_lag, PPFParam *ppf, enum Rate cur_rate)
 Calculate pitch postfilter parameters. More...
 
static int comp_interp_index (G723_1_Context *p, int pitch_lag, int *exc_eng, int *scale)
 Classify frames as voiced/unvoiced. More...
 
static void residual_interp (int16_t *buf, int16_t *out, int lag, int gain, int *rseed)
 Peform residual interpolation based on frame classification. More...
 
static void gain_scale (G723_1_Context *p, int16_t *buf, int energy)
 Adjust gain of postfiltered signal. More...
 
static void formant_postfilter (G723_1_Context *p, int16_t *lpc, int16_t *buf, int16_t *dst)
 Perform formant filtering. More...
 
static int sid_gain_to_lsp_index (int gain)
 
static int cng_rand (int *state, int base)
 
static int estimate_sid_gain (G723_1_Context *p)
 
static void generate_noise (G723_1_Context *p)
 
static int g723_1_decode_frame (AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
 

Variables

static const AVOption options []
 
static const AVClass g723_1dec_class
 
AVCodec ff_g723_1_decoder
 

Detailed Description

G.723.1 compatible decoder.

Definition in file libavcodec/g723_1.c.

Macro Definition Documentation

Definition at line 1317 of file libavcodec/g723_1.c.

#define BITSTREAM_READER_LE

Definition at line 28 of file libavcodec/g723_1.c.

#define CNG_RANDOM_SEED   12345

Definition at line 41 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame(), and g723_1_decode_init().

#define iir_filter (   fir_coef,
  iir_coef,
  src,
  dest,
  width 
)
Value:
{\
int m, n;\
int res_shift = 16 & ~-(width);\
int in_shift = 16 - res_shift;\
for (m = 0; m < SUBFRAME_LEN; m++) {\
int64_t filter = 0;\
for (n = 1; n <= LPC_ORDER; n++) {\
filter -= (fir_coef)[n - 1] * (src)[m - n] -\
(iir_coef)[n - 1] * ((dest)[m - n] >> in_shift);\
}\
\
(dest)[m] = av_clipl_int32(((src)[m] << 16) + (filter << 3) +\
(1 << 15)) >> res_shift;\
}\
}
#define SUBFRAME_LEN
Definition: g723_1_data.h:34
window constants for m
the mask is usually to keep the same permissions Filters should remove permissions on reference they give to output whenever necessary It can be automatically done by setting the rej_perms field on the output pad Here are a few guidelines corresponding to common then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
static int width
Definition: tests/utils.c:158
dest
Definition: start.py:60
AVS_Value src
Definition: avisynth_c.h:523
#define LPC_ORDER
Definition: g723_1_data.h:38
for(j=16;j >0;--j)

Perform IIR filtering.

Parameters
fir_coefFIR coefficients
iir_coefIIR coefficients
srcsource vector
destdestination vector
widthwidth of the output, 16 bits(0) / 32 bits(1)

Definition at line 822 of file libavcodec/g723_1.c.

Referenced by formant_postfilter().

#define MULL2 (   a,
  b 
)    MULL(a,b,15)

Bitexact implementation of 2ab scaled by 1/2^16.

Parameters
a32 bit multiplicand
b16 bit multiplier

Definition at line 343 of file libavcodec/g723_1.c.

Referenced by lsp2lpc().

#define normalize_bits_int16 (   num)    normalize_bits(num, 15)

Definition at line 244 of file libavcodec/g723_1.c.

#define normalize_bits_int32 (   num)    normalize_bits(num, 31)

Definition at line 245 of file libavcodec/g723_1.c.

#define OFFSET (   x)    offsetof(G723_1_Context, x)

Definition at line 1316 of file libavcodec/g723_1.c.

Typedef Documentation

Function Documentation

static int autocorr_max ( const int16_t *  buf,
int  offset,
int *  ccr_max,
int  pitch_lag,
int  length,
int  dir 
)
static

Estimate maximum auto-correlation around pitch lag.

Parameters
bufbuffer with offset applied
offsetoffset of the excitation vector
ccr_maxpointer to the maximum auto-correlation
pitch_lagdecoded pitch lag
lengthlength of autocorrelation
dirforward lag(1) / backward lag(-1)

Definition at line 584 of file libavcodec/g723_1.c.

Referenced by comp_interp_index(), and comp_ppf_coeff().

static int cng_rand ( int *  state,
int  base 
)
inlinestatic

Definition at line 968 of file libavcodec/g723_1.c.

Referenced by generate_noise().

static int comp_interp_index ( G723_1_Context p,
int  pitch_lag,
int *  exc_eng,
int *  scale 
)
static

Classify frames as voiced/unvoiced.

Parameters
pthe context
pitch_lagdecoded pitch_lag
exc_engexcitation energy estimation
scalescaling factor of exc_eng
Returns
residual interpolation index if voiced, 0 otherwise

Definition at line 749 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static void comp_ppf_coeff ( G723_1_Context p,
int  offset,
int  pitch_lag,
PPFParam ppf,
enum Rate  cur_rate 
)
static

Calculate pitch postfilter parameters.

Parameters
pthe context
offsetoffset of the excitation vector
pitch_lagdecoded pitch lag
ppfpitch postfilter parameters
cur_ratecurrent bitrate

Definition at line 665 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static void comp_ppf_gains ( int  lag,
PPFParam ppf,
enum Rate  cur_rate,
int  tgt_eng,
int  ccr,
int  res_eng 
)
static

Calculate pitch postfilter optimal and scaling gains.

Parameters
lagpitch postfilter forward/backward lag
ppfpitch postfilter parameters
cur_ratecurrent bitrate
tgt_engtarget energy
ccrcross-correlation
res_engresidual energy

Definition at line 617 of file libavcodec/g723_1.c.

Referenced by comp_ppf_coeff().

static int dot_product ( const int16_t *  a,
const int16_t *  b,
int  length 
)
static
static int estimate_sid_gain ( G723_1_Context p)
static

Definition at line 974 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static void formant_postfilter ( G723_1_Context p,
int16_t *  lpc,
int16_t *  buf,
int16_t *  dst 
)
static

Perform formant filtering.

Parameters
pthe context
lpcquantized lpc coefficients
bufinput buffer
dstoutput buffer

Definition at line 890 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static int g723_1_decode_frame ( AVCodecContext avctx,
void data,
int *  got_frame_ptr,
AVPacket avpkt 
)
static

Definition at line 1153 of file libavcodec/g723_1.c.

static av_cold int g723_1_decode_init ( AVCodecContext avctx)
static

Definition at line 86 of file libavcodec/g723_1.c.

static void gain_scale ( G723_1_Context p,
int16_t *  buf,
int  energy 
)
static

Adjust gain of postfiltered signal.

Parameters
pthe context
bufpostfiltered output vector
energyinput energy coefficient

Definition at line 847 of file libavcodec/g723_1.c.

Referenced by formant_postfilter().

static void gen_acb_excitation ( int16_t *  vector,
int16_t *  prev_excitation,
int  pitch_lag,
G723_1_Subframe subfrm,
enum Rate  cur_rate 
)
static

Generate adaptive codebook excitation.

Definition at line 547 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame(), and generate_noise().

static void gen_dirac_train ( int16_t *  buf,
int  pitch_lag 
)
static

Generate a train of dirac functions with period as pitch lag.

Definition at line 444 of file libavcodec/g723_1.c.

Referenced by gen_fcb_excitation().

static void gen_fcb_excitation ( int16_t *  vector,
G723_1_Subframe subfrm,
enum Rate  cur_rate,
int  pitch_lag,
int  index 
)
static

Generate fixed codebook excitation vector.

Parameters
vectordecoded excitation vector
subfrmcurrent subframe
cur_ratecurrent bitrate
pitch_lagclosed loop pitch lag
indexcurrent subframe index

Definition at line 465 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static void generate_noise ( G723_1_Context p)
static

Definition at line 1028 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static void get_residual ( int16_t *  residual,
int16_t *  prev_excitation,
int  lag 
)
static

Get delayed contribution from the previous excitation vector.

Definition at line 525 of file libavcodec/g723_1.c.

Referenced by gen_acb_excitation().

static void inverse_quant ( int16_t *  cur_lsp,
int16_t *  prev_lsp,
uint8_t lsp_index,
int  bad_frame 
)
static

Perform inverse quantization of LSP frequencies.

Parameters
cur_lspthe current LSP vector
prev_lspthe previous LSP vector
lsp_indexVQ indices
bad_framebad frame flag

Definition at line 275 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static void lsp2lpc ( int16_t *  lpc)
static

Convert LSP frequencies to LPC coefficients.

Parameters
lpcbuffer for LPC coefficients

Definition at line 351 of file libavcodec/g723_1.c.

Referenced by lsp_interpolate().

static void lsp_interpolate ( int16_t *  lpc,
int16_t *  cur_lsp,
int16_t *  prev_lsp 
)
static

Quantize LSP frequencies by interpolation and convert them to the corresponding LPC coefficients.

Parameters
lpcbuffer for LPC coefficients
cur_lspthe current LSP vector
prev_lspthe previous LSP vector

Definition at line 421 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static int normalize_bits ( int  num,
int  width 
)
static

Calculate the number of left-shifts required for normalizing the input.

Parameters
numinput number
widthwidth of the input, 15 or 31 bits

Definition at line 239 of file libavcodec/g723_1.c.

Referenced by comp_ppf_coeff(), and gain_scale().

static void residual_interp ( int16_t *  buf,
int16_t *  out,
int  lag,
int  gain,
int *  rseed 
)
static

Peform residual interpolation based on frame classification.

Parameters
bufdecoded excitation vector
outoutput vector
lagdecoded pitch lag
gaininterpolated gain
rseedseed for random number generator

Definition at line 793 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static int scale_vector ( int16_t *  dst,
const int16_t *  vector,
int  length 
)
static

Scale vector contents based on the largest of their absolutes.

Definition at line 250 of file libavcodec/g723_1.c.

Referenced by comp_interp_index(), and formant_postfilter().

static int sid_gain_to_lsp_index ( int  gain)
static

Definition at line 958 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

static int16_t square_root ( unsigned  val)
static

Bitexact implementation of sqrt(val/2).

Definition at line 226 of file libavcodec/g723_1.c.

Referenced by comp_ppf_gains(), gain_scale(), and generate_noise().

static int unpack_bitstream ( G723_1_Context p,
const uint8_t buf,
int  buf_size 
)
static

Unpack the frame into parameters.

Parameters
pthe context
bufpointer to the input buffer
buf_sizesize of the input buffer

Definition at line 111 of file libavcodec/g723_1.c.

Referenced by g723_1_decode_frame().

Variable Documentation

AVCodec ff_g723_1_decoder
Initial value:
= {
.name = "g723_1",
.priv_data_size = sizeof(G723_1_Context),
.long_name = NULL_IF_CONFIG_SMALL("G.723.1"),
.priv_class = &g723_1dec_class,
}
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static const AVClass g723_1dec_class
static int g723_1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_cold int g723_1_decode_init(AVCodecContext *avctx)
struct g723_1_context G723_1_Context
#define CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868

Definition at line 1333 of file libavcodec/g723_1.c.

const AVClass g723_1dec_class
static
Initial value:
= {
.class_name = "G.723.1 decoder",
.item_name = av_default_item_name,
.option = options,
}
av_default_item_name
static const AVOption options[]
LIBAVUTIL_VERSION_INT
Definition: eval.c:55

Definition at line 1326 of file libavcodec/g723_1.c.

const AVOption options[]
static
Initial value:
= {
{ "postfilter", "postfilter on/off", OFFSET(postfilter), AV_OPT_TYPE_INT,
{ .i64 = 1 }, 0, 1, AD },
{ NULL }
}
static void postfilter(AMRContext *p, float *lpc, float *buf_out)
Perform adaptive post-filtering to enhance the quality of the speech.
Definition: amrnbdec.c:904
#define OFFSET(x)
NULL
Definition: eval.c:55
#define AD

Definition at line 1319 of file libavcodec/g723_1.c.