1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Opus encoder 3cabdff1aSopenharmony_ci * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com> 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#include "encode.h" 23cabdff1aSopenharmony_ci#include "opusenc.h" 24cabdff1aSopenharmony_ci#include "opus_pvq.h" 25cabdff1aSopenharmony_ci#include "opusenc_psy.h" 26cabdff1aSopenharmony_ci#include "opustab.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 29cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 30cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 31cabdff1aSopenharmony_ci#include "libavutil/opt.h" 32cabdff1aSopenharmony_ci#include "bytestream.h" 33cabdff1aSopenharmony_ci#include "audio_frame_queue.h" 34cabdff1aSopenharmony_ci#include "codec_internal.h" 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_citypedef struct OpusEncContext { 37cabdff1aSopenharmony_ci AVClass *av_class; 38cabdff1aSopenharmony_ci OpusEncOptions options; 39cabdff1aSopenharmony_ci OpusPsyContext psyctx; 40cabdff1aSopenharmony_ci AVCodecContext *avctx; 41cabdff1aSopenharmony_ci AudioFrameQueue afq; 42cabdff1aSopenharmony_ci AVFloatDSPContext *dsp; 43cabdff1aSopenharmony_ci MDCT15Context *mdct[CELT_BLOCK_NB]; 44cabdff1aSopenharmony_ci CeltPVQ *pvq; 45cabdff1aSopenharmony_ci struct FFBufQueue bufqueue; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci uint8_t enc_id[64]; 48cabdff1aSopenharmony_ci int enc_id_bits; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci OpusPacketInfo packet; 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci int channels; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci CeltFrame *frame; 55cabdff1aSopenharmony_ci OpusRangeCoder *rc; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci /* Actual energy the decoder will have */ 58cabdff1aSopenharmony_ci float last_quantized_energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, scratch)[2048]; 61cabdff1aSopenharmony_ci} OpusEncContext; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cistatic void opus_write_extradata(AVCodecContext *avctx) 64cabdff1aSopenharmony_ci{ 65cabdff1aSopenharmony_ci uint8_t *bs = avctx->extradata; 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci bytestream_put_buffer(&bs, "OpusHead", 8); 68cabdff1aSopenharmony_ci bytestream_put_byte (&bs, 0x1); 69cabdff1aSopenharmony_ci bytestream_put_byte (&bs, avctx->ch_layout.nb_channels); 70cabdff1aSopenharmony_ci bytestream_put_le16 (&bs, avctx->initial_padding); 71cabdff1aSopenharmony_ci bytestream_put_le32 (&bs, avctx->sample_rate); 72cabdff1aSopenharmony_ci bytestream_put_le16 (&bs, 0x0); 73cabdff1aSopenharmony_ci bytestream_put_byte (&bs, 0x0); /* Default layout */ 74cabdff1aSopenharmony_ci} 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_cistatic int opus_gen_toc(OpusEncContext *s, uint8_t *toc, int *size, int *fsize_needed) 77cabdff1aSopenharmony_ci{ 78cabdff1aSopenharmony_ci int tmp = 0x0, extended_toc = 0; 79cabdff1aSopenharmony_ci static const int toc_cfg[][OPUS_MODE_NB][OPUS_BANDWITH_NB] = { 80cabdff1aSopenharmony_ci /* Silk Hybrid Celt Layer */ 81cabdff1aSopenharmony_ci /* NB MB WB SWB FB NB MB WB SWB FB NB MB WB SWB FB Bandwidth */ 82cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 17, 0, 21, 25, 29 } }, /* 2.5 ms */ 83cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 18, 0, 22, 26, 30 } }, /* 5 ms */ 84cabdff1aSopenharmony_ci { { 1, 5, 9, 0, 0 }, { 0, 0, 0, 13, 15 }, { 19, 0, 23, 27, 31 } }, /* 10 ms */ 85cabdff1aSopenharmony_ci { { 2, 6, 10, 0, 0 }, { 0, 0, 0, 14, 16 }, { 20, 0, 24, 28, 32 } }, /* 20 ms */ 86cabdff1aSopenharmony_ci { { 3, 7, 11, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }, /* 40 ms */ 87cabdff1aSopenharmony_ci { { 4, 8, 12, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }, /* 60 ms */ 88cabdff1aSopenharmony_ci }; 89cabdff1aSopenharmony_ci int cfg = toc_cfg[s->packet.framesize][s->packet.mode][s->packet.bandwidth]; 90cabdff1aSopenharmony_ci *fsize_needed = 0; 91cabdff1aSopenharmony_ci if (!cfg) 92cabdff1aSopenharmony_ci return 1; 93cabdff1aSopenharmony_ci if (s->packet.frames == 2) { /* 2 packets */ 94cabdff1aSopenharmony_ci if (s->frame[0].framebits == s->frame[1].framebits) { /* same size */ 95cabdff1aSopenharmony_ci tmp = 0x1; 96cabdff1aSopenharmony_ci } else { /* different size */ 97cabdff1aSopenharmony_ci tmp = 0x2; 98cabdff1aSopenharmony_ci *fsize_needed = 1; /* put frame sizes in the packet */ 99cabdff1aSopenharmony_ci } 100cabdff1aSopenharmony_ci } else if (s->packet.frames > 2) { 101cabdff1aSopenharmony_ci tmp = 0x3; 102cabdff1aSopenharmony_ci extended_toc = 1; 103cabdff1aSopenharmony_ci } 104cabdff1aSopenharmony_ci tmp |= (s->channels > 1) << 2; /* Stereo or mono */ 105cabdff1aSopenharmony_ci tmp |= (cfg - 1) << 3; /* codec configuration */ 106cabdff1aSopenharmony_ci *toc++ = tmp; 107cabdff1aSopenharmony_ci if (extended_toc) { 108cabdff1aSopenharmony_ci for (int i = 0; i < (s->packet.frames - 1); i++) 109cabdff1aSopenharmony_ci *fsize_needed |= (s->frame[i].framebits != s->frame[i + 1].framebits); 110cabdff1aSopenharmony_ci tmp = (*fsize_needed) << 7; /* vbr flag */ 111cabdff1aSopenharmony_ci tmp |= (0) << 6; /* padding flag */ 112cabdff1aSopenharmony_ci tmp |= s->packet.frames; 113cabdff1aSopenharmony_ci *toc++ = tmp; 114cabdff1aSopenharmony_ci } 115cabdff1aSopenharmony_ci *size = 1 + extended_toc; 116cabdff1aSopenharmony_ci return 0; 117cabdff1aSopenharmony_ci} 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_cistatic void celt_frame_setup_input(OpusEncContext *s, CeltFrame *f) 120cabdff1aSopenharmony_ci{ 121cabdff1aSopenharmony_ci AVFrame *cur = NULL; 122cabdff1aSopenharmony_ci const int subframesize = s->avctx->frame_size; 123cabdff1aSopenharmony_ci int subframes = OPUS_BLOCK_SIZE(s->packet.framesize) / subframesize; 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci cur = ff_bufqueue_get(&s->bufqueue); 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 128cabdff1aSopenharmony_ci CeltBlock *b = &f->block[ch]; 129cabdff1aSopenharmony_ci const void *input = cur->extended_data[ch]; 130cabdff1aSopenharmony_ci size_t bps = av_get_bytes_per_sample(cur->format); 131cabdff1aSopenharmony_ci memcpy(b->overlap, input, bps*cur->nb_samples); 132cabdff1aSopenharmony_ci } 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci av_frame_free(&cur); 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci for (int sf = 0; sf < subframes; sf++) { 137cabdff1aSopenharmony_ci if (sf != (subframes - 1)) 138cabdff1aSopenharmony_ci cur = ff_bufqueue_get(&s->bufqueue); 139cabdff1aSopenharmony_ci else 140cabdff1aSopenharmony_ci cur = ff_bufqueue_peek(&s->bufqueue, 0); 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 143cabdff1aSopenharmony_ci CeltBlock *b = &f->block[ch]; 144cabdff1aSopenharmony_ci const void *input = cur->extended_data[ch]; 145cabdff1aSopenharmony_ci const size_t bps = av_get_bytes_per_sample(cur->format); 146cabdff1aSopenharmony_ci const size_t left = (subframesize - cur->nb_samples)*bps; 147cabdff1aSopenharmony_ci const size_t len = FFMIN(subframesize, cur->nb_samples)*bps; 148cabdff1aSopenharmony_ci memcpy(&b->samples[sf*subframesize], input, len); 149cabdff1aSopenharmony_ci memset(&b->samples[cur->nb_samples], 0, left); 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci /* Last frame isn't popped off and freed yet - we need it for overlap */ 153cabdff1aSopenharmony_ci if (sf != (subframes - 1)) 154cabdff1aSopenharmony_ci av_frame_free(&cur); 155cabdff1aSopenharmony_ci } 156cabdff1aSopenharmony_ci} 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci/* Apply the pre emphasis filter */ 159cabdff1aSopenharmony_cistatic void celt_apply_preemph_filter(OpusEncContext *s, CeltFrame *f) 160cabdff1aSopenharmony_ci{ 161cabdff1aSopenharmony_ci const int subframesize = s->avctx->frame_size; 162cabdff1aSopenharmony_ci const int subframes = OPUS_BLOCK_SIZE(s->packet.framesize) / subframesize; 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci /* Filter overlap */ 165cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 166cabdff1aSopenharmony_ci CeltBlock *b = &f->block[ch]; 167cabdff1aSopenharmony_ci float m = b->emph_coeff; 168cabdff1aSopenharmony_ci for (int i = 0; i < CELT_OVERLAP; i++) { 169cabdff1aSopenharmony_ci float sample = b->overlap[i]; 170cabdff1aSopenharmony_ci b->overlap[i] = sample - m; 171cabdff1aSopenharmony_ci m = sample * CELT_EMPH_COEFF; 172cabdff1aSopenharmony_ci } 173cabdff1aSopenharmony_ci b->emph_coeff = m; 174cabdff1aSopenharmony_ci } 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci /* Filter the samples but do not update the last subframe's coeff - overlap ^^^ */ 177cabdff1aSopenharmony_ci for (int sf = 0; sf < subframes; sf++) { 178cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 179cabdff1aSopenharmony_ci CeltBlock *b = &f->block[ch]; 180cabdff1aSopenharmony_ci float m = b->emph_coeff; 181cabdff1aSopenharmony_ci for (int i = 0; i < subframesize; i++) { 182cabdff1aSopenharmony_ci float sample = b->samples[sf*subframesize + i]; 183cabdff1aSopenharmony_ci b->samples[sf*subframesize + i] = sample - m; 184cabdff1aSopenharmony_ci m = sample * CELT_EMPH_COEFF; 185cabdff1aSopenharmony_ci } 186cabdff1aSopenharmony_ci if (sf != (subframes - 1)) 187cabdff1aSopenharmony_ci b->emph_coeff = m; 188cabdff1aSopenharmony_ci } 189cabdff1aSopenharmony_ci } 190cabdff1aSopenharmony_ci} 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci/* Create the window and do the mdct */ 193cabdff1aSopenharmony_cistatic void celt_frame_mdct(OpusEncContext *s, CeltFrame *f) 194cabdff1aSopenharmony_ci{ 195cabdff1aSopenharmony_ci float *win = s->scratch, *temp = s->scratch + 1920; 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_ci if (f->transient) { 198cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 199cabdff1aSopenharmony_ci CeltBlock *b = &f->block[ch]; 200cabdff1aSopenharmony_ci float *src1 = b->overlap; 201cabdff1aSopenharmony_ci for (int t = 0; t < f->blocks; t++) { 202cabdff1aSopenharmony_ci float *src2 = &b->samples[CELT_OVERLAP*t]; 203cabdff1aSopenharmony_ci s->dsp->vector_fmul(win, src1, ff_celt_window, 128); 204cabdff1aSopenharmony_ci s->dsp->vector_fmul_reverse(&win[CELT_OVERLAP], src2, 205cabdff1aSopenharmony_ci ff_celt_window - 8, 128); 206cabdff1aSopenharmony_ci src1 = src2; 207cabdff1aSopenharmony_ci s->mdct[0]->mdct(s->mdct[0], b->coeffs + t, win, f->blocks); 208cabdff1aSopenharmony_ci } 209cabdff1aSopenharmony_ci } 210cabdff1aSopenharmony_ci } else { 211cabdff1aSopenharmony_ci int blk_len = OPUS_BLOCK_SIZE(f->size), wlen = OPUS_BLOCK_SIZE(f->size + 1); 212cabdff1aSopenharmony_ci int rwin = blk_len - CELT_OVERLAP, lap_dst = (wlen - blk_len - CELT_OVERLAP) >> 1; 213cabdff1aSopenharmony_ci memset(win, 0, wlen*sizeof(float)); 214cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 215cabdff1aSopenharmony_ci CeltBlock *b = &f->block[ch]; 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ci /* Overlap */ 218cabdff1aSopenharmony_ci s->dsp->vector_fmul(temp, b->overlap, ff_celt_window, 128); 219cabdff1aSopenharmony_ci memcpy(win + lap_dst, temp, CELT_OVERLAP*sizeof(float)); 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci /* Samples, flat top window */ 222cabdff1aSopenharmony_ci memcpy(&win[lap_dst + CELT_OVERLAP], b->samples, rwin*sizeof(float)); 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci /* Samples, windowed */ 225cabdff1aSopenharmony_ci s->dsp->vector_fmul_reverse(temp, b->samples + rwin, 226cabdff1aSopenharmony_ci ff_celt_window - 8, 128); 227cabdff1aSopenharmony_ci memcpy(win + lap_dst + blk_len, temp, CELT_OVERLAP*sizeof(float)); 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci s->mdct[f->size]->mdct(s->mdct[f->size], b->coeffs, win, 1); 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci } 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 234cabdff1aSopenharmony_ci CeltBlock *block = &f->block[ch]; 235cabdff1aSopenharmony_ci for (int i = 0; i < CELT_MAX_BANDS; i++) { 236cabdff1aSopenharmony_ci float ener = 0.0f; 237cabdff1aSopenharmony_ci int band_offset = ff_celt_freq_bands[i] << f->size; 238cabdff1aSopenharmony_ci int band_size = ff_celt_freq_range[i] << f->size; 239cabdff1aSopenharmony_ci float *coeffs = &block->coeffs[band_offset]; 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci for (int j = 0; j < band_size; j++) 242cabdff1aSopenharmony_ci ener += coeffs[j]*coeffs[j]; 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci block->lin_energy[i] = sqrtf(ener) + FLT_EPSILON; 245cabdff1aSopenharmony_ci ener = 1.0f/block->lin_energy[i]; 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci for (int j = 0; j < band_size; j++) 248cabdff1aSopenharmony_ci coeffs[j] *= ener; 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci block->energy[i] = log2f(block->lin_energy[i]) - ff_celt_mean_energy[i]; 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci /* CELT_ENERGY_SILENCE is what the decoder uses and its not -infinity */ 253cabdff1aSopenharmony_ci block->energy[i] = FFMAX(block->energy[i], CELT_ENERGY_SILENCE); 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci } 256cabdff1aSopenharmony_ci} 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_cistatic void celt_enc_tf(CeltFrame *f, OpusRangeCoder *rc) 259cabdff1aSopenharmony_ci{ 260cabdff1aSopenharmony_ci int tf_select = 0, diff = 0, tf_changed = 0, tf_select_needed; 261cabdff1aSopenharmony_ci int bits = f->transient ? 2 : 4; 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci tf_select_needed = ((f->size && (opus_rc_tell(rc) + bits + 1) <= f->framebits)); 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_ci for (int i = f->start_band; i < f->end_band; i++) { 266cabdff1aSopenharmony_ci if ((opus_rc_tell(rc) + bits + tf_select_needed) <= f->framebits) { 267cabdff1aSopenharmony_ci const int tbit = (diff ^ 1) == f->tf_change[i]; 268cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, tbit, bits); 269cabdff1aSopenharmony_ci diff ^= tbit; 270cabdff1aSopenharmony_ci tf_changed |= diff; 271cabdff1aSopenharmony_ci } 272cabdff1aSopenharmony_ci bits = f->transient ? 4 : 5; 273cabdff1aSopenharmony_ci } 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ci if (tf_select_needed && ff_celt_tf_select[f->size][f->transient][0][tf_changed] != 276cabdff1aSopenharmony_ci ff_celt_tf_select[f->size][f->transient][1][tf_changed]) { 277cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, f->tf_select, 1); 278cabdff1aSopenharmony_ci tf_select = f->tf_select; 279cabdff1aSopenharmony_ci } 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci for (int i = f->start_band; i < f->end_band; i++) 282cabdff1aSopenharmony_ci f->tf_change[i] = ff_celt_tf_select[f->size][f->transient][tf_select][f->tf_change[i]]; 283cabdff1aSopenharmony_ci} 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_cistatic void celt_enc_quant_pfilter(OpusRangeCoder *rc, CeltFrame *f) 286cabdff1aSopenharmony_ci{ 287cabdff1aSopenharmony_ci float gain = f->pf_gain; 288cabdff1aSopenharmony_ci int txval, octave = f->pf_octave, period = f->pf_period, tapset = f->pf_tapset; 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, f->pfilter, 1); 291cabdff1aSopenharmony_ci if (!f->pfilter) 292cabdff1aSopenharmony_ci return; 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci /* Octave */ 295cabdff1aSopenharmony_ci txval = FFMIN(octave, 6); 296cabdff1aSopenharmony_ci ff_opus_rc_enc_uint(rc, txval, 6); 297cabdff1aSopenharmony_ci octave = txval; 298cabdff1aSopenharmony_ci /* Period */ 299cabdff1aSopenharmony_ci txval = av_clip(period - (16 << octave) + 1, 0, (1 << (4 + octave)) - 1); 300cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, period, 4 + octave); 301cabdff1aSopenharmony_ci period = txval + (16 << octave) - 1; 302cabdff1aSopenharmony_ci /* Gain */ 303cabdff1aSopenharmony_ci txval = FFMIN(((int)(gain / 0.09375f)) - 1, 7); 304cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, txval, 3); 305cabdff1aSopenharmony_ci gain = 0.09375f * (txval + 1); 306cabdff1aSopenharmony_ci /* Tapset */ 307cabdff1aSopenharmony_ci if ((opus_rc_tell(rc) + 2) <= f->framebits) 308cabdff1aSopenharmony_ci ff_opus_rc_enc_cdf(rc, tapset, ff_celt_model_tapset); 309cabdff1aSopenharmony_ci else 310cabdff1aSopenharmony_ci tapset = 0; 311cabdff1aSopenharmony_ci /* Finally create the coeffs */ 312cabdff1aSopenharmony_ci for (int i = 0; i < 2; i++) { 313cabdff1aSopenharmony_ci CeltBlock *block = &f->block[i]; 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci block->pf_period_new = FFMAX(period, CELT_POSTFILTER_MINPERIOD); 316cabdff1aSopenharmony_ci block->pf_gains_new[0] = gain * ff_celt_postfilter_taps[tapset][0]; 317cabdff1aSopenharmony_ci block->pf_gains_new[1] = gain * ff_celt_postfilter_taps[tapset][1]; 318cabdff1aSopenharmony_ci block->pf_gains_new[2] = gain * ff_celt_postfilter_taps[tapset][2]; 319cabdff1aSopenharmony_ci } 320cabdff1aSopenharmony_ci} 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_cistatic void exp_quant_coarse(OpusRangeCoder *rc, CeltFrame *f, 323cabdff1aSopenharmony_ci float last_energy[][CELT_MAX_BANDS], int intra) 324cabdff1aSopenharmony_ci{ 325cabdff1aSopenharmony_ci float alpha, beta, prev[2] = { 0, 0 }; 326cabdff1aSopenharmony_ci const uint8_t *pmod = ff_celt_coarse_energy_dist[f->size][intra]; 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ci /* Inter is really just differential coding */ 329cabdff1aSopenharmony_ci if (opus_rc_tell(rc) + 3 <= f->framebits) 330cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, intra, 3); 331cabdff1aSopenharmony_ci else 332cabdff1aSopenharmony_ci intra = 0; 333cabdff1aSopenharmony_ci 334cabdff1aSopenharmony_ci if (intra) { 335cabdff1aSopenharmony_ci alpha = 0.0f; 336cabdff1aSopenharmony_ci beta = 1.0f - (4915.0f/32768.0f); 337cabdff1aSopenharmony_ci } else { 338cabdff1aSopenharmony_ci alpha = ff_celt_alpha_coef[f->size]; 339cabdff1aSopenharmony_ci beta = ff_celt_beta_coef[f->size]; 340cabdff1aSopenharmony_ci } 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci for (int i = f->start_band; i < f->end_band; i++) { 343cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 344cabdff1aSopenharmony_ci CeltBlock *block = &f->block[ch]; 345cabdff1aSopenharmony_ci const int left = f->framebits - opus_rc_tell(rc); 346cabdff1aSopenharmony_ci const float last = FFMAX(-9.0f, last_energy[ch][i]); 347cabdff1aSopenharmony_ci float diff = block->energy[i] - prev[ch] - last*alpha; 348cabdff1aSopenharmony_ci int q_en = lrintf(diff); 349cabdff1aSopenharmony_ci if (left >= 15) { 350cabdff1aSopenharmony_ci ff_opus_rc_enc_laplace(rc, &q_en, pmod[i << 1] << 7, pmod[(i << 1) + 1] << 6); 351cabdff1aSopenharmony_ci } else if (left >= 2) { 352cabdff1aSopenharmony_ci q_en = av_clip(q_en, -1, 1); 353cabdff1aSopenharmony_ci ff_opus_rc_enc_cdf(rc, 2*q_en + 3*(q_en < 0), ff_celt_model_energy_small); 354cabdff1aSopenharmony_ci } else if (left >= 1) { 355cabdff1aSopenharmony_ci q_en = av_clip(q_en, -1, 0); 356cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, (q_en & 1), 1); 357cabdff1aSopenharmony_ci } else q_en = -1; 358cabdff1aSopenharmony_ci 359cabdff1aSopenharmony_ci block->error_energy[i] = q_en - diff; 360cabdff1aSopenharmony_ci prev[ch] += beta * q_en; 361cabdff1aSopenharmony_ci } 362cabdff1aSopenharmony_ci } 363cabdff1aSopenharmony_ci} 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_cistatic void celt_quant_coarse(CeltFrame *f, OpusRangeCoder *rc, 366cabdff1aSopenharmony_ci float last_energy[][CELT_MAX_BANDS]) 367cabdff1aSopenharmony_ci{ 368cabdff1aSopenharmony_ci uint32_t inter, intra; 369cabdff1aSopenharmony_ci OPUS_RC_CHECKPOINT_SPAWN(rc); 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci exp_quant_coarse(rc, f, last_energy, 1); 372cabdff1aSopenharmony_ci intra = OPUS_RC_CHECKPOINT_BITS(rc); 373cabdff1aSopenharmony_ci 374cabdff1aSopenharmony_ci OPUS_RC_CHECKPOINT_ROLLBACK(rc); 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci exp_quant_coarse(rc, f, last_energy, 0); 377cabdff1aSopenharmony_ci inter = OPUS_RC_CHECKPOINT_BITS(rc); 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci if (inter > intra) { /* Unlikely */ 380cabdff1aSopenharmony_ci OPUS_RC_CHECKPOINT_ROLLBACK(rc); 381cabdff1aSopenharmony_ci exp_quant_coarse(rc, f, last_energy, 1); 382cabdff1aSopenharmony_ci } 383cabdff1aSopenharmony_ci} 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_cistatic void celt_quant_fine(CeltFrame *f, OpusRangeCoder *rc) 386cabdff1aSopenharmony_ci{ 387cabdff1aSopenharmony_ci for (int i = f->start_band; i < f->end_band; i++) { 388cabdff1aSopenharmony_ci if (!f->fine_bits[i]) 389cabdff1aSopenharmony_ci continue; 390cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 391cabdff1aSopenharmony_ci CeltBlock *block = &f->block[ch]; 392cabdff1aSopenharmony_ci int quant, lim = (1 << f->fine_bits[i]); 393cabdff1aSopenharmony_ci float offset, diff = 0.5f - block->error_energy[i]; 394cabdff1aSopenharmony_ci quant = av_clip(floor(diff*lim), 0, lim - 1); 395cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, quant, f->fine_bits[i]); 396cabdff1aSopenharmony_ci offset = 0.5f - ((quant + 0.5f) * (1 << (14 - f->fine_bits[i])) / 16384.0f); 397cabdff1aSopenharmony_ci block->error_energy[i] -= offset; 398cabdff1aSopenharmony_ci } 399cabdff1aSopenharmony_ci } 400cabdff1aSopenharmony_ci} 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_cistatic void celt_quant_final(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f) 403cabdff1aSopenharmony_ci{ 404cabdff1aSopenharmony_ci for (int priority = 0; priority < 2; priority++) { 405cabdff1aSopenharmony_ci for (int i = f->start_band; i < f->end_band && (f->framebits - opus_rc_tell(rc)) >= f->channels; i++) { 406cabdff1aSopenharmony_ci if (f->fine_priority[i] != priority || f->fine_bits[i] >= CELT_MAX_FINE_BITS) 407cabdff1aSopenharmony_ci continue; 408cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 409cabdff1aSopenharmony_ci CeltBlock *block = &f->block[ch]; 410cabdff1aSopenharmony_ci const float err = block->error_energy[i]; 411cabdff1aSopenharmony_ci const float offset = 0.5f * (1 << (14 - f->fine_bits[i] - 1)) / 16384.0f; 412cabdff1aSopenharmony_ci const int sign = FFABS(err + offset) < FFABS(err - offset); 413cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, sign, 1); 414cabdff1aSopenharmony_ci block->error_energy[i] -= offset*(1 - 2*sign); 415cabdff1aSopenharmony_ci } 416cabdff1aSopenharmony_ci } 417cabdff1aSopenharmony_ci } 418cabdff1aSopenharmony_ci} 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_cistatic void celt_encode_frame(OpusEncContext *s, OpusRangeCoder *rc, 421cabdff1aSopenharmony_ci CeltFrame *f, int index) 422cabdff1aSopenharmony_ci{ 423cabdff1aSopenharmony_ci ff_opus_rc_enc_init(rc); 424cabdff1aSopenharmony_ci 425cabdff1aSopenharmony_ci ff_opus_psy_celt_frame_init(&s->psyctx, f, index); 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_ci celt_frame_setup_input(s, f); 428cabdff1aSopenharmony_ci 429cabdff1aSopenharmony_ci if (f->silence) { 430cabdff1aSopenharmony_ci if (f->framebits >= 16) 431cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, 1, 15); /* Silence (if using explicit singalling) */ 432cabdff1aSopenharmony_ci for (int ch = 0; ch < s->channels; ch++) 433cabdff1aSopenharmony_ci memset(s->last_quantized_energy[ch], 0.0f, sizeof(float)*CELT_MAX_BANDS); 434cabdff1aSopenharmony_ci return; 435cabdff1aSopenharmony_ci } 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ci /* Filters */ 438cabdff1aSopenharmony_ci celt_apply_preemph_filter(s, f); 439cabdff1aSopenharmony_ci if (f->pfilter) { 440cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, 0, 15); 441cabdff1aSopenharmony_ci celt_enc_quant_pfilter(rc, f); 442cabdff1aSopenharmony_ci } 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci /* Transform */ 445cabdff1aSopenharmony_ci celt_frame_mdct(s, f); 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_ci /* Need to handle transient/non-transient switches at any point during analysis */ 448cabdff1aSopenharmony_ci while (ff_opus_psy_celt_frame_process(&s->psyctx, f, index)) 449cabdff1aSopenharmony_ci celt_frame_mdct(s, f); 450cabdff1aSopenharmony_ci 451cabdff1aSopenharmony_ci ff_opus_rc_enc_init(rc); 452cabdff1aSopenharmony_ci 453cabdff1aSopenharmony_ci /* Silence */ 454cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, 0, 15); 455cabdff1aSopenharmony_ci 456cabdff1aSopenharmony_ci /* Pitch filter */ 457cabdff1aSopenharmony_ci if (!f->start_band && opus_rc_tell(rc) + 16 <= f->framebits) 458cabdff1aSopenharmony_ci celt_enc_quant_pfilter(rc, f); 459cabdff1aSopenharmony_ci 460cabdff1aSopenharmony_ci /* Transient flag */ 461cabdff1aSopenharmony_ci if (f->size && opus_rc_tell(rc) + 3 <= f->framebits) 462cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, f->transient, 3); 463cabdff1aSopenharmony_ci 464cabdff1aSopenharmony_ci /* Main encoding */ 465cabdff1aSopenharmony_ci celt_quant_coarse (f, rc, s->last_quantized_energy); 466cabdff1aSopenharmony_ci celt_enc_tf (f, rc); 467cabdff1aSopenharmony_ci ff_celt_bitalloc (f, rc, 1); 468cabdff1aSopenharmony_ci celt_quant_fine (f, rc); 469cabdff1aSopenharmony_ci ff_celt_quant_bands(f, rc); 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci /* Anticollapse bit */ 472cabdff1aSopenharmony_ci if (f->anticollapse_needed) 473cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, f->anticollapse, 1); 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_ci /* Final per-band energy adjustments from leftover bits */ 476cabdff1aSopenharmony_ci celt_quant_final(s, rc, f); 477cabdff1aSopenharmony_ci 478cabdff1aSopenharmony_ci for (int ch = 0; ch < f->channels; ch++) { 479cabdff1aSopenharmony_ci CeltBlock *block = &f->block[ch]; 480cabdff1aSopenharmony_ci for (int i = 0; i < CELT_MAX_BANDS; i++) 481cabdff1aSopenharmony_ci s->last_quantized_energy[ch][i] = block->energy[i] + block->error_energy[i]; 482cabdff1aSopenharmony_ci } 483cabdff1aSopenharmony_ci} 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_cistatic inline int write_opuslacing(uint8_t *dst, int v) 486cabdff1aSopenharmony_ci{ 487cabdff1aSopenharmony_ci dst[0] = FFMIN(v - FFALIGN(v - 255, 4), v); 488cabdff1aSopenharmony_ci dst[1] = v - dst[0] >> 2; 489cabdff1aSopenharmony_ci return 1 + (v >= 252); 490cabdff1aSopenharmony_ci} 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_cistatic void opus_packet_assembler(OpusEncContext *s, AVPacket *avpkt) 493cabdff1aSopenharmony_ci{ 494cabdff1aSopenharmony_ci int offset, fsize_needed; 495cabdff1aSopenharmony_ci 496cabdff1aSopenharmony_ci /* Write toc */ 497cabdff1aSopenharmony_ci opus_gen_toc(s, avpkt->data, &offset, &fsize_needed); 498cabdff1aSopenharmony_ci 499cabdff1aSopenharmony_ci /* Frame sizes if needed */ 500cabdff1aSopenharmony_ci if (fsize_needed) { 501cabdff1aSopenharmony_ci for (int i = 0; i < s->packet.frames - 1; i++) { 502cabdff1aSopenharmony_ci offset += write_opuslacing(avpkt->data + offset, 503cabdff1aSopenharmony_ci s->frame[i].framebits >> 3); 504cabdff1aSopenharmony_ci } 505cabdff1aSopenharmony_ci } 506cabdff1aSopenharmony_ci 507cabdff1aSopenharmony_ci /* Packets */ 508cabdff1aSopenharmony_ci for (int i = 0; i < s->packet.frames; i++) { 509cabdff1aSopenharmony_ci ff_opus_rc_enc_end(&s->rc[i], avpkt->data + offset, 510cabdff1aSopenharmony_ci s->frame[i].framebits >> 3); 511cabdff1aSopenharmony_ci offset += s->frame[i].framebits >> 3; 512cabdff1aSopenharmony_ci } 513cabdff1aSopenharmony_ci 514cabdff1aSopenharmony_ci avpkt->size = offset; 515cabdff1aSopenharmony_ci} 516cabdff1aSopenharmony_ci 517cabdff1aSopenharmony_ci/* Used as overlap for the first frame and padding for the last encoded packet */ 518cabdff1aSopenharmony_cistatic AVFrame *spawn_empty_frame(OpusEncContext *s) 519cabdff1aSopenharmony_ci{ 520cabdff1aSopenharmony_ci AVFrame *f = av_frame_alloc(); 521cabdff1aSopenharmony_ci int ret; 522cabdff1aSopenharmony_ci if (!f) 523cabdff1aSopenharmony_ci return NULL; 524cabdff1aSopenharmony_ci f->format = s->avctx->sample_fmt; 525cabdff1aSopenharmony_ci f->nb_samples = s->avctx->frame_size; 526cabdff1aSopenharmony_ci ret = av_channel_layout_copy(&f->ch_layout, &s->avctx->ch_layout); 527cabdff1aSopenharmony_ci if (ret < 0) { 528cabdff1aSopenharmony_ci av_frame_free(&f); 529cabdff1aSopenharmony_ci return NULL; 530cabdff1aSopenharmony_ci } 531cabdff1aSopenharmony_ci if (av_frame_get_buffer(f, 4)) { 532cabdff1aSopenharmony_ci av_frame_free(&f); 533cabdff1aSopenharmony_ci return NULL; 534cabdff1aSopenharmony_ci } 535cabdff1aSopenharmony_ci for (int i = 0; i < s->channels; i++) { 536cabdff1aSopenharmony_ci size_t bps = av_get_bytes_per_sample(f->format); 537cabdff1aSopenharmony_ci memset(f->extended_data[i], 0, bps*f->nb_samples); 538cabdff1aSopenharmony_ci } 539cabdff1aSopenharmony_ci return f; 540cabdff1aSopenharmony_ci} 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_cistatic int opus_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 543cabdff1aSopenharmony_ci const AVFrame *frame, int *got_packet_ptr) 544cabdff1aSopenharmony_ci{ 545cabdff1aSopenharmony_ci OpusEncContext *s = avctx->priv_data; 546cabdff1aSopenharmony_ci int ret, frame_size, alloc_size = 0; 547cabdff1aSopenharmony_ci 548cabdff1aSopenharmony_ci if (frame) { /* Add new frame to queue */ 549cabdff1aSopenharmony_ci if ((ret = ff_af_queue_add(&s->afq, frame)) < 0) 550cabdff1aSopenharmony_ci return ret; 551cabdff1aSopenharmony_ci ff_bufqueue_add(avctx, &s->bufqueue, av_frame_clone(frame)); 552cabdff1aSopenharmony_ci } else { 553cabdff1aSopenharmony_ci ff_opus_psy_signal_eof(&s->psyctx); 554cabdff1aSopenharmony_ci if (!s->afq.remaining_samples || !avctx->frame_number) 555cabdff1aSopenharmony_ci return 0; /* We've been flushed and there's nothing left to encode */ 556cabdff1aSopenharmony_ci } 557cabdff1aSopenharmony_ci 558cabdff1aSopenharmony_ci /* Run the psychoacoustic system */ 559cabdff1aSopenharmony_ci if (ff_opus_psy_process(&s->psyctx, &s->packet)) 560cabdff1aSopenharmony_ci return 0; 561cabdff1aSopenharmony_ci 562cabdff1aSopenharmony_ci frame_size = OPUS_BLOCK_SIZE(s->packet.framesize); 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_ci if (!frame) { 565cabdff1aSopenharmony_ci /* This can go negative, that's not a problem, we only pad if positive */ 566cabdff1aSopenharmony_ci int pad_empty = s->packet.frames*(frame_size/s->avctx->frame_size) - s->bufqueue.available + 1; 567cabdff1aSopenharmony_ci /* Pad with empty 2.5 ms frames to whatever framesize was decided, 568cabdff1aSopenharmony_ci * this should only happen at the very last flush frame. The frames 569cabdff1aSopenharmony_ci * allocated here will be freed (because they have no other references) 570cabdff1aSopenharmony_ci * after they get used by celt_frame_setup_input() */ 571cabdff1aSopenharmony_ci for (int i = 0; i < pad_empty; i++) { 572cabdff1aSopenharmony_ci AVFrame *empty = spawn_empty_frame(s); 573cabdff1aSopenharmony_ci if (!empty) 574cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 575cabdff1aSopenharmony_ci ff_bufqueue_add(avctx, &s->bufqueue, empty); 576cabdff1aSopenharmony_ci } 577cabdff1aSopenharmony_ci } 578cabdff1aSopenharmony_ci 579cabdff1aSopenharmony_ci for (int i = 0; i < s->packet.frames; i++) { 580cabdff1aSopenharmony_ci celt_encode_frame(s, &s->rc[i], &s->frame[i], i); 581cabdff1aSopenharmony_ci alloc_size += s->frame[i].framebits >> 3; 582cabdff1aSopenharmony_ci } 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ci /* Worst case toc + the frame lengths if needed */ 585cabdff1aSopenharmony_ci alloc_size += 2 + s->packet.frames*2; 586cabdff1aSopenharmony_ci 587cabdff1aSopenharmony_ci if ((ret = ff_alloc_packet(avctx, avpkt, alloc_size)) < 0) 588cabdff1aSopenharmony_ci return ret; 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci /* Assemble packet */ 591cabdff1aSopenharmony_ci opus_packet_assembler(s, avpkt); 592cabdff1aSopenharmony_ci 593cabdff1aSopenharmony_ci /* Update the psychoacoustic system */ 594cabdff1aSopenharmony_ci ff_opus_psy_postencode_update(&s->psyctx, s->frame, s->rc); 595cabdff1aSopenharmony_ci 596cabdff1aSopenharmony_ci /* Remove samples from queue and skip if needed */ 597cabdff1aSopenharmony_ci ff_af_queue_remove(&s->afq, s->packet.frames*frame_size, &avpkt->pts, &avpkt->duration); 598cabdff1aSopenharmony_ci if (s->packet.frames*frame_size > avpkt->duration) { 599cabdff1aSopenharmony_ci uint8_t *side = av_packet_new_side_data(avpkt, AV_PKT_DATA_SKIP_SAMPLES, 10); 600cabdff1aSopenharmony_ci if (!side) 601cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 602cabdff1aSopenharmony_ci AV_WL32(&side[4], s->packet.frames*frame_size - avpkt->duration + 120); 603cabdff1aSopenharmony_ci } 604cabdff1aSopenharmony_ci 605cabdff1aSopenharmony_ci *got_packet_ptr = 1; 606cabdff1aSopenharmony_ci 607cabdff1aSopenharmony_ci return 0; 608cabdff1aSopenharmony_ci} 609cabdff1aSopenharmony_ci 610cabdff1aSopenharmony_cistatic av_cold int opus_encode_end(AVCodecContext *avctx) 611cabdff1aSopenharmony_ci{ 612cabdff1aSopenharmony_ci OpusEncContext *s = avctx->priv_data; 613cabdff1aSopenharmony_ci 614cabdff1aSopenharmony_ci for (int i = 0; i < CELT_BLOCK_NB; i++) 615cabdff1aSopenharmony_ci ff_mdct15_uninit(&s->mdct[i]); 616cabdff1aSopenharmony_ci 617cabdff1aSopenharmony_ci ff_celt_pvq_uninit(&s->pvq); 618cabdff1aSopenharmony_ci av_freep(&s->dsp); 619cabdff1aSopenharmony_ci av_freep(&s->frame); 620cabdff1aSopenharmony_ci av_freep(&s->rc); 621cabdff1aSopenharmony_ci ff_af_queue_close(&s->afq); 622cabdff1aSopenharmony_ci ff_opus_psy_end(&s->psyctx); 623cabdff1aSopenharmony_ci ff_bufqueue_discard_all(&s->bufqueue); 624cabdff1aSopenharmony_ci 625cabdff1aSopenharmony_ci return 0; 626cabdff1aSopenharmony_ci} 627cabdff1aSopenharmony_ci 628cabdff1aSopenharmony_cistatic av_cold int opus_encode_init(AVCodecContext *avctx) 629cabdff1aSopenharmony_ci{ 630cabdff1aSopenharmony_ci int ret, max_frames; 631cabdff1aSopenharmony_ci OpusEncContext *s = avctx->priv_data; 632cabdff1aSopenharmony_ci 633cabdff1aSopenharmony_ci s->avctx = avctx; 634cabdff1aSopenharmony_ci s->channels = avctx->ch_layout.nb_channels; 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci /* Opus allows us to change the framesize on each packet (and each packet may 637cabdff1aSopenharmony_ci * have multiple frames in it) but we can't change the codec's frame size on 638cabdff1aSopenharmony_ci * runtime, so fix it to the lowest possible number of samples and use a queue 639cabdff1aSopenharmony_ci * to accumulate AVFrames until we have enough to encode whatever the encoder 640cabdff1aSopenharmony_ci * decides is the best */ 641cabdff1aSopenharmony_ci avctx->frame_size = 120; 642cabdff1aSopenharmony_ci /* Initial padding will change if SILK is ever supported */ 643cabdff1aSopenharmony_ci avctx->initial_padding = 120; 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_ci if (!avctx->bit_rate) { 646cabdff1aSopenharmony_ci int coupled = ff_opus_default_coupled_streams[s->channels - 1]; 647cabdff1aSopenharmony_ci avctx->bit_rate = coupled*(96000) + (s->channels - coupled*2)*(48000); 648cabdff1aSopenharmony_ci } else if (avctx->bit_rate < 6000 || avctx->bit_rate > 255000 * s->channels) { 649cabdff1aSopenharmony_ci int64_t clipped_rate = av_clip(avctx->bit_rate, 6000, 255000 * s->channels); 650cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Unsupported bitrate %"PRId64" kbps, clipping to %"PRId64" kbps\n", 651cabdff1aSopenharmony_ci avctx->bit_rate/1000, clipped_rate/1000); 652cabdff1aSopenharmony_ci avctx->bit_rate = clipped_rate; 653cabdff1aSopenharmony_ci } 654cabdff1aSopenharmony_ci 655cabdff1aSopenharmony_ci /* Extradata */ 656cabdff1aSopenharmony_ci avctx->extradata_size = 19; 657cabdff1aSopenharmony_ci avctx->extradata = av_malloc(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); 658cabdff1aSopenharmony_ci if (!avctx->extradata) 659cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 660cabdff1aSopenharmony_ci opus_write_extradata(avctx); 661cabdff1aSopenharmony_ci 662cabdff1aSopenharmony_ci ff_af_queue_init(avctx, &s->afq); 663cabdff1aSopenharmony_ci 664cabdff1aSopenharmony_ci if ((ret = ff_celt_pvq_init(&s->pvq, 1)) < 0) 665cabdff1aSopenharmony_ci return ret; 666cabdff1aSopenharmony_ci 667cabdff1aSopenharmony_ci if (!(s->dsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT))) 668cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 669cabdff1aSopenharmony_ci 670cabdff1aSopenharmony_ci /* I have no idea why a base scaling factor of 68 works, could be the twiddles */ 671cabdff1aSopenharmony_ci for (int i = 0; i < CELT_BLOCK_NB; i++) 672cabdff1aSopenharmony_ci if ((ret = ff_mdct15_init(&s->mdct[i], 0, i + 3, 68 << (CELT_BLOCK_NB - 1 - i)))) 673cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 674cabdff1aSopenharmony_ci 675cabdff1aSopenharmony_ci /* Zero out previous energy (matters for inter first frame) */ 676cabdff1aSopenharmony_ci for (int ch = 0; ch < s->channels; ch++) 677cabdff1aSopenharmony_ci memset(s->last_quantized_energy[ch], 0.0f, sizeof(float)*CELT_MAX_BANDS); 678cabdff1aSopenharmony_ci 679cabdff1aSopenharmony_ci /* Allocate an empty frame to use as overlap for the first frame of audio */ 680cabdff1aSopenharmony_ci ff_bufqueue_add(avctx, &s->bufqueue, spawn_empty_frame(s)); 681cabdff1aSopenharmony_ci if (!ff_bufqueue_peek(&s->bufqueue, 0)) 682cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 683cabdff1aSopenharmony_ci 684cabdff1aSopenharmony_ci if ((ret = ff_opus_psy_init(&s->psyctx, s->avctx, &s->bufqueue, &s->options))) 685cabdff1aSopenharmony_ci return ret; 686cabdff1aSopenharmony_ci 687cabdff1aSopenharmony_ci /* Frame structs and range coder buffers */ 688cabdff1aSopenharmony_ci max_frames = ceilf(FFMIN(s->options.max_delay_ms, 120.0f)/2.5f); 689cabdff1aSopenharmony_ci s->frame = av_malloc(max_frames*sizeof(CeltFrame)); 690cabdff1aSopenharmony_ci if (!s->frame) 691cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 692cabdff1aSopenharmony_ci s->rc = av_malloc(max_frames*sizeof(OpusRangeCoder)); 693cabdff1aSopenharmony_ci if (!s->rc) 694cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 695cabdff1aSopenharmony_ci 696cabdff1aSopenharmony_ci for (int i = 0; i < max_frames; i++) { 697cabdff1aSopenharmony_ci s->frame[i].dsp = s->dsp; 698cabdff1aSopenharmony_ci s->frame[i].avctx = s->avctx; 699cabdff1aSopenharmony_ci s->frame[i].seed = 0; 700cabdff1aSopenharmony_ci s->frame[i].pvq = s->pvq; 701cabdff1aSopenharmony_ci s->frame[i].apply_phase_inv = s->options.apply_phase_inv; 702cabdff1aSopenharmony_ci s->frame[i].block[0].emph_coeff = s->frame[i].block[1].emph_coeff = 0.0f; 703cabdff1aSopenharmony_ci } 704cabdff1aSopenharmony_ci 705cabdff1aSopenharmony_ci return 0; 706cabdff1aSopenharmony_ci} 707cabdff1aSopenharmony_ci 708cabdff1aSopenharmony_ci#define OPUSENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM 709cabdff1aSopenharmony_cistatic const AVOption opusenc_options[] = { 710cabdff1aSopenharmony_ci { "opus_delay", "Maximum delay in milliseconds", offsetof(OpusEncContext, options.max_delay_ms), AV_OPT_TYPE_FLOAT, { .dbl = OPUS_MAX_LOOKAHEAD }, 2.5f, OPUS_MAX_LOOKAHEAD, OPUSENC_FLAGS, "max_delay_ms" }, 711cabdff1aSopenharmony_ci { "apply_phase_inv", "Apply intensity stereo phase inversion", offsetof(OpusEncContext, options.apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, OPUSENC_FLAGS, "apply_phase_inv" }, 712cabdff1aSopenharmony_ci { NULL }, 713cabdff1aSopenharmony_ci}; 714cabdff1aSopenharmony_ci 715cabdff1aSopenharmony_cistatic const AVClass opusenc_class = { 716cabdff1aSopenharmony_ci .class_name = "Opus encoder", 717cabdff1aSopenharmony_ci .item_name = av_default_item_name, 718cabdff1aSopenharmony_ci .option = opusenc_options, 719cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 720cabdff1aSopenharmony_ci}; 721cabdff1aSopenharmony_ci 722cabdff1aSopenharmony_cistatic const FFCodecDefault opusenc_defaults[] = { 723cabdff1aSopenharmony_ci { "b", "0" }, 724cabdff1aSopenharmony_ci { "compression_level", "10" }, 725cabdff1aSopenharmony_ci { NULL }, 726cabdff1aSopenharmony_ci}; 727cabdff1aSopenharmony_ci 728cabdff1aSopenharmony_ciconst FFCodec ff_opus_encoder = { 729cabdff1aSopenharmony_ci .p.name = "opus", 730cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Opus"), 731cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 732cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_OPUS, 733cabdff1aSopenharmony_ci .defaults = opusenc_defaults, 734cabdff1aSopenharmony_ci .p.priv_class = &opusenc_class, 735cabdff1aSopenharmony_ci .priv_data_size = sizeof(OpusEncContext), 736cabdff1aSopenharmony_ci .init = opus_encode_init, 737cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(opus_encode_frame), 738cabdff1aSopenharmony_ci .close = opus_encode_end, 739cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 740cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_EXPERIMENTAL | AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY, 741cabdff1aSopenharmony_ci .p.supported_samplerates = (const int []){ 48000, 0 }, 742cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT 743cabdff1aSopenharmony_ci .p.channel_layouts = (const uint64_t []){ AV_CH_LAYOUT_MONO, 744cabdff1aSopenharmony_ci AV_CH_LAYOUT_STEREO, 0 }, 745cabdff1aSopenharmony_ci#endif 746cabdff1aSopenharmony_ci .p.ch_layouts = (const AVChannelLayout []){ AV_CHANNEL_LAYOUT_MONO, 747cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_STEREO, { 0 } }, 748cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, 749cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 750cabdff1aSopenharmony_ci}; 751