Moved modeID check in nb_celp/sb_celp
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 27 Aug 2002 20:57:44 +0000 (20:57 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 27 Aug 2002 20:57:44 +0000 (20:57 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3881 0101bb08-14d6-0310-b084-bc0e0c8e3800

doc/manual.lyx
libspeex/modes.c
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/sb_celp.c
libspeex/sb_celp.h
libspeex/speex.h
src/speexdec.c

index aaab86e..2cf49e4 100644 (file)
@@ -129,10 +129,10 @@ All this led us to the choice of CELP as the encoding technique to use for
  
 \layout Standard
 
-Strenghts & features
+The main characteristics can be summerized as follows:
 \layout Itemize
 
-Open-source, IPR-free
+Free software/open-source, royalty-free
 \layout Itemize
 
 Integration of wideband and narrowband in the same bit-stream
@@ -144,6 +144,9 @@ Wide range of bit-rates available
 Dynamic bit-rate switching and variable bit-rate (VBR)
 \layout Itemize
 
+Voice Activity Detection (VAD, integrated with VBR)
+\layout Itemize
+
 Variable complexity
 \layout Section
 \pagebreak_top 
index 3331b0d..dee746a 100644 (file)
@@ -468,20 +468,7 @@ void speex_decoder_destroy(void *state)
 
 int speex_decode(void *state, SpeexBits *bits, float *out)
 {
-   int m = speex_bits_peek_unsigned(bits, 5);
-   if (m==15)
-   {
-      return -1;
-   } else if (m==14)
-   {
-      int req_size = speex_bits_unpack_unsigned(bits, 6);
-      speex_bits_advance(bits, 8*req_size);
-   } else if (m>7)
-   {
-      return -2;
-   }
-   (*((SpeexMode**)state))->dec(state, bits, out);
-   return 0;
+   return (*((SpeexMode**)state))->dec(state, bits, out);
 }
 
 
index 5212653..3699a30 100644 (file)
@@ -317,6 +317,8 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
             qual=0;
          if (qual>10)
             qual=10;
+         if (qual==10 && st->vbr_quality<10)
+            qual=9;
          speex_encoder_ctl(state, SPEEX_SET_QUALITY, &qual);
       }
    }
@@ -824,7 +826,7 @@ static void nb_decode_lost(DecState *st, float *out)
 }
 
 
-void nb_decode(void *state, SpeexBits *bits, float *out)
+int nb_decode(void *state, SpeexBits *bits, float *out)
 {
    DecState *st;
    int i, sub;
@@ -836,13 +838,27 @@ void nb_decode(void *state, SpeexBits *bits, float *out)
    int best_pitch=40;
    float best_pitch_gain=-1;
    int wideband;
+   int m;
 
    st=state;
 
    if (!bits)
    {
       nb_decode_lost(st, out);
-      return;
+      return 0;
+   }
+
+   m = speex_bits_peek_unsigned(bits, 5);
+   if (m==15)
+   {
+      return -1;
+   } else if (m==14)
+   {
+      int req_size = speex_bits_unpack_unsigned(bits, 6);
+      speex_bits_advance(bits, 8*req_size);
+   } else if (m>7)
+   {
+      return -2;
    }
 
    wideband = speex_bits_unpack_unsigned(bits, 1);
@@ -884,7 +900,7 @@ void nb_decode(void *state, SpeexBits *bits, float *out)
          out[i]=st->frame[i] + st->preemph*out[i-1];
       st->pre_mem=out[st->frameSize-1];
       st->count_lost=0;
-      return;
+      return 0;
    }
 
    /* Unquantize LSPs */
@@ -1099,6 +1115,8 @@ void nb_decode(void *state, SpeexBits *bits, float *out)
    st->count_lost=0;
    st->last_pitch = best_pitch;
    st->last_pitch_gain = best_pitch_gain;
+
+   return 0;
 }
 
 void nb_encoder_ctl(void *state, int request, void *ptr)
index 9714692..e43470d 100644 (file)
@@ -139,7 +139,7 @@ void *nb_decoder_init(SpeexMode *m);
 void nb_decoder_destroy(void *state);
 
 /**Decodes one frame*/
-void nb_decode(void *state, SpeexBits *bits, float *out);
+int nb_decode(void *state, SpeexBits *bits, float *out);
 
 void nb_encoder_ctl(void *state, int request, void *ptr);
 
index 7b81522..2f1b924 100644 (file)
@@ -714,20 +714,27 @@ static void sb_decode_lost(SBDecState *st, float *out)
    return;
 }
 
-void sb_decode(void *state, SpeexBits *bits, float *out)
+int sb_decode(void *state, SpeexBits *bits, float *out)
 {
    int i, sub;
    SBDecState *st;
    int wideband;
+   int ret;
 
    st = state;
    /* Decode the low-band */
-   nb_decode(st->st_low, bits, st->x0d);
+   ret = nb_decode(st->st_low, bits, st->x0d);
+
+   /* If error decoding the narrowband part, propagate error */
+   if (ret!=0)
+   {
+      return ret;
+   }
 
    if (!bits)
    {
       sb_decode_lost(st, out);
-      return;
+      return 0;
    }
 
    /*Check "wideband bit"*/
@@ -771,7 +778,7 @@ void sb_decode(void *state, SpeexBits *bits, float *out)
       for (i=0;i<st->full_frame_size;i++)
          out[i]=2*(st->y0[i]-st->y1[i]);
 
-      return;
+      return 0;
 
    }
 
@@ -895,6 +902,7 @@ void sb_decode(void *state, SpeexBits *bits, float *out)
 
    st->first=0;
 
+   return 0;
 }
 
 
index 1ed9b8e..f2251bf 100644 (file)
@@ -127,7 +127,7 @@ void *sb_decoder_init(SpeexMode *m);
 void sb_decoder_destroy(void *state);
 
 /**Decodes one frame*/
-void sb_decode(void *state, SpeexBits *bits, float *out);
+int sb_decode(void *state, SpeexBits *bits, float *out);
 
 void sb_encoder_ctl(void *state, int request, void *ptr);
 
index 2a0630c..840a7bc 100644 (file)
@@ -72,7 +72,7 @@ typedef void (*encoder_destroy_func)(void *st);
 typedef void (*encode_func)(void *state, float *in, SpeexBits *bits);
 typedef void *(*decoder_init_func)(struct SpeexMode *mode);
 typedef void (*decoder_destroy_func)(void *st);
-typedef void (*decode_func)(void *state, SpeexBits *bits, float *out);
+typedef int  (*decode_func)(void *state, SpeexBits *bits, float *out);
 typedef void (*encoder_ctl_func)(void *state, int request, void *ptr);
 typedef void (*decoder_ctl_func)(void *state, int request, void *ptr);
 
index 4ab9a80..383fbeb 100644 (file)
@@ -119,7 +119,7 @@ FILE *out_file_open(char *outFile, int rate)
             perror(outFile);
             exit(1);
          }
-         if (strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(inFile+strlen(inFile)-4,".WAV")==0)
+         if (strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(outFile+strlen(outFile)-4,".WAV")==0)
             write_wav_header(fout, rate, 1, 0, 0);
       }
    }