mirror of https://github.com/FFmpeg/FFmpeg.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
6.9 KiB
267 lines
6.9 KiB
/* |
|
* G.723.1 common header and data tables |
|
* Copyright (c) 2006 Benjamin Larsson |
|
* Copyright (c) 2010 Mohamed Naufal Basheer |
|
* |
|
* This file is part of FFmpeg. |
|
* |
|
* FFmpeg is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU Lesser General Public |
|
* License as published by the Free Software Foundation; either |
|
* version 2.1 of the License, or (at your option) any later version. |
|
* |
|
* FFmpeg is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
* Lesser General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Lesser General Public |
|
* License along with FFmpeg; if not, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
*/ |
|
|
|
/** |
|
* @file |
|
* G.723.1 types, functions and data tables |
|
*/ |
|
|
|
#ifndef AVCODEC_G723_1_H |
|
#define AVCODEC_G723_1_H |
|
|
|
#include <stdint.h> |
|
|
|
#include "libavutil/log.h" |
|
|
|
#define SUBFRAMES 4 |
|
#define SUBFRAME_LEN 60 |
|
#define FRAME_LEN (SUBFRAME_LEN << 2) |
|
#define HALF_FRAME_LEN (FRAME_LEN / 2) |
|
#define LPC_FRAME (HALF_FRAME_LEN + SUBFRAME_LEN) |
|
#define LPC_ORDER 10 |
|
#define LSP_BANDS 3 |
|
#define LSP_CB_SIZE 256 |
|
#define PITCH_MIN 18 |
|
#define PITCH_MAX (PITCH_MIN + 127) |
|
#define PITCH_ORDER 5 |
|
#define GRID_SIZE 2 |
|
#define PULSE_MAX 6 |
|
#define GAIN_LEVELS 24 |
|
#define COS_TBL_SIZE 512 |
|
|
|
/** |
|
* Bitexact implementation of 2ab scaled by 1/2^16. |
|
* |
|
* @param a 32 bit multiplicand |
|
* @param b 16 bit multiplier |
|
*/ |
|
#define MULL2(a, b) \ |
|
((((a) >> 16) * (b) * 2) + (((a) & 0xffff) * (b) >> 15)) |
|
|
|
/** |
|
* G723.1 frame types |
|
*/ |
|
enum FrameType { |
|
ACTIVE_FRAME, ///< Active speech |
|
SID_FRAME, ///< Silence Insertion Descriptor frame |
|
UNTRANSMITTED_FRAME |
|
}; |
|
|
|
/** |
|
* G723.1 rate values |
|
*/ |
|
enum Rate { |
|
RATE_6300, |
|
RATE_5300 |
|
}; |
|
|
|
/** |
|
* G723.1 unpacked data subframe |
|
*/ |
|
typedef struct G723_1_Subframe { |
|
int ad_cb_lag; ///< adaptive codebook lag |
|
int ad_cb_gain; |
|
int dirac_train; |
|
int pulse_sign; |
|
int grid_index; |
|
int amp_index; |
|
int pulse_pos; |
|
} G723_1_Subframe; |
|
|
|
/** |
|
* Pitch postfilter parameters |
|
*/ |
|
typedef struct PPFParam { |
|
int index; ///< postfilter backward/forward lag |
|
int16_t opt_gain; ///< optimal gain |
|
int16_t sc_gain; ///< scaling gain |
|
} PPFParam; |
|
|
|
/** |
|
* Harmonic filter parameters |
|
*/ |
|
typedef struct HFParam { |
|
int index; |
|
int gain; |
|
} HFParam; |
|
|
|
/** |
|
* Optimized fixed codebook excitation parameters |
|
*/ |
|
typedef struct FCBParam { |
|
int min_err; |
|
int amp_index; |
|
int grid_index; |
|
int dirac_train; |
|
int pulse_pos[PULSE_MAX]; |
|
int pulse_sign[PULSE_MAX]; |
|
} FCBParam; |
|
|
|
typedef struct G723_1_ChannelContext { |
|
G723_1_Subframe subframe[4]; |
|
enum FrameType cur_frame_type; |
|
enum FrameType past_frame_type; |
|
enum Rate cur_rate; |
|
uint8_t lsp_index[LSP_BANDS]; |
|
int pitch_lag[2]; |
|
int erased_frames; |
|
|
|
int16_t prev_lsp[LPC_ORDER]; |
|
int16_t sid_lsp[LPC_ORDER]; |
|
int16_t prev_excitation[PITCH_MAX]; |
|
int16_t excitation[PITCH_MAX + FRAME_LEN + 4]; |
|
int16_t synth_mem[LPC_ORDER]; |
|
int16_t fir_mem[LPC_ORDER]; |
|
int iir_mem[LPC_ORDER]; |
|
|
|
int random_seed; |
|
int cng_random_seed; |
|
int interp_index; |
|
int interp_gain; |
|
int sid_gain; |
|
int cur_gain; |
|
int reflection_coef; |
|
int pf_gain; ///< formant postfilter |
|
///< gain scaling unit memory |
|
int16_t audio[FRAME_LEN + LPC_ORDER + PITCH_MAX + 4]; |
|
|
|
/* encoder */ |
|
int16_t prev_data[HALF_FRAME_LEN]; |
|
int16_t prev_weight_sig[PITCH_MAX]; |
|
|
|
int16_t hpf_fir_mem; ///< highpass filter fir |
|
int hpf_iir_mem; ///< and iir memories |
|
int16_t perf_fir_mem[LPC_ORDER]; ///< perceptual filter fir |
|
int16_t perf_iir_mem[LPC_ORDER]; ///< and iir memories |
|
|
|
int16_t harmonic_mem[PITCH_MAX]; |
|
} G723_1_ChannelContext; |
|
|
|
typedef struct G723_1_Context { |
|
AVClass *class; |
|
int postfilter; |
|
|
|
G723_1_ChannelContext ch[2]; |
|
} G723_1_Context; |
|
|
|
|
|
/** |
|
* Scale vector contents based on the largest of their absolutes. |
|
*/ |
|
int ff_g723_1_scale_vector(int16_t *dst, const int16_t *vector, int length); |
|
|
|
/** |
|
* Calculate the number of left-shifts required for normalizing the input. |
|
* |
|
* @param num input number |
|
* @param width width of the input, 16 bits(0) / 32 bits(1) |
|
*/ |
|
int ff_g723_1_normalize_bits(int num, int width); |
|
|
|
int ff_g723_1_dot_product(const int16_t *a, const int16_t *b, int length); |
|
|
|
/** |
|
* Get delayed contribution from the previous excitation vector. |
|
*/ |
|
void ff_g723_1_get_residual(int16_t *residual, int16_t *prev_excitation, |
|
int lag); |
|
|
|
/** |
|
* Generate a train of dirac functions with period as pitch lag. |
|
*/ |
|
void ff_g723_1_gen_dirac_train(int16_t *buf, int pitch_lag); |
|
|
|
|
|
/** |
|
* Generate adaptive codebook excitation. |
|
*/ |
|
void ff_g723_1_gen_acb_excitation(int16_t *vector, int16_t *prev_excitation, |
|
int pitch_lag, G723_1_Subframe *subfrm, |
|
enum Rate cur_rate); |
|
/** |
|
* Quantize LSP frequencies by interpolation and convert them to |
|
* the corresponding LPC coefficients. |
|
* |
|
* @param lpc buffer for LPC coefficients |
|
* @param cur_lsp the current LSP vector |
|
* @param prev_lsp the previous LSP vector |
|
*/ |
|
void ff_g723_1_lsp_interpolate(int16_t *lpc, int16_t *cur_lsp, |
|
int16_t *prev_lsp); |
|
|
|
/** |
|
* Perform inverse quantization of LSP frequencies. |
|
* |
|
* @param cur_lsp the current LSP vector |
|
* @param prev_lsp the previous LSP vector |
|
* @param lsp_index VQ indices |
|
* @param bad_frame bad frame flag |
|
*/ |
|
void ff_g723_1_inverse_quant(int16_t *cur_lsp, int16_t *prev_lsp, |
|
uint8_t *lsp_index, int bad_frame); |
|
|
|
static const uint8_t frame_size[4] = { 24, 20, 4, 1 }; |
|
|
|
/** |
|
* LSP DC component |
|
*/ |
|
static const int16_t dc_lsp[LPC_ORDER] = { |
|
0x0c3b, |
|
0x1271, |
|
0x1e0a, |
|
0x2a36, |
|
0x3630, |
|
0x406f, |
|
0x4d28, |
|
0x56f4, |
|
0x638c, |
|
0x6c46 |
|
}; |
|
|
|
/* Cosine table scaled by 2^14 */ |
|
extern const int16_t ff_g723_1_cos_tab[COS_TBL_SIZE + 1]; |
|
#define G723_1_COS_TAB_FIRST_ELEMENT 16384 |
|
|
|
/** |
|
* LSP VQ tables |
|
*/ |
|
extern const int16_t ff_g723_1_lsp_band0[LSP_CB_SIZE][3]; |
|
extern const int16_t ff_g723_1_lsp_band1[LSP_CB_SIZE][3]; |
|
extern const int16_t ff_g723_1_lsp_band2[LSP_CB_SIZE][4]; |
|
|
|
/** |
|
* Used for the coding/decoding of the pulses positions |
|
* for the MP-MLQ codebook |
|
*/ |
|
extern const int32_t ff_g723_1_combinatorial_table[PULSE_MAX][SUBFRAME_LEN/GRID_SIZE]; |
|
|
|
/** |
|
* Number of non-zero pulses in the MP-MLQ excitation |
|
*/ |
|
static const int8_t pulses[4] = {6, 5, 6, 5}; |
|
|
|
extern const int16_t ff_g723_1_fixed_cb_gain[GAIN_LEVELS]; |
|
|
|
extern const int16_t ff_g723_1_adaptive_cb_gain85 [ 85 * 20]; |
|
extern const int16_t ff_g723_1_adaptive_cb_gain170[170 * 20]; |
|
|
|
#endif /* AVCODEC_G723_1_H */
|
|
|