mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 20:42:49 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			268 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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 */
 | 
