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 "dsputil.h" 29#include "acelp_pitch_delay.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 48typedef enum { 49 MODE_16k, 50 MODE_8k5, 51 MODE_6k5, 52 MODE_5k0, 53 MODE_COUNT 54} SiprMode; 55 56typedef struct { 57 AVCodecContext *avctx; 58 DSPContext dsp; 59 60 SiprMode mode; 61 62 float past_pitch_gain; 63 float lsf_history[LP_FILTER_ORDER_16k]; 64 65 float excitation[L_INTERPOL + PITCH_MAX + 2 * L_SUBFR_16k]; 66 67 DECLARE_ALIGNED(16, float, synth_buf)[LP_FILTER_ORDER + 5*SUBFR_SIZE + 6]; 68 69 float lsp_history[LP_FILTER_ORDER]; 70 float gain_mem; 71 float energy_history[4]; 72 float highpass_filt_mem[2]; 73 float postfilter_mem[PITCH_DELAY_MAX + LP_FILTER_ORDER]; 74 75 /* 5k0 */ 76 float tilt_mem; 77 float postfilter_agc; 78 float postfilter_mem5k0[PITCH_DELAY_MAX + LP_FILTER_ORDER]; 79 float postfilter_syn5k0[LP_FILTER_ORDER + SUBFR_SIZE*5]; 80 81 /* 16k */ 82 int pitch_lag_prev; 83 float iir_mem[LP_FILTER_ORDER_16k+1]; 84 float filt_buf[2][LP_FILTER_ORDER_16k+1]; 85 float *filt_mem[2]; 86 float mem_preemph[LP_FILTER_ORDER_16k]; 87 float synth[LP_FILTER_ORDER_16k]; 88 double lsp_history_16k[16]; 89} SiprContext; 90 91typedef struct { 92 int ma_pred_switch; ///< switched moving average predictor 93 int vq_indexes[5]; 94 int pitch_delay[5]; ///< pitch delay 95 int gp_index[5]; ///< adaptive-codebook gain indexes 96 int16_t fc_indexes[5][10]; ///< fixed-codebook indexes 97 int gc_index[5]; ///< fixed-codebook gain indexes 98} SiprParameters; 99 100extern const float ff_pow_0_5[16]; 101 102void ff_sipr_init_16k(SiprContext *ctx); 103 104void ff_sipr_decode_frame_16k(SiprContext *ctx, SiprParameters *params, 105 float *out_data); 106 107#endif /* AVCODEC_SIPR_H */ 108