Go to the documentation of this file.
65 bytestream_put_byte (&bs, 0x1);
66 bytestream_put_byte (&bs, avctx->
channels);
69 bytestream_put_le16 (&bs, 0x0);
70 bytestream_put_byte (&bs, 0x0);
75 int tmp = 0x0, extended_toc = 0;
79 { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 17, 0, 21, 25, 29 } },
80 { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 18, 0, 22, 26, 30 } },
81 { { 1, 5, 9, 0, 0 }, { 0, 0, 0, 13, 15 }, { 19, 0, 23, 27, 31 } },
82 { { 2, 6, 10, 0, 0 }, { 0, 0, 0, 14, 16 }, { 20, 0, 24, 28, 32 } },
83 { { 3, 7, 11, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
84 { { 4, 8, 12, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
86 int cfg = toc_cfg[
s->packet.framesize][
s->packet.mode][
s->packet.bandwidth];
90 if (
s->packet.frames == 2) {
91 if (
s->frame[0].framebits ==
s->frame[1].framebits) {
97 }
else if (
s->packet.frames > 2) {
101 tmp |= (
s->channels > 1) << 2;
102 tmp |= (cfg - 1) << 3;
105 for (
int i = 0;
i < (
s->packet.frames - 1);
i++)
106 *fsize_needed |= (
s->frame[
i].framebits !=
s->frame[
i + 1].framebits);
107 tmp = (*fsize_needed) << 7;
109 tmp |=
s->packet.frames;
112 *
size = 1 + extended_toc;
119 const int subframesize =
s->avctx->frame_size;
124 for (
int ch = 0;
ch <
f->channels;
ch++) {
133 for (
int sf = 0; sf < subframes; sf++) {
134 if (sf != (subframes - 1))
139 for (
int ch = 0;
ch <
f->channels;
ch++) {
145 memcpy(&
b->samples[sf*subframesize],
input,
len);
150 if (sf != (subframes - 1))
158 const int subframesize =
s->avctx->frame_size;
162 for (
int ch = 0;
ch <
f->channels;
ch++) {
164 float m =
b->emph_coeff;
174 for (
int sf = 0; sf < subframes; sf++) {
175 for (
int ch = 0;
ch <
f->channels;
ch++) {
177 float m =
b->emph_coeff;
178 for (
int i = 0;
i < subframesize;
i++) {
179 float sample =
b->samples[sf*subframesize +
i];
180 b->samples[sf*subframesize +
i] =
sample - m;
183 if (sf != (subframes - 1))
192 float *
win =
s->scratch, *
temp =
s->scratch + 1920;
195 for (
int ch = 0;
ch <
f->channels;
ch++) {
197 float *
src1 =
b->overlap;
198 for (
int t = 0; t <
f->blocks; t++) {
204 s->mdct[0]->mdct(
s->mdct[0],
b->coeffs + t,
win,
f->blocks);
210 memset(
win, 0, wlen*
sizeof(
float));
211 for (
int ch = 0;
ch <
f->channels;
ch++) {
222 s->dsp->vector_fmul_reverse(
temp,
b->samples + rwin,
226 s->mdct[
f->size]->mdct(
s->mdct[
f->size],
b->coeffs,
win, 1);
230 for (
int ch = 0;
ch <
f->channels;
ch++) {
236 float *coeffs = &
block->coeffs[band_offset];
238 for (
int j = 0; j < band_size; j++)
239 ener += coeffs[j]*coeffs[j];
241 block->lin_energy[
i] = sqrtf(ener) + FLT_EPSILON;
242 ener = 1.0f/
block->lin_energy[
i];
244 for (
int j = 0; j < band_size; j++)
257 int tf_select = 0,
diff = 0, tf_changed = 0, tf_select_needed;
258 int bits =
f->transient ? 2 : 4;
262 for (
int i =
f->start_band; i < f->end_band;
i++) {
264 const int tbit = (
diff ^ 1) ==
f->tf_change[
i];
269 bits =
f->transient ? 4 : 5;
275 tf_select =
f->tf_select;
278 for (
int i =
f->start_band; i < f->end_band;
i++)
284 float gain =
f->pf_gain;
285 int txval, octave =
f->pf_octave,
period =
f->pf_period, tapset =
f->pf_tapset;
292 txval =
FFMIN(octave, 6);
296 txval = av_clip(
period - (16 << octave) + 1, 0, (1 << (4 + octave)) - 1);
298 period = txval + (16 << octave) - 1;
300 txval =
FFMIN(((
int)(gain / 0.09375
f)) - 1, 7);
302 gain = 0.09375f * (txval + 1);
309 for (
int i = 0;
i < 2;
i++) {
322 float alpha, beta, prev[2] = { 0, 0 };
333 beta = 1.0f - (4915.0f/32768.0f);
339 for (
int i =
f->start_band; i < f->end_band;
i++) {
340 for (
int ch = 0;
ch <
f->channels;
ch++) {
343 const float last =
FFMAX(-9.0
f, last_energy[
ch][
i]);
348 }
else if (
left >= 2) {
349 q_en = av_clip(q_en, -1, 1);
351 }
else if (
left >= 1) {
352 q_en = av_clip(q_en, -1, 0);
357 prev[
ch] += beta * q_en;
365 uint32_t inter, intra;
384 for (
int i =
f->start_band; i < f->end_band;
i++) {
385 if (!
f->fine_bits[
i])
387 for (
int ch = 0;
ch <
f->channels;
ch++) {
389 int quant, lim = (1 <<
f->fine_bits[
i]);
391 quant = av_clip(floor(
diff*lim), 0, lim - 1);
393 offset = 0.5f - ((
quant + 0.5f) * (1 << (14 -
f->fine_bits[
i])) / 16384.0
f);
401 for (
int priority = 0; priority < 2; priority++) {
402 for (
int i =
f->start_band; i < f->end_band && (
f->framebits -
opus_rc_tell(rc)) >=
f->channels;
i++) {
405 for (
int ch = 0;
ch <
f->channels;
ch++) {
407 const float err =
block->error_energy[
i];
408 const float offset = 0.5f * (1 << (14 -
f->fine_bits[
i] - 1)) / 16384.0f;
427 if (
f->framebits >= 16)
429 for (
int ch = 0;
ch <
s->channels;
ch++)
469 if (
f->anticollapse_needed)
475 for (
int ch = 0;
ch <
f->channels;
ch++) {
478 s->last_quantized_energy[
ch][
i] =
block->energy[
i] +
block->error_energy[
i];
485 dst[1] = v - dst[0] >> 2;
486 return 1 + (v >= 252);
498 for (
int i = 0;
i <
s->packet.frames - 1;
i++) {
500 s->frame[
i].framebits >> 3);
505 for (
int i = 0;
i <
s->packet.frames;
i++) {
507 s->frame[
i].framebits >> 3);
508 offset +=
s->frame[
i].framebits >> 3;
520 f->format =
s->avctx->sample_fmt;
521 f->nb_samples =
s->avctx->frame_size;
522 f->channel_layout =
s->avctx->channel_layout;
527 for (
int i = 0;
i <
s->channels;
i++) {
529 memset(
f->extended_data[
i], 0,
bps*
f->nb_samples);
558 int pad_empty =
s->packet.frames*(
frame_size/
s->avctx->frame_size) -
s->bufqueue.available + 1;
563 for (
int i = 0;
i < pad_empty;
i++) {
571 for (
int i = 0;
i <
s->packet.frames;
i++) {
573 alloc_size +=
s->frame[
i].framebits >> 3;
577 alloc_size += 2 +
s->packet.frames*2;
640 avctx->
bit_rate = coupled*(96000) + (
s->channels - coupled*2)*(48000);
642 int64_t clipped_rate = av_clip(avctx->
bit_rate, 6000, 255000 *
s->channels);
643 av_log(avctx,
AV_LOG_ERROR,
"Unsupported bitrate %"PRId64
" kbps, clipping to %"PRId64
" kbps\n",
644 avctx->
bit_rate/1000, clipped_rate/1000);
669 for (
int ch = 0;
ch <
s->channels;
ch++)
681 max_frames = ceilf(
FFMIN(
s->options.max_delay_ms, 120.0f)/2.5f);
689 for (
int i = 0;
i < max_frames;
i++) {
690 s->frame[
i].dsp =
s->dsp;
691 s->frame[
i].avctx =
s->avctx;
692 s->frame[
i].seed = 0;
693 s->frame[
i].pvq =
s->pvq;
694 s->frame[
i].apply_phase_inv = 1;
695 s->frame[
i].block[0].emph_coeff =
s->frame[
i].block[1].emph_coeff = 0.0f;
701 #define OPUSENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
703 {
"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" },
716 {
"compression_level",
"10" },
733 .supported_samplerates = (
const int []){ 48000, 0 },
int frame_size
Number of samples per channel in an audio frame.
@ AV_SAMPLE_FMT_FLTP
float, planar
const float ff_celt_postfilter_taps[3][3]
void ff_opus_rc_enc_cdf(OpusRangeCoder *rc, int val, const uint16_t *cdf)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
int ff_opus_psy_process(OpusPsyContext *s, OpusPacketInfo *p)
static AVFrame * spawn_empty_frame(OpusEncContext *s)
static av_cold int init(AVCodecContext *avctx)
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
const uint8_t ff_celt_freq_bands[]
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int64_t *duration)
Remove frame(s) from the queue.
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
int sample_rate
samples per second
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
void ff_opus_psy_celt_frame_init(OpusPsyContext *s, CeltFrame *f, int index)
const float * ff_celt_window
#define AV_CH_LAYOUT_MONO
void ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size)
CELT: write a uniformly distributed integer.
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
const uint16_t ff_celt_model_tapset[]
static const AVOption opusenc_options[]
This structure describes decoded (raw) audio or video data.
static const AVCodecDefault opusenc_defaults[]
#define OPUS_RC_CHECKPOINT_SPAWN(rc)
static void opus_packet_assembler(OpusEncContext *s, AVPacket *avpkt)
av_cold int ff_mdct15_init(MDCT15Context **ps, int inverse, int N, double scale)
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
static av_cold int opus_encode_end(AVCodecContext *avctx)
int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
static void exp_quant_coarse(OpusRangeCoder *rc, CeltFrame *f, float last_energy[][CELT_MAX_BANDS], int intra)
static AVFrame * ff_bufqueue_get(struct FFBufQueue *queue)
Get the first buffer from the queue and remove it.
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,...
const uint8_t ff_celt_coarse_energy_dist[4][2][42]
static float win(SuperEqualizerContext *s, float n, int N)
int initial_padding
Audio only.
static int opus_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
int flags
AV_CODEC_FLAG_*.
av_cold int ff_opus_psy_end(OpusPsyContext *s)
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
#define AV_CH_LAYOUT_STEREO
void ff_opus_psy_postencode_update(OpusPsyContext *s, CeltFrame *f, OpusRangeCoder *rc)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define OPUS_MAX_LOOKAHEAD
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
#define OPUS_BLOCK_SIZE(x)
int ff_opus_psy_celt_frame_process(OpusPsyContext *s, CeltFrame *f, int index)
#define CELT_MAX_FINE_BITS
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
MDCT15Context * mdct[CELT_BLOCK_NB]
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
void ff_celt_bitalloc(CeltFrame *f, OpusRangeCoder *rc, int encode)
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
void av_cold ff_celt_pvq_uninit(CeltPVQ **pvq)
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
int64_t bit_rate
the average bitrate
const char * av_default_item_name(void *ptr)
Return the context name.
static void ff_bufqueue_discard_all(struct FFBufQueue *queue)
Unref and remove all buffers from the queue.
static void celt_frame_mdct(OpusEncContext *s, CeltFrame *f)
static void celt_quant_fine(CeltFrame *f, OpusRangeCoder *rc)
static void celt_frame_setup_input(OpusEncContext *s, CeltFrame *f)
static int opus_gen_toc(OpusEncContext *s, uint8_t *toc, int *size, int *fsize_needed)
const uint8_t ff_celt_freq_range[]
#define CELT_ENERGY_SILENCE
const OptionDef options[]
void ff_opus_rc_enc_init(OpusRangeCoder *rc)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
const int8_t ff_celt_tf_select[4][2][2][2]
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
static void ff_bufqueue_add(void *log, struct FFBufQueue *queue, AVFrame *buf)
Add a buffer to the queue.
static int write_opuslacing(uint8_t *dst, int v)
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
static void opus_write_extradata(AVCodecContext *avctx)
const float ff_celt_beta_coef[]
int channels
number of audio channels
#define DECLARE_ALIGNED(n, t, v)
float last_quantized_energy[OPUS_MAX_CHANNELS][CELT_MAX_BANDS]
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
int nb_samples
number of audio samples (per channel) described by this frame
static AVFrame * ff_bufqueue_peek(struct FFBufQueue *queue, unsigned index)
Get a buffer from the queue without altering it.
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
void ff_opus_rc_enc_laplace(OpusRangeCoder *rc, int *value, uint32_t symbol, int decay)
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Structure holding the queue.
uint8_t ** extended_data
pointers to the data planes/channels.
void ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count)
CELT: write 0 - 31 bits to the rawbits buffer.
static void celt_encode_frame(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f, int index)
AVSampleFormat
Audio sample formats.
#define OPUS_MAX_CHANNELS
void ff_opus_psy_signal_eof(OpusPsyContext *s)
av_cold void ff_mdct15_uninit(MDCT15Context **ps)
const char * name
Name of the codec implementation.
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
#define CELT_POSTFILTER_MINPERIOD
const uint8_t ff_opus_default_coupled_streams[]
static const AVClass opusenc_class
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
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
#define AV_INPUT_BUFFER_PADDING_SIZE
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
main external API structure.
const uint16_t ff_celt_model_energy_small[]
static void celt_quant_coarse(CeltFrame *f, OpusRangeCoder *rc, float last_energy[][CELT_MAX_BANDS])
void ff_celt_quant_bands(CeltFrame *f, OpusRangeCoder *rc)
void ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits)
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
const float ff_celt_alpha_coef[]
static void celt_enc_quant_pfilter(OpusRangeCoder *rc, CeltFrame *f)
static void celt_quant_final(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f)
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
int frame_number
Frame counter, set by libavcodec.
av_cold int ff_opus_psy_init(OpusPsyContext *s, AVCodecContext *avctx, struct FFBufQueue *bufqueue, OpusEncOptions *options)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
static const int16_t alpha[]
This structure stores compressed data.
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
The exact code depends on how similar the blocks are and how related they are to the block
static void celt_apply_preemph_filter(OpusEncContext *s, CeltFrame *f)
const float ff_celt_mean_energy[]
struct FFBufQueue bufqueue
#define OPUS_RC_CHECKPOINT_BITS(rc)
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define OPUS_RC_CHECKPOINT_ROLLBACK(rc)
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
static void celt_enc_tf(CeltFrame *f, OpusRangeCoder *rc)
static av_cold int opus_encode_init(AVCodecContext *avctx)
void ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size)