diff options
Diffstat (limited to 'libavcodec/g723_1dec.c')
-rw-r--r-- | libavcodec/g723_1dec.c | 93 |
1 files changed, 38 insertions, 55 deletions
diff --git a/libavcodec/g723_1dec.c b/libavcodec/g723_1dec.c index f50bed134e..e9896b5e7a 100644 --- a/libavcodec/g723_1dec.c +++ b/libavcodec/g723_1dec.c @@ -3,20 +3,20 @@ * Copyright (c) 2006 Benjamin Larsson * Copyright (c) 2010 Mohamed Naufal Basheer * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * 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. * - * Libav is distributed in the hope that it will be useful, + * 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 Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -33,6 +33,7 @@ #include "acelp_vectors.h" #include "avcodec.h" #include "celp_filters.h" +#include "celp_math.h" #include "get_bits.h" #include "internal.h" #include "g723_1.h" @@ -46,7 +47,6 @@ static av_cold int g723_1_decode_init(AVCodecContext *avctx) avctx->channel_layout = AV_CH_LAYOUT_MONO; avctx->sample_fmt = AV_SAMPLE_FMT_S16; avctx->channels = 1; - avctx->sample_rate = 8000; p->pf_gain = 1 << 12; memcpy(p->prev_lsp, dc_lsp, LPC_ORDER * sizeof(*p->prev_lsp)); @@ -130,13 +130,13 @@ static int unpack_bitstream(G723_1_Context *p, const uint8_t *buf, } } - p->subframe[0].grid_index = get_bits(&gb, 1); - p->subframe[1].grid_index = get_bits(&gb, 1); - p->subframe[2].grid_index = get_bits(&gb, 1); - p->subframe[3].grid_index = get_bits(&gb, 1); + p->subframe[0].grid_index = get_bits1(&gb); + p->subframe[1].grid_index = get_bits1(&gb); + p->subframe[2].grid_index = get_bits1(&gb); + p->subframe[3].grid_index = get_bits1(&gb); if (p->cur_rate == RATE_6300) { - skip_bits(&gb, 1); /* skip reserved bit */ + skip_bits1(&gb); /* skip reserved bit */ /* Compute pulse_pos index using the 13-bit combined position index */ temp = get_bits(&gb, 13); @@ -180,31 +180,14 @@ static int unpack_bitstream(G723_1_Context *p, const uint8_t *buf, /** * Bitexact implementation of sqrt(val/2). */ -static int16_t square_root(int val) +static int16_t square_root(unsigned val) { - int16_t res = 0; - int16_t exp = 0x4000; - int i; + av_assert2(!(val & 0x80000000)); - for (i = 0; i < 14; i ++) { - int res_exp = res + exp; - if (val >= res_exp * res_exp << 1) - res += exp; - exp >>= 1; - } - return res; + return (ff_sqrt(val << 1) >> 1) & (~1); } /** - * 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) << 1) + (((a) & 0xffff) * (b) >> 15)) - -/** * Generate fixed codebook excitation vector. * * @param vector decoded excitation vector @@ -477,9 +460,9 @@ static int comp_interp_index(G723_1_Context *p, int pitch_lag, temp = best_eng * *exc_eng >> 3; - if (temp < ccr * ccr) + if (temp < ccr * ccr) { return index; - else + } else return 0; } @@ -519,21 +502,24 @@ static void residual_interp(int16_t *buf, int16_t *out, int lag, * @param iir_coef IIR coefficients * @param src source vector * @param dest destination vector + * @param width width of the output, 16 bits(0) / 32 bits(1) */ -static void iir_filter(int16_t *fir_coef, int16_t *iir_coef, - int16_t *src, int *dest) -{ - int m, n; - - for (m = 0; m < SUBFRAME_LEN; m++) { - int64_t filter = 0; - for (n = 1; n <= LPC_ORDER; n++) { - filter -= fir_coef[n - 1] * src[m - n] - - iir_coef[n - 1] * (dest[m - n] >> 16); - } - - dest[m] = av_clipl_int32((src[m] << 16) + (filter << 3) + (1 << 15)); - } +#define iir_filter(fir_coef, iir_coef, src, dest, width)\ +{\ + int m, n;\ + int res_shift = 16 & ~-(width);\ + int in_shift = 16 - res_shift;\ +\ + for (m = 0; m < SUBFRAME_LEN; m++) {\ + int64_t filter = 0;\ + for (n = 1; n <= LPC_ORDER; n++) {\ + filter -= (fir_coef)[n - 1] * (src)[m - n] -\ + (iir_coef)[n - 1] * ((dest)[m - n] >> in_shift);\ + }\ +\ + (dest)[m] = av_clipl_int32(((src)[m] << 16) + (filter << 3) +\ + (1 << 15)) >> res_shift;\ + }\ } /** @@ -603,13 +589,12 @@ static void formant_postfilter(G723_1_Context *p, int16_t *lpc, filter_coef[1][k] = (-lpc[k] * postfilter_tbl[1][k] + (1 << 14)) >> 15; } - iir_filter(filter_coef[0], filter_coef[1], buf + i, filter_signal + i); + iir_filter(filter_coef[0], filter_coef[1], buf + i, filter_signal + i, 1); lpc += LPC_ORDER; } - memcpy(p->fir_mem, buf + FRAME_LEN, LPC_ORDER * sizeof(*p->fir_mem)); - memcpy(p->iir_mem, filter_signal + FRAME_LEN, - LPC_ORDER * sizeof(*p->iir_mem)); + memcpy(p->fir_mem, buf + FRAME_LEN, LPC_ORDER * sizeof(int16_t)); + memcpy(p->iir_mem, filter_signal + FRAME_LEN, LPC_ORDER * sizeof(int)); buf += LPC_ORDER; signal_ptr = filter_signal + LPC_ORDER; @@ -884,10 +869,8 @@ static int g723_1_decode_frame(AVCodecContext *avctx, void *data, } frame->nb_samples = FRAME_LEN; - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return ret; - } + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) + return ret; out = (int16_t *)frame->data[0]; @@ -1019,7 +1002,7 @@ static int g723_1_decode_frame(AVCodecContext *avctx, void *data, #define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM static const AVOption options[] = { - { "postfilter", "postfilter on/off", OFFSET(postfilter), AV_OPT_TYPE_INT, + { "postfilter", "enable postfilter", OFFSET(postfilter), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AD }, { NULL } }; |