Go to the documentation of this file.
26 #include "config_components.h"
31 #define CELT_PVQ_U(n, k) (ff_celt_pvq_u_row[FFMIN(n, k)][FFMAX(n, k)])
32 #define CELT_PVQ_V(n, k) (CELT_PVQ_U(n, k) + CELT_PVQ_U(n, (k) + 1))
36 x = (
MUL16(x, x) + 4096) >> 13;
48 return (ls << 11) - (lc << 11) +
61 for (
i = 0;
i < 6;
i++) {
62 int center = (low + high + 1) >> 1;
63 if (cache[center] >=
bits)
69 return (
bits - (low == 0 ? -1 : cache[low]) <= cache[high] -
bits) ? low : high;
82 for (
i = 0;
i <
N;
i++)
97 *Xptr++ =
c * x1 -
s * x2;
105 *Xptr-- =
c * x1 -
s * x2;
110 uint32_t
stride, uint32_t K,
113 uint32_t stride2 = 0;
122 theta =
M_PI * gain * gain / 4;
151 int i, j,
N0 =
N /
B;
152 uint32_t collapse_mask = 0;
157 for (
i = 0;
i <
B;
i++)
158 for (j = 0; j <
N0; j++)
159 collapse_mask |= (!!iy[
i*
N0+j]) <<
i;
160 return collapse_mask;
166 float xp = 0, side = 0;
172 for (
i = 0;
i <
N;
i++) {
180 E[0] = mid2 * mid2 + side - 2 * xp;
181 E[1] = mid2 * mid2 + side + 2 * xp;
182 if (
E[0] < 6e-4
f ||
E[1] < 6e-4
f) {
183 for (
i = 0;
i <
N;
i++)
188 gain[0] = 1.0f /
sqrtf(
E[0]);
189 gain[1] = 1.0f /
sqrtf(
E[1]);
191 for (
i = 0;
i <
N;
i++) {
208 for (j = 0; j <
N0; j++)
211 memcpy(
X,
tmp,
N*
sizeof(
float));
221 for (j = 0; j <
N0; j++)
224 memcpy(
X,
tmp,
N*
sizeof(
float));
232 for (j = 0; j <
N0; j++) {
233 float x0 =
X[
stride * (2 * j + 0) +
i];
234 float x1 =
X[
stride * (2 * j + 1) +
i];
246 if (stereo &&
N == 2)
253 qn = (qb < (1 << 3 >> 1)) ? 1 : ((
ff_celt_qn_exp2[qb & 0x7] >> (14 - (qb >> 3))) + 1) >> 1 << 1;
258 static inline uint32_t
celt_icwrsi(uint32_t
N, uint32_t K,
const int *y)
260 int i, idx = 0, sum = 0;
261 for (
i =
N - 1;
i >= 0;
i--) {
270 static inline uint64_t
celt_cwrsi(uint32_t
N, uint32_t K, uint32_t
i,
int *y)
296 for (p = row[K]; p >
i; p = row[K])
300 val = (k0 - K +
s) ^
s;
308 if (p <=
i &&
i < q) {
322 val = (k0 - K +
s) ^
s;
340 val = (k0 - K +
s) ^
s;
371 float res = 0.0f, xy_norm = 0.0f;
373 for (
i = 0;
i <
N;
i++)
376 res = K/(res + FLT_EPSILON);
378 for (
i = 0;
i <
N;
i++) {
381 xy_norm += y[
i]*
X[
i];
386 int max_idx = 0, phase =
FFSIGN(K);
387 float max_num = 0.0f;
388 float max_den = 1.0f;
391 for (
i = 0;
i <
N;
i++) {
395 const int ca = 1 ^ ((y[
i] == 0) & (phase < 0));
396 const int y_new = y_norm + 2*phase*
FFABS(y[
i]);
397 float xy_new = xy_norm + 1*phase*
FFABS(
X[
i]);
398 xy_new = xy_new * xy_new;
399 if (ca && (max_den*xy_new) > (y_new*max_num)) {
409 xy_norm += 1*phase*
X[max_idx];
410 y_norm += 2*phase*y[max_idx];
414 return (
float)y_norm;
418 enum CeltSpread spread, uint32_t blocks,
float gain,
434 enum CeltSpread spread, uint32_t blocks,
float gain,
448 float e[2] = { 0.0f, 0.0f };
450 for (
i = 0;
i <
N;
i++) {
451 e[0] += (
X[
i] +
Y[
i])*(
X[
i] +
Y[
i]);
452 e[1] += (
X[
i] -
Y[
i])*(
X[
i] -
Y[
i]);
455 for (
i = 0;
i <
N;
i++) {
466 const float energy_n = 1.0f/(
sqrtf(e_l*e_l + e_r*e_r) + FLT_EPSILON);
469 for (
i = 0;
i <
N;
i++)
470 X[
i] = e_l*
X[
i] + e_r*
Y[
i];
476 for (
i = 0;
i <
N;
i++) {
477 const float Xret =
X[
i];
485 const int band,
float *
X,
486 float *
Y,
int N,
int b,
487 uint32_t blocks,
float *lowband,
489 int level,
float gain,
490 float *lowband_scratch,
494 const uint8_t *cache;
495 int stereo = !!
Y,
split = stereo;
496 int imid = 0, iside = 0;
498 int N_B =
N / blocks;
504 float mid = 0, side = 0;
505 int longblocks = (
B0 == 1);
510 for (
i = 0;
i <= stereo;
i++) {
512 if (
f->remaining2 >= 1 << 3) {
519 f->remaining2 -= 1 << 3;
521 x[0] = 1.0f - 2.0f*sign;
525 lowband_out[0] =
X[0];
529 if (!stereo &&
level == 0) {
530 int tf_change =
f->tf_change[band];
533 recombine = tf_change;
537 (recombine || ((N_B & 1) == 0 && tf_change < 0) ||
B0 > 1)) {
538 for (
i = 0;
i <
N;
i++)
539 lowband_scratch[
i] = lowband[
i];
540 lowband = lowband_scratch;
543 for (k = 0; k < recombine; k++) {
544 if (
quant || lowband)
548 blocks >>= recombine;
552 while ((N_B & 1) == 0 && tf_change < 0) {
553 if (
quant || lowband)
555 fill |= fill << blocks;
565 if (
B0 > 1 && (
quant || lowband))
567 N_B >> recombine,
B0 << recombine,
574 if (!stereo &&
duration >= 0 &&
b > cache[cache[0]] + 12 &&
N > 2) {
580 fill = (fill & 1) | (fill << 1);
581 blocks = (blocks + 1) >> 1;
587 int mbits, sbits,
delta;
598 qn = (stereo && band >=
f->intensity_stereo) ? 1 :
603 itheta = (itheta*qn + 8192) >> 14;
609 else if (stereo ||
B0 > 1)
613 itheta = itheta * 16384 / qn;
617 f->block[1].lin_energy[band],
N);
624 else if (stereo ||
B0 > 1)
628 itheta = itheta * 16384 / qn;
632 inv =
f->apply_phase_inv ? itheta > 8192 : 0;
634 for (
i = 0;
i <
N;
i++)
638 f->block[1].lin_energy[band],
N);
640 if (
b > 2 << 3 &&
f->remaining2 > 2 << 3) {
647 inv =
f->apply_phase_inv ? inv : 0;
660 }
else if (itheta == 16384) {
663 fill &= ((1 << blocks) - 1) << blocks;
673 mid = imid / 32768.0f;
674 side = iside / 32768.0f;
679 if (
N == 2 && stereo) {
686 sbits = (itheta != 0 && itheta != 16384) ? 1 << 3 : 0;
689 f->remaining2 -= qalloc+sbits;
695 sign = x2[0]*y2[1] - x2[1]*y2[0] < 0;
704 cm = pvq->
quant_band(pvq,
f, rc, band, x2,
NULL,
N, mbits, blocks, lowband,
duration,
705 lowband_out,
level, gain, lowband_scratch, orig_fill);
708 y2[0] = -sign * x2[1];
709 y2[1] = sign * x2[0];
722 float *next_lowband2 =
NULL;
723 float *next_lowband_out1 =
NULL;
730 if (
B0 > 1 && !stereo && (itheta & 0x3fff)) {
741 f->remaining2 -= qalloc;
743 if (lowband && !stereo)
744 next_lowband2 = lowband +
N;
749 next_lowband_out1 = lowband_out;
751 next_level =
level + 1;
753 rebalance =
f->remaining2;
754 if (mbits >= sbits) {
758 lowband,
duration, next_lowband_out1, next_level,
759 stereo ? 1.0
f : (gain * mid), lowband_scratch, fill);
760 rebalance = mbits - (rebalance -
f->remaining2);
761 if (rebalance > 3 << 3 && itheta != 0)
762 sbits += rebalance - (3 << 3);
768 gain * side,
NULL, fill >> blocks);
769 cm |= cmt << ((
B0 >> 1) & (stereo - 1));
775 gain * side,
NULL, fill >> blocks);
776 cm <<= ((
B0 >> 1) & (stereo - 1));
777 rebalance = sbits - (rebalance -
f->remaining2);
778 if (rebalance > 3 << 3 && itheta != 16384)
779 mbits += rebalance - (3 << 3);
784 lowband,
duration, next_lowband_out1, next_level,
785 stereo ? 1.0
f : (gain * mid), lowband_scratch, fill);
792 f->remaining2 -= curr_bits;
795 while (
f->remaining2 < 0 && q > 0) {
796 f->remaining2 += curr_bits;
798 f->remaining2 -= curr_bits;
805 f->spread, blocks, gain, pvq);
808 f->spread, blocks, gain, pvq);
812 uint32_t cm_mask = (1 << blocks) - 1;
817 for (
i = 0;
i <
N;
i++)
822 for (
i = 0;
i <
N;
i++) {
824 X[
i] = lowband[
i] + (((
celt_rng(
f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256);
830 memset(
X, 0,
N*
sizeof(
float));
840 for (
i = 0;
i <
N;
i++)
843 }
else if (
level == 0) {
849 B0 << recombine, longblocks);
854 for (k = 0; k < time_divide; k++) {
861 for (k = 0; k < recombine; k++) {
865 blocks <<= recombine;
870 for (
i = 0;
i <
N0;
i++)
871 lowband_out[
i] = n *
X[
i];
881 #if CONFIG_OPUS_DECODER
882 return quant_band_template(pvq,
f, rc, band,
X,
Y,
N,
b, blocks, lowband,
duration,
883 lowband_out,
level, gain, lowband_scratch, fill, 0);
891 #if CONFIG_OPUS_ENCODER
892 return quant_band_template(pvq,
f, rc, band,
X,
Y,
N,
b, blocks, lowband,
duration,
893 lowband_out,
level, gain, lowband_scratch, fill, 1);
906 s->quant_band =
encode ? pvq_encode_band : pvq_decode_band;
908 #if CONFIG_OPUS_ENCODER && ARCH_X86
const uint8_t ff_celt_cache_bits[392]
const uint8_t ff_celt_bit_deinterleave[]
static void celt_normalize_residual(const int *av_restrict iy, float *av_restrict X, int N, float g)
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 uint16_t ff_celt_qn_exp2[]
static uint32_t celt_alg_unquant(OpusRangeCoder *rc, float *X, uint32_t N, uint32_t K, enum CeltSpread spread, uint32_t blocks, float gain, CeltPVQ *pvq)
Decode pulse vector and combine the result with the pitch vector to produce the final normalised sign...
static float ppp_pvq_search_c(float *X, int *y, int K, int N)
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.
static av_always_inline uint32_t quant_band_template(CeltPVQ *pvq, CeltFrame *f, OpusRangeCoder *rc, const int band, float *X, float *Y, int N, int b, uint32_t blocks, float *lowband, int duration, float *lowband_out, int level, float gain, float *lowband_scratch, int fill, int quant)
static uint64_t celt_cwrsi(uint32_t N, uint32_t K, uint32_t i, int *y)
void ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size)
CELT: write a uniformly distributed integer.
static void celt_haar1(float *X, int N0, int stride)
const uint8_t ff_celt_log_freq_range[]
static void celt_stereo_is_decouple(float *X, float *Y, float e_l, float e_r, int N)
static void celt_exp_rotation_impl(float *X, uint32_t len, uint32_t stride, float c, float s)
const uint8_t ff_celt_hadamard_order[]
static int celt_calc_theta(const float *X, const float *Y, int coupling, int N)
static float celt_decode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K)
static QUANT_FN(pvq_decode_band)
int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
const uint32_t *const ff_celt_pvq_u_row[15]
static void celt_exp_rotation(float *X, uint32_t len, uint32_t stride, uint32_t K, enum CeltSpread spread, const int encode)
static int celt_log2tan(int isin, int icos)
static int celt_pulses2bits(const uint8_t *cache, int pulses)
static double val(void *priv, double ch)
static int celt_bits2pulses(const uint8_t *cache, int bits)
static int quant(float coef, const float Q, const float rounding)
Quantize one coefficient.
static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
uint32_t ff_opus_rc_dec_uint(OpusRangeCoder *rc, uint32_t size)
CELT: read a uniform distribution.
static uint32_t celt_alg_quant(OpusRangeCoder *rc, float *X, uint32_t N, uint32_t K, enum CeltSpread spread, uint32_t blocks, float gain, CeltPVQ *pvq)
#define CELT_QTHETA_OFFSET_TWOPHASE
void ff_opus_rc_enc_uint_tri(OpusRangeCoder *rc, uint32_t k, int qn)
static uint32_t celt_icwrsi(uint32_t N, uint32_t K, const int *y)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
const int16_t ff_celt_cache_index[105]
void av_cold ff_celt_pvq_uninit(CeltPVQ **pvq)
#define CELT_QTHETA_OFFSET
static __device__ float sqrtf(float a)
uint32_t ff_opus_rc_dec_uint_tri(OpusRangeCoder *rc, int qn)
static void celt_deinterleave_hadamard(float *tmp, float *X, int N0, int stride, int hadamard)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static int16_t celt_cos(int16_t x)
static char * split(char *message, char delim)
static av_always_inline uint32_t celt_rng(CeltFrame *f)
static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *output)
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
#define ROUND_MUL16(a, b)
void ff_opus_rc_enc_uint_step(OpusRangeCoder *rc, uint32_t val, int k0)
#define i(width, name, range_min, range_max)
void ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count)
CELT: write 0 - 31 bits to the rawbits buffer.
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 value
static void celt_encode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K)
static av_always_inline uint32_t opus_rc_tell_frac(const OpusRangeCoder *rc)
uint32_t ff_opus_rc_dec_uint_step(OpusRangeCoder *rc, int k0)
static void celt_stereo_merge(float *X, float *Y, float mid, int N)
void ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits)
static int celt_compute_qn(int N, int b, int offset, int pulse_cap, int stereo)
void ff_celt_pvq_init_x86(struct CeltPVQ *s)
static void celt_interleave_hadamard(float *tmp, float *X, int N0, int stride, int hadamard)
const uint8_t ff_celt_bit_interleave[]
uint32_t ff_opus_rc_dec_log(OpusRangeCoder *rc, uint32_t bits)
float(* pvq_search)(float *X, int *y, int K, int N)
static const int8_t pulses[4]
Number of non-zero pulses in the MP-MLQ excitation.
static uint32_t celt_extract_collapse_mask(const int *iy, uint32_t N, uint32_t B)
static void celt_stereo_ms_decouple(float *X, float *Y, int N)