1 /* 2 * SIPR / ACELP.NET decoder 3 * 4 * Copyright (c) 2008 Vladimir Voroshilov 5 * Copyright (c) 2009 Vitor Sessak 6 * 7 * This file is part of FFmpeg. 8 * 9 * FFmpeg is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2.1 of the License, or (at your option) any later version. 13 * 14 * FFmpeg is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with FFmpeg; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 */ 23 24 #ifndef AVCODEC_SIPR_H 25 #define AVCODEC_SIPR_H 26 27 #include "avcodec.h" 28 #include "acelp_pitch_delay.h" 29 #include "libavutil/mem_internal.h" 30 31 #define LP_FILTER_ORDER_16k 16 32 #define L_SUBFR_16k 80 33 #define PITCH_MIN 30 34 #define PITCH_MAX 281 35 36 #define LSFQ_DIFF_MIN (0.0125 * M_PI) 37 38 #define LP_FILTER_ORDER 10 39 40 /** Number of past samples needed for excitation interpolation */ 41 #define L_INTERPOL (LP_FILTER_ORDER + 1) 42 43 /** Subframe size for all modes except 16k */ 44 #define SUBFR_SIZE 48 45 46 #define SUBFRAME_COUNT_16k 2 47 48 typedef enum { 49 MODE_16k, 50 MODE_8k5, 51 MODE_6k5, 52 MODE_5k0, 53 MODE_COUNT 54 } SiprMode; 55 56 typedef struct SiprParameters { 57 int ma_pred_switch; ///< switched moving average predictor 58 int vq_indexes[5]; 59 int pitch_delay[5]; ///< pitch delay 60 int gp_index[5]; ///< adaptive-codebook gain indexes 61 int16_t fc_indexes[5][10]; ///< fixed-codebook indexes 62 int gc_index[5]; ///< fixed-codebook gain indexes 63 } SiprParameters; 64 65 typedef struct SiprContext { 66 AVCodecContext *avctx; 67 68 SiprMode mode; 69 70 float past_pitch_gain; 71 float lsf_history[LP_FILTER_ORDER_16k]; 72 73 float excitation[L_INTERPOL + PITCH_MAX + 2 * L_SUBFR_16k]; 74 75 DECLARE_ALIGNED(16, float, synth_buf)[LP_FILTER_ORDER + 5*SUBFR_SIZE + 6]; 76 77 float lsp_history[LP_FILTER_ORDER]; 78 float gain_mem; 79 float energy_history[4]; 80 float highpass_filt_mem[2]; 81 float postfilter_mem[PITCH_DELAY_MAX + LP_FILTER_ORDER]; 82 83 /* 5k0 */ 84 float tilt_mem; 85 float postfilter_agc; 86 float postfilter_mem5k0[PITCH_DELAY_MAX + LP_FILTER_ORDER]; 87 float postfilter_syn5k0[LP_FILTER_ORDER + SUBFR_SIZE*5]; 88 89 /* 16k */ 90 int pitch_lag_prev; 91 float iir_mem[LP_FILTER_ORDER_16k+1]; 92 float filt_buf[2][LP_FILTER_ORDER_16k+1]; 93 float *filt_mem[2]; 94 float mem_preemph[LP_FILTER_ORDER_16k]; 95 float synth[LP_FILTER_ORDER_16k]; 96 double lsp_history_16k[16]; 97 98 void (*decode_frame)(struct SiprContext *ctx, SiprParameters *params, 99 float *out_data); 100 } SiprContext; 101 102 extern const float ff_pow_0_5[16]; 103 104 void ff_sipr_init_16k(SiprContext *ctx); 105 106 void ff_sipr_decode_frame_16k(SiprContext *ctx, SiprParameters *params, 107 float *out_data); 108 109 #endif /* AVCODEC_SIPR_H */ 110