40 float prev[2] = { 0 };
48 beta = 1.0f - (4915.0f/32768.0f);
53 for (j = 0; j <
f->channels; j++) {
58 if (
i < f->start_band ||
i >=
f->end_band) {
64 if (available >= 15) {
68 }
else if (available >= 2) {
70 value = (x>>1) ^ -(x&1);
71 }
else if (available >= 1) {
76 prev[j] += beta *
value;
84 for (
i =
f->start_band;
i < f->end_band;
i++) {
89 for (j = 0; j <
f->channels; j++) {
94 offset = (q2 + 0.5f) * (1 << (14 -
f->fine_bits[
i])) / 16384.0f - 0.5f;
105 for (priority = 0; priority < 2; priority++) {
110 for (j = 0; j <
f->channels; j++) {
114 offset = (q2 - 0.5f) * (1 << (14 -
f->fine_bits[
i] - 1)) / 16384.0f;
124 int i,
diff = 0, tf_select = 0, tf_changed = 0, tf_select_bit;
125 int consumed,
bits =
f->transient ? 2 : 4;
128 tf_select_bit = (
f->size != 0 && consumed+
bits+1 <=
f->framebits);
130 for (
i =
f->start_band;
i < f->end_band;
i++) {
131 if (consumed+
bits+tf_select_bit <= f->framebits) {
137 bits =
f->transient ? 4 : 5;
144 for (
i =
f->start_band;
i < f->end_band;
i++) {
153 for (
i =
f->start_band;
i < f->end_band;
i++) {
165 const int T0 =
block->pf_period_old;
166 const int T1 =
block->pf_period;
171 float x0, x1, x2, x3, x4;
175 if (
block->pf_gains[0] == 0.0 &&
176 block->pf_gains_old[0] == 0.0)
179 g00 =
block->pf_gains_old[0];
180 g01 =
block->pf_gains_old[1];
181 g02 =
block->pf_gains_old[2];
182 g10 =
block->pf_gains[0];
183 g11 =
block->pf_gains[1];
184 g12 =
block->pf_gains[2];
193 x0 =
data[
i - T1 + 2];
196 (1.0 -
w) * g01 * (
data[
i - T0 - 1] +
data[
i - T0 + 1]) +
197 (1.0 -
w) * g02 * (
data[
i - T0 - 2] +
data[
i - T0 + 2]) +
199 w * g11 * (x1 + x3) +
210 int len =
f->blocksize *
f->blocks;
224 if (
block->pf_gains[0] > FLT_EPSILON && filter_len > 0)
240 memset(
f->block[0].pf_gains_new, 0,
sizeof(
f->block[0].pf_gains_new));
241 memset(
f->block[1].pf_gains_new, 0,
sizeof(
f->block[1].pf_gains_new));
243 if (
f->start_band == 0 && consumed + 16 <=
f->framebits) {
245 if (has_postfilter) {
247 int tapset, octave, period;
255 for (
i = 0;
i < 2;
i++) {
275 for (
i =
f->start_band;
i < f->end_band;
i++) {
280 float thresh, sqrt_1;
285 thresh =
exp2f(-1.0 - 0.125f * depth);
290 prev[0] =
block->prev_energy[0][
i];
291 prev[1] =
block->prev_energy[1][
i];
292 if (
f->channels == 1) {
298 Ediff =
block->energy[
i] -
FFMIN(prev[0], prev[1]);
299 Ediff =
FFMAX(0, Ediff);
307 for (k = 0; k < 1 <<
f->size; k++) {
309 if (!(
block->collapse_masks[
i] & 1 << k)) {
312 xptr[(j <<
f->size) + k] = (
celt_rng(
f) & 0x8000) ?
r : -
r;
325 int start_band,
int end_band)
327 int i, j, downmix = 0;
337 if (start_band < 0 || start_band > end_band || end_band >
CELT_MAX_BANDS) {
339 start_band, end_band);
348 f->start_band = start_band;
349 f->end_band = end_band;
360 if (!
f->output_channels)
363 for (
i = 0;
i <
f->channels;
i++) {
364 memset(
f->block[
i].coeffs, 0,
sizeof(
f->block[
i].coeffs));
365 memset(
f->block[
i].collapse_masks, 0,
sizeof(
f->block[
i].collapse_masks));
371 if (consumed >=
f->framebits)
373 else if (consumed == 1)
378 consumed =
f->framebits;
386 if (
f->size != 0 && consumed+3 <=
f->framebits)
389 f->blocks =
f->transient ? 1 <<
f->size : 1;
392 imdct =
f->tx[
f->transient ? 0 :
f->size];
393 imdct_fn =
f->tx_fn[
f->transient ? 0 :
f->size];
397 f->block[0].energy[
i] =
FFMAX(
f->block[0].energy[
i],
f->block[1].energy[
i]);
406 if (
f->anticollapse_needed)
413 for (
i = 0;
i <
f->channels;
i++) {
423 if (
f->output_channels <
f->channels) {
424 f->dsp->vector_fmac_scalar(
f->block[0].coeffs,
f->block[1].coeffs, 1.0,
FFALIGN(
frame_size, 16));
426 }
else if (
f->output_channels >
f->channels)
427 memcpy(
f->block[1].coeffs,
f->block[0].coeffs,
frame_size *
sizeof(
float));
430 for (
i = 0;
i < 2;
i++) {
436 memset(
f->block[0].coeffs, 0,
sizeof(
f->block[0].coeffs));
437 memset(
f->block[1].coeffs, 0,
sizeof(
f->block[1].coeffs));
441 for (
i = 0;
i <
f->output_channels;
i++) {
445 for (j = 0; j <
f->blocks; j++) {
446 float *
dst =
block->buf + 1024 + j *
f->blocksize;
449 sizeof(
float)*
f->blocks);
461 block->emph_coeff =
f->opusdsp.deemphasis(output[
i],
466 if (!isnormal(
block->emph_coeff))
467 block->emph_coeff = 0.0;
471 memcpy(
f->block[1].energy,
f->block[0].energy,
sizeof(
f->block[0].energy));
473 for (
i = 0;
i < 2;
i++ ) {
477 memcpy(
block->prev_energy[1],
block->prev_energy[0],
sizeof(
block->prev_energy[0]));
478 memcpy(
block->prev_energy[0],
block->energy,
sizeof(
block->prev_energy[0]));
484 for (j = 0; j <
f->start_band; j++) {
486 block->energy[j] = 0.0;
490 block->energy[j] = 0.0;
506 for (
i = 0;
i < 2;
i++) {
512 memset(
block->energy, 0,
sizeof(
block->energy));
515 memset(
block->pf_gains, 0,
sizeof(
block->pf_gains));
516 memset(
block->pf_gains_old, 0,
sizeof(
block->pf_gains_old));
517 memset(
block->pf_gains_new, 0,
sizeof(
block->pf_gains_new));
553 if (output_channels != 1 && output_channels != 2) {
568 const float scale = -1.0f/32768;
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
#define i(width, name, range_min, range_max)
void ff_celt_quant_bands(CeltFrame *f, OpusRangeCoder *rc)
void ff_celt_bitalloc(CeltFrame *f, OpusRangeCoder *rc, int encode)
static av_always_inline uint32_t celt_rng(CeltFrame *f)
static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
#define CELT_MAX_LOG_BLOCKS
#define CELT_SHORT_BLOCKSIZE
#define CELT_POSTFILTER_MINPERIOD
#define CELT_ENERGY_SILENCE
#define CELT_MAX_FINE_BITS
static __device__ float sqrtf(float a)
static int16_t block1[64]
void ff_celt_free(CeltFrame **f)
static void celt_denormalize(CeltFrame *f, CeltBlock *block, float *data)
int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels, int apply_phase_inv)
static void celt_decode_coarse_energy(CeltFrame *f, OpusRangeCoder *rc)
int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output, int channels, int frame_size, int start_band, int end_band)
static int parse_postfilter(CeltFrame *f, OpusRangeCoder *rc, int consumed)
static void celt_decode_final_energy(CeltFrame *f, OpusRangeCoder *rc)
static void process_anticollapse(CeltFrame *f, CeltBlock *block, float *X)
static void celt_postfilter(CeltFrame *f, CeltBlock *block)
static void celt_decode_fine_energy(CeltFrame *f, OpusRangeCoder *rc)
static void celt_postfilter_apply_transition(CeltBlock *block, float *data)
void ff_celt_flush(CeltFrame *f)
static void celt_decode_tf_changes(CeltFrame *f, OpusRangeCoder *rc)
static const uint8_t bits[8]
static const uint8_t frame_size[4]
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const int16_t alpha[]
static void scale(int *out, const int *in, const int w, const int h, const int shift)
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Memory handling functions.
av_cold void ff_opus_dsp_init(OpusDSP *ctx)
int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
void av_cold ff_celt_pvq_uninit(CeltPVQ **pvq)
uint32_t ff_opus_rc_dec_uint(OpusRangeCoder *rc, uint32_t size)
CELT: read a uniform distribution.
uint32_t ff_opus_rc_dec_log(OpusRangeCoder *rc, uint32_t bits)
uint32_t ff_opus_rc_dec_cdf(OpusRangeCoder *rc, const uint16_t *cdf)
uint32_t ff_opus_rc_get_raw(OpusRangeCoder *rc, uint32_t count)
CELT: read 1-25 raw bits at the end of the frame, backwards byte-wise.
int ff_opus_rc_dec_laplace(OpusRangeCoder *rc, uint32_t symbol, int decay)
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,...
#define FF_ARRAY_ELEMS(a)
main external API structure.
int flags
AV_CODEC_FLAG_*.
const uint8_t ff_celt_freq_range[]
const uint8_t ff_celt_freq_bands[]
const uint16_t ff_celt_model_tapset[]
const int8_t ff_celt_tf_select[4][2][2][2]
const uint8_t ff_celt_coarse_energy_dist[4][2][42]
const float ff_celt_alpha_coef[]
const float ff_opus_deemph_weights[]
const float ff_celt_beta_coef[]
const float ff_celt_window2[120]
const float ff_celt_mean_energy[]
const float ff_celt_postfilter_taps[3][3]
#define ff_celt_model_energy_small
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
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...
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respectively.
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)