FFmpeg
opusenc.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 "encode.h"
23 #include "opusenc.h"
24 #include "opus_pvq.h"
25 #include "opusenc_psy.h"
26 #include "opustab.h"
27 
29 #include "libavutil/float_dsp.h"
30 #include "libavutil/mem_internal.h"
31 #include "libavutil/opt.h"
32 #include "internal.h"
33 #include "bytestream.h"
34 #include "audio_frame_queue.h"
35 
36 typedef struct OpusEncContext {
46 
47  uint8_t enc_id[64];
49 
51 
52  int channels;
53 
56 
57  /* Actual energy the decoder will have */
59 
60  DECLARE_ALIGNED(32, float, scratch)[2048];
62 
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->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 
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 
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 */
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 */
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 
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 
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)
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 
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 
366  float last_energy[][CELT_MAX_BANDS])
367 {
368  uint32_t inter, intra;
370 
371  exp_quant_coarse(rc, f, last_energy, 1);
372  intra = OPUS_RC_CHECKPOINT_BITS(rc);
373 
375 
376  exp_quant_coarse(rc, f, last_energy, 0);
377  inter = OPUS_RC_CHECKPOINT_BITS(rc);
378 
379  if (inter > intra) { /* Unlikely */
381  exp_quant_coarse(rc, f, last_energy, 1);
382  }
383 }
384 
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 
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 
421  CeltFrame *f, int index)
422 {
424 
425  ff_opus_psy_celt_frame_init(&s->psyctx, f, index);
426 
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 */
439  if (f->pfilter) {
440  ff_opus_rc_enc_log(rc, 0, 15);
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 
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)
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 
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 
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 */
519 {
520  AVFrame *f = av_frame_alloc();
521  if (!f)
522  return NULL;
523  f->format = s->avctx->sample_fmt;
524  f->nb_samples = s->avctx->frame_size;
525  f->channel_layout = s->avctx->channel_layout;
526  if (av_frame_get_buffer(f, 4)) {
527  av_frame_free(&f);
528  return NULL;
529  }
530  for (int i = 0; i < s->channels; i++) {
531  size_t bps = av_get_bytes_per_sample(f->format);
532  memset(f->extended_data[i], 0, bps*f->nb_samples);
533  }
534  return f;
535 }
536 
537 static int opus_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
538  const AVFrame *frame, int *got_packet_ptr)
539 {
540  OpusEncContext *s = avctx->priv_data;
541  int ret, frame_size, alloc_size = 0;
542 
543  if (frame) { /* Add new frame to queue */
544  if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
545  return ret;
546  ff_bufqueue_add(avctx, &s->bufqueue, av_frame_clone(frame));
547  } else {
548  ff_opus_psy_signal_eof(&s->psyctx);
549  if (!s->afq.remaining_samples || !avctx->frame_number)
550  return 0; /* We've been flushed and there's nothing left to encode */
551  }
552 
553  /* Run the psychoacoustic system */
554  if (ff_opus_psy_process(&s->psyctx, &s->packet))
555  return 0;
556 
557  frame_size = OPUS_BLOCK_SIZE(s->packet.framesize);
558 
559  if (!frame) {
560  /* This can go negative, that's not a problem, we only pad if positive */
561  int pad_empty = s->packet.frames*(frame_size/s->avctx->frame_size) - s->bufqueue.available + 1;
562  /* Pad with empty 2.5 ms frames to whatever framesize was decided,
563  * this should only happen at the very last flush frame. The frames
564  * allocated here will be freed (because they have no other references)
565  * after they get used by celt_frame_setup_input() */
566  for (int i = 0; i < pad_empty; i++) {
567  AVFrame *empty = spawn_empty_frame(s);
568  if (!empty)
569  return AVERROR(ENOMEM);
570  ff_bufqueue_add(avctx, &s->bufqueue, empty);
571  }
572  }
573 
574  for (int i = 0; i < s->packet.frames; i++) {
575  celt_encode_frame(s, &s->rc[i], &s->frame[i], i);
576  alloc_size += s->frame[i].framebits >> 3;
577  }
578 
579  /* Worst case toc + the frame lengths if needed */
580  alloc_size += 2 + s->packet.frames*2;
581 
582  if ((ret = ff_alloc_packet(avctx, avpkt, alloc_size)) < 0)
583  return ret;
584 
585  /* Assemble packet */
586  opus_packet_assembler(s, avpkt);
587 
588  /* Update the psychoacoustic system */
589  ff_opus_psy_postencode_update(&s->psyctx, s->frame, s->rc);
590 
591  /* Remove samples from queue and skip if needed */
592  ff_af_queue_remove(&s->afq, s->packet.frames*frame_size, &avpkt->pts, &avpkt->duration);
593  if (s->packet.frames*frame_size > avpkt->duration) {
594  uint8_t *side = av_packet_new_side_data(avpkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
595  if (!side)
596  return AVERROR(ENOMEM);
597  AV_WL32(&side[4], s->packet.frames*frame_size - avpkt->duration + 120);
598  }
599 
600  *got_packet_ptr = 1;
601 
602  return 0;
603 }
604 
606 {
607  OpusEncContext *s = avctx->priv_data;
608 
609  for (int i = 0; i < CELT_BLOCK_NB; i++)
610  ff_mdct15_uninit(&s->mdct[i]);
611 
612  ff_celt_pvq_uninit(&s->pvq);
613  av_freep(&s->dsp);
614  av_freep(&s->frame);
615  av_freep(&s->rc);
616  ff_af_queue_close(&s->afq);
617  ff_opus_psy_end(&s->psyctx);
618  ff_bufqueue_discard_all(&s->bufqueue);
619 
620  return 0;
621 }
622 
624 {
625  int ret, max_frames;
626  OpusEncContext *s = avctx->priv_data;
627 
628  s->avctx = avctx;
629  s->channels = avctx->channels;
630 
631  /* Opus allows us to change the framesize on each packet (and each packet may
632  * have multiple frames in it) but we can't change the codec's frame size on
633  * runtime, so fix it to the lowest possible number of samples and use a queue
634  * to accumulate AVFrames until we have enough to encode whatever the encoder
635  * decides is the best */
636  avctx->frame_size = 120;
637  /* Initial padding will change if SILK is ever supported */
638  avctx->initial_padding = 120;
639 
640  if (!avctx->bit_rate) {
641  int coupled = ff_opus_default_coupled_streams[s->channels - 1];
642  avctx->bit_rate = coupled*(96000) + (s->channels - coupled*2)*(48000);
643  } else if (avctx->bit_rate < 6000 || avctx->bit_rate > 255000 * s->channels) {
644  int64_t clipped_rate = av_clip(avctx->bit_rate, 6000, 255000 * s->channels);
645  av_log(avctx, AV_LOG_ERROR, "Unsupported bitrate %"PRId64" kbps, clipping to %"PRId64" kbps\n",
646  avctx->bit_rate/1000, clipped_rate/1000);
647  avctx->bit_rate = clipped_rate;
648  }
649 
650  /* Extradata */
651  avctx->extradata_size = 19;
653  if (!avctx->extradata)
654  return AVERROR(ENOMEM);
655  opus_write_extradata(avctx);
656 
657  ff_af_queue_init(avctx, &s->afq);
658 
659  if ((ret = ff_celt_pvq_init(&s->pvq, 1)) < 0)
660  return ret;
661 
662  if (!(s->dsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT)))
663  return AVERROR(ENOMEM);
664 
665  /* I have no idea why a base scaling factor of 68 works, could be the twiddles */
666  for (int i = 0; i < CELT_BLOCK_NB; i++)
667  if ((ret = ff_mdct15_init(&s->mdct[i], 0, i + 3, 68 << (CELT_BLOCK_NB - 1 - i))))
668  return AVERROR(ENOMEM);
669 
670  /* Zero out previous energy (matters for inter first frame) */
671  for (int ch = 0; ch < s->channels; ch++)
672  memset(s->last_quantized_energy[ch], 0.0f, sizeof(float)*CELT_MAX_BANDS);
673 
674  /* Allocate an empty frame to use as overlap for the first frame of audio */
675  ff_bufqueue_add(avctx, &s->bufqueue, spawn_empty_frame(s));
676  if (!ff_bufqueue_peek(&s->bufqueue, 0))
677  return AVERROR(ENOMEM);
678 
679  if ((ret = ff_opus_psy_init(&s->psyctx, s->avctx, &s->bufqueue, &s->options)))
680  return ret;
681 
682  /* Frame structs and range coder buffers */
683  max_frames = ceilf(FFMIN(s->options.max_delay_ms, 120.0f)/2.5f);
684  s->frame = av_malloc(max_frames*sizeof(CeltFrame));
685  if (!s->frame)
686  return AVERROR(ENOMEM);
687  s->rc = av_malloc(max_frames*sizeof(OpusRangeCoder));
688  if (!s->rc)
689  return AVERROR(ENOMEM);
690 
691  for (int i = 0; i < max_frames; i++) {
692  s->frame[i].dsp = s->dsp;
693  s->frame[i].avctx = s->avctx;
694  s->frame[i].seed = 0;
695  s->frame[i].pvq = s->pvq;
696  s->frame[i].apply_phase_inv = s->options.apply_phase_inv;
697  s->frame[i].block[0].emph_coeff = s->frame[i].block[1].emph_coeff = 0.0f;
698  }
699 
700  return 0;
701 }
702 
703 #define OPUSENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
704 static const AVOption opusenc_options[] = {
705  { "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" },
706  { "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" },
707  { NULL },
708 };
709 
710 static const AVClass opusenc_class = {
711  .class_name = "Opus encoder",
712  .item_name = av_default_item_name,
713  .option = opusenc_options,
714  .version = LIBAVUTIL_VERSION_INT,
715 };
716 
718  { "b", "0" },
719  { "compression_level", "10" },
720  { NULL },
721 };
722 
724  .name = "opus",
725  .long_name = NULL_IF_CONFIG_SMALL("Opus"),
726  .type = AVMEDIA_TYPE_AUDIO,
727  .id = AV_CODEC_ID_OPUS,
728  .defaults = opusenc_defaults,
729  .priv_class = &opusenc_class,
730  .priv_data_size = sizeof(OpusEncContext),
732  .encode2 = opus_encode_frame,
733  .close = opus_encode_end,
736  .supported_samplerates = (const int []){ 48000, 0 },
737  .channel_layouts = (const uint64_t []){ AV_CH_LAYOUT_MONO,
738  AV_CH_LAYOUT_STEREO, 0 },
739  .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
741 };
AVCodecContext::frame_size
int frame_size
Number of samples per channel in an audio frame.
Definition: avcodec.h:1012
AVCodec
AVCodec.
Definition: codec.h:202
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:69
ff_celt_postfilter_taps
const float ff_celt_postfilter_taps[3][3]
Definition: opustab.c:1098
ff_opus_rc_enc_cdf
void ff_opus_rc_enc_cdf(OpusRangeCoder *rc, int val, const uint16_t *cdf)
Definition: opus_rc.c:109
FF_CODEC_CAP_INIT_THREADSAFE
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:42
OpusEncContext::av_class
AVClass * av_class
Definition: opusenc.c:37
ff_opus_psy_process
int ff_opus_psy_process(OpusPsyContext *s, OpusPacketInfo *p)
Definition: opusenc_psy.c:223
av_clip
#define av_clip
Definition: common.h:96
spawn_empty_frame
static AVFrame * spawn_empty_frame(OpusEncContext *s)
Definition: opusenc.c:518
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
ff_celt_freq_bands
const uint8_t ff_celt_freq_bands[]
Definition: opustab.c:768
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:426
mem_internal.h
ff_af_queue_remove
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
Remove frame(s) from the queue.
Definition: audio_frame_queue.c:75
av_frame_get_buffer
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
Definition: frame.c:246
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:992
ff_af_queue_close
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
Definition: audio_frame_queue.c:36
log2f
#define log2f(x)
Definition: libm.h:409
ff_opus_psy_celt_frame_init
void ff_opus_psy_celt_frame_init(OpusPsyContext *s, CeltFrame *f, int index)
Definition: opusenc_psy.c:254
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:90
ff_opus_rc_enc_uint
void ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size)
CELT: write a uniformly distributed integer.
Definition: opus_rc.c:204
ff_af_queue_init
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
Definition: audio_frame_queue.c:28
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:112
ff_celt_model_tapset
const uint16_t ff_celt_model_tapset[]
Definition: opustab.c:758
opusenc_options
static const AVOption opusenc_options[]
Definition: opusenc.c:704
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:303
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
index
fg index
Definition: ffmpeg_filter.c:168
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:373
opusenc_defaults
static const AVCodecDefault opusenc_defaults[]
Definition: opusenc.c:717
AVOption
AVOption.
Definition: opt.h:247
encode.h
b
#define b
Definition: input.c:40
OPUS_RC_CHECKPOINT_SPAWN
#define OPUS_RC_CHECKPOINT_SPAWN(rc)
Definition: opus_rc.h:116
opus_packet_assembler
static void opus_packet_assembler(OpusEncContext *s, AVPacket *avpkt)
Definition: opusenc.c:492
ff_mdct15_init
av_cold int ff_mdct15_init(MDCT15Context **ps, int inverse, int N, double scale)
Definition: mdct15.c:247
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:391
OpusEncContext::options
OpusEncOptions options
Definition: opusenc.c:38
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
opus_encode_end
static av_cold int opus_encode_end(AVCodecContext *avctx)
Definition: opusenc.c:605
ff_celt_pvq_init
int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
Definition: opus_pvq.c:897
exp_quant_coarse
static void exp_quant_coarse(OpusRangeCoder *rc, CeltFrame *f, float last_energy[][CELT_MAX_BANDS], int intra)
Definition: opusenc.c:322
ceilf
static __device__ float ceilf(float a)
Definition: cuda_runtime.h:175
ff_bufqueue_get
static AVFrame * ff_bufqueue_get(struct FFBufQueue *queue)
Get the first buffer from the queue and remove it.
Definition: bufferqueue.h:98
opus_rc_tell
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: opus_rc.h:61
ff_celt_coarse_energy_dist
const uint8_t ff_celt_coarse_energy_dist[4][2][42]
Definition: opustab.c:808
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
CeltBlock
Definition: opus_celt.h:66
win
static float win(SuperEqualizerContext *s, float n, int N)
Definition: af_superequalizer.c:119
CeltPVQ
Definition: opus_pvq.h:37
OPUSENC_FLAGS
#define OPUSENC_FLAGS
Definition: opusenc.c:703
audio_frame_queue.h
AVCodecContext::initial_padding
int initial_padding
Audio only.
Definition: avcodec.h:1701
opus_encode_frame
static int opus_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition: opusenc.c:537
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:463
OpusEncContext::frame
CeltFrame * frame
Definition: opusenc.c:54
ff_opus_psy_end
av_cold int ff_opus_psy_end(OpusPsyContext *s)
Definition: opusenc_psy.c:593
ff_af_queue_add
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
Definition: audio_frame_queue.c:44
AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_STEREO
Definition: channel_layout.h:91
quant
static int quant(float coef, const float Q, const float rounding)
Quantize one coefficient.
Definition: aacenc_utils.h:59
ff_opus_psy_postencode_update
void ff_opus_psy_postencode_update(OpusPsyContext *s, CeltFrame *f, OpusRangeCoder *rc)
Definition: opusenc_psy.c:479
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:99
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
OPUS_MAX_LOOKAHEAD
#define OPUS_MAX_LOOKAHEAD
Definition: opusenc.h:32
OpusEncContext::afq
AudioFrameQueue afq
Definition: opusenc.c:41
AV_CODEC_CAP_EXPERIMENTAL
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
Definition: codec.h:105
av_cold
#define av_cold
Definition: attributes.h:90
OPUS_BLOCK_SIZE
#define OPUS_BLOCK_SIZE(x)
Definition: opusenc.h:39
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:485
OpusEncContext::rc
OpusRangeCoder * rc
Definition: opusenc.c:55
OpusEncContext::scratch
float scratch[2048]
Definition: opusenc.c:60
s
#define s(width, name)
Definition: cbs_vp9.c:257
floor
static __device__ float floor(float a)
Definition: cuda_runtime.h:173
frame_size
int frame_size
Definition: mxfenc.c:2205
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
ff_opus_psy_celt_frame_process
int ff_opus_psy_celt_frame_process(OpusPsyContext *s, CeltFrame *f, int index)
Definition: opusenc_psy.c:455
CELT_MAX_FINE_BITS
#define CELT_MAX_FINE_BITS
Definition: opus_celt.h:41
bits
uint8_t bits
Definition: vp3data.h:141
AudioFrameQueue
Definition: audio_frame_queue.h:32
av_frame_clone
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
Definition: frame.c:424
MDCT15Context
Definition: mdct15.h:30
f
#define f(width, name)
Definition: cbs_vp9.c:255
OpusPsyContext
Definition: opusenc_psy.h:56
OpusEncContext::mdct
MDCT15Context * mdct[CELT_BLOCK_NB]
Definition: opusenc.c:43
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:65
AVCodecDefault
Definition: internal.h:211
OPUS_MODE_NB
@ OPUS_MODE_NB
Definition: opus.h:68
ff_celt_bitalloc
void ff_celt_bitalloc(CeltFrame *f, OpusRangeCoder *rc, int encode)
Definition: opus.c:556
OpusPacketInfo
Definition: opusenc.h:48
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
OPUS_BANDWITH_NB
@ OPUS_BANDWITH_NB
Definition: opus.h:78
opusenc.h
OpusEncContext::packet
OpusPacketInfo packet
Definition: opusenc.c:50
ff_celt_pvq_uninit
void av_cold ff_celt_pvq_uninit(CeltPVQ **pvq)
Definition: opus_pvq.c:914
period
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without period
Definition: writing_filters.txt:89
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:433
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
ff_bufqueue_discard_all
static void ff_bufqueue_discard_all(struct FFBufQueue *queue)
Unref and remove all buffers from the queue.
Definition: bufferqueue.h:111
celt_frame_mdct
static void celt_frame_mdct(OpusEncContext *s, CeltFrame *f)
Definition: opusenc.c:193
CELT_MAX_BANDS
#define CELT_MAX_BANDS
Definition: opus.h:46
celt_quant_fine
static void celt_quant_fine(CeltFrame *f, OpusRangeCoder *rc)
Definition: opusenc.c:385
celt_frame_setup_input
static void celt_frame_setup_input(OpusEncContext *s, CeltFrame *f)
Definition: opusenc.c:119
opus_gen_toc
static int opus_gen_toc(OpusEncContext *s, uint8_t *toc, int *size, int *fsize_needed)
Definition: opusenc.c:76
ff_celt_freq_range
const uint8_t ff_celt_freq_range[]
Definition: opustab.c:772
float_dsp.h
for
for(j=16;j >0;--j)
Definition: h264pred_template.c:469
CELT_ENERGY_SILENCE
#define CELT_ENERGY_SILENCE
Definition: opus_celt.h:46
OpusEncContext::channels
int channels
Definition: opusenc.c:52
options
const OptionDef options[]
opustab.h
ff_opus_rc_enc_init
void ff_opus_rc_enc_init(OpusRangeCoder *rc)
Definition: opus_rc.c:402
AVPacket::size
int size
Definition: packet.h:374
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
opus_pvq.h
opusenc_psy.h
bps
unsigned bps
Definition: movenc.c:1596
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:59
sample
#define sample
Definition: flacdsp_template.c:44
size
int size
Definition: twinvq_data.h:10344
OpusEncContext::enc_id
uint8_t enc_id[64]
Definition: opusenc.c:47
OpusRangeCoder
Definition: opus_rc.h:40
OpusEncContext::psyctx
OpusPsyContext psyctx
Definition: opusenc.c:39
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:483
AVFloatDSPContext
Definition: float_dsp.h:24
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:376
ff_celt_tf_select
const int8_t ff_celt_tf_select[4][2][2][2]
Definition: opustab.c:782
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
ff_bufqueue_add
static void ff_bufqueue_add(void *log, struct FFBufQueue *queue, AVFrame *buf)
Add a buffer to the queue.
Definition: bufferqueue.h:71
write_opuslacing
static int write_opuslacing(uint8_t *dst, int v)
Definition: opusenc.c:485
OpusEncContext
Definition: opusenc.c:36
input
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some input
Definition: filter_design.txt:172
opus_write_extradata
static void opus_write_extradata(AVCodecContext *avctx)
Definition: opusenc.c:63
ff_celt_beta_coef
const float ff_celt_beta_coef[]
Definition: opustab.c:804
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:993
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Definition: opt.h:227
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:116
src1
#define src1
Definition: h264pred.c:140
OpusEncContext::last_quantized_energy
float last_quantized_energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
Definition: opusenc.c:58
bytestream_put_buffer
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
Definition: bytestream.h:372
AVFrame::nb_samples
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:369
lrintf
#define lrintf(x)
Definition: libm_mips.h:72
ff_bufqueue_peek
static AVFrame * ff_bufqueue_peek(struct FFBufQueue *queue, unsigned index)
Get a buffer from the queue without altering it.
Definition: bufferqueue.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:366
ff_opus_rc_enc_laplace
void ff_opus_rc_enc_laplace(OpusRangeCoder *rc, int *value, uint32_t symbol, int decay)
Definition: opus_rc.c:314
av_get_bytes_per_sample
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:106
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:484
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: internal.h:50
FFBufQueue
Structure holding the queue.
Definition: bufferqueue.h:49
AVFrame::extended_data
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:350
ff_opus_rc_put_raw
void ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count)
CELT: write 0 - 31 bits to the rawbits buffer.
Definition: opus_rc.c:161
celt_encode_frame
static void celt_encode_frame(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f, int index)
Definition: opusenc.c:420
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
OPUS_MAX_CHANNELS
#define OPUS_MAX_CHANNELS
Definition: opusenc.h:34
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ff_opus_psy_signal_eof
void ff_opus_psy_signal_eof(OpusPsyContext *s)
Definition: opusenc_psy.c:588
ff_mdct15_uninit
av_cold void ff_mdct15_uninit(MDCT15Context **ps)
Definition: mdct15.c:43
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:209
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
Definition: packet.h:156
len
int len
Definition: vorbis_enc_data.h:426
CELT_POSTFILTER_MINPERIOD
#define CELT_POSTFILTER_MINPERIOD
Definition: opus_celt.h:45
ff_opus_default_coupled_streams
const uint8_t ff_opus_default_coupled_streams[]
Definition: opustab.c:27
opusenc_class
static const AVClass opusenc_class
Definition: opusenc.c:710
ret
ret
Definition: filter_design.txt:187
OpusEncContext::avctx
AVCodecContext * avctx
Definition: opusenc.c:40
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
OpusEncContext::enc_id_bits
int enc_id_bits
Definition: opusenc.c:48
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
CELT_EMPH_COEFF
#define CELT_EMPH_COEFF
Definition: opusdsp.h:24
AVCodecContext
main external API structure.
Definition: avcodec.h:383
ff_celt_model_energy_small
const uint16_t ff_celt_model_energy_small[]
Definition: opustab.c:766
channel_layout.h
ff_celt_window
const float *const ff_celt_window
Definition: opustab.c:1135
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: avpacket.c:225
celt_quant_coarse
static void celt_quant_coarse(CeltFrame *f, OpusRangeCoder *rc, float last_energy[][CELT_MAX_BANDS])
Definition: opusenc.c:365
ff_opus_encoder
const AVCodec ff_opus_encoder
Definition: opusenc.c:723
ff_celt_quant_bands
void ff_celt_quant_bands(CeltFrame *f, OpusRangeCoder *rc)
Definition: opus.c:447
ff_opus_rc_enc_log
void ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits)
Definition: opus_rc.c:131
temp
else temp
Definition: vf_mcdeint.c:248
AV_CODEC_CAP_DELAY
#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:82
ff_celt_alpha_coef
const float ff_celt_alpha_coef[]
Definition: opustab.c:800
celt_enc_quant_pfilter
static void celt_enc_quant_pfilter(OpusRangeCoder *rc, CeltFrame *f)
Definition: opusenc.c:285
celt_quant_final
static void celt_quant_final(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f)
Definition: opusenc.c:402
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:272
AVCodecContext::frame_number
int frame_number
Frame counter, set by libavcodec.
Definition: avcodec.h:1023
ff_opus_psy_init
av_cold int ff_opus_psy_init(OpusPsyContext *s, AVCodecContext *avctx, struct FFBufQueue *bufqueue, OpusEncOptions *options)
Definition: opusenc_psy.c:516
diff
static av_always_inline int diff(const uint32_t a, const uint32_t b)
Definition: vf_palettegen.c:139
OpusEncOptions
Definition: opusenc.h:43
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:410
AVPacket
This structure stores compressed data.
Definition: packet.h:350
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:241
OpusEncContext::pvq
CeltPVQ * pvq
Definition: opusenc.c:44
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
avpriv_float_dsp_alloc
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Definition: float_dsp.c:135
CELT_BLOCK_NB
@ CELT_BLOCK_NB
Definition: opus_celt.h:63
bytestream.h
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
celt_apply_preemph_filter
static void celt_apply_preemph_filter(OpusEncContext *s, CeltFrame *f)
Definition: opusenc.c:159
ff_celt_mean_energy
const float ff_celt_mean_energy[]
Definition: opustab.c:792
OpusEncContext::bufqueue
struct FFBufQueue bufqueue
Definition: opusenc.c:45
CELT_OVERLAP
#define CELT_OVERLAP
Definition: opus.h:43
OPUS_RC_CHECKPOINT_BITS
#define OPUS_RC_CHECKPOINT_BITS(rc)
Definition: opus_rc.h:120
AV_CODEC_CAP_SMALL_LAST_FRAME
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
Definition: codec.h:87
OPUS_RC_CHECKPOINT_ROLLBACK
#define OPUS_RC_CHECKPOINT_ROLLBACK(rc)
Definition: opus_rc.h:123
ff_alloc_packet
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition: encode.c:34
celt_enc_tf
static void celt_enc_tf(CeltFrame *f, OpusRangeCoder *rc)
Definition: opusenc.c:258
opus_encode_init
static av_cold int opus_encode_init(AVCodecContext *avctx)
Definition: opusenc.c:623
ff_opus_rc_enc_end
void ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size)
Definition: opus_rc.c:360
CeltFrame
Definition: opus_celt.h:93
OpusEncContext::dsp
AVFloatDSPContext * dsp
Definition: opusenc.c:42