ref: 8cbea177ba1a99c36d15adda77f615f8e80fe212
parent: 30e2493efa11aa09fd5faf4df6cd8711b32d187a
author: Jean-Marc Valin <[email protected]>
date: Thu Aug 5 11:22:57 EDT 2010
Removing pitch prediction code
--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -212,125 +212,6 @@
}
}
-int compute_pitch_gain(const CELTMode *m, const celt_sig *X, const celt_sig *P, int norm_rate, int *gain_id, int _C, celt_word16 *gain_prod, int M)
-{
- int j, c;
- celt_word16 g;
- celt_word16 delta;
- const int C = CHANNELS(_C);
- celt_word32 Sxy=0, Sxx=0, Syy=0;
- int len = M*m->pitchEnd;
- int N = M*m->shortMdctSize;
-#ifdef FIXED_POINT
- int shift = 0;
- celt_word32 maxabs=0;
-
- for (c=0;c<C;c++)
- {
- for (j=0;j<len;j++)
- {
- maxabs = MAX32(maxabs, ABS32(X[j+c*N]));
- maxabs = MAX32(maxabs, ABS32(P[j+c*N]));
- }
- }
- shift = celt_ilog2(maxabs)-12;
- if (shift<0)
- shift = 0;
-#endif
- delta = PDIV32_16(Q15ONE, len);
- for (c=0;c<C;c++)
- {
- celt_word16 gg = Q15ONE;
- for (j=0;j<len;j++)
- {
- celt_word16 Xj, Pj;
- Xj = EXTRACT16(SHR32(X[j+c*N], shift));
- Pj = MULT16_16_P15(gg,EXTRACT16(SHR32(P[j+c*N], shift)));
- Sxy = MAC16_16(Sxy, Xj, Pj);
- Sxx = MAC16_16(Sxx, Pj, Pj);
- Syy = MAC16_16(Syy, Xj, Xj);
- gg = SUB16(gg, delta);
- }
- }
-#ifdef FIXED_POINT
- {
- celt_word32 num, den;
- celt_word16 fact;
- fact = MULT16_16(QCONST16(.04f, 14), norm_rate);
- if (fact < QCONST16(1.f, 14))
- fact = QCONST16(1.f, 14);
- num = Sxy;
- den = EPSILON+Sxx+MULT16_32_Q15(QCONST16(.03f,15),Syy);
- shift = celt_zlog2(Sxy)-16;
- if (shift < 0)
- shift = 0;
- if (Sxy < MULT16_32_Q15(fact, MULT16_16(celt_sqrt(EPSILON+Sxx),celt_sqrt(EPSILON+Syy))))
- g = 0;
- else
- g = DIV32(SHL32(SHR32(num,shift),14),ADD32(EPSILON,SHR32(den,shift)));
-
- /* This MUST round down so that we don't over-estimate the gain */
- *gain_id = EXTRACT16(SHR32(MULT16_16(20,(g-QCONST16(.5f,14))),14));
- }
-#else
- {
- float fact = .04f*norm_rate;
- if (fact < 1)
- fact = 1;
- g = Sxy/(.1f+Sxx+.03f*Syy);
- if (Sxy < .5f*fact*celt_sqrt(1+Sxx*Syy))
- g = 0;
- /* This MUST round down so that we don't over-estimate the gain */
- *gain_id = floor(20*(g-.5f));
- }
-#endif
- /* This prevents the pitch gain from being above 1.0 for too long by bounding the
- maximum error amplification factor to 2.0 */
- g = ADD16(QCONST16(.5f,14), MULT16_16_16(QCONST16(.05f,14),*gain_id));
- *gain_prod = MAX16(QCONST32(1.f, 13), MULT16_16_Q14(*gain_prod,g));
- if (*gain_prod>QCONST32(2.f, 13))
- {
- *gain_id=9;
- *gain_prod = QCONST32(2.f, 13);
- }
-
- if (*gain_id < 0)
- {
- *gain_id = 0;
- return 0;
- } else {
- if (*gain_id > 15)
- *gain_id = 15;
- return 1;
- }
-}
-
-void apply_pitch(const CELTMode *m, celt_sig *X, const celt_sig *P, int gain_id, int pred, int _C, int M)
-{
- int j, c, N;
- celt_word16 gain;
- celt_word16 delta;
- const int C = CHANNELS(_C);
- int len = M*m->pitchEnd;
-
- N = M*m->shortMdctSize;
- gain = ADD16(QCONST16(.5f,14), MULT16_16_16(QCONST16(.05f,14),gain_id));
- delta = PDIV32_16(gain, len);
- if (pred)
- gain = -gain;
- else
- delta = -delta;
- for (c=0;c<C;c++)
- {
- celt_word16 gg = gain;
- for (j=0;j<len;j++)
- {
- X[j+c*N] += SHL32(MULT16_32_Q15(gg,P[j+c*N]),1);
- gg = ADD16(gg, delta);
- }
- }
-}
-
static void stereo_band_mix(const CELTMode *m, celt_norm *X, celt_norm *Y, const celt_ener *bank, int stereo_mode, int bandID, int dir, int N)
{
int i = bandID;
--- a/libcelt/bands.h
+++ b/libcelt/bands.h
@@ -66,17 +66,6 @@
*/
void denormalise_bands(const CELTMode *m, const celt_norm * restrict X, celt_sig * restrict freq, const celt_ener *bands, int end, int _C, int M);
-/** Compute the pitch predictor gain for each pitch band
- * @param m Mode data
- * @param X Spectrum to predict
- * @param P Pitch vector (normalised)
- * @param gains Gain computed for each pitch band (returned)
- * @param bank Square root of the energy for each band
- */
-int compute_pitch_gain(const CELTMode *m, const celt_sig *X, const celt_sig *P, int norm_rate, int *gain_id, int _C, celt_word16 *gain_prod, int M);
-
-void apply_pitch(const CELTMode *m, celt_sig *X, const celt_sig *P, int gain_id, int pred, int _C, int M);
-
int folding_decision(const CELTMode *m, celt_norm *X, celt_word16 *average, int *last_decision, int end, int _C, int M);
#ifdef MEASURE_NORM_MSE
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -78,9 +78,6 @@
int overlap;
int channels;
- int pitch_enabled; /* Complexity level is allowed to use pitch */
- int pitch_permitted; /* Use of the LTP is permitted by the user */
- int pitch_available; /* Amount of pitch buffer available */
int force_intra;
int delayedIntra;
celt_word16 tonal_average;
@@ -101,8 +98,6 @@
celt_sig *in_mem;
celt_sig *out_mem;
- celt_word16 *pitch_buf;
- celt_sig xmem;
celt_word16 *oldBandE;
};
@@ -161,9 +156,6 @@
st->end = st->mode->effEBands;
st->vbr_rate_norm = 0;
- st->pitch_enabled = 1;
- st->pitch_permitted = 1;
- st->pitch_available = 1;
st->force_intra = 0;
st->delayedIntra = 1;
st->tonal_average = QCONST16(1.f,8);
@@ -171,7 +163,6 @@
st->in_mem = celt_alloc(st->overlap*C*sizeof(celt_sig));
st->out_mem = celt_alloc((MAX_PERIOD+st->overlap)*C*sizeof(celt_sig));
- st->pitch_buf = celt_alloc(((MAX_PERIOD>>1)+2)*sizeof(celt_word16));
st->oldBandE = (celt_word16*)celt_alloc(C*mode->nbEBands*sizeof(celt_word16));
@@ -215,7 +206,6 @@
celt_free(st->in_mem);
celt_free(st->out_mem);
- celt_free(st->pitch_buf);
celt_free(st->oldBandE);
st->marker = ENCODERFREED;
@@ -428,13 +418,12 @@
7 /*111 */ | FLAG_INTRA|FLAG_SHORT|FLAG_FOLD
};
-static void encode_flags(ec_enc *enc, int intra_ener, int has_pitch, int shortBlocks, int has_fold)
+static void encode_flags(ec_enc *enc, int intra_ener, int shortBlocks, int has_fold)
{
int i;
int flags=FLAG_NONE;
int flag_bits;
flags |= intra_ener ? FLAG_INTRA : 0;
- flags |= has_pitch ? FLAG_PITCH : 0;
flags |= shortBlocks ? FLAG_SHORT : 0;
flags |= has_fold ? FLAG_FOLD : 0;
for (i=0;i<8;i++)
@@ -459,7 +448,7 @@
}
}
-static void decode_flags(ec_dec *dec, int *intra_ener, int *has_pitch, int *shortBlocks, int *has_fold)
+static void decode_flags(ec_dec *dec, int *intra_ener, int *shortBlocks, int *has_fold)
{
int i;
int flag_bits;
@@ -474,7 +463,6 @@
break;
celt_assert(i<8);
*intra_ener = (flaglist[i]&FLAG_INTRA) != 0;
- *has_pitch = (flaglist[i]&FLAG_PITCH) != 0;
*shortBlocks = (flaglist[i]&FLAG_SHORT) != 0;
*has_fold = (flaglist[i]&FLAG_FOLD ) != 0;
/*printf ("dec %d: %d %d %d %d\n", flag_bits, *intra_ener, *has_pitch, *shortBlocks, *has_fold);*/
@@ -684,8 +672,6 @@
{
#endif
int i, c, N, NN, N4;
- int has_pitch;
- int pitch_index;
int bits;
int has_fold=1;
ec_byte_buffer buf;
@@ -692,7 +678,6 @@
ec_enc _enc;
VARDECL(celt_sig, in);
VARDECL(celt_sig, freq);
- VARDECL(celt_sig, pitch_freq);
VARDECL(celt_norm, X);
VARDECL(celt_ener, bandE);
VARDECL(celt_word16, bandLogE);
@@ -711,8 +696,6 @@
const int C = CHANNELS(st->channels);
int mdct_weight_shift = 0;
int mdct_weight_pos=0;
- int gain_id=0;
- int norm_rate;
int LM, M;
int tf_select;
celt_int32 vbr_rate=0;
@@ -780,7 +763,7 @@
transient_shift = 0;
isTransient = 0;
- resynth = st->pitch_available>0 || optional_resynthesis!=NULL;
+ resynth = optional_resynthesis!=NULL;
if (M > 1 && transient_analysis(in, N+st->overlap, C, &transient_time, &transient_shift, &st->frame_max, st->overlap))
{
@@ -824,38 +807,8 @@
/* Compute MDCTs */
compute_mdcts(st->mode, shortBlocks, in, freq, C, LM);
-
- norm_rate = (nbAvailableBytes-5)*8*(celt_uint32)st->mode->Fs/(C*N)>>10;
- /* Pitch analysis: we do it early to save on the peak stack space */
- /* Don't use pitch if there isn't enough data available yet,
- or if we're using shortBlocks */
- has_pitch = st->pitch_enabled && st->pitch_permitted && (N <= 512)
- && (st->pitch_available >= MAX_PERIOD) && (!shortBlocks)
- && norm_rate < 50;
- if (has_pitch)
- {
- VARDECL(celt_word16, x_lp);
- SAVE_STACK;
- ALLOC(x_lp, (2*N-2*N4)>>1, celt_word16);
- pitch_downsample(in, x_lp, 2*N-2*N4, N, C, &st->xmem, &st->pitch_buf[MAX_PERIOD>>1]);
- pitch_search(st->mode, x_lp, st->pitch_buf, 2*N-2*N4, MAX_PERIOD-(2*N-2*N4), &pitch_index, &st->xmem, M);
- RESTORE_STACK;
- }
-
- /* Deferred allocation after find_spectral_pitch() to reduce
- the peak memory usage */
ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
- ALLOC(pitch_freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
- if (has_pitch)
- {
- compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C, LM);
- has_pitch = compute_pitch_gain(st->mode, freq, pitch_freq, norm_rate, &gain_id, C, &st->gain_prod, M);
- }
-
- if (has_pitch)
- apply_pitch(st->mode, freq, pitch_freq, gain_id, 1, C, M);
-
compute_band_energies(st->mode, freq, bandE, effEnd, C, M);
for (c=0;c<C;c++)
{
@@ -871,7 +824,7 @@
has_fold = 0;
/* Don't use intra energy when we're operating at low bit-rate */
- intra_ener = st->force_intra || (!has_pitch && st->delayedIntra && nbAvailableBytes > st->end);
+ intra_ener = st->force_intra || (st->delayedIntra && nbAvailableBytes > st->end);
if (shortBlocks || intra_decision(bandLogE, st->oldBandE, st->start, effEnd, st->mode->nbEBands, C))
st->delayedIntra = 1;
else
@@ -925,12 +878,7 @@
}
- encode_flags(enc, intra_ener, has_pitch, shortBlocks, has_fold);
- if (has_pitch)
- {
- ec_enc_uint(enc, pitch_index, MAX_PERIOD-(2*N-2*N4));
- ec_enc_uint(enc, gain_id, 16);
- }
+ encode_flags(enc, intra_ener, shortBlocks, has_fold);
if (shortBlocks)
{
if (transient_shift)
@@ -1070,9 +1018,6 @@
measure_norm_mse(st->mode, X, X0, bandE, bandE0, M, N, C);
#endif
- if (st->pitch_available>0 && st->pitch_available<MAX_PERIOD)
- st->pitch_available+=N;
-
if (mdct_weight_shift)
{
mdct_shape(st->mode, X, 0, mdct_weight_pos+1, N, mdct_weight_shift, effEnd, C, 1, M);
@@ -1083,9 +1028,6 @@
CELT_MOVE(st->out_mem, st->out_mem+C*N, C*(MAX_PERIOD+st->overlap-N));
- if (has_pitch)
- apply_pitch(st->mode, freq, pitch_freq, gain_id, 0, C, M);
-
for (c=0;c<C;c++)
for (i=0;i<M*st->mode->eBands[st->start];i++)
freq[c*N+i] = 0;
@@ -1251,14 +1193,6 @@
int value = va_arg(ap, celt_int32);
if (value<0 || value>10)
goto bad_arg;
- if (value<=2) {
- st->pitch_enabled = 0;
- st->pitch_available = 0;
- } else {
- st->pitch_enabled = 1;
- if (st->pitch_available<1)
- st->pitch_available = 1;
- }
}
break;
case CELT_SET_START_BAND_REQUEST:
@@ -1285,13 +1219,10 @@
if (value==0)
{
st->force_intra = 1;
- st->pitch_permitted = 0;
} else if (value==1) {
st->force_intra = 0;
- st->pitch_permitted = 0;
} else {
st->force_intra = 0;
- st->pitch_permitted = 1;
}
}
break;
@@ -1313,8 +1244,6 @@
const CELTMode *mode = st->mode;
int C = st->channels;
- if (st->pitch_available > 0) st->pitch_available = 1;
-
CELT_MEMSET(st->in_mem, 0, st->overlap*C);
CELT_MEMSET(st->out_mem, 0, (MAX_PERIOD+st->overlap)*C);
@@ -1331,9 +1260,7 @@
st->vbr_drift = 0;
st->vbr_offset = 0;
st->vbr_count = 0;
- st->xmem = 0;
st->frame_max = 0;
- CELT_MEMSET(st->pitch_buf, 0, (MAX_PERIOD>>1)+2);
}
break;
default:
@@ -1668,13 +1595,11 @@
{
#endif
int c, i, N, N4;
- int has_pitch, has_fold;
- int pitch_index;
+ int has_fold;
int bits;
ec_dec _dec;
ec_byte_buffer buf;
VARDECL(celt_sig, freq);
- VARDECL(celt_sig, pitch_freq);
VARDECL(celt_norm, X);
VARDECL(celt_ener, bandE);
VARDECL(int, fine_quant);
@@ -1691,7 +1616,6 @@
int mdct_weight_shift=0;
const int C = CHANNELS(st->channels);
int mdct_weight_pos=0;
- int gain_id=0;
int LM, M;
int nbFilledBytes, nbAvailableBytes;
int effEnd;
@@ -1752,7 +1676,7 @@
}
nbAvailableBytes = len-nbFilledBytes;
- decode_flags(dec, &intra_ener, &has_pitch, &isTransient, &has_fold);
+ decode_flags(dec, &intra_ener, &isTransient, &has_fold);
if (isTransient)
shortBlocks = M;
else
@@ -1779,24 +1703,6 @@
transient_shift = 0;
}
- if (has_pitch)
- {
- int maxpitch = MAX_PERIOD-(2*N-2*N4);
- if (maxpitch<0)
- {
- celt_notify("detected pitch when not allowed, bit corruption suspected");
- dec->error |= 1;
- pitch_index = 0;
- has_pitch = 0;
- } else {
- pitch_index = ec_dec_uint(dec, maxpitch);
- gain_id = ec_dec_uint(dec, 16);
- }
- } else {
- pitch_index = 0;
- }
-
-
ALLOC(fine_quant, st->mode->nbEBands, int);
/* Get band energies */
unquant_coarse_energy(st->mode, st->start, st->end, bandE, st->oldBandE, intra_ener, st->mode->prob, dec, C, LM);
@@ -1818,14 +1724,7 @@
unquant_fine_energy(st->mode, st->start, st->end, bandE, st->oldBandE, fine_quant, dec, C);
- ALLOC(pitch_freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
- if (has_pitch)
- {
- /* Pitch MDCT */
- compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C, LM);
- }
-
- /* Decode fixed codebook and merge with pitch */
+ /* Decode fixed codebook */
quant_all_bands(0, st->mode, st->start, st->end, X, C==2 ? X+N : NULL, NULL, pulses, shortBlocks, has_fold, tf_res, 1, len*8, dec, LM);
unquant_energy_finalise(st->mode, st->start, st->end, bandE, st->oldBandE, fine_quant, fine_priority, len*8-ec_dec_tell(dec, 0), dec, C);
@@ -1842,9 +1741,6 @@
CELT_MOVE(st->decode_mem, st->decode_mem+C*N, C*(DECODE_BUFFER_SIZE+st->overlap-N));
-
- if (has_pitch)
- apply_pitch(st->mode, freq, pitch_freq, gain_id, 0, C, M);
for (c=0;c<C;c++)
for (i=0;i<M*st->mode->eBands[st->start];i++)
--- a/libcelt/dump_modes.c
+++ b/libcelt/dump_modes.c
@@ -151,7 +151,6 @@
fprintf(file, "%d,\t/* overlap */\n", mode->overlap);
fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands);
fprintf(file, "%d,\t/* effEBands */\n", mode->effEBands);
- fprintf(file, "%d,\t/* pitchEnd */\n", mode->pitchEnd);
fprintf(file, "{");
for (i=0;i<4;i++)
fprintf(file, WORD16 ", ", mode->preemph[i]);
--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -388,7 +388,6 @@
mode->effEBands = mode->nbEBands;
while (mode->eBands[mode->effEBands] > mode->shortMdctSize)
mode->effEBands--;
- mode->pitchEnd = 4000*(celt_int32)mode->shortMdctSize/Fs;
/* Overlap must be divisible by 4 */
if (mode->nbShortMdcts > 1)
--- a/libcelt/modes.h
+++ b/libcelt/modes.h
@@ -38,7 +38,6 @@
#include "celt.h"
#include "arch.h"
#include "mdct.h"
-#include "pitch.h"
#include "entenc.h"
#include "entdec.h"
@@ -78,7 +77,6 @@
int nbEBands;
int effEBands;
- int pitchEnd;
celt_word16 preemph[4];
const celt_int16 *eBands; /**< Definition for each "pseudo-critical band" */