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