1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Opus decoder/demuxer common functions 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#ifndef AVCODEC_OPUS_H 24cabdff1aSopenharmony_ci#define AVCODEC_OPUS_H 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include <stdint.h> 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/audio_fifo.h" 29cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 30cabdff1aSopenharmony_ci#include "libavutil/frame.h" 31cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#include "libswresample/swresample.h" 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#include "avcodec.h" 36cabdff1aSopenharmony_ci#include "opus_rc.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#define MAX_FRAME_SIZE 1275 39cabdff1aSopenharmony_ci#define MAX_FRAMES 48 40cabdff1aSopenharmony_ci#define MAX_PACKET_DUR 5760 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#define CELT_SHORT_BLOCKSIZE 120 43cabdff1aSopenharmony_ci#define CELT_OVERLAP CELT_SHORT_BLOCKSIZE 44cabdff1aSopenharmony_ci#define CELT_MAX_LOG_BLOCKS 3 45cabdff1aSopenharmony_ci#define CELT_MAX_FRAME_SIZE (CELT_SHORT_BLOCKSIZE * (1 << CELT_MAX_LOG_BLOCKS)) 46cabdff1aSopenharmony_ci#define CELT_MAX_BANDS 21 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci#define SILK_HISTORY 322 49cabdff1aSopenharmony_ci#define SILK_MAX_LPC 16 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci#define ROUND_MULL(a,b,s) (((MUL64(a, b) >> ((s) - 1)) + 1) >> 1) 52cabdff1aSopenharmony_ci#define ROUND_MUL16(a,b) ((MUL16(a, b) + 16384) >> 15) 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci#define OPUS_TS_HEADER 0x7FE0 // 0x3ff (11 bits) 55cabdff1aSopenharmony_ci#define OPUS_TS_MASK 0xFFE0 // top 11 bits 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_cistatic const uint8_t opus_default_extradata[30] = { 58cabdff1aSopenharmony_ci 'O', 'p', 'u', 's', 'H', 'e', 'a', 'd', 59cabdff1aSopenharmony_ci 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61cabdff1aSopenharmony_ci}; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cienum OpusMode { 64cabdff1aSopenharmony_ci OPUS_MODE_SILK, 65cabdff1aSopenharmony_ci OPUS_MODE_HYBRID, 66cabdff1aSopenharmony_ci OPUS_MODE_CELT, 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci OPUS_MODE_NB 69cabdff1aSopenharmony_ci}; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_cienum OpusBandwidth { 72cabdff1aSopenharmony_ci OPUS_BANDWIDTH_NARROWBAND, 73cabdff1aSopenharmony_ci OPUS_BANDWIDTH_MEDIUMBAND, 74cabdff1aSopenharmony_ci OPUS_BANDWIDTH_WIDEBAND, 75cabdff1aSopenharmony_ci OPUS_BANDWIDTH_SUPERWIDEBAND, 76cabdff1aSopenharmony_ci OPUS_BANDWIDTH_FULLBAND, 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci OPUS_BANDWITH_NB 79cabdff1aSopenharmony_ci}; 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_citypedef struct SilkContext SilkContext; 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_citypedef struct CeltFrame CeltFrame; 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_citypedef struct OpusPacket { 86cabdff1aSopenharmony_ci int packet_size; /**< packet size */ 87cabdff1aSopenharmony_ci int data_size; /**< size of the useful data -- packet size - padding */ 88cabdff1aSopenharmony_ci int code; /**< packet code: specifies the frame layout */ 89cabdff1aSopenharmony_ci int stereo; /**< whether this packet is mono or stereo */ 90cabdff1aSopenharmony_ci int vbr; /**< vbr flag */ 91cabdff1aSopenharmony_ci int config; /**< configuration: tells the audio mode, 92cabdff1aSopenharmony_ci ** bandwidth, and frame duration */ 93cabdff1aSopenharmony_ci int frame_count; /**< frame count */ 94cabdff1aSopenharmony_ci int frame_offset[MAX_FRAMES]; /**< frame offsets */ 95cabdff1aSopenharmony_ci int frame_size[MAX_FRAMES]; /**< frame sizes */ 96cabdff1aSopenharmony_ci int frame_duration; /**< frame duration, in samples @ 48kHz */ 97cabdff1aSopenharmony_ci enum OpusMode mode; /**< mode */ 98cabdff1aSopenharmony_ci enum OpusBandwidth bandwidth; /**< bandwidth */ 99cabdff1aSopenharmony_ci} OpusPacket; 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_citypedef struct OpusStreamContext { 102cabdff1aSopenharmony_ci AVCodecContext *avctx; 103cabdff1aSopenharmony_ci int output_channels; 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci /* number of decoded samples for this stream */ 106cabdff1aSopenharmony_ci int decoded_samples; 107cabdff1aSopenharmony_ci /* current output buffers for this stream */ 108cabdff1aSopenharmony_ci float *out[2]; 109cabdff1aSopenharmony_ci int out_size; 110cabdff1aSopenharmony_ci /* Buffer with samples from this stream for synchronizing 111cabdff1aSopenharmony_ci * the streams when they have different resampling delays */ 112cabdff1aSopenharmony_ci AVAudioFifo *sync_buffer; 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci OpusRangeCoder rc; 115cabdff1aSopenharmony_ci OpusRangeCoder redundancy_rc; 116cabdff1aSopenharmony_ci SilkContext *silk; 117cabdff1aSopenharmony_ci CeltFrame *celt; 118cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci float silk_buf[2][960]; 121cabdff1aSopenharmony_ci float *silk_output[2]; 122cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, celt_buf)[2][960]; 123cabdff1aSopenharmony_ci float *celt_output[2]; 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, redundancy_buf)[2][960]; 126cabdff1aSopenharmony_ci float *redundancy_output[2]; 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci /* buffers for the next samples to be decoded */ 129cabdff1aSopenharmony_ci float *cur_out[2]; 130cabdff1aSopenharmony_ci int remaining_out_size; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_ci float *out_dummy; 133cabdff1aSopenharmony_ci int out_dummy_allocated_size; 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci SwrContext *swr; 136cabdff1aSopenharmony_ci AVAudioFifo *celt_delay; 137cabdff1aSopenharmony_ci int silk_samplerate; 138cabdff1aSopenharmony_ci /* number of samples we still want to get from the resampler */ 139cabdff1aSopenharmony_ci int delayed_samples; 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_ci OpusPacket packet; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci int redundancy_idx; 144cabdff1aSopenharmony_ci} OpusStreamContext; 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci// a mapping between an opus stream and an output channel 147cabdff1aSopenharmony_citypedef struct ChannelMap { 148cabdff1aSopenharmony_ci int stream_idx; 149cabdff1aSopenharmony_ci int channel_idx; 150cabdff1aSopenharmony_ci 151cabdff1aSopenharmony_ci // when a single decoded channel is mapped to multiple output channels, we 152cabdff1aSopenharmony_ci // write to the first output directly and copy from it to the others 153cabdff1aSopenharmony_ci // this field is set to 1 for those copied output channels 154cabdff1aSopenharmony_ci int copy; 155cabdff1aSopenharmony_ci // this is the index of the output channel to copy from 156cabdff1aSopenharmony_ci int copy_idx; 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci // this channel is silent 159cabdff1aSopenharmony_ci int silence; 160cabdff1aSopenharmony_ci} ChannelMap; 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_citypedef struct OpusContext { 163cabdff1aSopenharmony_ci AVClass *av_class; 164cabdff1aSopenharmony_ci OpusStreamContext *streams; 165cabdff1aSopenharmony_ci int apply_phase_inv; 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci int nb_streams; 168cabdff1aSopenharmony_ci int nb_stereo_streams; 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 171cabdff1aSopenharmony_ci int16_t gain_i; 172cabdff1aSopenharmony_ci float gain; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci ChannelMap *channel_maps; 175cabdff1aSopenharmony_ci} OpusContext; 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ciint ff_opus_parse_packet(OpusPacket *pkt, const uint8_t *buf, int buf_size, 178cabdff1aSopenharmony_ci int self_delimited); 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ciint ff_opus_parse_extradata(AVCodecContext *avctx, OpusContext *s); 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ciint ff_silk_init(AVCodecContext *avctx, SilkContext **ps, int output_channels); 183cabdff1aSopenharmony_civoid ff_silk_free(SilkContext **ps); 184cabdff1aSopenharmony_civoid ff_silk_flush(SilkContext *s); 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci/** 187cabdff1aSopenharmony_ci * Decode the LP layer of one Opus frame (which may correspond to several SILK 188cabdff1aSopenharmony_ci * frames). 189cabdff1aSopenharmony_ci */ 190cabdff1aSopenharmony_ciint ff_silk_decode_superframe(SilkContext *s, OpusRangeCoder *rc, 191cabdff1aSopenharmony_ci float *output[2], 192cabdff1aSopenharmony_ci enum OpusBandwidth bandwidth, int coded_channels, 193cabdff1aSopenharmony_ci int duration_ms); 194cabdff1aSopenharmony_ci 195cabdff1aSopenharmony_ci/* Encode or decode CELT bands */ 196cabdff1aSopenharmony_civoid ff_celt_quant_bands(CeltFrame *f, OpusRangeCoder *rc); 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_ci/* Encode or decode CELT bitallocation */ 199cabdff1aSopenharmony_civoid ff_celt_bitalloc(CeltFrame *f, OpusRangeCoder *rc, int encode); 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_ci#endif /* AVCODEC_OPUS_H */ 202