Go to the documentation of this file.
   28 #include "config_components.h" 
   35 #define ROUND_MUL16(a,b)  ((MUL16(a, b) + 16384) >> 15) 
   37 #define CELT_PVQ_U(n, k) (ff_celt_pvq_u_row[FFMIN(n, k)][FFMAX(n, k)]) 
   38 #define CELT_PVQ_V(n, k) (CELT_PVQ_U(n, k) + CELT_PVQ_U(n, (k) + 1)) 
   42     x = (
MUL16(x, x) + 4096) >> 13;
 
   54     return (ls << 11) - (lc << 11) +
 
   67     for (
i = 0; 
i < 6; 
i++) {
 
   68         int center = (low + 
high + 1) >> 1;
 
   69         if (cache[center] >= 
bits)
 
   75     return (
bits - (low == 0 ? -1 : cache[low]) <= cache[
high] - 
bits) ? low : 
high;
 
   88     for (
i = 0; 
i < 
N; 
i++)
 
  103         *Xptr++      = 
c * x1 - 
s * x2;
 
  111         *Xptr--      = 
c * x1 - 
s * x2;
 
  119     uint32_t stride2 = 0;
 
  128     theta = 
M_PI * gain * gain / 4;
 
  157     int i, j, 
N0 = 
N / 
B;
 
  158     uint32_t collapse_mask = 0;
 
  163     for (
i = 0; 
i < 
B; 
i++)
 
  164         for (j = 0; j < 
N0; j++)
 
  165             collapse_mask |= (!!iy[
i*
N0+j]) << 
i;
 
  166     return collapse_mask;
 
  172     float xp = 0, side = 0;
 
  178     for (
i = 0; 
i < 
N; 
i++) {
 
  186     E[0] = mid2 * mid2 + side - 2 * xp;
 
  187     E[1] = mid2 * mid2 + side + 2 * xp;
 
  188     if (
E[0] < 6e-4
f || 
E[1] < 6e-4
f) {
 
  189         for (
i = 0; 
i < 
N; 
i++)
 
  194     gain[0] = 1.0f / 
sqrtf(
E[0]);
 
  195     gain[1] = 1.0f / 
sqrtf(
E[1]);
 
  197     for (
i = 0; 
i < 
N; 
i++) {
 
  214         for (j = 0; j < 
N0; j++)
 
  217     memcpy(
X, 
tmp, 
N*
sizeof(
float));
 
  227         for (j = 0; j < 
N0; j++)
 
  230     memcpy(
X, 
tmp, 
N*
sizeof(
float));
 
  238         for (j = 0; j < 
N0; j++) {
 
  239             float x0 = 
X[
stride * (2 * j + 0) + 
i];
 
  240             float x1 = 
X[
stride * (2 * j + 1) + 
i];
 
  252     if (stereo && 
N == 2)
 
  259     qn = (qb < (1 << 3 >> 1)) ? 1 : ((
ff_celt_qn_exp2[qb & 0x7] >> (14 - (qb >> 3))) + 1) >> 1 << 1;
 
  266     int i, idx = 0, sum = 0;
 
  267     for (
i = 
N - 1; 
i >= 0; 
i--) {
 
  276 static inline uint64_t 
celt_cwrsi(uint32_t 
N, uint32_t 
K, uint32_t 
i, 
int *y)
 
  302                 for (p = row[
K]; p > 
i; p = row[
K])
 
  314             if (p <= 
i && 
i < q) {
 
  370 #if CONFIG_OPUS_ENCODER 
  375 static float ppp_pvq_search_c(
float *
X, 
int *y, 
int K, 
int N)
 
  378     float res = 0.0f, xy_norm = 0.0f;
 
  380     for (
i = 0; 
i < 
N; 
i++)
 
  383     res = 
K/(res + FLT_EPSILON);
 
  385     for (
i = 0; 
i < 
N; 
i++) {
 
  388         xy_norm += y[
i]*
X[
i];
 
  393         int max_idx = 0, phase = 
FFSIGN(
K);
 
  394         float max_num = 0.0f;
 
  395         float max_den = 1.0f;
 
  398         for (
i = 0; 
i < 
N; 
i++) {
 
  402             const int ca = 1 ^ ((y[
i] == 0) & (phase < 0));
 
  403             const int y_new = y_norm  + 2*phase*
FFABS(y[
i]);
 
  404             float xy_new = xy_norm + 1*phase*
FFABS(
X[
i]);
 
  405             xy_new = xy_new * xy_new;
 
  406             if (ca && (max_den*xy_new) > (y_new*max_num)) {
 
  416         xy_norm += 1*phase*
X[max_idx];
 
  417         y_norm  += 2*phase*y[max_idx];
 
  421     return (
float)y_norm;
 
  426                                enum CeltSpread spread, uint32_t blocks, 
float gain,
 
  442                                  enum CeltSpread spread, uint32_t blocks, 
float gain,
 
  456     float e[2] = { 0.0f, 0.0f };
 
  458         for (
i = 0; 
i < 
N; 
i++) {
 
  459             e[0] += (
X[
i] + 
Y[
i])*(
X[
i] + 
Y[
i]);
 
  460             e[1] += (
X[
i] - 
Y[
i])*(
X[
i] - 
Y[
i]);
 
  463         for (
i = 0; 
i < 
N; 
i++) {
 
  474     const float energy_n = 1.0f/(
sqrtf(e_l*e_l + e_r*e_r) + FLT_EPSILON);
 
  477     for (
i = 0; 
i < 
N; 
i++)
 
  478         X[
i] = e_l*
X[
i] + e_r*
Y[
i];
 
  484     for (
i = 0; 
i < 
N; 
i++) {
 
  485         const float Xret = 
X[
i];
 
  493                                                      const int band, 
float *
X,
 
  494                                                      float *
Y, 
int N, 
int b,
 
  495                                                      uint32_t blocks, 
float *lowband,
 
  497                                                      int level, 
float gain,
 
  498                                                      float *lowband_scratch,
 
  502     const uint8_t *cache;
 
  503     int stereo = !!
Y, 
split = stereo;
 
  504     int imid = 0, iside = 0;
 
  506     int N_B = 
N / blocks;
 
  512     float mid = 0, side = 0;
 
  513     int longblocks = (
B0 == 1);
 
  518         for (
i = 0; 
i <= stereo; 
i++) {
 
  520             if (
f->remaining2 >= 1 << 3) {
 
  527                 f->remaining2 -= 1 << 3;
 
  529             x[0] = 1.0f - 2.0f*sign;
 
  533             lowband_out[0] = 
X[0];
 
  537     if (!stereo && 
level == 0) {
 
  538         int tf_change = 
f->tf_change[band];
 
  541             recombine = tf_change;
 
  545             (recombine || ((N_B & 1) == 0 && tf_change < 0) || 
B0 > 1)) {
 
  546             for (
i = 0; 
i < 
N; 
i++)
 
  547                 lowband_scratch[
i] = lowband[
i];
 
  548             lowband = lowband_scratch;
 
  551         for (k = 0; k < recombine; k++) {
 
  552             if (
quant || lowband)
 
  556         blocks >>= recombine;
 
  560         while ((N_B & 1) == 0 && tf_change < 0) {
 
  561             if (
quant || lowband)
 
  563             fill |= fill << blocks;
 
  573         if (
B0 > 1 && (
quant || lowband))
 
  575                                        N_B >> recombine, 
B0 << recombine,
 
  582     if (!stereo && 
duration >= 0 && 
b > cache[cache[0]] + 12 && 
N > 2) {
 
  588             fill = (fill & 1) | (fill << 1);
 
  589         blocks = (blocks + 1) >> 1;
 
  595         int mbits, sbits, 
delta;
 
  606         qn = (stereo && band >= 
f->intensity_stereo) ? 1 :
 
  611                 itheta = (itheta*qn + 8192) >> 14;
 
  617                 else if (stereo || 
B0 > 1)
 
  621                 itheta = itheta * 16384 / qn;
 
  625                                                 f->block[1].lin_energy[band], 
N);
 
  632                 else if (stereo || 
B0 > 1)
 
  636                 itheta = itheta * 16384 / qn;
 
  640                 inv = 
f->apply_phase_inv ? itheta > 8192 : 0;
 
  642                     for (
i = 0; 
i < 
N; 
i++)
 
  646                                          f->block[1].lin_energy[band], 
N);
 
  648                 if (
b > 2 << 3 && 
f->remaining2 > 2 << 3) {
 
  655                 inv = 
f->apply_phase_inv ? inv : 0;
 
  668         } 
else if (itheta == 16384) {
 
  671             fill &= ((1 << blocks) - 1) << blocks;
 
  681         mid  = imid  / 32768.0f;
 
  682         side = iside / 32768.0f;
 
  687         if (
N == 2 && stereo) {
 
  694             sbits = (itheta != 0 && itheta != 16384) ? 1 << 3 : 0;
 
  697             f->remaining2 -= qalloc+sbits;
 
  703                     sign = x2[0]*y2[1] - x2[1]*y2[0] < 0;
 
  712             cm = pvq->
quant_band(pvq, 
f, rc, band, x2, 
NULL, 
N, mbits, blocks, lowband, 
duration,
 
  713                                  lowband_out, 
level, gain, lowband_scratch, orig_fill);
 
  716             y2[0] = -sign * x2[1];
 
  717             y2[1] =  sign * x2[0];
 
  730             float *next_lowband2     = 
NULL;
 
  731             float *next_lowband_out1 = 
NULL;
 
  738             if (
B0 > 1 && !stereo && (itheta & 0x3fff)) {
 
  749             f->remaining2 -= qalloc;
 
  751             if (lowband && !stereo)
 
  752                 next_lowband2 = lowband + 
N; 
 
  757                 next_lowband_out1 = lowband_out;
 
  759                 next_level = 
level + 1;
 
  761             rebalance = 
f->remaining2;
 
  762             if (mbits >= sbits) {
 
  766                                      lowband, 
duration, next_lowband_out1, next_level,
 
  767                                      stereo ? 1.0
f : (gain * mid), lowband_scratch, fill);
 
  768                 rebalance = mbits - (rebalance - 
f->remaining2);
 
  769                 if (rebalance > 3 << 3 && itheta != 0)
 
  770                     sbits += rebalance - (3 << 3);
 
  776                                       gain * side, 
NULL, fill >> blocks);
 
  777                 cm |= cmt << ((
B0 >> 1) & (stereo - 1));
 
  783                                      gain * side, 
NULL, fill >> blocks);
 
  784                 cm <<= ((
B0 >> 1) & (stereo - 1));
 
  785                 rebalance = sbits - (rebalance - 
f->remaining2);
 
  786                 if (rebalance > 3 << 3 && itheta != 16384)
 
  787                     mbits += rebalance - (3 << 3);
 
  792                                       lowband, 
duration, next_lowband_out1, next_level,
 
  793                                       stereo ? 1.0
f : (gain * mid), lowband_scratch, fill);
 
  800         f->remaining2 -= curr_bits;
 
  803         while (
f->remaining2 < 0 && q > 0) {
 
  804             f->remaining2 += curr_bits;
 
  806             f->remaining2 -= curr_bits;
 
  813                                     f->spread, blocks, gain, pvq);
 
  816                                       f->spread, blocks, gain, pvq);
 
  820             uint32_t cm_mask = (1 << blocks) - 1;
 
  825                     for (
i = 0; 
i < 
N; 
i++)
 
  830                     for (
i = 0; 
i < 
N; 
i++) {
 
  832                         X[
i] = lowband[
i] + (((
celt_rng(
f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256);
 
  838                 memset(
X, 0, 
N*
sizeof(
float));
 
  848             for (
i = 0; 
i < 
N; 
i++)
 
  851     } 
else if (
level == 0) {
 
  857                                      B0 << recombine, longblocks);
 
  862         for (k = 0; k < time_divide; k++) {
 
  869         for (k = 0; k < recombine; k++) {
 
  873         blocks <<= recombine;
 
  878             for (
i = 0; 
i < 
N0; 
i++)
 
  879                 lowband_out[
i] = n * 
X[
i];
 
  889 #if CONFIG_OPUS_DECODER 
  890     return quant_band_template(pvq, 
f, rc, band, 
X, 
Y, 
N, 
b, blocks, lowband, 
duration,
 
  891                                lowband_out, 
level, gain, lowband_scratch, fill, 0);
 
  899 #if CONFIG_OPUS_ENCODER 
  900     return quant_band_template(pvq, 
f, rc, band, 
X, 
Y, 
N, 
b, blocks, lowband, 
duration,
 
  901                                lowband_out, 
level, gain, lowband_scratch, fill, 1);
 
  913     s->quant_band = 
encode ? pvq_encode_band : pvq_decode_band;
 
  915 #if CONFIG_OPUS_ENCODER 
  916     s->pvq_search = ppp_pvq_search_c;
 
  
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 void celt_interleave_hadamard(float *tmp, float *X, int N0, int stride, int hadamard)
 
static int celt_log2tan(int isin, int icos)
 
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
 
#define ROUND_MUL16(a, b)
 
static QUANT_FN(pvq_decode_band)
 
uint32_t ff_opus_rc_dec_uint_step(OpusRangeCoder *rc, int k0)
 
static void celt_exp_rotation_impl(float *X, uint32_t len, uint32_t stride, float c, float s)
 
static uint64_t celt_cwrsi(uint32_t N, uint32_t K, uint32_t i, int *y)
 
static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
 
static int celt_compute_qn(int N, int b, int offset, int pulse_cap, int stereo)
 
#define CELT_QTHETA_OFFSET
 
static void celt_normalize_residual(const int *restrict iy, float *restrict X, int N, float g)
 
static uint32_t celt_icwrsi(uint32_t N, uint32_t K, const int *y)
 
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)
 
#define CELT_QTHETA_OFFSET_TWOPHASE
 
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)
 
static void celt_stereo_is_decouple(float *X, float *Y, float e_l, float e_r, int N)
 
uint32_t ff_opus_rc_dec_uint(OpusRangeCoder *rc, uint32_t size)
CELT: read a uniform distribution.
 
void ff_opus_rc_enc_uint_tri(OpusRangeCoder *rc, uint32_t k, int qn)
 
static double val(void *priv, double ch)
 
static av_always_inline uint32_t celt_rng(CeltFrame *f)
 
static float celt_decode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K)
 
static const uint8_t quant[64]
 
const uint8_t ff_celt_cache_bits[392]
 
const uint8_t ff_celt_log_freq_range[]
 
static void celt_stereo_merge(float *X, float *Y, float mid, int N)
 
uint32_t ff_opus_rc_dec_uint_tri(OpusRangeCoder *rc, int qn)
 
void av_cold ff_celt_pvq_uninit(CeltPVQ **pvq)
 
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
 
static av_always_inline uint32_t opus_rc_tell_frac(const OpusRangeCoder *rc)
 
static int celt_bits2pulses(const uint8_t *cache, int bits)
 
static int BS_FUNC() tell(const BSCTX *bc)
Return number of bits already read.
 
uint32_t ff_opus_rc_dec_log(OpusRangeCoder *rc, uint32_t bits)
 
const uint8_t ff_celt_hadamard_order[]
 
static void celt_stereo_ms_decouple(float *X, float *Y, int N)
 
static __device__ float sqrtf(float a)
 
const uint32_t *const ff_celt_pvq_u_row[15]
 
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 void celt_encode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K)
 
static int celt_pulses2bits(const uint8_t *cache, int pulses)
 
static uint32_t celt_extract_collapse_mask(const int *iy, uint32_t N, uint32_t B)
 
static void celt_haar1(float *X, int N0, int stride)
 
const uint8_t ff_celt_bit_interleave[]
 
static char * split(char *message, char delim)
 
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 i(width, name, range_min, range_max)
 
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...
 
const uint8_t ff_celt_bit_deinterleave[]
 
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_exp_rotation(float *X, uint32_t len, uint32_t stride, uint32_t K, enum CeltSpread spread, const int encode)
 
void ff_celt_pvq_init_x86(struct CeltPVQ *s)
 
static void celt_deinterleave_hadamard(float *tmp, float *X, int N0, int stride, int hadamard)
 
const int16_t ff_celt_cache_index[105]
 
static int celt_calc_theta(const float *X, const float *Y, int coupling, int N)
 
int av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode)
 
void ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count)
CELT: write 0 - 31 bits to the rawbits buffer.
 
static int16_t celt_cos(int16_t x)
 
const uint16_t ff_celt_qn_exp2[]
 
float(* pvq_search)(float *X, int *y, int K, int N)
 
void ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits)
 
static const int8_t pulses[4]
Number of non-zero pulses in the MP-MLQ excitation.
 
void ff_opus_rc_enc_uint_step(OpusRangeCoder *rc, uint32_t val, int k0)
 
void ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size)
CELT: write a uniformly distributed integer.