/* * 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 */