For celt_encoder_ctl CELT_SET_LTP is replaced with CELT_SET_PREDICTION
authorGregory Maxwell <greg@xiph.org>
Fri, 5 Jun 2009 18:05:51 +0000 (14:05 -0400)
committerGregory Maxwell <greg@xiph.org>
Fri, 5 Jun 2009 18:47:21 +0000 (14:47 -0400)
which allows the caller to request that frames be independent.

libcelt/celt.c
libcelt/celt.h

index ec4d4bd..0cdf97f 100644 (file)
@@ -79,8 +79,10 @@ struct CELTEncoder {
    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 @@ CELTEncoder *celt_encoder_create(const CELTMode *mode)
 
    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 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig_t * pcm, celt_si
 
    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 @@ int celt_encoder_ctl(CELTEncoder * restrict st, int request, ...)
          }   
       }
       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:
index 9fc366a..271e0a3 100644 (file)
@@ -77,9 +77,13 @@ extern "C" {
 #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)