1/* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19#include "config.h" 20#include "libavutil/attributes.h" 21#include "opusdsp.h" 22 23static void postfilter_c(float *data, int period, float *gains, int len) 24{ 25 const float g0 = gains[0]; 26 const float g1 = gains[1]; 27 const float g2 = gains[2]; 28 29 float x4 = data[-period - 2]; 30 float x3 = data[-period - 1]; 31 float x2 = data[-period + 0]; 32 float x1 = data[-period + 1]; 33 34 for (int i = 0; i < len; i++) { 35 float x0 = data[i - period + 2]; 36 data[i] += g0 * x2 + 37 g1 * (x1 + x3) + 38 g2 * (x0 + x4); 39 x4 = x3; 40 x3 = x2; 41 x2 = x1; 42 x1 = x0; 43 } 44} 45 46static float deemphasis_c(float *y, float *x, float coeff, int len) 47{ 48 for (int i = 0; i < len; i++) 49 coeff = y[i] = x[i] + coeff*CELT_EMPH_COEFF; 50 51 return coeff; 52} 53 54av_cold void ff_opus_dsp_init(OpusDSP *ctx) 55{ 56 ctx->postfilter = postfilter_c; 57 ctx->deemphasis = deemphasis_c; 58 59#if ARCH_AARCH64 60 ff_opus_dsp_init_aarch64(ctx); 61#elif ARCH_X86 62 ff_opus_dsp_init_x86(ctx); 63#endif 64} 65