Added speex_ctl call to set codec parameters (e.g. enable/disable
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 3 Jun 2002 02:14:19 +0000 (02:14 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 3 Jun 2002 02:14:19 +0000 (02:14 +0000)
post-filter)

git-svn-id: http://svn.xiph.org/trunk/speex@3339 0101bb08-14d6-0310-b084-bc0e0c8e3800

13 files changed:
OPTIMIZE [new file with mode: 0644]
Speex.spec
Speex.spec.in
configure.in
libspeex/modes.c
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/sb_celp.c
libspeex/sb_celp.h
libspeex/speex.h
libspeex/testenc.c
libspeex/testenc_wb.c
src/speexdec.c

diff --git a/OPTIMIZE b/OPTIMIZE
new file mode 100644 (file)
index 0000000..d36f5f7
--- /dev/null
+++ b/OPTIMIZE
@@ -0,0 +1,10 @@
+Narrowband:
+
+- pitch_gain_search_3tap calls syn_filt_zero more times than it should (we're
+computing some things twice)
+
+Wideband
+
+- All narrowband optimizations apply
+- Lots of time spent in the codebook search. We could speed that up by using
+  a hierarchical codebook
index 27ff2a1..749cae0 100644 (file)
@@ -8,7 +8,7 @@ Version: %ver
 Release: %rel
 Copyright: LGPL
 Group: Application/Devel
-Source: http://download.sourceforge.net/speex/%{name}-%{ver}.tar.gz
+Source: http://prdownloads.sourceforge.net/speex/%{name}-%{ver}.tar.gz
 URL: http://speex.sourceforge.net/
 Vendor: Speex
 Packager: Jean-Marc Valin (jean-marc.valin@hermes.usherb.ca)
index 462857a..9948d5f 100644 (file)
@@ -8,7 +8,7 @@ Version: %ver
 Release: %rel
 Copyright: LGPL
 Group: Application/Devel
-Source: http://download.sourceforge.net/speex/%{name}-%{ver}.tar.gz
+Source: http://prdownloads.sourceforge.net/speex/%{name}-%{ver}.tar.gz
 URL: http://speex.sourceforge.net/
 Vendor: Speex
 Packager: Jean-Marc Valin (jean-marc.valin@hermes.usherb.ca)
index 3e5e5eb..f5e5da4 100644 (file)
@@ -4,7 +4,7 @@ AC_INIT(libspeex/speex.h)
 
 SPEEX_MAJOR_VERSION=0
 SPEEX_MINOR_VERSION=1
-SPEEX_MICRO_VERSION=1
+SPEEX_MICRO_VERSION=2
 SPEEX_VERSION=$SPEEX_MAJOR_VERSION.$SPEEX_MINOR_VERSION.$SPEEX_MICRO_VERSION
 SPEEX_BINARY_AGE=0
 SPEEX_INTERFACE_AGE=0
index 0b7fc06..9679b1a 100644 (file)
@@ -141,6 +141,7 @@ SpeexMode low_wb_mode = {
    &nb_decoder_init,
    &nb_decoder_destroy,
    &nb_decode,
+   &nb_ctl,
    160
 };
 
@@ -152,6 +153,7 @@ SpeexMode speex_nb_mode = {
    &nb_decoder_init,
    &nb_decoder_destroy,
    &nb_decode,
+   &nb_ctl,
    160
 };
 
@@ -186,6 +188,7 @@ SpeexMode speex_wb_mode = {
    &sb_decoder_init,
    &sb_decoder_destroy,
    &sb_decode,
+   &sb_ctl,
    320
 };
 
@@ -221,3 +224,9 @@ void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
 {
    (*((SpeexMode**)state))->dec(state, bits, out, lost);
 }
+
+
+void speex_ctl(void *state, int request, void *ptr)
+{
+   (*((SpeexMode**)state))->ctl(state, request, ptr);
+}
index 72c769a..003eb18 100644 (file)
@@ -585,6 +585,7 @@ void *nb_decoder_init(SpeexMode *m)
 
    st->post_filter_func = mode->post_filter_func;
    st->post_filter_params = mode->post_filter_params;
+   st->pf_enabled=0;
 
    st->stack = calloc(10000, sizeof(float));
 
@@ -717,7 +718,7 @@ void nb_decode(void *state, SpeexBits *bits, float *out, int lost)
       for (i=0;i<st->subframeSize;i++)
          exc2[i]=exc[i];
 
-      if (1)
+      if (st->pf_enabled)
          st->post_filter_func(exc, exc2, st->interp_qlpc, st->lpcSize, st->subframeSize,
                               pitch, pitch_gain, st->post_filter_params, st->stack);
 
@@ -744,3 +745,20 @@ void nb_decode(void *state, SpeexBits *bits, float *out, int lost)
    st->first = 0;
 
 }
+
+
+void nb_ctl(void *state, int request, void *ptr)
+{
+   switch(request)
+   {
+   case SPEEX_SET_PF:
+      {
+         DecState *st;
+         st=state;     
+         st->pf_enabled = *((int*)ptr);
+      }
+      break;
+   default:
+      fprintf(stderr, "Unknown nb_ctl request: %d\n", request);
+   }
+}
index 8a96a23..5739d0f 100644 (file)
@@ -122,7 +122,7 @@ typedef struct DecState {
    void             *innovation_params;
    nb_post_filter_func post_filter_func;
    void             *post_filter_params;
-
+   int               pf_enabled;
 } DecState;
 
 /**Initializes encoder state*/
