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