Completed VBR for 0.5.0 release Speex-0.5.0
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 11 Jul 2002 06:10:37 +0000 (06:10 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 11 Jul 2002 06:10:37 +0000 (06:10 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3573 0101bb08-14d6-0310-b084-bc0e0c8e3800

Speex.spec
libspeex/modes.c
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/sb_celp.c
libspeex/speex.h
libspeex/testenc.c
libspeex/testenc_wb.c
libspeex/vbr.c
src/speexenc.c

index 360d394..2051649 100644 (file)
@@ -1,5 +1,5 @@
 %define name     Speex
-%define ver      0.4.0
+%define ver      0.5.0
 %define rel      1
 
 Summary: An open-source, patent-free speech codec
index 3ec667d..e23290e 100644 (file)
@@ -182,8 +182,8 @@ SpeexSubmode nb_submode2 = {
    split_cb_search_nogain2,
    split_cb_nogain_unquant,
    &split_cb_nb_vlbr,
-   nb_post_filter,
-   &pf_params_lbr
+   NULL,
+   NULL
 };
 
 
@@ -283,7 +283,7 @@ SpeexMode speex_nb_mode = {
    &nb_mode,
    "narrowband",
    0,
-   2,
+   3,
    &nb_encoder_init,
    &nb_encoder_destroy,
    &nb_encode,
@@ -376,7 +376,7 @@ SpeexMode speex_wb_mode = {
    &sb_wb_mode,
    "full-rate wideband (sub-band CELP)",
    1,
-   2,
+   3,
    &sb_encoder_init,
    &sb_encoder_destroy,
    &sb_encode,
index ef22060..76ecb98 100644 (file)
@@ -132,6 +132,8 @@ void *nb_encoder_init(SpeexMode *m)
    if (1) {
       st->vbr = malloc(sizeof(VBRState));
       vbr_init(st->vbr);
+      st->vbr_quality = 8;
+      st->vbr_enabled = 0;
    } else {
       st->vbr = 0;
    }
@@ -187,7 +189,7 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
    int ol_pitch;
    float ol_pitch_coef;
    float ol_gain;
-   float vbr_qual=0;
+   float delta_qual=0;
 
    st=state;
    
@@ -274,14 +276,17 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
 
    /*Experimental VBR stuff*/
    if (st->vbr)
-      vbr_qual = vbr_analysis(st->vbr, in, st->frameSize, ol_pitch, ol_pitch_coef);
-   if (0) {
-      int qual = (int)floor(3.2+1*vbr_qual+.5);
-      if (qual<0)
-         qual=0;
-      if (qual>10)
-         qual=10;
-      speex_encoder_ctl(state, SPEEX_SET_QUALITY, &qual);
+   {
+      delta_qual = vbr_analysis(st->vbr, in, st->frameSize, ol_pitch, ol_pitch_coef);
+      if (st->vbr_enabled) 
+      {
+         int qual = (int)floor(st->vbr_quality+delta_qual+.5);
+         if (qual<0)
+            qual=0;
+         if (qual>10)
+            qual=10;
+         speex_encoder_ctl(state, SPEEX_SET_QUALITY, &qual);
+      }
    }
    /*printf ("VBR quality = %f\n", vbr_qual);*/
 
@@ -961,6 +966,21 @@ void nb_encoder_ctl(void *state, int request, void *ptr)
    case SPEEX_SET_MODE:
       st->submodeID = (*(int*)ptr);
       break;
+   case SPEEX_GET_MODE:
+      (*(int*)ptr) = st->submodeID;
+      break;
+   case SPEEX_SET_VBR:
+      st->vbr_enabled = (*(int*)ptr);
+      break;
+   case SPEEX_GET_VBR:
+      (*(int*)ptr) = st->vbr_enabled;
+      break;
+   case SPEEX_SET_VBR_QUALITY:
+      st->vbr_quality = (*(int*)ptr);
+      break;
+   case SPEEX_GET_VBR_QUALITY:
+      (*(int*)ptr) = st->vbr_quality;
+      break;
    case SPEEX_SET_QUALITY:
       {
          int quality = (*(int*)ptr);
index 13616a4..21712c6 100644 (file)
@@ -75,6 +75,8 @@ typedef struct EncState {
    float *mem_sp, *mem_sw;
    float *pi_gain;
    VBRState *vbr;
+   int    vbr_quality;
+   int    vbr_enabled;
 
    SpeexSubmode **submodes;
    int    submodeID;
index a891b62..e18b29a 100644 (file)
@@ -923,6 +923,18 @@ void sb_encoder_ctl(void *state, int request, void *ptr)
    case SPEEX_SET_LOW_MODE:
       speex_encoder_ctl(st->st_low, SPEEX_SET_MODE, ptr);
       break;
+   case SPEEX_SET_VBR:
+      speex_encoder_ctl(st->st_low, SPEEX_SET_VBR, ptr);
+      break;
+   case SPEEX_SET_VBR_QUALITY:
+      {
+         int qual = (*(int*)ptr)+1;
+         if (qual>10)
+            qual=10;
+         speex_encoder_ctl(st->st_low, SPEEX_SET_VBR_QUALITY, &qual);
+         speex_encoder_ctl(state, SPEEX_SET_QUALITY, ptr);
+         break;
+      }
    case SPEEX_SET_QUALITY:
       {
          int nb_mode;
index d6a03ee..2a40f9a 100644 (file)
@@ -41,6 +41,10 @@ extern "C" {
 #define SPEEX_GET_LOW_MODE 9
 #define SPEEX_SET_HIGH_MODE 10
 #define SPEEX_GET_HIGH_MODE 11
+#define SPEEX_SET_VBR 12
+#define SPEEX_GET_VBR 13
+#define SPEEX_SET_VBR_QUALITY 14
+#define SPEEX_GET_VBR_QUALITY 15
 
 
 #define SPEEX_NB_MODES 2
index 9848840..74d1feb 100644 (file)
@@ -16,15 +16,20 @@ int main(int argc, char **argv)
    void *st;
    void *dec;
    SpeexBits bits;
-   int pf;
+   int tmp;
+   int bitCount=0;
 
    for (i=0;i<FRAME_SIZE;i++)
       bak2[i]=0;
    st = speex_encoder_init(&speex_nb_mode);
    dec = speex_decoder_init(&speex_nb_mode);
 
-   pf=0;
-   speex_decoder_ctl(dec, SPEEX_SET_PF, &pf);
+   tmp=1;
+   speex_decoder_ctl(dec, SPEEX_SET_PF, &tmp);
+   tmp=0;
+   speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp);
+   tmp=10;
+   speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp);
 
    if (argc != 4 && argc != 3)
    {
@@ -51,6 +56,7 @@ int main(int argc, char **argv)
       speex_bits_reset(&bits);
       speex_encode(st, input, &bits);
       nbBits = speex_bits_write(&bits, cbits, 200);
+      bitCount+=bits.nbBits;
       printf ("Encoding frame in %d bits\n", nbBits*8);
       if (argc==4)
          fwrite(cbits, 1, nbBits, fbits);
@@ -83,6 +89,7 @@ int main(int argc, char **argv)
          bak2[i]=bak[i];
       fwrite(in, sizeof(short), FRAME_SIZE, fout);
    }
+   fprintf (stderr, "Total encoded size: %d bits\n", bitCount);
    
    speex_encoder_destroy(st);
    speex_decoder_destroy(dec);
index c1fdf72..d2dcc08 100644 (file)
@@ -17,6 +17,7 @@ int main(int argc, char **argv)
    void *dec;
    SpeexBits bits;
    int pf;
+   int bitCount;
 
    for (i=0;i<FRAME_SIZE;i++)
       bak2[i]=0;
@@ -25,8 +26,10 @@ int main(int argc, char **argv)
 
    pf=0;
    speex_decoder_ctl(dec, SPEEX_SET_PF, &pf);
+   pf=1;
+   speex_encoder_ctl(st, SPEEX_SET_VBR, &pf);
    pf=10;
-   speex_encoder_ctl(st, SPEEX_SET_QUALITY, &pf);
+   speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &pf);
 
    if (argc != 4 && argc != 3)
    {
@@ -53,6 +56,7 @@ int main(int argc, char **argv)
       speex_bits_reset(&bits);
       speex_encode(st, input, &bits);
       nbBits = speex_bits_write(&bits, cbits, 200);
+      bitCount+=bits.nbBits;
       printf ("Encoding frame in %d bits\n", nbBits*8);
       if (argc==4)
          fwrite(cbits, 1, nbBits, fbits);
@@ -86,6 +90,7 @@ int main(int argc, char **argv)
       fwrite(in, sizeof(short), FRAME_SIZE, fout);
    }
    
+   fprintf (stderr, "Total encoded size: %d bits\n", bitCount);
    speex_encoder_destroy(st);
    speex_decoder_destroy(dec);
    return 1;
index c6a4999..62c2dc8 100644 (file)
@@ -142,11 +142,11 @@ float vbr_analysis(VBRState *vbr, float *sig, int len, int pitch, float pitch_co
    } else {
       /* Checking for energy increases */
       if (ener > vbr->last_energy*4.0)
-         qual += 1;
+         qual += .7;
       if (ener > vbr->last_energy*1.8)
-         qual += 1;
+         qual += .7;
       if (ener > 3*vbr->average_energy)
-         qual += 1;
+         qual += .7;
       if (ener2 > 1.6*ener1)
          qual += .7;
       if (ener2 < .6*ener1)
@@ -165,6 +165,13 @@ float vbr_analysis(VBRState *vbr, float *sig, int len, int pitch, float pitch_co
    if (qual>3)
       qual=3;
 
+   if (vbr->consec_noise>=1)
+      qual-=1.2;
+   if (vbr->consec_noise>=4)
+      qual-=1.2;
+   if (vbr->consec_noise>=8)
+      qual-=1.2;
+
    vbr->last_pitch_coef = pitch_coef;
    vbr->last_quality = qual;
 
index 96cf203..9ab5146 100644 (file)
@@ -61,6 +61,7 @@ void usage()
    fprintf (stderr, "  --wideband   -w    Wideband (16 kHz) input file\n"); 
    fprintf (stderr, "  --quality n        Encoding quality setting from 0 to 10\n"); 
    fprintf (stderr, "  --lbr              Low bit-rate mode (equivalent to --quality 3)\n"); 
+   fprintf (stderr, "  --vbr              Enable variable bit-rate (VBR)\n"); 
    fprintf (stderr, "  --help       -h    This help\n"); 
    fprintf (stderr, "  --version    -v    Version information\n"); 
    fprintf (stderr, "\n");  
@@ -83,6 +84,7 @@ int main(int argc, char **argv)
    short in[MAX_FRAME_SIZE];
    float input[MAX_FRAME_SIZE];
    int frame_size;
+   int vbr_enabled;
    int i,nbBytes;
    SpeexMode *mode=NULL;
    void *st;
@@ -93,6 +95,7 @@ int main(int argc, char **argv)
       {"wideband", no_argument, NULL, 0},
       {"narrowband", no_argument, NULL, 0},
       {"lbr", no_argument, NULL, 0},
+      {"vbr", no_argument, NULL, 0},
       {"quality", required_argument, NULL, 0},
       {"help", no_argument, NULL, 0},
       {"version", no_argument, NULL, 0},
@@ -126,6 +129,8 @@ int main(int argc, char **argv)
                wideband=1;
          else if (strcmp(long_options[option_index].name,"lbr")==0)
                lbr=1;
+         else if (strcmp(long_options[option_index].name,"vbr")==0)
+               vbr_enabled=1;
          else if (strcmp(long_options[option_index].name,"quality")==0)
          {
             quality = atoi (optarg);
@@ -282,13 +287,22 @@ int main(int argc, char **argv)
    }
 
    speex_encoder_ctl(st, SPEEX_GET_FRAME_SIZE, &frame_size);
+   if (vbr_enabled)
+   {
+      int tmp;
+      tmp=1;
+      speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp);
+   }
    if (lbr || quality != -1)
    {
       int tmp=quality;
       if (quality==-1)
          tmp = 3;
       speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp);
+      if (vbr_enabled)
+         speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &tmp);
    }
+
    /*Main encoding loop (one frame per iteration)*/
    while (1)
    {