@@ -144,6 +144,7 @@ void nb_decoder_destroy(void *state);
 /**Decodes one frame*/
 void nb_decode(void *state, SpeexBits *bits, float *out, int lost);
 
+void nb_ctl(void *state, int request, void *ptr);
 
 
 #endif
index 6e2049f..9538bd0 100644 (file)
@@ -867,3 +867,21 @@ void sb_decode(void *state, SpeexBits *bits, float *out, int lost)
    st->first=0;
 
 }
+
+
+void sb_ctl(void *state, int request, void *ptr)
+{
+   switch(request)
+   {
+   case SPEEX_SET_PF:
+      {
+         SBDecState *st;
+         st=state;
+         speex_ctl(st->st_low, request, ptr);
+      }
+      break;
+   default:
+      fprintf(stderr, "Unknown nb_ctl request: %d\n", request);
+   }
+
+}
index e49131a..12a9342 100644 (file)
@@ -139,5 +139,7 @@ void sb_decoder_destroy(void *state);
 /**Decodes one frame*/
 void sb_decode(void *state, SpeexBits *bits, float *out, int lost);
 
+void sb_ctl(void *state, int request, void *ptr);
+
 
 #endif
index 25c4ae7..263d432 100644 (file)
@@ -28,6 +28,8 @@
 extern "C" {
 #endif
 
+#define SPEEX_SET_PF 0
+
 struct SpeexMode;
 
 typedef void *(*encoder_init_func)(struct SpeexMode *mode);
@@ -36,6 +38,7 @@ 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, int lost);
+typedef void (*ctl_func)(void *state, int request, void *ptr);
 
 /** Struct defining a Speex mode */ 
 typedef struct SpeexMode {
@@ -60,6 +63,9 @@ typedef struct SpeexMode {
    /** Pointer to frame decoding function */
    decode_func dec;
 
+   /** ioctl-like requests for codec state */
+   ctl_func ctl;
+
    /** Frame size used for the current mode */
    int frameSize;
 
@@ -91,6 +97,9 @@ void speex_decoder_destroy(void *state);
     bits. The output speech is saved written to out. */
 void speex_decode(void *state, SpeexBits *bits, float *out, int lost);
 
+
+void speex_ctl(void *state, int request, void *ptr);
+
 /** Default narrowband mode */
 extern SpeexMode speex_nb_mode;
 
index fe67200..6ae167c 100644 (file)
@@ -16,11 +16,16 @@ int main(int argc, char **argv)
    void *st;
    void *dec;
    SpeexBits bits;
+   int pf;
 
    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_ctl(dec, SPEEX_SET_PF, &pf);
+
    if (argc != 4 && argc != 3)
    {
       fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc);
index 540ab84..6f38dd6 100644 (file)
@@ -16,11 +16,16 @@ int main(int argc, char **argv)
    void *st;
    void *dec;
    SpeexBits bits;
+   int pf;
 
    for (i=0;i<FRAME_SIZE;i++)
       bak2[i]=0;
    st = speex_encoder_init(&speex_wb_mode);
    dec = speex_decoder_init(&speex_wb_mode);
+
+   pf=0;
+   speex_ctl(dec, SPEEX_SET_PF, &pf);
+
    if (argc != 4 && argc != 3)
    {
       fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc);
index 36ce0e8..b412097 100644 (file)
 #include "ogg/ogg.h"
 
 #define MAX_FRAME_SIZE 2000
-#define MAX_FRAME_BYTES 1000
 
 void usage()
 {
    fprintf (stderr, "speexenc [options] <input file> <output file>\n");
    fprintf (stderr, "options:\n");
-   fprintf (stderr, "\t--help       -h    This help\n"); 
-   fprintf (stderr, "\t--version    -v    Version information\n"); 
+   fprintf (stderr, "\t--help       -h      This help\n"); 
+   fprintf (stderr, "\t--version    -v      Version information\n"); 
+   fprintf (stderr, "\t--pf         --pf    Enable post-filter\n"); 
+   fprintf (stderr, "\t--no-pf      --no-pf Disable post-filter\n"); 
 }
 
 void version()
@@ -58,12 +59,17 @@ int main(int argc, char **argv)
    {
       {"help", no_argument, NULL, 0},
       {"version", no_argument, NULL, 0},
+      {"pf", no_argument, NULL, 0},
+      {"no-pf", no_argument, NULL, 0},
       {0, 0, 0, 0}
    };
    ogg_sync_state oy;
    ogg_page       og;
    ogg_packet     op;
    ogg_stream_state os;
+   int pf_enabled;
+
+   pf_enabled = 0;
 
    /*Process options*/
    while(1)
@@ -84,6 +90,12 @@ int main(int argc, char **argv)
          {
             version();
             exit(0);
+         } else if (strcmp(long_options[option_index].name,"pf")==0)
+         {
+            pf_enabled=1;
+         } else if (strcmp(long_options[option_index].name,"no-pf")==0)
+         {
+            pf_enabled=0;
          }
          break;
       case 'h':
@@ -172,6 +184,7 @@ int main(int argc, char **argv)
                }
                /*Initialize Speex decoder*/
                st = speex_decoder_init(mode);
+               speex_ctl(st, SPEEX_SET_PF, &pf_enabled);
                frame_size=mode->frameSize;
                first=0;
             } else {