1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Enhanced Variable Rate Codec, Service Option 3 decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2013 Paul B Mahol 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * Enhanced Variable Rate Codec, Service Option 3 decoder 25cabdff1aSopenharmony_ci * @author Paul B Mahol 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 29cabdff1aSopenharmony_ci#include "libavutil/mathematics.h" 30cabdff1aSopenharmony_ci#include "libavutil/opt.h" 31cabdff1aSopenharmony_ci#include "avcodec.h" 32cabdff1aSopenharmony_ci#include "codec_internal.h" 33cabdff1aSopenharmony_ci#include "internal.h" 34cabdff1aSopenharmony_ci#include "get_bits.h" 35cabdff1aSopenharmony_ci#include "evrcdata.h" 36cabdff1aSopenharmony_ci#include "acelp_vectors.h" 37cabdff1aSopenharmony_ci#include "lsp.h" 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci#define MIN_LSP_SEP (0.05 / (2.0 * M_PI)) 40cabdff1aSopenharmony_ci#define MIN_DELAY 20 41cabdff1aSopenharmony_ci#define MAX_DELAY 120 42cabdff1aSopenharmony_ci#define NB_SUBFRAMES 3 43cabdff1aSopenharmony_ci#define SUBFRAME_SIZE 54 44cabdff1aSopenharmony_ci#define FILTER_ORDER 10 45cabdff1aSopenharmony_ci#define ACB_SIZE 128 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_citypedef enum { 48cabdff1aSopenharmony_ci RATE_ERRS = -1, 49cabdff1aSopenharmony_ci SILENCE, 50cabdff1aSopenharmony_ci RATE_QUANT, 51cabdff1aSopenharmony_ci RATE_QUARTER, 52cabdff1aSopenharmony_ci RATE_HALF, 53cabdff1aSopenharmony_ci RATE_FULL, 54cabdff1aSopenharmony_ci} evrc_packet_rate; 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci/** 57cabdff1aSopenharmony_ci * EVRC-A unpacked data frame 58cabdff1aSopenharmony_ci */ 59cabdff1aSopenharmony_citypedef struct EVRCAFrame { 60cabdff1aSopenharmony_ci uint8_t lpc_flag; ///< spectral change indicator 61cabdff1aSopenharmony_ci uint16_t lsp[4]; ///< index into LSP codebook 62cabdff1aSopenharmony_ci uint8_t pitch_delay; ///< pitch delay for entire frame 63cabdff1aSopenharmony_ci uint8_t delay_diff; ///< delay difference for entire frame 64cabdff1aSopenharmony_ci uint8_t acb_gain[3]; ///< adaptive codebook gain 65cabdff1aSopenharmony_ci uint16_t fcb_shape[3][4]; ///< fixed codebook shape 66cabdff1aSopenharmony_ci uint8_t fcb_gain[3]; ///< fixed codebook gain index 67cabdff1aSopenharmony_ci uint8_t energy_gain; ///< frame energy gain index 68cabdff1aSopenharmony_ci uint8_t tty; ///< tty baud rate bit 69cabdff1aSopenharmony_ci} EVRCAFrame; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_citypedef struct EVRCContext { 72cabdff1aSopenharmony_ci AVClass *class; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci int postfilter; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci GetBitContext gb; 77cabdff1aSopenharmony_ci evrc_packet_rate bitrate; 78cabdff1aSopenharmony_ci evrc_packet_rate last_valid_bitrate; 79cabdff1aSopenharmony_ci EVRCAFrame frame; 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci float lspf[FILTER_ORDER]; 82cabdff1aSopenharmony_ci float prev_lspf[FILTER_ORDER]; 83cabdff1aSopenharmony_ci float synthesis[FILTER_ORDER]; 84cabdff1aSopenharmony_ci float postfilter_fir[FILTER_ORDER]; 85cabdff1aSopenharmony_ci float postfilter_iir[FILTER_ORDER]; 86cabdff1aSopenharmony_ci float postfilter_residual[ACB_SIZE + SUBFRAME_SIZE]; 87cabdff1aSopenharmony_ci float pitch_delay; 88cabdff1aSopenharmony_ci float prev_pitch_delay; 89cabdff1aSopenharmony_ci float avg_acb_gain; ///< average adaptive codebook gain 90cabdff1aSopenharmony_ci float avg_fcb_gain; ///< average fixed codebook gain 91cabdff1aSopenharmony_ci float pitch[ACB_SIZE + FILTER_ORDER + SUBFRAME_SIZE]; 92cabdff1aSopenharmony_ci float pitch_back[ACB_SIZE]; 93cabdff1aSopenharmony_ci float interpolation_coeffs[136]; 94cabdff1aSopenharmony_ci float energy_vector[NB_SUBFRAMES]; 95cabdff1aSopenharmony_ci float fade_scale; 96cabdff1aSopenharmony_ci float last; 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci uint8_t prev_energy_gain; 99cabdff1aSopenharmony_ci uint8_t prev_error_flag; 100cabdff1aSopenharmony_ci uint8_t warned_buf_mismatch_bitrate; 101cabdff1aSopenharmony_ci} EVRCContext; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci/** 104cabdff1aSopenharmony_ci * Frame unpacking for RATE_FULL, RATE_HALF and RATE_QUANT 105cabdff1aSopenharmony_ci * 106cabdff1aSopenharmony_ci * @param e the context 107cabdff1aSopenharmony_ci * 108cabdff1aSopenharmony_ci * TIA/IS-127 Table 4.21-1 109cabdff1aSopenharmony_ci */ 110cabdff1aSopenharmony_cistatic void unpack_frame(EVRCContext *e) 111cabdff1aSopenharmony_ci{ 112cabdff1aSopenharmony_ci EVRCAFrame *frame = &e->frame; 113cabdff1aSopenharmony_ci GetBitContext *gb = &e->gb; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci switch (e->bitrate) { 116cabdff1aSopenharmony_ci case RATE_FULL: 117cabdff1aSopenharmony_ci frame->lpc_flag = get_bits1(gb); 118cabdff1aSopenharmony_ci frame->lsp[0] = get_bits(gb, 6); 119cabdff1aSopenharmony_ci frame->lsp[1] = get_bits(gb, 6); 120cabdff1aSopenharmony_ci frame->lsp[2] = get_bits(gb, 9); 121cabdff1aSopenharmony_ci frame->lsp[3] = get_bits(gb, 7); 122cabdff1aSopenharmony_ci frame->pitch_delay = get_bits(gb, 7); 123cabdff1aSopenharmony_ci frame->delay_diff = get_bits(gb, 5); 124cabdff1aSopenharmony_ci frame->acb_gain[0] = get_bits(gb, 3); 125cabdff1aSopenharmony_ci frame->fcb_shape[0][0] = get_bits(gb, 8); 126cabdff1aSopenharmony_ci frame->fcb_shape[0][1] = get_bits(gb, 8); 127cabdff1aSopenharmony_ci frame->fcb_shape[0][2] = get_bits(gb, 8); 128cabdff1aSopenharmony_ci frame->fcb_shape[0][3] = get_bits(gb, 11); 129cabdff1aSopenharmony_ci frame->fcb_gain[0] = get_bits(gb, 5); 130cabdff1aSopenharmony_ci frame->acb_gain[1] = get_bits(gb, 3); 131cabdff1aSopenharmony_ci frame->fcb_shape[1][0] = get_bits(gb, 8); 132cabdff1aSopenharmony_ci frame->fcb_shape[1][1] = get_bits(gb, 8); 133cabdff1aSopenharmony_ci frame->fcb_shape[1][2] = get_bits(gb, 8); 134cabdff1aSopenharmony_ci frame->fcb_shape[1][3] = get_bits(gb, 11); 135cabdff1aSopenharmony_ci frame->fcb_gain [1] = get_bits(gb, 5); 136cabdff1aSopenharmony_ci frame->acb_gain [2] = get_bits(gb, 3); 137cabdff1aSopenharmony_ci frame->fcb_shape[2][0] = get_bits(gb, 8); 138cabdff1aSopenharmony_ci frame->fcb_shape[2][1] = get_bits(gb, 8); 139cabdff1aSopenharmony_ci frame->fcb_shape[2][2] = get_bits(gb, 8); 140cabdff1aSopenharmony_ci frame->fcb_shape[2][3] = get_bits(gb, 11); 141cabdff1aSopenharmony_ci frame->fcb_gain [2] = get_bits(gb, 5); 142cabdff1aSopenharmony_ci frame->tty = get_bits1(gb); 143cabdff1aSopenharmony_ci break; 144cabdff1aSopenharmony_ci case RATE_HALF: 145cabdff1aSopenharmony_ci frame->lsp [0] = get_bits(gb, 7); 146cabdff1aSopenharmony_ci frame->lsp [1] = get_bits(gb, 7); 147cabdff1aSopenharmony_ci frame->lsp [2] = get_bits(gb, 8); 148cabdff1aSopenharmony_ci frame->pitch_delay = get_bits(gb, 7); 149cabdff1aSopenharmony_ci frame->acb_gain [0] = get_bits(gb, 3); 150cabdff1aSopenharmony_ci frame->fcb_shape[0][0] = get_bits(gb, 10); 151cabdff1aSopenharmony_ci frame->fcb_gain [0] = get_bits(gb, 4); 152cabdff1aSopenharmony_ci frame->acb_gain [1] = get_bits(gb, 3); 153cabdff1aSopenharmony_ci frame->fcb_shape[1][0] = get_bits(gb, 10); 154cabdff1aSopenharmony_ci frame->fcb_gain [1] = get_bits(gb, 4); 155cabdff1aSopenharmony_ci frame->acb_gain [2] = get_bits(gb, 3); 156cabdff1aSopenharmony_ci frame->fcb_shape[2][0] = get_bits(gb, 10); 157cabdff1aSopenharmony_ci frame->fcb_gain [2] = get_bits(gb, 4); 158cabdff1aSopenharmony_ci break; 159cabdff1aSopenharmony_ci case RATE_QUANT: 160cabdff1aSopenharmony_ci frame->lsp [0] = get_bits(gb, 4); 161cabdff1aSopenharmony_ci frame->lsp [1] = get_bits(gb, 4); 162cabdff1aSopenharmony_ci frame->energy_gain = get_bits(gb, 8); 163cabdff1aSopenharmony_ci break; 164cabdff1aSopenharmony_ci } 165cabdff1aSopenharmony_ci} 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_cistatic evrc_packet_rate buf_size2bitrate(const int buf_size) 168cabdff1aSopenharmony_ci{ 169cabdff1aSopenharmony_ci switch (buf_size) { 170cabdff1aSopenharmony_ci case 23: return RATE_FULL; 171cabdff1aSopenharmony_ci case 11: return RATE_HALF; 172cabdff1aSopenharmony_ci case 6: return RATE_QUARTER; 173cabdff1aSopenharmony_ci case 3: return RATE_QUANT; 174cabdff1aSopenharmony_ci case 1: return SILENCE; 175cabdff1aSopenharmony_ci } 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci return RATE_ERRS; 178cabdff1aSopenharmony_ci} 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci/** 181cabdff1aSopenharmony_ci * Determine the bitrate from the frame size and/or the first byte of the frame. 182cabdff1aSopenharmony_ci * 183cabdff1aSopenharmony_ci * @param avctx the AV codec context 184cabdff1aSopenharmony_ci * @param buf_size length of the buffer 185cabdff1aSopenharmony_ci * @param buf the bufffer 186cabdff1aSopenharmony_ci * 187cabdff1aSopenharmony_ci * @return the bitrate on success, 188cabdff1aSopenharmony_ci * RATE_ERRS if the bitrate cannot be satisfactorily determined 189cabdff1aSopenharmony_ci */ 190cabdff1aSopenharmony_cistatic evrc_packet_rate determine_bitrate(AVCodecContext *avctx, 191cabdff1aSopenharmony_ci int *buf_size, 192cabdff1aSopenharmony_ci const uint8_t **buf) 193cabdff1aSopenharmony_ci{ 194cabdff1aSopenharmony_ci evrc_packet_rate bitrate; 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_ci if ((bitrate = buf_size2bitrate(*buf_size)) >= 0) { 197cabdff1aSopenharmony_ci if (bitrate > **buf) { 198cabdff1aSopenharmony_ci EVRCContext *e = avctx->priv_data; 199cabdff1aSopenharmony_ci if (!e->warned_buf_mismatch_bitrate) { 200cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, 201cabdff1aSopenharmony_ci "Claimed bitrate and buffer size mismatch.\n"); 202cabdff1aSopenharmony_ci e->warned_buf_mismatch_bitrate = 1; 203cabdff1aSopenharmony_ci } 204cabdff1aSopenharmony_ci bitrate = **buf; 205cabdff1aSopenharmony_ci } else if (bitrate < **buf) { 206cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 207cabdff1aSopenharmony_ci "Buffer is too small for the claimed bitrate.\n"); 208cabdff1aSopenharmony_ci return RATE_ERRS; 209cabdff1aSopenharmony_ci } 210cabdff1aSopenharmony_ci (*buf)++; 211cabdff1aSopenharmony_ci *buf_size -= 1; 212cabdff1aSopenharmony_ci } else if ((bitrate = buf_size2bitrate(*buf_size + 1)) >= 0) { 213cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, 214cabdff1aSopenharmony_ci "Bitrate byte is missing, guessing the bitrate from packet size.\n"); 215cabdff1aSopenharmony_ci } else 216cabdff1aSopenharmony_ci return RATE_ERRS; 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci return bitrate; 219cabdff1aSopenharmony_ci} 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_cistatic void warn_insufficient_frame_quality(AVCodecContext *avctx, 222cabdff1aSopenharmony_ci const char *message) 223cabdff1aSopenharmony_ci{ 224cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "Frame #%d, %s\n", 225cabdff1aSopenharmony_ci avctx->frame_number, message); 226cabdff1aSopenharmony_ci} 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci/** 229cabdff1aSopenharmony_ci * Initialize the speech codec according to the specification. 230cabdff1aSopenharmony_ci * 231cabdff1aSopenharmony_ci * TIA/IS-127 5.2 232cabdff1aSopenharmony_ci */ 233cabdff1aSopenharmony_cistatic av_cold int evrc_decode_init(AVCodecContext *avctx) 234cabdff1aSopenharmony_ci{ 235cabdff1aSopenharmony_ci EVRCContext *e = avctx->priv_data; 236cabdff1aSopenharmony_ci int i, n, idx = 0; 237cabdff1aSopenharmony_ci float denom = 2.0 / (2.0 * 8.0 + 1.0); 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 240cabdff1aSopenharmony_ci avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; 241cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLT; 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci for (i = 0; i < FILTER_ORDER; i++) { 244cabdff1aSopenharmony_ci e->prev_lspf[i] = (i + 1) * 0.048; 245cabdff1aSopenharmony_ci e->synthesis[i] = 0.0; 246cabdff1aSopenharmony_ci } 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci for (i = 0; i < ACB_SIZE; i++) 249cabdff1aSopenharmony_ci e->pitch[i] = e->pitch_back[i] = 0.0; 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci e->last_valid_bitrate = RATE_QUANT; 252cabdff1aSopenharmony_ci e->prev_pitch_delay = 40.0; 253cabdff1aSopenharmony_ci e->fade_scale = 1.0; 254cabdff1aSopenharmony_ci e->prev_error_flag = 0; 255cabdff1aSopenharmony_ci e->avg_acb_gain = e->avg_fcb_gain = 0.0; 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) { 258cabdff1aSopenharmony_ci float tt = ((float)i - 8.0 / 2.0) / 8.0; 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci for (n = -8; n <= 8; n++, idx++) { 261cabdff1aSopenharmony_ci float arg1 = M_PI * 0.9 * (tt - n); 262cabdff1aSopenharmony_ci float arg2 = M_PI * (tt - n); 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_ci e->interpolation_coeffs[idx] = 0.9; 265cabdff1aSopenharmony_ci if (arg1) 266cabdff1aSopenharmony_ci e->interpolation_coeffs[idx] *= (0.54 + 0.46 * cos(arg2 * denom)) * 267cabdff1aSopenharmony_ci sin(arg1) / arg1; 268cabdff1aSopenharmony_ci } 269cabdff1aSopenharmony_ci } 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci return 0; 272cabdff1aSopenharmony_ci} 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci/** 275cabdff1aSopenharmony_ci * Decode the 10 vector quantized line spectral pair frequencies from the LSP 276cabdff1aSopenharmony_ci * transmission codes of any bitrate and check for badly received packets. 277cabdff1aSopenharmony_ci * 278cabdff1aSopenharmony_ci * @param e the context 279cabdff1aSopenharmony_ci * 280cabdff1aSopenharmony_ci * @return 0 on success, -1 if the packet is badly received 281cabdff1aSopenharmony_ci * 282cabdff1aSopenharmony_ci * TIA/IS-127 5.2.1, 5.7.1 283cabdff1aSopenharmony_ci */ 284cabdff1aSopenharmony_cistatic int decode_lspf(EVRCContext *e) 285cabdff1aSopenharmony_ci{ 286cabdff1aSopenharmony_ci const float * const *codebooks = evrc_lspq_codebooks[e->bitrate]; 287cabdff1aSopenharmony_ci int i, j, k = 0; 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci for (i = 0; i < evrc_lspq_nb_codebooks[e->bitrate]; i++) { 290cabdff1aSopenharmony_ci int row_size = evrc_lspq_codebooks_row_sizes[e->bitrate][i]; 291cabdff1aSopenharmony_ci const float *codebook = codebooks[i]; 292cabdff1aSopenharmony_ci 293cabdff1aSopenharmony_ci for (j = 0; j < row_size; j++) 294cabdff1aSopenharmony_ci e->lspf[k++] = codebook[e->frame.lsp[i] * row_size + j]; 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci // check for monotonic LSPs 298cabdff1aSopenharmony_ci for (i = 1; i < FILTER_ORDER; i++) 299cabdff1aSopenharmony_ci if (e->lspf[i] <= e->lspf[i - 1]) 300cabdff1aSopenharmony_ci return -1; 301cabdff1aSopenharmony_ci 302cabdff1aSopenharmony_ci // check for minimum separation of LSPs at the splits 303cabdff1aSopenharmony_ci for (i = 0, k = 0; i < evrc_lspq_nb_codebooks[e->bitrate] - 1; i++) { 304cabdff1aSopenharmony_ci k += evrc_lspq_codebooks_row_sizes[e->bitrate][i]; 305cabdff1aSopenharmony_ci if (e->lspf[k] - e->lspf[k - 1] <= MIN_LSP_SEP) 306cabdff1aSopenharmony_ci return -1; 307cabdff1aSopenharmony_ci } 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci return 0; 310cabdff1aSopenharmony_ci} 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci/* 313cabdff1aSopenharmony_ci * Interpolation of LSP parameters. 314cabdff1aSopenharmony_ci * 315cabdff1aSopenharmony_ci * TIA/IS-127 5.2.3.1, 5.7.3.2 316cabdff1aSopenharmony_ci */ 317cabdff1aSopenharmony_cistatic void interpolate_lsp(float *ilsp, const float *lsp, 318cabdff1aSopenharmony_ci const float *prev, int index) 319cabdff1aSopenharmony_ci{ 320cabdff1aSopenharmony_ci static const float lsp_interpolation_factors[] = { 0.1667, 0.5, 0.8333 }; 321cabdff1aSopenharmony_ci ff_weighted_vector_sumf(ilsp, prev, lsp, 322cabdff1aSopenharmony_ci 1.0 - lsp_interpolation_factors[index], 323cabdff1aSopenharmony_ci lsp_interpolation_factors[index], FILTER_ORDER); 324cabdff1aSopenharmony_ci} 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci/* 327cabdff1aSopenharmony_ci * Reconstruction of the delay contour. 328cabdff1aSopenharmony_ci * 329cabdff1aSopenharmony_ci * TIA/IS-127 5.2.2.3.2 330cabdff1aSopenharmony_ci */ 331cabdff1aSopenharmony_cistatic void interpolate_delay(float *dst, float current, float prev, int index) 332cabdff1aSopenharmony_ci{ 333cabdff1aSopenharmony_ci static const float d_interpolation_factors[] = { 0, 0.3313, 0.6625, 1, 1 }; 334cabdff1aSopenharmony_ci dst[0] = (1.0 - d_interpolation_factors[index ]) * prev 335cabdff1aSopenharmony_ci + d_interpolation_factors[index ] * current; 336cabdff1aSopenharmony_ci dst[1] = (1.0 - d_interpolation_factors[index + 1]) * prev 337cabdff1aSopenharmony_ci + d_interpolation_factors[index + 1] * current; 338cabdff1aSopenharmony_ci dst[2] = (1.0 - d_interpolation_factors[index + 2]) * prev 339cabdff1aSopenharmony_ci + d_interpolation_factors[index + 2] * current; 340cabdff1aSopenharmony_ci} 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci/* 343cabdff1aSopenharmony_ci * Convert the quantized, interpolated line spectral frequencies, 344cabdff1aSopenharmony_ci * to prediction coefficients. 345cabdff1aSopenharmony_ci * 346cabdff1aSopenharmony_ci * TIA/IS-127 5.2.3.2, 4.7.2.2 347cabdff1aSopenharmony_ci */ 348cabdff1aSopenharmony_cistatic void decode_predictor_coeffs(const float *ilspf, float *ilpc) 349cabdff1aSopenharmony_ci{ 350cabdff1aSopenharmony_ci double lsp[FILTER_ORDER]; 351cabdff1aSopenharmony_ci float a[FILTER_ORDER / 2 + 1], b[FILTER_ORDER / 2 + 1]; 352cabdff1aSopenharmony_ci float a1[FILTER_ORDER / 2] = { 0 }; 353cabdff1aSopenharmony_ci float a2[FILTER_ORDER / 2] = { 0 }; 354cabdff1aSopenharmony_ci float b1[FILTER_ORDER / 2] = { 0 }; 355cabdff1aSopenharmony_ci float b2[FILTER_ORDER / 2] = { 0 }; 356cabdff1aSopenharmony_ci int i, k; 357cabdff1aSopenharmony_ci 358cabdff1aSopenharmony_ci ff_acelp_lsf2lspd(lsp, ilspf, FILTER_ORDER); 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci for (k = 0; k <= FILTER_ORDER; k++) { 361cabdff1aSopenharmony_ci a[0] = k < 2 ? 0.25 : 0; 362cabdff1aSopenharmony_ci b[0] = k < 2 ? k < 1 ? 0.25 : -0.25 : 0; 363cabdff1aSopenharmony_ci 364cabdff1aSopenharmony_ci for (i = 0; i < FILTER_ORDER / 2; i++) { 365cabdff1aSopenharmony_ci a[i + 1] = a[i] - 2 * lsp[i * 2 ] * a1[i] + a2[i]; 366cabdff1aSopenharmony_ci b[i + 1] = b[i] - 2 * lsp[i * 2 + 1] * b1[i] + b2[i]; 367cabdff1aSopenharmony_ci a2[i] = a1[i]; 368cabdff1aSopenharmony_ci a1[i] = a[i]; 369cabdff1aSopenharmony_ci b2[i] = b1[i]; 370cabdff1aSopenharmony_ci b1[i] = b[i]; 371cabdff1aSopenharmony_ci } 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci if (k) 374cabdff1aSopenharmony_ci ilpc[k - 1] = 2.0 * (a[FILTER_ORDER / 2] + b[FILTER_ORDER / 2]); 375cabdff1aSopenharmony_ci } 376cabdff1aSopenharmony_ci} 377cabdff1aSopenharmony_ci 378cabdff1aSopenharmony_cistatic void bl_intrp(EVRCContext *e, float *ex, float delay) 379cabdff1aSopenharmony_ci{ 380cabdff1aSopenharmony_ci float *f; 381cabdff1aSopenharmony_ci int offset, i, coef_idx; 382cabdff1aSopenharmony_ci int16_t t; 383cabdff1aSopenharmony_ci 384cabdff1aSopenharmony_ci offset = lrintf(delay); 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_ci t = (offset - delay + 0.5) * 8.0 + 0.5; 387cabdff1aSopenharmony_ci if (t == 8) { 388cabdff1aSopenharmony_ci t = 0; 389cabdff1aSopenharmony_ci offset--; 390cabdff1aSopenharmony_ci } 391cabdff1aSopenharmony_ci 392cabdff1aSopenharmony_ci f = ex - offset - 8; 393cabdff1aSopenharmony_ci 394cabdff1aSopenharmony_ci coef_idx = t * (2 * 8 + 1); 395cabdff1aSopenharmony_ci 396cabdff1aSopenharmony_ci ex[0] = 0.0; 397cabdff1aSopenharmony_ci for (i = 0; i < 2 * 8 + 1; i++) 398cabdff1aSopenharmony_ci ex[0] += e->interpolation_coeffs[coef_idx + i] * f[i]; 399cabdff1aSopenharmony_ci} 400cabdff1aSopenharmony_ci 401cabdff1aSopenharmony_ci/* 402cabdff1aSopenharmony_ci * Adaptive codebook excitation. 403cabdff1aSopenharmony_ci * 404cabdff1aSopenharmony_ci * TIA/IS-127 5.2.2.3.3, 4.12.5.2 405cabdff1aSopenharmony_ci */ 406cabdff1aSopenharmony_cistatic void acb_excitation(EVRCContext *e, float *excitation, float gain, 407cabdff1aSopenharmony_ci const float delay[3], int length) 408cabdff1aSopenharmony_ci{ 409cabdff1aSopenharmony_ci float denom, locdelay, dpr, invl; 410cabdff1aSopenharmony_ci int i; 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci invl = 1.0 / ((float) length); 413cabdff1aSopenharmony_ci dpr = length; 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci /* first at-most extra samples */ 416cabdff1aSopenharmony_ci denom = (delay[1] - delay[0]) * invl; 417cabdff1aSopenharmony_ci for (i = 0; i < dpr; i++) { 418cabdff1aSopenharmony_ci locdelay = delay[0] + i * denom; 419cabdff1aSopenharmony_ci bl_intrp(e, excitation + i, locdelay); 420cabdff1aSopenharmony_ci } 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci denom = (delay[2] - delay[1]) * invl; 423cabdff1aSopenharmony_ci /* interpolation */ 424cabdff1aSopenharmony_ci for (i = dpr; i < dpr + 10; i++) { 425cabdff1aSopenharmony_ci locdelay = delay[1] + (i - dpr) * denom; 426cabdff1aSopenharmony_ci bl_intrp(e, excitation + i, locdelay); 427cabdff1aSopenharmony_ci } 428cabdff1aSopenharmony_ci 429cabdff1aSopenharmony_ci for (i = 0; i < length; i++) 430cabdff1aSopenharmony_ci excitation[i] *= gain; 431cabdff1aSopenharmony_ci} 432cabdff1aSopenharmony_ci 433cabdff1aSopenharmony_cistatic void decode_8_pulses_35bits(const uint16_t *fixed_index, float *cod) 434cabdff1aSopenharmony_ci{ 435cabdff1aSopenharmony_ci int i, pos1, pos2, offset; 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ci offset = (fixed_index[3] >> 9) & 3; 438cabdff1aSopenharmony_ci 439cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 440cabdff1aSopenharmony_ci pos1 = ((fixed_index[i] & 0x7f) / 11) * 5 + ((i + offset) % 5); 441cabdff1aSopenharmony_ci pos2 = ((fixed_index[i] & 0x7f) % 11) * 5 + ((i + offset) % 5); 442cabdff1aSopenharmony_ci 443cabdff1aSopenharmony_ci cod[pos1] = (fixed_index[i] & 0x80) ? -1.0 : 1.0; 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci if (pos2 < pos1) 446cabdff1aSopenharmony_ci cod[pos2] = -cod[pos1]; 447cabdff1aSopenharmony_ci else 448cabdff1aSopenharmony_ci cod[pos2] += cod[pos1]; 449cabdff1aSopenharmony_ci } 450cabdff1aSopenharmony_ci 451cabdff1aSopenharmony_ci pos1 = ((fixed_index[3] & 0x7f) / 11) * 5 + ((3 + offset) % 5); 452cabdff1aSopenharmony_ci pos2 = ((fixed_index[3] & 0x7f) % 11) * 5 + ((4 + offset) % 5); 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci cod[pos1] = (fixed_index[3] & 0x100) ? -1.0 : 1.0; 455cabdff1aSopenharmony_ci cod[pos2] = (fixed_index[3] & 0x80 ) ? -1.0 : 1.0; 456cabdff1aSopenharmony_ci} 457cabdff1aSopenharmony_ci 458cabdff1aSopenharmony_cistatic void decode_3_pulses_10bits(uint16_t fixed_index, float *cod) 459cabdff1aSopenharmony_ci{ 460cabdff1aSopenharmony_ci float sign; 461cabdff1aSopenharmony_ci int pos; 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_ci sign = (fixed_index & 0x200) ? -1.0 : 1.0; 464cabdff1aSopenharmony_ci 465cabdff1aSopenharmony_ci pos = ((fixed_index & 0x7) * 7) + 4; 466cabdff1aSopenharmony_ci cod[pos] += sign; 467cabdff1aSopenharmony_ci pos = (((fixed_index >> 3) & 0x7) * 7) + 2; 468cabdff1aSopenharmony_ci cod[pos] -= sign; 469cabdff1aSopenharmony_ci pos = (((fixed_index >> 6) & 0x7) * 7); 470cabdff1aSopenharmony_ci cod[pos] += sign; 471cabdff1aSopenharmony_ci} 472cabdff1aSopenharmony_ci 473cabdff1aSopenharmony_ci/* 474cabdff1aSopenharmony_ci * Reconstruction of ACELP fixed codebook excitation for full and half rate. 475cabdff1aSopenharmony_ci * 476cabdff1aSopenharmony_ci * TIA/IS-127 5.2.3.7 477cabdff1aSopenharmony_ci */ 478cabdff1aSopenharmony_cistatic void fcb_excitation(EVRCContext *e, const uint16_t *codebook, 479cabdff1aSopenharmony_ci float *excitation, float pitch_gain, 480cabdff1aSopenharmony_ci int pitch_lag, int subframe_size) 481cabdff1aSopenharmony_ci{ 482cabdff1aSopenharmony_ci int i; 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci if (e->bitrate == RATE_FULL) 485cabdff1aSopenharmony_ci decode_8_pulses_35bits(codebook, excitation); 486cabdff1aSopenharmony_ci else 487cabdff1aSopenharmony_ci decode_3_pulses_10bits(*codebook, excitation); 488cabdff1aSopenharmony_ci 489cabdff1aSopenharmony_ci pitch_gain = av_clipf(pitch_gain, 0.2, 0.9); 490cabdff1aSopenharmony_ci 491cabdff1aSopenharmony_ci for (i = pitch_lag; i < subframe_size; i++) 492cabdff1aSopenharmony_ci excitation[i] += pitch_gain * excitation[i - pitch_lag]; 493cabdff1aSopenharmony_ci} 494cabdff1aSopenharmony_ci 495cabdff1aSopenharmony_ci/** 496cabdff1aSopenharmony_ci * Synthesis of the decoder output signal. 497cabdff1aSopenharmony_ci * 498cabdff1aSopenharmony_ci * param[in] in input signal 499cabdff1aSopenharmony_ci * param[in] filter_coeffs LPC coefficients 500cabdff1aSopenharmony_ci * param[in/out] memory synthesis filter memory 501cabdff1aSopenharmony_ci * param buffer_length amount of data to process 502cabdff1aSopenharmony_ci * param[out] samples output samples 503cabdff1aSopenharmony_ci * 504cabdff1aSopenharmony_ci * TIA/IS-127 5.2.3.15, 5.7.3.4 505cabdff1aSopenharmony_ci */ 506cabdff1aSopenharmony_cistatic void synthesis_filter(const float *in, const float *filter_coeffs, 507cabdff1aSopenharmony_ci float *memory, int buffer_length, float *samples) 508cabdff1aSopenharmony_ci{ 509cabdff1aSopenharmony_ci int i, j; 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ci for (i = 0; i < buffer_length; i++) { 512cabdff1aSopenharmony_ci samples[i] = in[i]; 513cabdff1aSopenharmony_ci for (j = FILTER_ORDER - 1; j > 0; j--) { 514cabdff1aSopenharmony_ci samples[i] -= filter_coeffs[j] * memory[j]; 515cabdff1aSopenharmony_ci memory[j] = memory[j - 1]; 516cabdff1aSopenharmony_ci } 517cabdff1aSopenharmony_ci samples[i] -= filter_coeffs[0] * memory[0]; 518cabdff1aSopenharmony_ci memory[0] = samples[i]; 519cabdff1aSopenharmony_ci } 520cabdff1aSopenharmony_ci} 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_cistatic void bandwidth_expansion(float *coeff, const float *inbuf, float gamma) 523cabdff1aSopenharmony_ci{ 524cabdff1aSopenharmony_ci double fac = gamma; 525cabdff1aSopenharmony_ci int i; 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci for (i = 0; i < FILTER_ORDER; i++) { 528cabdff1aSopenharmony_ci coeff[i] = inbuf[i] * fac; 529cabdff1aSopenharmony_ci fac *= gamma; 530cabdff1aSopenharmony_ci } 531cabdff1aSopenharmony_ci} 532cabdff1aSopenharmony_ci 533cabdff1aSopenharmony_cistatic void residual_filter(float *output, const float *input, 534cabdff1aSopenharmony_ci const float *coef, float *memory, int length) 535cabdff1aSopenharmony_ci{ 536cabdff1aSopenharmony_ci float sum; 537cabdff1aSopenharmony_ci int i, j; 538cabdff1aSopenharmony_ci 539cabdff1aSopenharmony_ci for (i = 0; i < length; i++) { 540cabdff1aSopenharmony_ci sum = input[i]; 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_ci for (j = FILTER_ORDER - 1; j > 0; j--) { 543cabdff1aSopenharmony_ci sum += coef[j] * memory[j]; 544cabdff1aSopenharmony_ci memory[j] = memory[j - 1]; 545cabdff1aSopenharmony_ci } 546cabdff1aSopenharmony_ci sum += coef[0] * memory[0]; 547cabdff1aSopenharmony_ci memory[0] = input[i]; 548cabdff1aSopenharmony_ci output[i] = sum; 549cabdff1aSopenharmony_ci } 550cabdff1aSopenharmony_ci} 551cabdff1aSopenharmony_ci 552cabdff1aSopenharmony_ci/* 553cabdff1aSopenharmony_ci * TIA/IS-127 Table 5.9.1-1. 554cabdff1aSopenharmony_ci */ 555cabdff1aSopenharmony_cistatic const struct PfCoeff { 556cabdff1aSopenharmony_ci float tilt; 557cabdff1aSopenharmony_ci float ltgain; 558cabdff1aSopenharmony_ci float p1; 559cabdff1aSopenharmony_ci float p2; 560cabdff1aSopenharmony_ci} postfilter_coeffs[5] = { 561cabdff1aSopenharmony_ci { 0.0 , 0.0 , 0.0 , 0.0 }, 562cabdff1aSopenharmony_ci { 0.0 , 0.0 , 0.57, 0.57 }, 563cabdff1aSopenharmony_ci { 0.0 , 0.0 , 0.0 , 0.0 }, 564cabdff1aSopenharmony_ci { 0.35, 0.50, 0.50, 0.75 }, 565cabdff1aSopenharmony_ci { 0.20, 0.50, 0.57, 0.75 }, 566cabdff1aSopenharmony_ci}; 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ci/* 569cabdff1aSopenharmony_ci * Adaptive postfilter. 570cabdff1aSopenharmony_ci * 571cabdff1aSopenharmony_ci * TIA/IS-127 5.9 572cabdff1aSopenharmony_ci */ 573cabdff1aSopenharmony_cistatic void postfilter(EVRCContext *e, float *in, const float *coeff, 574cabdff1aSopenharmony_ci float *out, int idx, const struct PfCoeff *pfc, 575cabdff1aSopenharmony_ci int length) 576cabdff1aSopenharmony_ci{ 577cabdff1aSopenharmony_ci float wcoef1[FILTER_ORDER], wcoef2[FILTER_ORDER], 578cabdff1aSopenharmony_ci scratch[SUBFRAME_SIZE], temp[SUBFRAME_SIZE], 579cabdff1aSopenharmony_ci mem[SUBFRAME_SIZE]; 580cabdff1aSopenharmony_ci float sum1 = 0.0, sum2 = 0.0, gamma, gain; 581cabdff1aSopenharmony_ci float tilt = pfc->tilt; 582cabdff1aSopenharmony_ci int i, n, best; 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ci bandwidth_expansion(wcoef1, coeff, pfc->p1); 585cabdff1aSopenharmony_ci bandwidth_expansion(wcoef2, coeff, pfc->p2); 586cabdff1aSopenharmony_ci 587cabdff1aSopenharmony_ci /* Tilt compensation filter, TIA/IS-127 5.9.1 */ 588cabdff1aSopenharmony_ci for (i = 0; i < length - 1; i++) 589cabdff1aSopenharmony_ci sum2 += in[i] * in[i + 1]; 590cabdff1aSopenharmony_ci if (sum2 < 0.0) 591cabdff1aSopenharmony_ci tilt = 0.0; 592cabdff1aSopenharmony_ci 593cabdff1aSopenharmony_ci for (i = 0; i < length; i++) { 594cabdff1aSopenharmony_ci scratch[i] = in[i] - tilt * e->last; 595cabdff1aSopenharmony_ci e->last = in[i]; 596cabdff1aSopenharmony_ci } 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci /* Short term residual filter, TIA/IS-127 5.9.2 */ 599cabdff1aSopenharmony_ci residual_filter(&e->postfilter_residual[ACB_SIZE], scratch, wcoef1, e->postfilter_fir, length); 600cabdff1aSopenharmony_ci 601cabdff1aSopenharmony_ci /* Long term postfilter */ 602cabdff1aSopenharmony_ci best = idx; 603cabdff1aSopenharmony_ci for (i = FFMIN(MIN_DELAY, idx - 3); i <= FFMAX(MAX_DELAY, idx + 3); i++) { 604cabdff1aSopenharmony_ci for (n = ACB_SIZE, sum2 = 0; n < ACB_SIZE + length; n++) 605cabdff1aSopenharmony_ci sum2 += e->postfilter_residual[n] * e->postfilter_residual[n - i]; 606cabdff1aSopenharmony_ci if (sum2 > sum1) { 607cabdff1aSopenharmony_ci sum1 = sum2; 608cabdff1aSopenharmony_ci best = i; 609cabdff1aSopenharmony_ci } 610cabdff1aSopenharmony_ci } 611cabdff1aSopenharmony_ci 612cabdff1aSopenharmony_ci for (i = ACB_SIZE, sum1 = 0; i < ACB_SIZE + length; i++) 613cabdff1aSopenharmony_ci sum1 += e->postfilter_residual[i - best] * e->postfilter_residual[i - best]; 614cabdff1aSopenharmony_ci for (i = ACB_SIZE, sum2 = 0; i < ACB_SIZE + length; i++) 615cabdff1aSopenharmony_ci sum2 += e->postfilter_residual[i] * e->postfilter_residual[i - best]; 616cabdff1aSopenharmony_ci 617cabdff1aSopenharmony_ci if (sum2 * sum1 == 0 || e->bitrate == RATE_QUANT) { 618cabdff1aSopenharmony_ci memcpy(temp, e->postfilter_residual + ACB_SIZE, length * sizeof(float)); 619cabdff1aSopenharmony_ci } else { 620cabdff1aSopenharmony_ci gamma = sum2 / sum1; 621cabdff1aSopenharmony_ci if (gamma < 0.5) 622cabdff1aSopenharmony_ci memcpy(temp, e->postfilter_residual + ACB_SIZE, length * sizeof(float)); 623cabdff1aSopenharmony_ci else { 624cabdff1aSopenharmony_ci gamma = FFMIN(gamma, 1.0); 625cabdff1aSopenharmony_ci 626cabdff1aSopenharmony_ci for (i = 0; i < length; i++) { 627cabdff1aSopenharmony_ci temp[i] = e->postfilter_residual[ACB_SIZE + i] + gamma * 628cabdff1aSopenharmony_ci pfc->ltgain * e->postfilter_residual[ACB_SIZE + i - best]; 629cabdff1aSopenharmony_ci } 630cabdff1aSopenharmony_ci } 631cabdff1aSopenharmony_ci } 632cabdff1aSopenharmony_ci 633cabdff1aSopenharmony_ci memcpy(scratch, temp, length * sizeof(float)); 634cabdff1aSopenharmony_ci memcpy(mem, e->postfilter_iir, FILTER_ORDER * sizeof(float)); 635cabdff1aSopenharmony_ci synthesis_filter(scratch, wcoef2, mem, length, scratch); 636cabdff1aSopenharmony_ci 637cabdff1aSopenharmony_ci /* Gain computation, TIA/IS-127 5.9.4-2 */ 638cabdff1aSopenharmony_ci for (i = 0, sum1 = 0, sum2 = 0; i < length; i++) { 639cabdff1aSopenharmony_ci sum1 += in[i] * in[i]; 640cabdff1aSopenharmony_ci sum2 += scratch[i] * scratch[i]; 641cabdff1aSopenharmony_ci } 642cabdff1aSopenharmony_ci gain = sum2 ? sqrt(sum1 / sum2) : 1.0; 643cabdff1aSopenharmony_ci 644cabdff1aSopenharmony_ci for (i = 0; i < length; i++) 645cabdff1aSopenharmony_ci temp[i] *= gain; 646cabdff1aSopenharmony_ci 647cabdff1aSopenharmony_ci /* Short term postfilter */ 648cabdff1aSopenharmony_ci synthesis_filter(temp, wcoef2, e->postfilter_iir, length, out); 649cabdff1aSopenharmony_ci 650cabdff1aSopenharmony_ci memmove(e->postfilter_residual, 651cabdff1aSopenharmony_ci e->postfilter_residual + length, ACB_SIZE * sizeof(float)); 652cabdff1aSopenharmony_ci} 653cabdff1aSopenharmony_ci 654cabdff1aSopenharmony_cistatic void frame_erasure(EVRCContext *e, float *samples) 655cabdff1aSopenharmony_ci{ 656cabdff1aSopenharmony_ci float ilspf[FILTER_ORDER], ilpc[FILTER_ORDER], idelay[NB_SUBFRAMES], 657cabdff1aSopenharmony_ci tmp[SUBFRAME_SIZE + 6], f; 658cabdff1aSopenharmony_ci int i, j; 659cabdff1aSopenharmony_ci 660cabdff1aSopenharmony_ci for (i = 0; i < FILTER_ORDER; i++) { 661cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT) 662cabdff1aSopenharmony_ci e->lspf[i] = e->prev_lspf[i] * 0.875 + 0.125 * (i + 1) * 0.048; 663cabdff1aSopenharmony_ci else 664cabdff1aSopenharmony_ci e->lspf[i] = e->prev_lspf[i]; 665cabdff1aSopenharmony_ci } 666cabdff1aSopenharmony_ci 667cabdff1aSopenharmony_ci if (e->prev_error_flag) 668cabdff1aSopenharmony_ci e->avg_acb_gain *= 0.75; 669cabdff1aSopenharmony_ci if (e->bitrate == RATE_FULL) 670cabdff1aSopenharmony_ci memcpy(e->pitch_back, e->pitch, ACB_SIZE * sizeof(float)); 671cabdff1aSopenharmony_ci if (e->last_valid_bitrate == RATE_QUANT) 672cabdff1aSopenharmony_ci e->bitrate = RATE_QUANT; 673cabdff1aSopenharmony_ci else 674cabdff1aSopenharmony_ci e->bitrate = RATE_FULL; 675cabdff1aSopenharmony_ci 676cabdff1aSopenharmony_ci if (e->bitrate == RATE_FULL || e->bitrate == RATE_HALF) { 677cabdff1aSopenharmony_ci e->pitch_delay = e->prev_pitch_delay; 678cabdff1aSopenharmony_ci } else { 679cabdff1aSopenharmony_ci float sum = 0; 680cabdff1aSopenharmony_ci 681cabdff1aSopenharmony_ci idelay[0] = idelay[1] = idelay[2] = MIN_DELAY; 682cabdff1aSopenharmony_ci 683cabdff1aSopenharmony_ci for (i = 0; i < NB_SUBFRAMES; i++) 684cabdff1aSopenharmony_ci sum += evrc_energy_quant[e->prev_energy_gain][i]; 685cabdff1aSopenharmony_ci sum /= (float) NB_SUBFRAMES; 686cabdff1aSopenharmony_ci sum = pow(10, sum); 687cabdff1aSopenharmony_ci for (i = 0; i < NB_SUBFRAMES; i++) 688cabdff1aSopenharmony_ci e->energy_vector[i] = sum; 689cabdff1aSopenharmony_ci } 690cabdff1aSopenharmony_ci 691cabdff1aSopenharmony_ci if (fabs(e->pitch_delay - e->prev_pitch_delay) > 15) 692cabdff1aSopenharmony_ci e->prev_pitch_delay = e->pitch_delay; 693cabdff1aSopenharmony_ci 694cabdff1aSopenharmony_ci for (i = 0; i < NB_SUBFRAMES; i++) { 695cabdff1aSopenharmony_ci int subframe_size = subframe_sizes[i]; 696cabdff1aSopenharmony_ci int pitch_lag; 697cabdff1aSopenharmony_ci 698cabdff1aSopenharmony_ci interpolate_lsp(ilspf, e->lspf, e->prev_lspf, i); 699cabdff1aSopenharmony_ci 700cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT) { 701cabdff1aSopenharmony_ci if (e->avg_acb_gain < 0.3) { 702cabdff1aSopenharmony_ci idelay[0] = estimation_delay[i]; 703cabdff1aSopenharmony_ci idelay[1] = estimation_delay[i + 1]; 704cabdff1aSopenharmony_ci idelay[2] = estimation_delay[i + 2]; 705cabdff1aSopenharmony_ci } else { 706cabdff1aSopenharmony_ci interpolate_delay(idelay, e->pitch_delay, e->prev_pitch_delay, i); 707cabdff1aSopenharmony_ci } 708cabdff1aSopenharmony_ci } 709cabdff1aSopenharmony_ci 710cabdff1aSopenharmony_ci pitch_lag = lrintf((idelay[1] + idelay[0]) / 2.0); 711cabdff1aSopenharmony_ci decode_predictor_coeffs(ilspf, ilpc); 712cabdff1aSopenharmony_ci 713cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT) { 714cabdff1aSopenharmony_ci acb_excitation(e, e->pitch + ACB_SIZE, 715cabdff1aSopenharmony_ci e->avg_acb_gain, idelay, subframe_size); 716cabdff1aSopenharmony_ci for (j = 0; j < subframe_size; j++) 717cabdff1aSopenharmony_ci e->pitch[ACB_SIZE + j] *= e->fade_scale; 718cabdff1aSopenharmony_ci e->fade_scale = FFMAX(e->fade_scale - 0.05, 0.0); 719cabdff1aSopenharmony_ci } else { 720cabdff1aSopenharmony_ci for (j = 0; j < subframe_size; j++) 721cabdff1aSopenharmony_ci e->pitch[ACB_SIZE + j] = e->energy_vector[i]; 722cabdff1aSopenharmony_ci } 723cabdff1aSopenharmony_ci 724cabdff1aSopenharmony_ci memmove(e->pitch, e->pitch + subframe_size, ACB_SIZE * sizeof(float)); 725cabdff1aSopenharmony_ci 726cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT && e->avg_acb_gain < 0.4) { 727cabdff1aSopenharmony_ci f = 0.1 * e->avg_fcb_gain; 728cabdff1aSopenharmony_ci for (j = 0; j < subframe_size; j++) 729cabdff1aSopenharmony_ci e->pitch[ACB_SIZE + j] += f; 730cabdff1aSopenharmony_ci } else if (e->bitrate == RATE_QUANT) { 731cabdff1aSopenharmony_ci for (j = 0; j < subframe_size; j++) 732cabdff1aSopenharmony_ci e->pitch[ACB_SIZE + j] = e->energy_vector[i]; 733cabdff1aSopenharmony_ci } 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci synthesis_filter(e->pitch + ACB_SIZE, ilpc, 736cabdff1aSopenharmony_ci e->synthesis, subframe_size, tmp); 737cabdff1aSopenharmony_ci postfilter(e, tmp, ilpc, samples, pitch_lag, 738cabdff1aSopenharmony_ci &postfilter_coeffs[e->bitrate], subframe_size); 739cabdff1aSopenharmony_ci 740cabdff1aSopenharmony_ci samples += subframe_size; 741cabdff1aSopenharmony_ci } 742cabdff1aSopenharmony_ci} 743cabdff1aSopenharmony_ci 744cabdff1aSopenharmony_cistatic int evrc_decode_frame(AVCodecContext *avctx, AVFrame *frame, 745cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 746cabdff1aSopenharmony_ci{ 747cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 748cabdff1aSopenharmony_ci EVRCContext *e = avctx->priv_data; 749cabdff1aSopenharmony_ci int buf_size = avpkt->size; 750cabdff1aSopenharmony_ci float ilspf[FILTER_ORDER], ilpc[FILTER_ORDER], idelay[NB_SUBFRAMES]; 751cabdff1aSopenharmony_ci float *samples; 752cabdff1aSopenharmony_ci int i, j, ret, error_flag = 0; 753cabdff1aSopenharmony_ci 754cabdff1aSopenharmony_ci frame->nb_samples = 160; 755cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 756cabdff1aSopenharmony_ci return ret; 757cabdff1aSopenharmony_ci samples = (float *)frame->data[0]; 758cabdff1aSopenharmony_ci 759cabdff1aSopenharmony_ci if ((e->bitrate = determine_bitrate(avctx, &buf_size, &buf)) == RATE_ERRS) { 760cabdff1aSopenharmony_ci warn_insufficient_frame_quality(avctx, "bitrate cannot be determined."); 761cabdff1aSopenharmony_ci goto erasure; 762cabdff1aSopenharmony_ci } 763cabdff1aSopenharmony_ci if (e->bitrate <= SILENCE || e->bitrate == RATE_QUARTER) 764cabdff1aSopenharmony_ci goto erasure; 765cabdff1aSopenharmony_ci if (e->bitrate == RATE_QUANT && e->last_valid_bitrate == RATE_FULL 766cabdff1aSopenharmony_ci && !e->prev_error_flag) 767cabdff1aSopenharmony_ci goto erasure; 768cabdff1aSopenharmony_ci 769cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&e->gb, buf, buf_size)) < 0) 770cabdff1aSopenharmony_ci return ret; 771cabdff1aSopenharmony_ci memset(&e->frame, 0, sizeof(EVRCAFrame)); 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_ci unpack_frame(e); 774cabdff1aSopenharmony_ci 775cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT) { 776cabdff1aSopenharmony_ci uint8_t *p = (uint8_t *) &e->frame; 777cabdff1aSopenharmony_ci for (i = 0; i < sizeof(EVRCAFrame); i++) { 778cabdff1aSopenharmony_ci if (p[i]) 779cabdff1aSopenharmony_ci break; 780cabdff1aSopenharmony_ci } 781cabdff1aSopenharmony_ci if (i == sizeof(EVRCAFrame)) 782cabdff1aSopenharmony_ci goto erasure; 783cabdff1aSopenharmony_ci } else if (e->frame.lsp[0] == 0xf && 784cabdff1aSopenharmony_ci e->frame.lsp[1] == 0xf && 785cabdff1aSopenharmony_ci e->frame.energy_gain == 0xff) { 786cabdff1aSopenharmony_ci goto erasure; 787cabdff1aSopenharmony_ci } 788cabdff1aSopenharmony_ci 789cabdff1aSopenharmony_ci if (decode_lspf(e) < 0) 790cabdff1aSopenharmony_ci goto erasure; 791cabdff1aSopenharmony_ci 792cabdff1aSopenharmony_ci if (e->bitrate == RATE_FULL || e->bitrate == RATE_HALF) { 793cabdff1aSopenharmony_ci /* Pitch delay parameter checking as per TIA/IS-127 5.1.5.1 */ 794cabdff1aSopenharmony_ci if (e->frame.pitch_delay > MAX_DELAY - MIN_DELAY) 795cabdff1aSopenharmony_ci goto erasure; 796cabdff1aSopenharmony_ci 797cabdff1aSopenharmony_ci e->pitch_delay = e->frame.pitch_delay + MIN_DELAY; 798cabdff1aSopenharmony_ci 799cabdff1aSopenharmony_ci /* Delay diff parameter checking as per TIA/IS-127 5.1.5.2 */ 800cabdff1aSopenharmony_ci if (e->frame.delay_diff) { 801cabdff1aSopenharmony_ci int p = e->pitch_delay - e->frame.delay_diff + 16; 802cabdff1aSopenharmony_ci if (p < MIN_DELAY || p > MAX_DELAY) 803cabdff1aSopenharmony_ci goto erasure; 804cabdff1aSopenharmony_ci } 805cabdff1aSopenharmony_ci 806cabdff1aSopenharmony_ci /* Delay contour reconstruction as per TIA/IS-127 5.2.2.2 */ 807cabdff1aSopenharmony_ci if (e->frame.delay_diff && 808cabdff1aSopenharmony_ci e->bitrate == RATE_FULL && e->prev_error_flag) { 809cabdff1aSopenharmony_ci float delay; 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_ci memcpy(e->pitch, e->pitch_back, ACB_SIZE * sizeof(float)); 812cabdff1aSopenharmony_ci 813cabdff1aSopenharmony_ci delay = e->prev_pitch_delay; 814cabdff1aSopenharmony_ci e->prev_pitch_delay = delay - e->frame.delay_diff + 16.0; 815cabdff1aSopenharmony_ci 816cabdff1aSopenharmony_ci if (fabs(e->pitch_delay - delay) > 15) 817cabdff1aSopenharmony_ci delay = e->pitch_delay; 818cabdff1aSopenharmony_ci 819cabdff1aSopenharmony_ci for (i = 0; i < NB_SUBFRAMES; i++) { 820cabdff1aSopenharmony_ci int subframe_size = subframe_sizes[i]; 821cabdff1aSopenharmony_ci 822cabdff1aSopenharmony_ci interpolate_delay(idelay, delay, e->prev_pitch_delay, i); 823cabdff1aSopenharmony_ci acb_excitation(e, e->pitch + ACB_SIZE, e->avg_acb_gain, idelay, subframe_size); 824cabdff1aSopenharmony_ci memmove(e->pitch, e->pitch + subframe_size, ACB_SIZE * sizeof(float)); 825cabdff1aSopenharmony_ci } 826cabdff1aSopenharmony_ci } 827cabdff1aSopenharmony_ci 828cabdff1aSopenharmony_ci /* Smoothing of the decoded delay as per TIA/IS-127 5.2.2.5 */ 829cabdff1aSopenharmony_ci if (fabs(e->pitch_delay - e->prev_pitch_delay) > 15) 830cabdff1aSopenharmony_ci e->prev_pitch_delay = e->pitch_delay; 831cabdff1aSopenharmony_ci 832cabdff1aSopenharmony_ci e->avg_acb_gain = e->avg_fcb_gain = 0.0; 833cabdff1aSopenharmony_ci } else { 834cabdff1aSopenharmony_ci idelay[0] = idelay[1] = idelay[2] = MIN_DELAY; 835cabdff1aSopenharmony_ci 836cabdff1aSopenharmony_ci /* Decode frame energy vectors as per TIA/IS-127 5.7.2 */ 837cabdff1aSopenharmony_ci for (i = 0; i < NB_SUBFRAMES; i++) 838cabdff1aSopenharmony_ci e->energy_vector[i] = pow(10, evrc_energy_quant[e->frame.energy_gain][i]); 839cabdff1aSopenharmony_ci e->prev_energy_gain = e->frame.energy_gain; 840cabdff1aSopenharmony_ci } 841cabdff1aSopenharmony_ci 842cabdff1aSopenharmony_ci for (i = 0; i < NB_SUBFRAMES; i++) { 843cabdff1aSopenharmony_ci float tmp[SUBFRAME_SIZE + 6] = { 0 }; 844cabdff1aSopenharmony_ci int subframe_size = subframe_sizes[i]; 845cabdff1aSopenharmony_ci int pitch_lag; 846cabdff1aSopenharmony_ci 847cabdff1aSopenharmony_ci interpolate_lsp(ilspf, e->lspf, e->prev_lspf, i); 848cabdff1aSopenharmony_ci 849cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT) 850cabdff1aSopenharmony_ci interpolate_delay(idelay, e->pitch_delay, e->prev_pitch_delay, i); 851cabdff1aSopenharmony_ci 852cabdff1aSopenharmony_ci pitch_lag = lrintf((idelay[1] + idelay[0]) / 2.0); 853cabdff1aSopenharmony_ci decode_predictor_coeffs(ilspf, ilpc); 854cabdff1aSopenharmony_ci 855cabdff1aSopenharmony_ci /* Bandwidth expansion as per TIA/IS-127 5.2.3.3 */ 856cabdff1aSopenharmony_ci if (e->frame.lpc_flag && e->prev_error_flag) 857cabdff1aSopenharmony_ci bandwidth_expansion(ilpc, ilpc, 0.75); 858cabdff1aSopenharmony_ci 859cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT) { 860cabdff1aSopenharmony_ci float acb_sum, f; 861cabdff1aSopenharmony_ci 862cabdff1aSopenharmony_ci f = exp((e->bitrate == RATE_HALF ? 0.5 : 0.25) 863cabdff1aSopenharmony_ci * (e->frame.fcb_gain[i] + 1)); 864cabdff1aSopenharmony_ci acb_sum = pitch_gain_vq[e->frame.acb_gain[i]]; 865cabdff1aSopenharmony_ci e->avg_acb_gain += acb_sum / NB_SUBFRAMES; 866cabdff1aSopenharmony_ci e->avg_fcb_gain += f / NB_SUBFRAMES; 867cabdff1aSopenharmony_ci 868cabdff1aSopenharmony_ci acb_excitation(e, e->pitch + ACB_SIZE, 869cabdff1aSopenharmony_ci acb_sum, idelay, subframe_size); 870cabdff1aSopenharmony_ci fcb_excitation(e, e->frame.fcb_shape[i], tmp, 871cabdff1aSopenharmony_ci acb_sum, pitch_lag, subframe_size); 872cabdff1aSopenharmony_ci 873cabdff1aSopenharmony_ci /* Total excitation generation as per TIA/IS-127 5.2.3.9 */ 874cabdff1aSopenharmony_ci for (j = 0; j < subframe_size; j++) 875cabdff1aSopenharmony_ci e->pitch[ACB_SIZE + j] += f * tmp[j]; 876cabdff1aSopenharmony_ci e->fade_scale = FFMIN(e->fade_scale + 0.2, 1.0); 877cabdff1aSopenharmony_ci } else { 878cabdff1aSopenharmony_ci for (j = 0; j < subframe_size; j++) 879cabdff1aSopenharmony_ci e->pitch[ACB_SIZE + j] = e->energy_vector[i]; 880cabdff1aSopenharmony_ci } 881cabdff1aSopenharmony_ci 882cabdff1aSopenharmony_ci memmove(e->pitch, e->pitch + subframe_size, ACB_SIZE * sizeof(float)); 883cabdff1aSopenharmony_ci 884cabdff1aSopenharmony_ci synthesis_filter(e->pitch + ACB_SIZE, ilpc, 885cabdff1aSopenharmony_ci e->synthesis, subframe_size, 886cabdff1aSopenharmony_ci e->postfilter ? tmp : samples); 887cabdff1aSopenharmony_ci if (e->postfilter) 888cabdff1aSopenharmony_ci postfilter(e, tmp, ilpc, samples, pitch_lag, 889cabdff1aSopenharmony_ci &postfilter_coeffs[e->bitrate], subframe_size); 890cabdff1aSopenharmony_ci 891cabdff1aSopenharmony_ci samples += subframe_size; 892cabdff1aSopenharmony_ci } 893cabdff1aSopenharmony_ci 894cabdff1aSopenharmony_ci if (error_flag) { 895cabdff1aSopenharmony_cierasure: 896cabdff1aSopenharmony_ci error_flag = 1; 897cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "frame erasure\n"); 898cabdff1aSopenharmony_ci frame_erasure(e, samples); 899cabdff1aSopenharmony_ci } 900cabdff1aSopenharmony_ci 901cabdff1aSopenharmony_ci memcpy(e->prev_lspf, e->lspf, sizeof(e->prev_lspf)); 902cabdff1aSopenharmony_ci e->prev_error_flag = error_flag; 903cabdff1aSopenharmony_ci e->last_valid_bitrate = e->bitrate; 904cabdff1aSopenharmony_ci 905cabdff1aSopenharmony_ci if (e->bitrate != RATE_QUANT) 906cabdff1aSopenharmony_ci e->prev_pitch_delay = e->pitch_delay; 907cabdff1aSopenharmony_ci 908cabdff1aSopenharmony_ci samples = (float *)frame->data[0]; 909cabdff1aSopenharmony_ci for (i = 0; i < 160; i++) 910cabdff1aSopenharmony_ci samples[i] /= 32768; 911cabdff1aSopenharmony_ci 912cabdff1aSopenharmony_ci *got_frame_ptr = 1; 913cabdff1aSopenharmony_ci 914cabdff1aSopenharmony_ci return avpkt->size; 915cabdff1aSopenharmony_ci} 916cabdff1aSopenharmony_ci 917cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(EVRCContext, x) 918cabdff1aSopenharmony_ci#define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM 919cabdff1aSopenharmony_ci 920cabdff1aSopenharmony_cistatic const AVOption options[] = { 921cabdff1aSopenharmony_ci { "postfilter", "enable postfilter", OFFSET(postfilter), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, AD }, 922cabdff1aSopenharmony_ci { NULL } 923cabdff1aSopenharmony_ci}; 924cabdff1aSopenharmony_ci 925cabdff1aSopenharmony_cistatic const AVClass evrcdec_class = { 926cabdff1aSopenharmony_ci .class_name = "evrc", 927cabdff1aSopenharmony_ci .item_name = av_default_item_name, 928cabdff1aSopenharmony_ci .option = options, 929cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 930cabdff1aSopenharmony_ci}; 931cabdff1aSopenharmony_ci 932cabdff1aSopenharmony_ciconst FFCodec ff_evrc_decoder = { 933cabdff1aSopenharmony_ci .p.name = "evrc", 934cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("EVRC (Enhanced Variable Rate Codec)"), 935cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 936cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_EVRC, 937cabdff1aSopenharmony_ci .init = evrc_decode_init, 938cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(evrc_decode_frame), 939cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, 940cabdff1aSopenharmony_ci .priv_data_size = sizeof(EVRCContext), 941cabdff1aSopenharmony_ci .p.priv_class = &evrcdec_class, 942cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 943cabdff1aSopenharmony_ci}; 944