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