ref: 2dd3d3258ab7b3acaccde06f384cd66572bd7e39
parent: f43488cdc2e6b776fc228f074051f095b9b6509f
author: Gregory Maxwell <[email protected]>
date: Fri Jun 5 10:05:51 EDT 2009
For celt_encoder_ctl CELT_SET_LTP is replaced with CELT_SET_PREDICTION which allows the caller to request that frames be independent.
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -79,8 +79,10 @@
int overlap;
int channels;
- int pitch_enabled;
- int pitch_available;
+ 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_t tonal_average;
int fold_decision;
@@ -137,7 +139,9 @@
st->VBR_rate = 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.,8);
st->fold_decision = 1;
@@ -669,14 +673,14 @@
compute_band_energies(st->mode, freq, bandE);
- intra_ener = st->delayedIntra;
- if (intra_decision(bandE, st->oldBandE, st->mode->nbEBands) || shortBlocks)
+ intra_ener = (st->force_intra || st->delayedIntra);
+ if (shortBlocks || intra_decision(bandE, st->oldBandE, st->mode->nbEBands))
st->delayedIntra = 1;
else
st->delayedIntra = 0;
/* 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_available >= MAX_PERIOD) && (!shortBlocks) && !intra_ener;
+ has_pitch = st->pitch_enabled && st->pitch_permitted && (st->pitch_available >= MAX_PERIOD) && (!shortBlocks) && !intra_ener;
#ifdef EXP_PSY
ALLOC(tonality, MAX_PERIOD/4, celt_word16_t);
{
@@ -1013,15 +1017,22 @@
}
}
break;
- case CELT_SET_LTP_REQUEST:
+ case CELT_SET_PREDICTION_REQUEST:
{
int value = va_arg(ap, celt_int32_t);
- if (value<0 || value>1 || (value==1 && st->pitch_available==0))
+ if (value<0 || value>2)
goto bad_arg;
if (value==0)
- st->pitch_enabled = 0;
- else
- st->pitch_enabled = 1;
+ {
+ 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;
case CELT_SET_VBR_RATE_REQUEST:
--- a/libcelt/celt.h
+++ b/libcelt/celt.h
@@ -77,9 +77,13 @@
#define CELT_SET_COMPLEXITY_REQUEST 2
/** Controls the complexity from 0-10 (int) */
#define CELT_SET_COMPLEXITY(x) CELT_SET_COMPLEXITY_REQUEST, _celt_check_int(x)
-#define CELT_SET_LTP_REQUEST 4
-/** Activate or deactivate the use of the long term predictor (PITCH) from 0 or 1 (int) */
-#define CELT_SET_LTP(x) CELT_SET_LTP_REQUEST, _celt_check_int(x)
+#define CELT_SET_PREDICTION_REQUEST 4
+/** Controls the use of interframe prediction.
+ 0=Independent frames
+ 1=Short term interframe prediction allowed
+ 2=Long term prediction allowed
+ */
+#define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, _celt_check_int(x)
#define CELT_SET_VBR_RATE_REQUEST 6
/** Set the target VBR rate in bits per second (int); 0=CBR (default) */
#define CELT_SET_VBR_RATE(x) CELT_SET_VBR_RATE_REQUEST, _celt_check_int(x)