1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Opus decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2012 Andrew D'Addesio 4cabdff1aSopenharmony_ci * Copyright (c) 2013-2014 Mozilla Corporation 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * Opus decoder 26cabdff1aSopenharmony_ci * @author Andrew D'Addesio, Anton Khirnov 27cabdff1aSopenharmony_ci * 28cabdff1aSopenharmony_ci * Codec homepage: http://opus-codec.org/ 29cabdff1aSopenharmony_ci * Specification: http://tools.ietf.org/html/rfc6716 30cabdff1aSopenharmony_ci * Ogg Opus specification: https://tools.ietf.org/html/draft-ietf-codec-oggopus-03 31cabdff1aSopenharmony_ci * 32cabdff1aSopenharmony_ci * Ogg-contained .opus files can be produced with opus-tools: 33cabdff1aSopenharmony_ci * http://git.xiph.org/?p=opus-tools.git 34cabdff1aSopenharmony_ci */ 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#include <stdint.h> 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 39cabdff1aSopenharmony_ci#include "libavutil/audio_fifo.h" 40cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 41cabdff1aSopenharmony_ci#include "libavutil/opt.h" 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci#include "libswresample/swresample.h" 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci#include "avcodec.h" 46cabdff1aSopenharmony_ci#include "codec_internal.h" 47cabdff1aSopenharmony_ci#include "get_bits.h" 48cabdff1aSopenharmony_ci#include "internal.h" 49cabdff1aSopenharmony_ci#include "mathops.h" 50cabdff1aSopenharmony_ci#include "opus.h" 51cabdff1aSopenharmony_ci#include "opustab.h" 52cabdff1aSopenharmony_ci#include "opus_celt.h" 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_cistatic const uint16_t silk_frame_duration_ms[16] = { 55cabdff1aSopenharmony_ci 10, 20, 40, 60, 56cabdff1aSopenharmony_ci 10, 20, 40, 60, 57cabdff1aSopenharmony_ci 10, 20, 40, 60, 58cabdff1aSopenharmony_ci 10, 20, 59cabdff1aSopenharmony_ci 10, 20, 60cabdff1aSopenharmony_ci}; 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_ci/* number of samples of silence to feed to the resampler 63cabdff1aSopenharmony_ci * at the beginning */ 64cabdff1aSopenharmony_cistatic const int silk_resample_delay[] = { 65cabdff1aSopenharmony_ci 4, 8, 11, 11, 11 66cabdff1aSopenharmony_ci}; 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_cistatic int get_silk_samplerate(int config) 69cabdff1aSopenharmony_ci{ 70cabdff1aSopenharmony_ci if (config < 4) 71cabdff1aSopenharmony_ci return 8000; 72cabdff1aSopenharmony_ci else if (config < 8) 73cabdff1aSopenharmony_ci return 12000; 74cabdff1aSopenharmony_ci return 16000; 75cabdff1aSopenharmony_ci} 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_cistatic void opus_fade(float *out, 78cabdff1aSopenharmony_ci const float *in1, const float *in2, 79cabdff1aSopenharmony_ci const float *window, int len) 80cabdff1aSopenharmony_ci{ 81cabdff1aSopenharmony_ci int i; 82cabdff1aSopenharmony_ci for (i = 0; i < len; i++) 83cabdff1aSopenharmony_ci out[i] = in2[i] * window[i] + in1[i] * (1.0 - window[i]); 84cabdff1aSopenharmony_ci} 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_cistatic int opus_flush_resample(OpusStreamContext *s, int nb_samples) 87cabdff1aSopenharmony_ci{ 88cabdff1aSopenharmony_ci int celt_size = av_audio_fifo_size(s->celt_delay); 89cabdff1aSopenharmony_ci int ret, i; 90cabdff1aSopenharmony_ci ret = swr_convert(s->swr, 91cabdff1aSopenharmony_ci (uint8_t**)s->cur_out, nb_samples, 92cabdff1aSopenharmony_ci NULL, 0); 93cabdff1aSopenharmony_ci if (ret < 0) 94cabdff1aSopenharmony_ci return ret; 95cabdff1aSopenharmony_ci else if (ret != nb_samples) { 96cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Wrong number of flushed samples: %d\n", 97cabdff1aSopenharmony_ci ret); 98cabdff1aSopenharmony_ci return AVERROR_BUG; 99cabdff1aSopenharmony_ci } 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci if (celt_size) { 102cabdff1aSopenharmony_ci if (celt_size != nb_samples) { 103cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Wrong number of CELT delay samples.\n"); 104cabdff1aSopenharmony_ci return AVERROR_BUG; 105cabdff1aSopenharmony_ci } 106cabdff1aSopenharmony_ci av_audio_fifo_read(s->celt_delay, (void**)s->celt_output, nb_samples); 107cabdff1aSopenharmony_ci for (i = 0; i < s->output_channels; i++) { 108cabdff1aSopenharmony_ci s->fdsp->vector_fmac_scalar(s->cur_out[i], 109cabdff1aSopenharmony_ci s->celt_output[i], 1.0, 110cabdff1aSopenharmony_ci nb_samples); 111cabdff1aSopenharmony_ci } 112cabdff1aSopenharmony_ci } 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci if (s->redundancy_idx) { 115cabdff1aSopenharmony_ci for (i = 0; i < s->output_channels; i++) 116cabdff1aSopenharmony_ci opus_fade(s->cur_out[i], s->cur_out[i], 117cabdff1aSopenharmony_ci s->redundancy_output[i] + 120 + s->redundancy_idx, 118cabdff1aSopenharmony_ci ff_celt_window2 + s->redundancy_idx, 120 - s->redundancy_idx); 119cabdff1aSopenharmony_ci s->redundancy_idx = 0; 120cabdff1aSopenharmony_ci } 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_ci s->cur_out[0] += nb_samples; 123cabdff1aSopenharmony_ci s->cur_out[1] += nb_samples; 124cabdff1aSopenharmony_ci s->remaining_out_size -= nb_samples * sizeof(float); 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci return 0; 127cabdff1aSopenharmony_ci} 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_cistatic int opus_init_resample(OpusStreamContext *s) 130cabdff1aSopenharmony_ci{ 131cabdff1aSopenharmony_ci static const float delay[16] = { 0.0 }; 132cabdff1aSopenharmony_ci const uint8_t *delayptr[2] = { (uint8_t*)delay, (uint8_t*)delay }; 133cabdff1aSopenharmony_ci int ret; 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci av_opt_set_int(s->swr, "in_sample_rate", s->silk_samplerate, 0); 136cabdff1aSopenharmony_ci ret = swr_init(s->swr); 137cabdff1aSopenharmony_ci if (ret < 0) { 138cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error opening the resampler.\n"); 139cabdff1aSopenharmony_ci return ret; 140cabdff1aSopenharmony_ci } 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci ret = swr_convert(s->swr, 143cabdff1aSopenharmony_ci NULL, 0, 144cabdff1aSopenharmony_ci delayptr, silk_resample_delay[s->packet.bandwidth]); 145cabdff1aSopenharmony_ci if (ret < 0) { 146cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 147cabdff1aSopenharmony_ci "Error feeding initial silence to the resampler.\n"); 148cabdff1aSopenharmony_ci return ret; 149cabdff1aSopenharmony_ci } 150cabdff1aSopenharmony_ci 151cabdff1aSopenharmony_ci return 0; 152cabdff1aSopenharmony_ci} 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_cistatic int opus_decode_redundancy(OpusStreamContext *s, const uint8_t *data, int size) 155cabdff1aSopenharmony_ci{ 156cabdff1aSopenharmony_ci int ret = ff_opus_rc_dec_init(&s->redundancy_rc, data, size); 157cabdff1aSopenharmony_ci if (ret < 0) 158cabdff1aSopenharmony_ci goto fail; 159cabdff1aSopenharmony_ci ff_opus_rc_dec_raw_init(&s->redundancy_rc, data + size, size); 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ci ret = ff_celt_decode_frame(s->celt, &s->redundancy_rc, 162cabdff1aSopenharmony_ci s->redundancy_output, 163cabdff1aSopenharmony_ci s->packet.stereo + 1, 240, 164cabdff1aSopenharmony_ci 0, ff_celt_band_end[s->packet.bandwidth]); 165cabdff1aSopenharmony_ci if (ret < 0) 166cabdff1aSopenharmony_ci goto fail; 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci return 0; 169cabdff1aSopenharmony_cifail: 170cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error decoding the redundancy frame.\n"); 171cabdff1aSopenharmony_ci return ret; 172cabdff1aSopenharmony_ci} 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_cistatic int opus_decode_frame(OpusStreamContext *s, const uint8_t *data, int size) 175cabdff1aSopenharmony_ci{ 176cabdff1aSopenharmony_ci int samples = s->packet.frame_duration; 177cabdff1aSopenharmony_ci int redundancy = 0; 178cabdff1aSopenharmony_ci int redundancy_size, redundancy_pos; 179cabdff1aSopenharmony_ci int ret, i, consumed; 180cabdff1aSopenharmony_ci int delayed_samples = s->delayed_samples; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci ret = ff_opus_rc_dec_init(&s->rc, data, size); 183cabdff1aSopenharmony_ci if (ret < 0) 184cabdff1aSopenharmony_ci return ret; 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci /* decode the silk frame */ 187cabdff1aSopenharmony_ci if (s->packet.mode == OPUS_MODE_SILK || s->packet.mode == OPUS_MODE_HYBRID) { 188cabdff1aSopenharmony_ci if (!swr_is_initialized(s->swr)) { 189cabdff1aSopenharmony_ci ret = opus_init_resample(s); 190cabdff1aSopenharmony_ci if (ret < 0) 191cabdff1aSopenharmony_ci return ret; 192cabdff1aSopenharmony_ci } 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci samples = ff_silk_decode_superframe(s->silk, &s->rc, s->silk_output, 195cabdff1aSopenharmony_ci FFMIN(s->packet.bandwidth, OPUS_BANDWIDTH_WIDEBAND), 196cabdff1aSopenharmony_ci s->packet.stereo + 1, 197cabdff1aSopenharmony_ci silk_frame_duration_ms[s->packet.config]); 198cabdff1aSopenharmony_ci if (samples < 0) { 199cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error decoding a SILK frame.\n"); 200cabdff1aSopenharmony_ci return samples; 201cabdff1aSopenharmony_ci } 202cabdff1aSopenharmony_ci samples = swr_convert(s->swr, 203cabdff1aSopenharmony_ci (uint8_t**)s->cur_out, s->packet.frame_duration, 204cabdff1aSopenharmony_ci (const uint8_t**)s->silk_output, samples); 205cabdff1aSopenharmony_ci if (samples < 0) { 206cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error resampling SILK data.\n"); 207cabdff1aSopenharmony_ci return samples; 208cabdff1aSopenharmony_ci } 209cabdff1aSopenharmony_ci av_assert2((samples & 7) == 0); 210cabdff1aSopenharmony_ci s->delayed_samples += s->packet.frame_duration - samples; 211cabdff1aSopenharmony_ci } else 212cabdff1aSopenharmony_ci ff_silk_flush(s->silk); 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci // decode redundancy information 215cabdff1aSopenharmony_ci consumed = opus_rc_tell(&s->rc); 216cabdff1aSopenharmony_ci if (s->packet.mode == OPUS_MODE_HYBRID && consumed + 37 <= size * 8) 217cabdff1aSopenharmony_ci redundancy = ff_opus_rc_dec_log(&s->rc, 12); 218cabdff1aSopenharmony_ci else if (s->packet.mode == OPUS_MODE_SILK && consumed + 17 <= size * 8) 219cabdff1aSopenharmony_ci redundancy = 1; 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci if (redundancy) { 222cabdff1aSopenharmony_ci redundancy_pos = ff_opus_rc_dec_log(&s->rc, 1); 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci if (s->packet.mode == OPUS_MODE_HYBRID) 225cabdff1aSopenharmony_ci redundancy_size = ff_opus_rc_dec_uint(&s->rc, 256) + 2; 226cabdff1aSopenharmony_ci else 227cabdff1aSopenharmony_ci redundancy_size = size - (consumed + 7) / 8; 228cabdff1aSopenharmony_ci size -= redundancy_size; 229cabdff1aSopenharmony_ci if (size < 0) { 230cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid redundancy frame size.\n"); 231cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 232cabdff1aSopenharmony_ci } 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci if (redundancy_pos) { 235cabdff1aSopenharmony_ci ret = opus_decode_redundancy(s, data + size, redundancy_size); 236cabdff1aSopenharmony_ci if (ret < 0) 237cabdff1aSopenharmony_ci return ret; 238cabdff1aSopenharmony_ci ff_celt_flush(s->celt); 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci } 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_ci /* decode the CELT frame */ 243cabdff1aSopenharmony_ci if (s->packet.mode == OPUS_MODE_CELT || s->packet.mode == OPUS_MODE_HYBRID) { 244cabdff1aSopenharmony_ci float *out_tmp[2] = { s->cur_out[0], s->cur_out[1] }; 245cabdff1aSopenharmony_ci float **dst = (s->packet.mode == OPUS_MODE_CELT) ? 246cabdff1aSopenharmony_ci out_tmp : s->celt_output; 247cabdff1aSopenharmony_ci int celt_output_samples = samples; 248cabdff1aSopenharmony_ci int delay_samples = av_audio_fifo_size(s->celt_delay); 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci if (delay_samples) { 251cabdff1aSopenharmony_ci if (s->packet.mode == OPUS_MODE_HYBRID) { 252cabdff1aSopenharmony_ci av_audio_fifo_read(s->celt_delay, (void**)s->celt_output, delay_samples); 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_ci for (i = 0; i < s->output_channels; i++) { 255cabdff1aSopenharmony_ci s->fdsp->vector_fmac_scalar(out_tmp[i], s->celt_output[i], 1.0, 256cabdff1aSopenharmony_ci delay_samples); 257cabdff1aSopenharmony_ci out_tmp[i] += delay_samples; 258cabdff1aSopenharmony_ci } 259cabdff1aSopenharmony_ci celt_output_samples -= delay_samples; 260cabdff1aSopenharmony_ci } else { 261cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, 262cabdff1aSopenharmony_ci "Spurious CELT delay samples present.\n"); 263cabdff1aSopenharmony_ci av_audio_fifo_drain(s->celt_delay, delay_samples); 264cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 265cabdff1aSopenharmony_ci return AVERROR_BUG; 266cabdff1aSopenharmony_ci } 267cabdff1aSopenharmony_ci } 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci ff_opus_rc_dec_raw_init(&s->rc, data + size, size); 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci ret = ff_celt_decode_frame(s->celt, &s->rc, dst, 272cabdff1aSopenharmony_ci s->packet.stereo + 1, 273cabdff1aSopenharmony_ci s->packet.frame_duration, 274cabdff1aSopenharmony_ci (s->packet.mode == OPUS_MODE_HYBRID) ? 17 : 0, 275cabdff1aSopenharmony_ci ff_celt_band_end[s->packet.bandwidth]); 276cabdff1aSopenharmony_ci if (ret < 0) 277cabdff1aSopenharmony_ci return ret; 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci if (s->packet.mode == OPUS_MODE_HYBRID) { 280cabdff1aSopenharmony_ci int celt_delay = s->packet.frame_duration - celt_output_samples; 281cabdff1aSopenharmony_ci void *delaybuf[2] = { s->celt_output[0] + celt_output_samples, 282cabdff1aSopenharmony_ci s->celt_output[1] + celt_output_samples }; 283cabdff1aSopenharmony_ci 284cabdff1aSopenharmony_ci for (i = 0; i < s->output_channels; i++) { 285cabdff1aSopenharmony_ci s->fdsp->vector_fmac_scalar(out_tmp[i], 286cabdff1aSopenharmony_ci s->celt_output[i], 1.0, 287cabdff1aSopenharmony_ci celt_output_samples); 288cabdff1aSopenharmony_ci } 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci ret = av_audio_fifo_write(s->celt_delay, delaybuf, celt_delay); 291cabdff1aSopenharmony_ci if (ret < 0) 292cabdff1aSopenharmony_ci return ret; 293cabdff1aSopenharmony_ci } 294cabdff1aSopenharmony_ci } else 295cabdff1aSopenharmony_ci ff_celt_flush(s->celt); 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci if (s->redundancy_idx) { 298cabdff1aSopenharmony_ci for (i = 0; i < s->output_channels; i++) 299cabdff1aSopenharmony_ci opus_fade(s->cur_out[i], s->cur_out[i], 300cabdff1aSopenharmony_ci s->redundancy_output[i] + 120 + s->redundancy_idx, 301cabdff1aSopenharmony_ci ff_celt_window2 + s->redundancy_idx, 120 - s->redundancy_idx); 302cabdff1aSopenharmony_ci s->redundancy_idx = 0; 303cabdff1aSopenharmony_ci } 304cabdff1aSopenharmony_ci if (redundancy) { 305cabdff1aSopenharmony_ci if (!redundancy_pos) { 306cabdff1aSopenharmony_ci ff_celt_flush(s->celt); 307cabdff1aSopenharmony_ci ret = opus_decode_redundancy(s, data + size, redundancy_size); 308cabdff1aSopenharmony_ci if (ret < 0) 309cabdff1aSopenharmony_ci return ret; 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_ci for (i = 0; i < s->output_channels; i++) { 312cabdff1aSopenharmony_ci opus_fade(s->cur_out[i] + samples - 120 + delayed_samples, 313cabdff1aSopenharmony_ci s->cur_out[i] + samples - 120 + delayed_samples, 314cabdff1aSopenharmony_ci s->redundancy_output[i] + 120, 315cabdff1aSopenharmony_ci ff_celt_window2, 120 - delayed_samples); 316cabdff1aSopenharmony_ci if (delayed_samples) 317cabdff1aSopenharmony_ci s->redundancy_idx = 120 - delayed_samples; 318cabdff1aSopenharmony_ci } 319cabdff1aSopenharmony_ci } else { 320cabdff1aSopenharmony_ci for (i = 0; i < s->output_channels; i++) { 321cabdff1aSopenharmony_ci memcpy(s->cur_out[i] + delayed_samples, s->redundancy_output[i], 120 * sizeof(float)); 322cabdff1aSopenharmony_ci opus_fade(s->cur_out[i] + 120 + delayed_samples, 323cabdff1aSopenharmony_ci s->redundancy_output[i] + 120, 324cabdff1aSopenharmony_ci s->cur_out[i] + 120 + delayed_samples, 325cabdff1aSopenharmony_ci ff_celt_window2, 120); 326cabdff1aSopenharmony_ci } 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci } 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_ci return samples; 331cabdff1aSopenharmony_ci} 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_cistatic int opus_decode_subpacket(OpusStreamContext *s, 334cabdff1aSopenharmony_ci const uint8_t *buf, int buf_size, 335cabdff1aSopenharmony_ci int nb_samples) 336cabdff1aSopenharmony_ci{ 337cabdff1aSopenharmony_ci int output_samples = 0; 338cabdff1aSopenharmony_ci int flush_needed = 0; 339cabdff1aSopenharmony_ci int i, j, ret; 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci s->cur_out[0] = s->out[0]; 342cabdff1aSopenharmony_ci s->cur_out[1] = s->out[1]; 343cabdff1aSopenharmony_ci s->remaining_out_size = s->out_size; 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci /* check if we need to flush the resampler */ 346cabdff1aSopenharmony_ci if (swr_is_initialized(s->swr)) { 347cabdff1aSopenharmony_ci if (buf) { 348cabdff1aSopenharmony_ci int64_t cur_samplerate; 349cabdff1aSopenharmony_ci av_opt_get_int(s->swr, "in_sample_rate", 0, &cur_samplerate); 350cabdff1aSopenharmony_ci flush_needed = (s->packet.mode == OPUS_MODE_CELT) || (cur_samplerate != s->silk_samplerate); 351cabdff1aSopenharmony_ci } else { 352cabdff1aSopenharmony_ci flush_needed = !!s->delayed_samples; 353cabdff1aSopenharmony_ci } 354cabdff1aSopenharmony_ci } 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci if (!buf && !flush_needed) 357cabdff1aSopenharmony_ci return 0; 358cabdff1aSopenharmony_ci 359cabdff1aSopenharmony_ci /* use dummy output buffers if the channel is not mapped to anything */ 360cabdff1aSopenharmony_ci if (!s->cur_out[0] || 361cabdff1aSopenharmony_ci (s->output_channels == 2 && !s->cur_out[1])) { 362cabdff1aSopenharmony_ci av_fast_malloc(&s->out_dummy, &s->out_dummy_allocated_size, 363cabdff1aSopenharmony_ci s->remaining_out_size); 364cabdff1aSopenharmony_ci if (!s->out_dummy) 365cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 366cabdff1aSopenharmony_ci if (!s->cur_out[0]) 367cabdff1aSopenharmony_ci s->cur_out[0] = s->out_dummy; 368cabdff1aSopenharmony_ci if (!s->cur_out[1]) 369cabdff1aSopenharmony_ci s->cur_out[1] = s->out_dummy; 370cabdff1aSopenharmony_ci } 371cabdff1aSopenharmony_ci 372cabdff1aSopenharmony_ci /* flush the resampler if necessary */ 373cabdff1aSopenharmony_ci if (flush_needed) { 374cabdff1aSopenharmony_ci ret = opus_flush_resample(s, s->delayed_samples); 375cabdff1aSopenharmony_ci if (ret < 0) { 376cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error flushing the resampler.\n"); 377cabdff1aSopenharmony_ci return ret; 378cabdff1aSopenharmony_ci } 379cabdff1aSopenharmony_ci swr_close(s->swr); 380cabdff1aSopenharmony_ci output_samples += s->delayed_samples; 381cabdff1aSopenharmony_ci s->delayed_samples = 0; 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_ci if (!buf) 384cabdff1aSopenharmony_ci goto finish; 385cabdff1aSopenharmony_ci } 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci /* decode all the frames in the packet */ 388cabdff1aSopenharmony_ci for (i = 0; i < s->packet.frame_count; i++) { 389cabdff1aSopenharmony_ci int size = s->packet.frame_size[i]; 390cabdff1aSopenharmony_ci int samples = opus_decode_frame(s, buf + s->packet.frame_offset[i], size); 391cabdff1aSopenharmony_ci 392cabdff1aSopenharmony_ci if (samples < 0) { 393cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error decoding an Opus frame.\n"); 394cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 395cabdff1aSopenharmony_ci return samples; 396cabdff1aSopenharmony_ci 397cabdff1aSopenharmony_ci for (j = 0; j < s->output_channels; j++) 398cabdff1aSopenharmony_ci memset(s->cur_out[j], 0, s->packet.frame_duration * sizeof(float)); 399cabdff1aSopenharmony_ci samples = s->packet.frame_duration; 400cabdff1aSopenharmony_ci } 401cabdff1aSopenharmony_ci output_samples += samples; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci for (j = 0; j < s->output_channels; j++) 404cabdff1aSopenharmony_ci s->cur_out[j] += samples; 405cabdff1aSopenharmony_ci s->remaining_out_size -= samples * sizeof(float); 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_cifinish: 409cabdff1aSopenharmony_ci s->cur_out[0] = s->cur_out[1] = NULL; 410cabdff1aSopenharmony_ci s->remaining_out_size = 0; 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci return output_samples; 413cabdff1aSopenharmony_ci} 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_cistatic int opus_decode_packet(AVCodecContext *avctx, AVFrame *frame, 416cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 417cabdff1aSopenharmony_ci{ 418cabdff1aSopenharmony_ci OpusContext *c = avctx->priv_data; 419cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 420cabdff1aSopenharmony_ci int buf_size = avpkt->size; 421cabdff1aSopenharmony_ci int coded_samples = 0; 422cabdff1aSopenharmony_ci int decoded_samples = INT_MAX; 423cabdff1aSopenharmony_ci int delayed_samples = 0; 424cabdff1aSopenharmony_ci int i, ret; 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_ci /* calculate the number of delayed samples */ 427cabdff1aSopenharmony_ci for (i = 0; i < c->nb_streams; i++) { 428cabdff1aSopenharmony_ci OpusStreamContext *s = &c->streams[i]; 429cabdff1aSopenharmony_ci s->out[0] = 430cabdff1aSopenharmony_ci s->out[1] = NULL; 431cabdff1aSopenharmony_ci delayed_samples = FFMAX(delayed_samples, 432cabdff1aSopenharmony_ci s->delayed_samples + av_audio_fifo_size(s->sync_buffer)); 433cabdff1aSopenharmony_ci } 434cabdff1aSopenharmony_ci 435cabdff1aSopenharmony_ci /* decode the header of the first sub-packet to find out the sample count */ 436cabdff1aSopenharmony_ci if (buf) { 437cabdff1aSopenharmony_ci OpusPacket *pkt = &c->streams[0].packet; 438cabdff1aSopenharmony_ci ret = ff_opus_parse_packet(pkt, buf, buf_size, c->nb_streams > 1); 439cabdff1aSopenharmony_ci if (ret < 0) { 440cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error parsing the packet header.\n"); 441cabdff1aSopenharmony_ci return ret; 442cabdff1aSopenharmony_ci } 443cabdff1aSopenharmony_ci coded_samples += pkt->frame_count * pkt->frame_duration; 444cabdff1aSopenharmony_ci c->streams[0].silk_samplerate = get_silk_samplerate(pkt->config); 445cabdff1aSopenharmony_ci } 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_ci frame->nb_samples = coded_samples + delayed_samples; 448cabdff1aSopenharmony_ci 449cabdff1aSopenharmony_ci /* no input or buffered data => nothing to do */ 450cabdff1aSopenharmony_ci if (!frame->nb_samples) { 451cabdff1aSopenharmony_ci *got_frame_ptr = 0; 452cabdff1aSopenharmony_ci return 0; 453cabdff1aSopenharmony_ci } 454cabdff1aSopenharmony_ci 455cabdff1aSopenharmony_ci /* setup the data buffers */ 456cabdff1aSopenharmony_ci ret = ff_get_buffer(avctx, frame, 0); 457cabdff1aSopenharmony_ci if (ret < 0) 458cabdff1aSopenharmony_ci return ret; 459cabdff1aSopenharmony_ci frame->nb_samples = 0; 460cabdff1aSopenharmony_ci 461cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) { 462cabdff1aSopenharmony_ci ChannelMap *map = &c->channel_maps[i]; 463cabdff1aSopenharmony_ci if (!map->copy) 464cabdff1aSopenharmony_ci c->streams[map->stream_idx].out[map->channel_idx] = (float*)frame->extended_data[i]; 465cabdff1aSopenharmony_ci } 466cabdff1aSopenharmony_ci 467cabdff1aSopenharmony_ci /* read the data from the sync buffers */ 468cabdff1aSopenharmony_ci for (i = 0; i < c->nb_streams; i++) { 469cabdff1aSopenharmony_ci OpusStreamContext *s = &c->streams[i]; 470cabdff1aSopenharmony_ci float **out = s->out; 471cabdff1aSopenharmony_ci int sync_size = av_audio_fifo_size(s->sync_buffer); 472cabdff1aSopenharmony_ci 473cabdff1aSopenharmony_ci float sync_dummy[32]; 474cabdff1aSopenharmony_ci int out_dummy = (!out[0]) | ((!out[1]) << 1); 475cabdff1aSopenharmony_ci 476cabdff1aSopenharmony_ci if (!out[0]) 477cabdff1aSopenharmony_ci out[0] = sync_dummy; 478cabdff1aSopenharmony_ci if (!out[1]) 479cabdff1aSopenharmony_ci out[1] = sync_dummy; 480cabdff1aSopenharmony_ci if (out_dummy && sync_size > FF_ARRAY_ELEMS(sync_dummy)) 481cabdff1aSopenharmony_ci return AVERROR_BUG; 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_ci ret = av_audio_fifo_read(s->sync_buffer, (void**)out, sync_size); 484cabdff1aSopenharmony_ci if (ret < 0) 485cabdff1aSopenharmony_ci return ret; 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_ci if (out_dummy & 1) 488cabdff1aSopenharmony_ci out[0] = NULL; 489cabdff1aSopenharmony_ci else 490cabdff1aSopenharmony_ci out[0] += ret; 491cabdff1aSopenharmony_ci if (out_dummy & 2) 492cabdff1aSopenharmony_ci out[1] = NULL; 493cabdff1aSopenharmony_ci else 494cabdff1aSopenharmony_ci out[1] += ret; 495cabdff1aSopenharmony_ci 496cabdff1aSopenharmony_ci s->out_size = frame->linesize[0] - ret * sizeof(float); 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci 499cabdff1aSopenharmony_ci /* decode each sub-packet */ 500cabdff1aSopenharmony_ci for (i = 0; i < c->nb_streams; i++) { 501cabdff1aSopenharmony_ci OpusStreamContext *s = &c->streams[i]; 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci if (i && buf) { 504cabdff1aSopenharmony_ci ret = ff_opus_parse_packet(&s->packet, buf, buf_size, i != c->nb_streams - 1); 505cabdff1aSopenharmony_ci if (ret < 0) { 506cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error parsing the packet header.\n"); 507cabdff1aSopenharmony_ci return ret; 508cabdff1aSopenharmony_ci } 509cabdff1aSopenharmony_ci if (coded_samples != s->packet.frame_count * s->packet.frame_duration) { 510cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 511cabdff1aSopenharmony_ci "Mismatching coded sample count in substream %d.\n", i); 512cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 513cabdff1aSopenharmony_ci } 514cabdff1aSopenharmony_ci 515cabdff1aSopenharmony_ci s->silk_samplerate = get_silk_samplerate(s->packet.config); 516cabdff1aSopenharmony_ci } 517cabdff1aSopenharmony_ci 518cabdff1aSopenharmony_ci ret = opus_decode_subpacket(&c->streams[i], buf, s->packet.data_size, 519cabdff1aSopenharmony_ci coded_samples); 520cabdff1aSopenharmony_ci if (ret < 0) 521cabdff1aSopenharmony_ci return ret; 522cabdff1aSopenharmony_ci s->decoded_samples = ret; 523cabdff1aSopenharmony_ci decoded_samples = FFMIN(decoded_samples, ret); 524cabdff1aSopenharmony_ci 525cabdff1aSopenharmony_ci buf += s->packet.packet_size; 526cabdff1aSopenharmony_ci buf_size -= s->packet.packet_size; 527cabdff1aSopenharmony_ci } 528cabdff1aSopenharmony_ci 529cabdff1aSopenharmony_ci /* buffer the extra samples */ 530cabdff1aSopenharmony_ci for (i = 0; i < c->nb_streams; i++) { 531cabdff1aSopenharmony_ci OpusStreamContext *s = &c->streams[i]; 532cabdff1aSopenharmony_ci int buffer_samples = s->decoded_samples - decoded_samples; 533cabdff1aSopenharmony_ci if (buffer_samples) { 534cabdff1aSopenharmony_ci float *buf[2] = { s->out[0] ? s->out[0] : (float*)frame->extended_data[0], 535cabdff1aSopenharmony_ci s->out[1] ? s->out[1] : (float*)frame->extended_data[0] }; 536cabdff1aSopenharmony_ci buf[0] += decoded_samples; 537cabdff1aSopenharmony_ci buf[1] += decoded_samples; 538cabdff1aSopenharmony_ci ret = av_audio_fifo_write(s->sync_buffer, (void**)buf, buffer_samples); 539cabdff1aSopenharmony_ci if (ret < 0) 540cabdff1aSopenharmony_ci return ret; 541cabdff1aSopenharmony_ci } 542cabdff1aSopenharmony_ci } 543cabdff1aSopenharmony_ci 544cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) { 545cabdff1aSopenharmony_ci ChannelMap *map = &c->channel_maps[i]; 546cabdff1aSopenharmony_ci 547cabdff1aSopenharmony_ci /* handle copied channels */ 548cabdff1aSopenharmony_ci if (map->copy) { 549cabdff1aSopenharmony_ci memcpy(frame->extended_data[i], 550cabdff1aSopenharmony_ci frame->extended_data[map->copy_idx], 551cabdff1aSopenharmony_ci frame->linesize[0]); 552cabdff1aSopenharmony_ci } else if (map->silence) { 553cabdff1aSopenharmony_ci memset(frame->extended_data[i], 0, frame->linesize[0]); 554cabdff1aSopenharmony_ci } 555cabdff1aSopenharmony_ci 556cabdff1aSopenharmony_ci if (c->gain_i && decoded_samples > 0) { 557cabdff1aSopenharmony_ci c->fdsp->vector_fmul_scalar((float*)frame->extended_data[i], 558cabdff1aSopenharmony_ci (float*)frame->extended_data[i], 559cabdff1aSopenharmony_ci c->gain, FFALIGN(decoded_samples, 8)); 560cabdff1aSopenharmony_ci } 561cabdff1aSopenharmony_ci } 562cabdff1aSopenharmony_ci 563cabdff1aSopenharmony_ci frame->nb_samples = decoded_samples; 564cabdff1aSopenharmony_ci *got_frame_ptr = !!decoded_samples; 565cabdff1aSopenharmony_ci 566cabdff1aSopenharmony_ci return avpkt->size; 567cabdff1aSopenharmony_ci} 568cabdff1aSopenharmony_ci 569cabdff1aSopenharmony_cistatic av_cold void opus_decode_flush(AVCodecContext *ctx) 570cabdff1aSopenharmony_ci{ 571cabdff1aSopenharmony_ci OpusContext *c = ctx->priv_data; 572cabdff1aSopenharmony_ci int i; 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci for (i = 0; i < c->nb_streams; i++) { 575cabdff1aSopenharmony_ci OpusStreamContext *s = &c->streams[i]; 576cabdff1aSopenharmony_ci 577cabdff1aSopenharmony_ci memset(&s->packet, 0, sizeof(s->packet)); 578cabdff1aSopenharmony_ci s->delayed_samples = 0; 579cabdff1aSopenharmony_ci 580cabdff1aSopenharmony_ci av_audio_fifo_drain(s->celt_delay, av_audio_fifo_size(s->celt_delay)); 581cabdff1aSopenharmony_ci swr_close(s->swr); 582cabdff1aSopenharmony_ci 583cabdff1aSopenharmony_ci av_audio_fifo_drain(s->sync_buffer, av_audio_fifo_size(s->sync_buffer)); 584cabdff1aSopenharmony_ci 585cabdff1aSopenharmony_ci ff_silk_flush(s->silk); 586cabdff1aSopenharmony_ci ff_celt_flush(s->celt); 587cabdff1aSopenharmony_ci } 588cabdff1aSopenharmony_ci} 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_cistatic av_cold int opus_decode_close(AVCodecContext *avctx) 591cabdff1aSopenharmony_ci{ 592cabdff1aSopenharmony_ci OpusContext *c = avctx->priv_data; 593cabdff1aSopenharmony_ci int i; 594cabdff1aSopenharmony_ci 595cabdff1aSopenharmony_ci for (i = 0; i < c->nb_streams; i++) { 596cabdff1aSopenharmony_ci OpusStreamContext *s = &c->streams[i]; 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci ff_silk_free(&s->silk); 599cabdff1aSopenharmony_ci ff_celt_free(&s->celt); 600cabdff1aSopenharmony_ci 601cabdff1aSopenharmony_ci av_freep(&s->out_dummy); 602cabdff1aSopenharmony_ci s->out_dummy_allocated_size = 0; 603cabdff1aSopenharmony_ci 604cabdff1aSopenharmony_ci av_audio_fifo_free(s->sync_buffer); 605cabdff1aSopenharmony_ci av_audio_fifo_free(s->celt_delay); 606cabdff1aSopenharmony_ci swr_free(&s->swr); 607cabdff1aSopenharmony_ci } 608cabdff1aSopenharmony_ci 609cabdff1aSopenharmony_ci av_freep(&c->streams); 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ci c->nb_streams = 0; 612cabdff1aSopenharmony_ci 613cabdff1aSopenharmony_ci av_freep(&c->channel_maps); 614cabdff1aSopenharmony_ci av_freep(&c->fdsp); 615cabdff1aSopenharmony_ci 616cabdff1aSopenharmony_ci return 0; 617cabdff1aSopenharmony_ci} 618cabdff1aSopenharmony_ci 619cabdff1aSopenharmony_cistatic av_cold int opus_decode_init(AVCodecContext *avctx) 620cabdff1aSopenharmony_ci{ 621cabdff1aSopenharmony_ci OpusContext *c = avctx->priv_data; 622cabdff1aSopenharmony_ci int ret, i, j; 623cabdff1aSopenharmony_ci 624cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 625cabdff1aSopenharmony_ci avctx->sample_rate = 48000; 626cabdff1aSopenharmony_ci 627cabdff1aSopenharmony_ci c->fdsp = avpriv_float_dsp_alloc(0); 628cabdff1aSopenharmony_ci if (!c->fdsp) 629cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 630cabdff1aSopenharmony_ci 631cabdff1aSopenharmony_ci /* find out the channel configuration */ 632cabdff1aSopenharmony_ci ret = ff_opus_parse_extradata(avctx, c); 633cabdff1aSopenharmony_ci if (ret < 0) 634cabdff1aSopenharmony_ci return ret; 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci /* allocate and init each independent decoder */ 637cabdff1aSopenharmony_ci c->streams = av_calloc(c->nb_streams, sizeof(*c->streams)); 638cabdff1aSopenharmony_ci if (!c->streams) { 639cabdff1aSopenharmony_ci c->nb_streams = 0; 640cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 641cabdff1aSopenharmony_ci } 642cabdff1aSopenharmony_ci 643cabdff1aSopenharmony_ci for (i = 0; i < c->nb_streams; i++) { 644cabdff1aSopenharmony_ci OpusStreamContext *s = &c->streams[i]; 645cabdff1aSopenharmony_ci uint64_t layout; 646cabdff1aSopenharmony_ci 647cabdff1aSopenharmony_ci s->output_channels = (i < c->nb_stereo_streams) ? 2 : 1; 648cabdff1aSopenharmony_ci 649cabdff1aSopenharmony_ci s->avctx = avctx; 650cabdff1aSopenharmony_ci 651cabdff1aSopenharmony_ci for (j = 0; j < s->output_channels; j++) { 652cabdff1aSopenharmony_ci s->silk_output[j] = s->silk_buf[j]; 653cabdff1aSopenharmony_ci s->celt_output[j] = s->celt_buf[j]; 654cabdff1aSopenharmony_ci s->redundancy_output[j] = s->redundancy_buf[j]; 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci 657cabdff1aSopenharmony_ci s->fdsp = c->fdsp; 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci s->swr =swr_alloc(); 660cabdff1aSopenharmony_ci if (!s->swr) 661cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 662cabdff1aSopenharmony_ci 663cabdff1aSopenharmony_ci layout = (s->output_channels == 1) ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO; 664cabdff1aSopenharmony_ci av_opt_set_int(s->swr, "in_sample_fmt", avctx->sample_fmt, 0); 665cabdff1aSopenharmony_ci av_opt_set_int(s->swr, "out_sample_fmt", avctx->sample_fmt, 0); 666cabdff1aSopenharmony_ci av_opt_set_int(s->swr, "in_channel_layout", layout, 0); 667cabdff1aSopenharmony_ci av_opt_set_int(s->swr, "out_channel_layout", layout, 0); 668cabdff1aSopenharmony_ci av_opt_set_int(s->swr, "out_sample_rate", avctx->sample_rate, 0); 669cabdff1aSopenharmony_ci av_opt_set_int(s->swr, "filter_size", 16, 0); 670cabdff1aSopenharmony_ci 671cabdff1aSopenharmony_ci ret = ff_silk_init(avctx, &s->silk, s->output_channels); 672cabdff1aSopenharmony_ci if (ret < 0) 673cabdff1aSopenharmony_ci return ret; 674cabdff1aSopenharmony_ci 675cabdff1aSopenharmony_ci ret = ff_celt_init(avctx, &s->celt, s->output_channels, c->apply_phase_inv); 676cabdff1aSopenharmony_ci if (ret < 0) 677cabdff1aSopenharmony_ci return ret; 678cabdff1aSopenharmony_ci 679cabdff1aSopenharmony_ci s->celt_delay = av_audio_fifo_alloc(avctx->sample_fmt, 680cabdff1aSopenharmony_ci s->output_channels, 1024); 681cabdff1aSopenharmony_ci if (!s->celt_delay) 682cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 683cabdff1aSopenharmony_ci 684cabdff1aSopenharmony_ci s->sync_buffer = av_audio_fifo_alloc(avctx->sample_fmt, 685cabdff1aSopenharmony_ci s->output_channels, 32); 686cabdff1aSopenharmony_ci if (!s->sync_buffer) 687cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 688cabdff1aSopenharmony_ci } 689cabdff1aSopenharmony_ci 690cabdff1aSopenharmony_ci return 0; 691cabdff1aSopenharmony_ci} 692cabdff1aSopenharmony_ci 693cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(OpusContext, x) 694cabdff1aSopenharmony_ci#define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM 695cabdff1aSopenharmony_cistatic const AVOption opus_options[] = { 696cabdff1aSopenharmony_ci { "apply_phase_inv", "Apply intensity stereo phase inversion", OFFSET(apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AD }, 697cabdff1aSopenharmony_ci { NULL }, 698cabdff1aSopenharmony_ci}; 699cabdff1aSopenharmony_ci 700cabdff1aSopenharmony_cistatic const AVClass opus_class = { 701cabdff1aSopenharmony_ci .class_name = "Opus Decoder", 702cabdff1aSopenharmony_ci .item_name = av_default_item_name, 703cabdff1aSopenharmony_ci .option = opus_options, 704cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 705cabdff1aSopenharmony_ci}; 706cabdff1aSopenharmony_ci 707cabdff1aSopenharmony_ciconst FFCodec ff_opus_decoder = { 708cabdff1aSopenharmony_ci .p.name = "opus", 709cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Opus"), 710cabdff1aSopenharmony_ci .p.priv_class = &opus_class, 711cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 712cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_OPUS, 713cabdff1aSopenharmony_ci .priv_data_size = sizeof(OpusContext), 714cabdff1aSopenharmony_ci .init = opus_decode_init, 715cabdff1aSopenharmony_ci .close = opus_decode_close, 716cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(opus_decode_packet), 717cabdff1aSopenharmony_ci .flush = opus_decode_flush, 718cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_CHANNEL_CONF, 719cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 720cabdff1aSopenharmony_ci}; 721