FFmpeg
Loading...
Searching...
No Matches
enc.c
Go to the documentation of this file.
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 <float.h>
23
24#include "enc.h"
25#include "pvq.h"
26#include "enc_psy.h"
27#include "tab.h"
28
30#include "libavutil/float_dsp.h"
31#include "libavutil/mem.h"
33#include "libavutil/opt.h"
34
38#include "libavcodec/encode.h"
39
67
69{
70 uint8_t *bs = avctx->extradata;
71
72 bytestream_put_buffer(&bs, "OpusHead", 8);
73 bytestream_put_byte (&bs, 0x1);
74 bytestream_put_byte (&bs, avctx->ch_layout.nb_channels);
75 bytestream_put_le16 (&bs, avctx->initial_padding);
76 bytestream_put_le32 (&bs, avctx->sample_rate);
77 bytestream_put_le16 (&bs, 0x0);
78 bytestream_put_byte (&bs, 0x0); /* Default layout */
79}
80
81static int opus_gen_toc(OpusEncContext *s, uint8_t *toc, int *size, int *fsize_needed)
82{
83 int tmp = 0x0, extended_toc = 0;
84 static const int toc_cfg[][OPUS_MODE_NB][OPUS_BANDWITH_NB] = {
85 /* Silk Hybrid Celt Layer */
86 /* NB MB WB SWB FB NB MB WB SWB FB NB MB WB SWB FB Bandwidth */
87 { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 17, 0, 21, 25, 29 } }, /* 2.5 ms */
88 { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 18, 0, 22, 26, 30 } }, /* 5 ms */
89 { { 1, 5, 9, 0, 0 }, { 0, 0, 0, 13, 15 }, { 19, 0, 23, 27, 31 } }, /* 10 ms */
90 { { 2, 6, 10, 0, 0 }, { 0, 0, 0, 14, 16 }, { 20, 0, 24, 28, 32 } }, /* 20 ms */
91 { { 3, 7, 11, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }, /* 40 ms */
92 { { 4, 8, 12, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }, /* 60 ms */
93 };
94 int cfg = toc_cfg[s->packet.framesize][s->packet.mode][s->packet.bandwidth];
95 *fsize_needed = 0;
96 if (!cfg)
97 return 1;
98 if (s->packet.frames == 2) { /* 2 packets */
99 if (s->frame[0].framebits == s->frame[1].framebits) { /* same size */
100 tmp = 0x1;
101 } else { /* different size */
102 tmp = 0x2;
103 *fsize_needed = 1; /* put frame sizes in the packet */
104 }
105 } else if (s->packet.frames > 2) {
106 tmp = 0x3;
107 extended_toc = 1;
108 }
109 tmp |= (s->channels > 1) << 2; /* Stereo or mono */
110 tmp |= (cfg - 1) << 3; /* codec configuration */
111 *toc++ = tmp;
112 if (extended_toc) {
113 for (int i = 0; i < (s->packet.frames - 1); i++)
114 *fsize_needed |= (s->frame[i].framebits != s->frame[i + 1].framebits);
115 tmp = (*fsize_needed) << 7; /* vbr flag */
116 tmp |= (0) << 6; /* padding flag */
117 tmp |= s->packet.frames;
118 *toc++ = tmp;
119 }
120 *size = 1 + extended_toc;
121 return 0;
122}
123
125{
126 AVFrame *cur = NULL;
127 const int subframesize = s->avctx->frame_size;
128 int subframes = OPUS_BLOCK_SIZE(s->packet.framesize) / subframesize;
129
130 cur = ff_bufqueue_get(&s->bufqueue);
131
132 for (int ch = 0; ch < f->channels; ch++) {
133 CeltBlock *b = &f->block[ch];
134 const char *input = cur->extended_data[ch];
135 size_t bps = av_get_bytes_per_sample(cur->format);
136 /* The MDCT overlap is the trailing CELT_OVERLAP samples of the
137 * previous packet's last frame. Because the encoder advertises
138 * AV_CODEC_CAP_SMALL_LAST_FRAME, that frame can be shorter than
139 * CELT_OVERLAP; in that case, zero-pad the leading part of the
140 * overlap buffer and copy only what's available. */
141 int n = FFMIN(cur->nb_samples, CELT_OVERLAP);
142 if (n < CELT_OVERLAP) {
143 memset(b->overlap, 0, (CELT_OVERLAP - n) * bps);
144 }
145 memcpy((char *)b->overlap + (CELT_OVERLAP - n) * bps,
146 input + (cur->nb_samples - n) * bps,
147 n * bps);
148 }
149
150 av_frame_free(&cur);
151
152 for (int sf = 0; sf < subframes; sf++) {
153 if (sf != (subframes - 1))
154 cur = ff_bufqueue_get(&s->bufqueue);
155 else
156 cur = ff_bufqueue_peek(&s->bufqueue, 0);
157
158 for (int ch = 0; ch < f->channels; ch++) {
159 CeltBlock *b = &f->block[ch];
160 const void *input = cur->extended_data[ch];
161 const size_t bps = av_get_bytes_per_sample(cur->format);
162 const size_t left = (subframesize - cur->nb_samples)*bps;
163 const size_t len = FFMIN(subframesize, cur->nb_samples)*bps;
164 memcpy(&b->samples[sf*subframesize], input, len);
165 memset(&b->samples[cur->nb_samples], 0, left);
166 }
167
168 /* Last frame isn't popped off and freed yet - we need it for overlap */
169 if (sf != (subframes - 1))
170 av_frame_free(&cur);
171 }
172}
173
174/* Apply the pre emphasis filter */
176{
177 const int subframesize = s->avctx->frame_size;
178 const int subframes = OPUS_BLOCK_SIZE(s->packet.framesize) / subframesize;
179 const float c = ff_opus_deemph_weights[0];
180
181 /* Filter overlap */
182 for (int ch = 0; ch < f->channels; ch++) {
183 CeltBlock *b = &f->block[ch];
184 float m = b->emph_coeff;
185 for (int i = 0; i < CELT_OVERLAP; i++) {
186 float sample = b->overlap[i];
187 b->overlap[i] = sample - m;
188 m = sample * c;
189 }
190 b->emph_coeff = m;
191 }
192
193 /* Filter the samples but do not update the last subframe's coeff - overlap ^^^ */
194 for (int sf = 0; sf < subframes; sf++) {
195 for (int ch = 0; ch < f->channels; ch++) {
196 CeltBlock *b = &f->block[ch];
197 float m = b->emph_coeff;
198 for (int i = 0; i < subframesize; i++) {
199 float sample = b->samples[sf*subframesize + i];
200 b->samples[sf*subframesize + i] = sample - m;
201 m = sample * c;
202 }
203 if (sf != (subframes - 1))
204 b->emph_coeff = m;
205 }
206 }
207}
208
209/* Create the window and do the mdct */
211{
212 float *win = s->scratch, *temp = s->scratch + 1920;
213
214 if (f->transient) {
215 for (int ch = 0; ch < f->channels; ch++) {
216 CeltBlock *b = &f->block[ch];
217 float *src1 = b->overlap;
218 for (int t = 0; t < f->blocks; t++) {
219 float *src2 = &b->samples[CELT_OVERLAP*t];
220 s->dsp->vector_fmul(win, src1, ff_celt_window, 128);
221 s->dsp->vector_fmul_reverse(&win[CELT_OVERLAP], src2,
223 src1 = src2;
224 s->tx_fn[0](s->tx[0], b->coeffs + t, win, sizeof(float)*f->blocks);
225 }
226 }
227 } else {
228 int blk_len = OPUS_BLOCK_SIZE(f->size), wlen = OPUS_BLOCK_SIZE(f->size + 1);
229 int rwin = blk_len - CELT_OVERLAP, lap_dst = (wlen - blk_len - CELT_OVERLAP) >> 1;
230 memset(win, 0, wlen*sizeof(float));
231 for (int ch = 0; ch < f->channels; ch++) {
232 CeltBlock *b = &f->block[ch];
233
234 /* Overlap */
235 s->dsp->vector_fmul(temp, b->overlap, ff_celt_window, 128);
236 memcpy(win + lap_dst, temp, CELT_OVERLAP*sizeof(float));
237
238 /* Samples, flat top window */
239 memcpy(&win[lap_dst + CELT_OVERLAP], b->samples, rwin*sizeof(float));
240
241 /* Samples, windowed */
242 s->dsp->vector_fmul_reverse(temp, b->samples + rwin,
244 memcpy(win + lap_dst + blk_len, temp, CELT_OVERLAP*sizeof(float));
245
246 s->tx_fn[f->size](s->tx[f->size], b->coeffs, win, sizeof(float));
247 }
248 }
249
250 for (int ch = 0; ch < f->channels; ch++) {
251 CeltBlock *block = &f->block[ch];
252 for (int i = 0; i < CELT_MAX_BANDS; i++) {
253 float ener = 0.0f;
254 int band_offset = ff_celt_freq_bands[i] << f->size;
255 int band_size = ff_celt_freq_range[i] << f->size;
256 float *coeffs = &block->coeffs[band_offset];
257
258 for (int j = 0; j < band_size; j++)
259 ener += coeffs[j]*coeffs[j];
260
261 block->lin_energy[i] = sqrtf(ener) + FLT_EPSILON;
262 ener = 1.0f/block->lin_energy[i];
263
264 for (int j = 0; j < band_size; j++)
265 coeffs[j] *= ener;
266
267 block->energy[i] = log2f(block->lin_energy[i]) - ff_celt_mean_energy[i];
268
269 /* CELT_ENERGY_SILENCE is what the decoder uses and its not -infinity */
270 block->energy[i] = FFMAX(block->energy[i], CELT_ENERGY_SILENCE);
271 }
272 }
273}
274
276{
277 int tf_select = 0, diff = 0, tf_changed = 0, tf_select_needed;
278 int bits = f->transient ? 2 : 4;
279
280 tf_select_needed = ((f->size && (opus_rc_tell(rc) + bits + 1) <= f->framebits));
281
282 for (int i = f->start_band; i < f->end_band; i++) {
283 if ((opus_rc_tell(rc) + bits + tf_select_needed) <= f->framebits) {
284 const int tbit = (diff ^ 1) == f->tf_change[i];
285 ff_opus_rc_enc_log(rc, tbit, bits);
286 diff ^= tbit;
287 tf_changed |= diff;
288 }
289 bits = f->transient ? 4 : 5;
290 }
291
292 if (tf_select_needed && ff_celt_tf_select[f->size][f->transient][0][tf_changed] !=
293 ff_celt_tf_select[f->size][f->transient][1][tf_changed]) {
294 ff_opus_rc_enc_log(rc, f->tf_select, 1);
295 tf_select = f->tf_select;
296 }
297
298 for (int i = f->start_band; i < f->end_band; i++)
299 f->tf_change[i] = ff_celt_tf_select[f->size][f->transient][tf_select][f->tf_change[i]];
300}
301
303{
304 float gain = f->pf_gain;
305 int txval, octave = f->pf_octave, period = f->pf_period, tapset = f->pf_tapset;
306
307 ff_opus_rc_enc_log(rc, f->pfilter, 1);
308 if (!f->pfilter)
309 return;
310
311 /* Octave */
312 txval = FFMIN(octave, 6);
313 ff_opus_rc_enc_uint(rc, txval, 6);
314 octave = txval;
315 /* Period */
316 txval = av_clip(period - (16 << octave) + 1, 0, (1 << (4 + octave)) - 1);
317 ff_opus_rc_put_raw(rc, period, 4 + octave);
318 period = txval + (16 << octave) - 1;
319 /* Gain */
320 txval = FFMIN(((int)(gain / 0.09375f)) - 1, 7);
321 ff_opus_rc_put_raw(rc, txval, 3);
322 gain = 0.09375f * (txval + 1);
323 /* Tapset */
324 if ((opus_rc_tell(rc) + 2) <= f->framebits)
326 else
327 tapset = 0;
328 /* Finally create the coeffs */
329 for (int i = 0; i < 2; i++) {
330 CeltBlock *block = &f->block[i];
331
332 block->pf_period_new = FFMAX(period, CELT_POSTFILTER_MINPERIOD);
333 block->pf_gains_new[0] = gain * ff_celt_postfilter_taps[tapset][0];
334 block->pf_gains_new[1] = gain * ff_celt_postfilter_taps[tapset][1];
335 block->pf_gains_new[2] = gain * ff_celt_postfilter_taps[tapset][2];
336 }
337}
338
340 float last_energy[][CELT_MAX_BANDS], int intra)
341{
342 float alpha, beta, prev[2] = { 0, 0 };
343 const uint8_t *pmod = ff_celt_coarse_energy_dist[f->size][intra];
344
345 /* Inter is really just differential coding */
346 if (opus_rc_tell(rc) + 3 <= f->framebits)
347 ff_opus_rc_enc_log(rc, intra, 3);
348 else
349 intra = 0;
350
351 if (intra) {
352 alpha = 0.0f;
353 beta = 1.0f - (4915.0f/32768.0f);
354 } else {
355 alpha = ff_celt_alpha_coef[f->size];
356 beta = ff_celt_beta_coef[f->size];
357 }
358
359 for (int i = f->start_band; i < f->end_band; i++) {
360 for (int ch = 0; ch < f->channels; ch++) {
361 CeltBlock *block = &f->block[ch];
362 const int left = f->framebits - opus_rc_tell(rc);
363 const float last = FFMAX(-9.0f, last_energy[ch][i]);
364 float diff = block->energy[i] - prev[ch] - last*alpha;
365 int q_en = lrintf(diff);
366 if (left >= 15) {
367 ff_opus_rc_enc_laplace(rc, &q_en, pmod[i << 1] << 7, pmod[(i << 1) + 1] << 6);
368 } else if (left >= 2) {
369 q_en = av_clip(q_en, -1, 1);
370 ff_opus_rc_enc_cdf(rc, 2*q_en + 3*(q_en < 0), ff_celt_model_energy_small);
371 } else if (left >= 1) {
372 q_en = av_clip(q_en, -1, 0);
373 ff_opus_rc_enc_log(rc, (q_en & 1), 1);
374 } else q_en = -1;
375
376 block->error_energy[i] = q_en - diff;
377 prev[ch] += beta * q_en;
378 }
379 }
380}
381
383 float last_energy[][CELT_MAX_BANDS])
384{
385 uint32_t inter, intra;
387
388 exp_quant_coarse(rc, f, last_energy, 1);
389 intra = OPUS_RC_CHECKPOINT_BITS(rc);
390
392
393 exp_quant_coarse(rc, f, last_energy, 0);
394 inter = OPUS_RC_CHECKPOINT_BITS(rc);
395
396 if (inter > intra) { /* Unlikely */
398 exp_quant_coarse(rc, f, last_energy, 1);
399 }
400}
401
403{
404 for (int i = f->start_band; i < f->end_band; i++) {
405 if (!f->fine_bits[i])
406 continue;
407 for (int ch = 0; ch < f->channels; ch++) {
408 CeltBlock *block = &f->block[ch];
409 int quant, lim = (1 << f->fine_bits[i]);
410 float offset, diff = 0.5f - block->error_energy[i];
411 quant = av_clip(floor(diff*lim), 0, lim - 1);
412 ff_opus_rc_put_raw(rc, quant, f->fine_bits[i]);
413 offset = 0.5f - ((quant + 0.5f) * (1 << (14 - f->fine_bits[i])) / 16384.0f);
414 block->error_energy[i] -= offset;
415 }
416 }
417}
418
420{
421 for (int priority = 0; priority < 2; priority++) {
422 for (int i = f->start_band; i < f->end_band && (f->framebits - opus_rc_tell(rc)) >= f->channels; i++) {
423 if (f->fine_priority[i] != priority || f->fine_bits[i] >= CELT_MAX_FINE_BITS)
424 continue;
425 for (int ch = 0; ch < f->channels; ch++) {
426 CeltBlock *block = &f->block[ch];
427 const float err = block->error_energy[i];
428 const float offset = 0.5f * (1 << (14 - f->fine_bits[i] - 1)) / 16384.0f;
429 const int sign = FFABS(err + offset) < FFABS(err - offset);
430 ff_opus_rc_put_raw(rc, sign, 1);
431 block->error_energy[i] -= offset*(1 - 2*sign);
432 }
433 }
434 }
435}
436
438 CeltFrame *f, int index)
439{
441
443
445
446 if (f->silence) {
447 if (f->framebits >= 16)
448 ff_opus_rc_enc_log(rc, 1, 15); /* Silence (if using explicit signalling) */
449 for (int ch = 0; ch < s->channels; ch++)
450 memset(s->last_quantized_energy[ch], 0.0f, sizeof(float)*CELT_MAX_BANDS);
451 return;
452 }
453
454 /* Filters */
456 if (f->pfilter) {
457 ff_opus_rc_enc_log(rc, 0, 15);
459 }
460
461 /* Transform */
463
464 /* Need to handle transient/non-transient switches at any point during analysis */
465 while (ff_opus_psy_celt_frame_process(&s->psyctx, f, index))
467
469
470 /* Silence */
471 ff_opus_rc_enc_log(rc, 0, 15);
472
473 /* Pitch filter */
474 if (!f->start_band && opus_rc_tell(rc) + 16 <= f->framebits)
476
477 /* Transient flag */
478 if (f->size && opus_rc_tell(rc) + 3 <= f->framebits)
479 ff_opus_rc_enc_log(rc, f->transient, 3);
480
481 /* Main encoding */
482 celt_quant_coarse (f, rc, s->last_quantized_energy);
483 celt_enc_tf (f, rc);
484 ff_celt_bitalloc (f, rc, 1);
485 celt_quant_fine (f, rc);
487
488 /* Anticollapse bit */
489 if (f->anticollapse_needed)
490 ff_opus_rc_put_raw(rc, f->anticollapse, 1);
491
492 /* Final per-band energy adjustments from leftover bits */
493 celt_quant_final(s, rc, f);
494
495 for (int ch = 0; ch < f->channels; ch++) {
496 CeltBlock *block = &f->block[ch];
497 for (int i = 0; i < CELT_MAX_BANDS; i++)
498 s->last_quantized_energy[ch][i] = block->energy[i] + block->error_energy[i];
499 }
500}
501
502static inline int write_opuslacing(uint8_t *dst, int v)
503{
504 dst[0] = FFMIN(v - FFALIGN(v - 255, 4), v);
505 dst[1] = v - dst[0] >> 2;
506 return 1 + (v >= 252);
507}
508
510{
511 int offset, fsize_needed;
512
513 /* Write toc */
514 opus_gen_toc(s, avpkt->data, &offset, &fsize_needed);
515
516 /* Frame sizes if needed */
517 if (fsize_needed) {
518 for (int i = 0; i < s->packet.frames - 1; i++) {
520 s->frame[i].framebits >> 3);
521 }
522 }
523
524 /* Packets */
525 for (int i = 0; i < s->packet.frames; i++) {
526 ff_opus_rc_enc_end(&s->rc[i], avpkt->data + offset,
527 s->frame[i].framebits >> 3);
528 offset += s->frame[i].framebits >> 3;
529 }
530
531 avpkt->size = offset;
532}
533
534/* Used as overlap for the first frame and padding for the last encoded packet */
536{
538 int ret;
539 if (!f)
540 return NULL;
541 f->format = s->avctx->sample_fmt;
542 f->nb_samples = s->avctx->frame_size;
543 ret = av_channel_layout_copy(&f->ch_layout, &s->avctx->ch_layout);
544 if (ret < 0) {
546 return NULL;
547 }
548 if (av_frame_get_buffer(f, 4)) {
550 return NULL;
551 }
552 for (int i = 0; i < s->channels; i++) {
553 size_t bps = av_get_bytes_per_sample(f->format);
554 memset(f->extended_data[i], 0, bps*f->nb_samples);
555 }
556 return f;
557}
558
559static int opus_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
560 const AVFrame *frame, int *got_packet_ptr)
561{
562 OpusEncContext *s = avctx->priv_data;
563 int ret, frame_size, discard_padding, alloc_size = 0;
564
565 if (frame) { /* Add new frame to queue */
566 if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
567 return ret;
568 ff_bufqueue_add(avctx, &s->bufqueue, av_frame_clone(frame));
569 } else {
570 ff_opus_psy_signal_eof(&s->psyctx);
571 if (!s->afq.remaining_samples || !avctx->frame_num)
572 return 0; /* We've been flushed and there's nothing left to encode */
573 }
574
575 /* Run the psychoacoustic system */
576 if (ff_opus_psy_process(&s->psyctx, &s->packet))
577 return 0;
578
579 frame_size = OPUS_BLOCK_SIZE(s->packet.framesize);
580
581 if (!frame) {
582 /* This can go negative, that's not a problem, we only pad if positive */
583 int pad_empty = s->packet.frames*(frame_size/s->avctx->frame_size) - s->bufqueue.available + 1;
584 /* Pad with empty 2.5 ms frames to whatever framesize was decided,
585 * this should only happen at the very last flush frame. The frames
586 * allocated here will be freed (because they have no other references)
587 * after they get used by celt_frame_setup_input() */
588 for (int i = 0; i < pad_empty; i++) {
589 AVFrame *empty = spawn_empty_frame(s);
590 if (!empty)
591 return AVERROR(ENOMEM);
592 ff_bufqueue_add(avctx, &s->bufqueue, empty);
593 }
594 }
595
596 for (int i = 0; i < s->packet.frames; i++) {
597 celt_encode_frame(s, &s->rc[i], &s->frame[i], i);
598 alloc_size += s->frame[i].framebits >> 3;
599 }
600
601 /* Worst case toc + the frame lengths if needed */
602 alloc_size += 2 + s->packet.frames*2;
603
604 if ((ret = ff_alloc_packet(avctx, avpkt, alloc_size)) < 0)
605 return ret;
606
607 /* Assemble packet */
608 opus_packet_assembler(s, avpkt);
609
610 /* Update the psychoacoustic system */
611 ff_opus_psy_postencode_update(&s->psyctx, s->frame);
612
613 /* Remove samples from queue and skip if needed */
614 ret = ff_af_queue_remove(&s->afq, s->packet.frames*frame_size, avpkt);
615 if (ret < 0)
616 return ret;
617
618 discard_padding = s->packet.frames*frame_size - ff_samples_from_time_base(avctx, avpkt->duration);
619 if (discard_padding > 0) {
620 uint8_t *side = av_packet_new_side_data(avpkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
621 if (!side)
622 return AVERROR(ENOMEM);
623 AV_WL32(&side[4], discard_padding);
624 }
625
626 *got_packet_ptr = 1;
627
628 return 0;
629}
630
632{
633 OpusEncContext *s = avctx->priv_data;
634
635 for (int i = 0; i < CELT_BLOCK_NB; i++)
636 av_tx_uninit(&s->tx[i]);
637
638 ff_celt_pvq_uninit(&s->pvq);
639 av_freep(&s->dsp);
640 av_freep(&s->frame);
641 av_freep(&s->rc);
642 ff_af_queue_close(&s->afq);
643 ff_opus_psy_end(&s->psyctx);
644 ff_bufqueue_discard_all(&s->bufqueue);
645
646 return 0;
647}
648
650{
651 int ret, max_frames;
652 OpusEncContext *s = avctx->priv_data;
653
654 s->avctx = avctx;
655 s->channels = avctx->ch_layout.nb_channels;
656
657 int max_delay_samples = (s->options.max_delay_ms * s->avctx->sample_rate) / 1000;
659 /* Initial padding will change if SILK is ever supported */
660 avctx->initial_padding = 120;
661
662 if (!avctx->bit_rate) {
663 int coupled = ff_opus_default_coupled_streams[s->channels - 1];
664 avctx->bit_rate = coupled*(96000) + (s->channels - coupled*2)*(48000);
665 } else if (avctx->bit_rate < 6000 || avctx->bit_rate > 255000 * s->channels) {
666 int64_t clipped_rate = av_clip(avctx->bit_rate, 6000, 255000 * s->channels);
667 av_log(avctx, AV_LOG_ERROR, "Unsupported bitrate %"PRId64" kbps, clipping to %"PRId64" kbps\n",
668 avctx->bit_rate/1000, clipped_rate/1000);
669 avctx->bit_rate = clipped_rate;
670 }
671
672 /* Extradata */
673 avctx->extradata_size = 19;
675 if (!avctx->extradata)
676 return AVERROR(ENOMEM);
678
679 ff_af_queue_init(avctx, &s->afq);
680
681 if ((ret = ff_celt_pvq_init(&s->pvq, 1)) < 0)
682 return ret;
683
685 return AVERROR(ENOMEM);
686
687 /* I have no idea why a base scaling factor of 68 works, could be the twiddles */
688 for (int i = 0; i < CELT_BLOCK_NB; i++) {
689 const float scale = 68 << (CELT_BLOCK_NB - 1 - i);
690 if ((ret = av_tx_init(&s->tx[i], &s->tx_fn[i], AV_TX_FLOAT_MDCT, 0, 15 << (i + 3), &scale, 0)))
691 return AVERROR(ENOMEM);
692 }
693
694 /* Zero out previous energy (matters for inter first frame) */
695 for (int ch = 0; ch < s->channels; ch++)
696 memset(s->last_quantized_energy[ch], 0.0f, sizeof(float)*CELT_MAX_BANDS);
697
698 /* Allocate an empty frame to use as overlap for the first frame of audio */
699 ff_bufqueue_add(avctx, &s->bufqueue, spawn_empty_frame(s));
700 if (!ff_bufqueue_peek(&s->bufqueue, 0))
701 return AVERROR(ENOMEM);
702
703 if ((ret = ff_opus_psy_init(&s->psyctx, s->avctx, &s->bufqueue, &s->options)))
704 return ret;
705
706 /* Frame structs and range coder buffers */
707 max_frames = ceilf(FFMIN(s->options.max_delay_ms, 120.0f)/2.5f);
708 s->frame = av_malloc(max_frames*sizeof(CeltFrame));
709 if (!s->frame)
710 return AVERROR(ENOMEM);
711 s->rc = av_malloc(max_frames*sizeof(OpusRangeCoder));
712 if (!s->rc)
713 return AVERROR(ENOMEM);
714
715 for (int i = 0; i < max_frames; i++) {
716 s->frame[i].dsp = s->dsp;
717 s->frame[i].avctx = s->avctx;
718 s->frame[i].seed = 0;
719 s->frame[i].pvq = s->pvq;
720 s->frame[i].apply_phase_inv = s->options.apply_phase_inv;
721 s->frame[i].block[0].emph_coeff = s->frame[i].block[1].emph_coeff = 0.0f;
722 }
723
724 return 0;
725}
726
727#define OPUSENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
728static const AVOption opusenc_options[] = {
729 { "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, .unit = "max_delay_ms" },
730 { "apply_phase_inv", "Apply intensity stereo phase inversion", offsetof(OpusEncContext, options.apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, OPUSENC_FLAGS, .unit = "apply_phase_inv" },
731 { NULL },
732};
733
734static const AVClass opusenc_class = {
735 .class_name = "Opus encoder",
736 .item_name = av_default_item_name,
737 .option = opusenc_options,
738 .version = LIBAVUTIL_VERSION_INT,
739};
740
742 { "b", "0" },
743 { "compression_level", "10" },
744 { NULL },
745};
746
748 .p.name = "opus",
749 CODEC_LONG_NAME("Opus"),
750 .p.type = AVMEDIA_TYPE_AUDIO,
751 .p.id = AV_CODEC_ID_OPUS,
752 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
754 .defaults = opusenc_defaults,
755 .p.priv_class = &opusenc_class,
756 .priv_data_size = sizeof(OpusEncContext),
759 .close = opus_encode_end,
760 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
761 CODEC_SAMPLERATES(48000),
764};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static float win(SuperEqualizerContext *s, float n, int N)
const FFCodec ff_opus_encoder
Definition enc.c:747
av_cold void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
int ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, AVPacket *pkt)
Remove frame(s) from the queue.
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static void ff_bufqueue_add(void *log, struct FFBufQueue *queue, AVFrame *buf)
Add a buffer to the queue.
Definition bufferqueue.h:71
static void ff_bufqueue_discard_all(struct FFBufQueue *queue)
Unref and remove all buffers from the queue.
static AVFrame * ff_bufqueue_peek(struct FFBufQueue *queue, unsigned index)
Get a buffer from the queue without altering it.
Definition bufferqueue.h:87
static AVFrame * ff_bufqueue_get(struct FFBufQueue *queue)
Get the first buffer from the queue and remove it.
Definition bufferqueue.h:98
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
Definition bytestream.h:372
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
#define s(width, name)
Definition cbs_vp9.c:198
void ff_celt_quant_bands(CeltFrame *f, OpusRangeCoder *rc)
Definition celt.c:28
void ff_celt_bitalloc(CeltFrame *f, OpusRangeCoder *rc, int encode)
Definition celt.c:137
#define CELT_OVERLAP
Definition celt.h:40
#define CELT_POSTFILTER_MINPERIOD
Definition celt.h:52
#define CELT_ENERGY_SILENCE
Definition celt.h:53
#define CELT_MAX_BANDS
Definition celt.h:43
#define CELT_MAX_FINE_BITS
Definition celt.h:48
@ CELT_BLOCK_NB
Definition celt.h:68
@ CELT_BLOCK_960
Definition celt.h:66
Public libavutil channel layout APIs header.
#define CODEC_CH_LAYOUTS(...)
#define CODEC_SAMPLERATES(...)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define CODEC_SAMPLEFMTS(...)
#define av_clip
Definition common.h:100
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static __device__ float sqrtf(float a)
static __device__ float floor(float a)
static __device__ float ceilf(float a)
static int16_t block[64]
Definition dct.c:125
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
static void celt_quant_coarse(CeltFrame *f, OpusRangeCoder *rc, float last_energy[][CELT_MAX_BANDS])
Definition enc.c:382
static const AVClass opusenc_class
Definition enc.c:734
static void celt_frame_setup_input(OpusEncContext *s, CeltFrame *f)
Definition enc.c:124
static const AVOption opusenc_options[]
Definition enc.c:728
static av_cold int opus_encode_init(AVCodecContext *avctx)
Definition enc.c:649
static int opus_gen_toc(OpusEncContext *s, uint8_t *toc, int *size, int *fsize_needed)
Definition enc.c:81
static int opus_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition enc.c:559
static void celt_enc_tf(CeltFrame *f, OpusRangeCoder *rc)
Definition enc.c:275
static void celt_frame_mdct(OpusEncContext *s, CeltFrame *f)
Definition enc.c:210
static void opus_packet_assembler(OpusEncContext *s, AVPacket *avpkt)
Definition enc.c:509
static void exp_quant_coarse(OpusRangeCoder *rc, CeltFrame *f, float last_energy[][CELT_MAX_BANDS], int intra)
Definition enc.c:339
static void celt_apply_preemph_filter(OpusEncContext *s, CeltFrame *f)
Definition enc.c:175
static void celt_encode_frame(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f, int index)
Definition enc.c:437
static void celt_quant_final(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f)
Definition enc.c:419
#define OPUSENC_FLAGS
Definition enc.c:727
static void opus_write_extradata(AVCodecContext *avctx)
Definition enc.c:68
static void celt_enc_quant_pfilter(OpusRangeCoder *rc, CeltFrame *f)
Definition enc.c:302
static av_cold int opus_encode_end(AVCodecContext *avctx)
Definition enc.c:631
static AVFrame * spawn_empty_frame(OpusEncContext *s)
Definition enc.c:535
static int write_opuslacing(uint8_t *dst, int v)
Definition enc.c:502
static void celt_quant_fine(CeltFrame *f, OpusRangeCoder *rc)
Definition enc.c:402
static const FFCodecDefault opusenc_defaults[]
Definition enc.c:741
#define OPUS_SAMPLES_TO_BLOCK_SIZE(x)
Definition enc.h:41
#define OPUS_MAX_CHANNELS
Definition enc.h:34
#define OPUS_BLOCK_SIZE(x)
Definition enc.h:39
#define OPUS_MAX_LOOKAHEAD
Definition enc.h:32
void ff_opus_psy_postencode_update(OpusPsyContext *s, CeltFrame *f)
Definition enc_psy.c:524
av_cold int ff_opus_psy_end(OpusPsyContext *s)
Definition enc_psy.c:642
int ff_opus_psy_celt_frame_process(OpusPsyContext *s, CeltFrame *f, int index)
Definition enc_psy.c:502
int ff_opus_psy_process(OpusPsyContext *s, OpusPacketInfo *p)
Definition enc_psy.c:254
av_cold int ff_opus_psy_init(OpusPsyContext *s, AVCodecContext *avctx, struct FFBufQueue *bufqueue, OpusEncOptions *options)
Definition enc_psy.c:561
void ff_opus_psy_signal_eof(OpusPsyContext *s)
Definition enc_psy.c:637
void ff_opus_psy_celt_frame_init(OpusPsyContext *s, CeltFrame *f, int index)
Definition enc_psy.c:288
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition encode.c:62
static av_always_inline int64_t ff_samples_from_time_base(const AVCodecContext *avctx, int64_t duration)
Rescale from time base to AVCodecContext.sample_rate.
Definition encode.h:108
static CheckasmConfig cfg
Definition checkasm.c:74
static const uint8_t bits[8]
Definition fastaudio.c:100
#define sample
static const uint8_t frame_size[4]
Definition g723_1.h:222
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
Definition opt.h:270
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition avcodec.h:322
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
Definition codec.h:84
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
Definition codec.h:90
@ AV_CODEC_ID_OPUS
Definition codec_id.h:513
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
@ AV_PKT_DATA_SKIP_SAMPLES
Recommends skipping the specified number of samples.
Definition packet.h:153
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition packet.c:231
#define AV_CHANNEL_LAYOUT_STEREO
#define AV_CHANNEL_LAYOUT_MONO
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
#define AVERROR(e)
Definition error.h:45
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
Definition frame.c:206
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
Definition frame.c:483
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition samplefmt.c:108
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition samplefmt.h:66
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
int index
Definition gxfenc.c:90
const pixel * src2
static const int16_t alpha[]
Definition ilbcdata.h:55
#define b
Definition input.c:43
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
#define AV_WL32(p, v)
unsigned offset
Definition libaomenc.c:763
#define av_cold
Definition attributes.h:117
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Definition float_dsp.c:135
#define log2f(x)
Definition libm.h:411
#define lrintf(x)
Definition libm_mips.h:72
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define FFALIGN(x, a)
Definition macros.h:78
Memory handling functions.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
unsigned bps
Definition movenc.c:2088
#define av_malloc(s)
Definition ops_static.c:52
AVOptions.
@ OPUS_BANDWITH_NB
Definition opus.h:56
@ OPUS_MODE_NB
Definition opus.h:46
int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
Definition pvq.c:907
void av_cold ff_celt_pvq_uninit(CeltPVQ **pvq)
Definition pvq.c:927
void ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size)
Definition rc.c:360
void ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size)
CELT: write a uniformly distributed integer.
Definition rc.c:204
void ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count)
CELT: write 0 - 31 bits to the rawbits buffer.
Definition rc.c:161
void ff_opus_rc_enc_cdf(OpusRangeCoder *rc, int val, const uint16_t *cdf)
Definition rc.c:109
void ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits)
Definition rc.c:131
void ff_opus_rc_enc_laplace(OpusRangeCoder *rc, int *value, uint32_t symbol, int decay)
Definition rc.c:314
void ff_opus_rc_enc_init(OpusRangeCoder *rc)
Definition rc.c:402
#define OPUS_RC_CHECKPOINT_ROLLBACK(rc)
Definition rc.h:124
static av_always_inline uint32_t opus_rc_tell(const OpusRangeCoder *rc)
CELT: estimate bits of entropy that have thus far been consumed for the current CELT frame,...
Definition rc.h:62
#define OPUS_RC_CHECKPOINT_SPAWN(rc)
Definition rc.h:117
#define OPUS_RC_CHECKPOINT_BITS(rc)
Definition rc.h:121
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
int64_t frame_num
Frame counter, set by libavcodec.
Definition avcodec.h:1883
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
int initial_padding
Audio only.
Definition avcodec.h:1114
int sample_rate
samples per second
Definition avcodec.h:1040
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
int extradata_size
Definition avcodec.h:527
int frame_size
Number of samples per channel in an audio frame.
Definition avcodec.h:1068
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
int nb_samples
number of audio samples (per channel) described by this frame
Definition frame.h:552
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition frame.h:559
uint8_t ** extended_data
pointers to the data planes/channels.
Definition frame.h:533
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition packet.h:621
uint8_t * data
Definition packet.h:603
Definition pvq.h:37
Structure holding the queue.
Definition bufferqueue.h:49
struct FFBufQueue bufqueue
Definition enc.c:50
av_tx_fn tx_fn[CELT_BLOCK_NB]
Definition enc.c:48
float last_quantized_energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition enc.c:63
float scratch[2048]
Definition enc.c:65
int channels
Definition enc.c:57
AVTXContext * tx[CELT_BLOCK_NB]
Definition enc.c:47
OpusPsyContext psyctx
Definition enc.c:43
int enc_id_bits
Definition enc.c:53
OpusRangeCoder * rc
Definition enc.c:60
AVClass * av_class
Definition enc.c:41
CeltFrame * frame
Definition enc.c:59
OpusEncOptions options
Definition enc.c:42
AVCodecContext * avctx
Definition enc.c:44
AVFloatDSPContext * dsp
Definition enc.c:46
uint8_t enc_id[64]
Definition enc.c:52
CeltPVQ * pvq
Definition enc.c:49
OpusPacketInfo packet
Definition enc.c:55
AudioFrameQueue afq
Definition enc.c:45
const uint8_t ff_celt_freq_range[]
Definition tab.c:836
const uint8_t ff_celt_freq_bands[]
Definition tab.c:832
const float ff_celt_window_padded[136]
Definition tab.c:1168
const uint16_t ff_celt_model_tapset[]
Definition tab.c:824
const uint8_t ff_opus_default_coupled_streams[]
Definition tab.c:27
const int8_t ff_celt_tf_select[4][2][2][2]
Definition tab.c:846
const uint8_t ff_celt_coarse_energy_dist[4][2][42]
Definition tab.c:872
const float ff_celt_alpha_coef[]
Definition tab.c:864
const float ff_opus_deemph_weights[]
Definition tab.c:1233
const float ff_celt_beta_coef[]
Definition tab.c:868
const float ff_celt_mean_energy[]
Definition tab.c:856
const float ff_celt_postfilter_taps[3][3]
Definition tab.c:1162
#define ff_celt_model_energy_small
Definition tab.h:130
#define ff_celt_window
Definition tab.h:165
#define av_freep(p)
#define av_log(a,...)
static uint8_t tmp[40]
Definition aes_ctr.c:52
#define src1
Definition h264pred.c:141
int size
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
Definition tx.c:295
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition tx.c:903
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respectively.
Definition tx.h:68
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition tx.h:151
else temp
Definition vf_mcdeint.c:275
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static const uint8_t quant[64]
Definition vmixdec.c:71
int len
static double c[64]