Added query function for modes
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 22 Aug 2002 20:47:51 +0000 (20:47 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 22 Aug 2002 20:47:51 +0000 (20:47 +0000)
Support for modes > 7 at decoder

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

libspeex/modes.c
libspeex/speex.h

index 98fc4d5..d7a8360 100644 (file)
@@ -20,6 +20,7 @@
 */
 
 #include <stdlib.h>
+#include <stdio.h>
 #include "modes.h"
 #include "ltp.h"
 #include "quant_lsp.h"
@@ -36,11 +37,13 @@ extern float hexc_table[];
 extern float exc_5_256_table[];
 extern float exc_5_64_table[];
 extern float exc_8_128_table[];
-extern float exc_8_32_table[];
 extern float exc_10_32_table[];
 extern float exc_10_16_table[];
 extern float hexc_10_32_table[];
 
+static void nb_mode_query(void *mode, int request, void *ptr);
+static void wb_mode_query(void *mode, int request, void *ptr);
+
 /* Parameters for Long-Term Prediction (LTP)*/
 static ltp_params ltp_params_nb = {
    gain_cdbk_nb,
@@ -302,6 +305,7 @@ static SpeexNBMode nb_mode = {
 
 SpeexMode speex_nb_mode = {
    &nb_mode,
+   nb_mode_query,
    "narrowband",
    0,
    4,
@@ -424,6 +428,7 @@ SpeexSBMode sb_wb_mode = {
 
 SpeexMode speex_wb_mode = {
    &sb_wb_mode,
+   wb_mode_query,
    "full-rate wideband (sub-band CELP)",
    1,
    4,
@@ -467,9 +472,22 @@ void speex_decoder_destroy(void *state)
    (*((SpeexMode**)state))->dec_destroy(state);
 }
 
-void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
+int speex_decode(void *state, SpeexBits *bits, float *out, int lost)
 {
+   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, lost);
+   return 0;
 }
 
 
@@ -482,3 +500,46 @@ void speex_decoder_ctl(void *state, int request, void *ptr)
 {
    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
 }
+
+
+
+static void nb_mode_query(void *mode, int request, void *ptr)
+{
+   SpeexNBMode *m = mode;
+   
+   switch (request)
+   {
+   case SPEEX_MODE_FRAME_SIZE:
+      *((int*)ptr)=m->frameSize;
+      break;
+   case SPEEX_SUBMODE_BITS_PER_FRAME:
+      *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame;
+      break;
+   default:
+      fprintf(stderr, "Unknown wb_mode_query request: %d\n", request);
+   }
+
+}
+
+static void wb_mode_query(void *mode, int request, void *ptr)
+{
+   SpeexSBMode *m = mode;
+
+   switch (request)
+   {
+   case SPEEX_MODE_FRAME_SIZE:
+      *((int*)ptr)=m->frameSize;
+      break;
+   case SPEEX_SUBMODE_BITS_PER_FRAME:
+      *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame;
+      break;
+   default:
+      fprintf(stderr, "Unknown wb_mode_query request: %d\n", request);
+   }
+}
+
+
+void speex_mode_query(SpeexMode *mode, int request, void *ptr)
+{
+   mode->query(mode, request, ptr);
+}
index c357c93..1ae39c7 100644 (file)
@@ -56,6 +56,11 @@ extern "C" {
 #define SPEEX_GET_PF 1
 
 
+/* Values allowed for mode queries */
+#define SPEEX_MODE_FRAME_SIZE 0
+#define SPEEX_SUBMODE_BITS_PER_FRAME 1
+
+
 #define SPEEX_NB_MODES 2
 
 
@@ -71,11 +76,16 @@ typedef void (*decode_func)(void *state, SpeexBits *bits, float *out, int lost);
 typedef void (*encoder_ctl_func)(void *state, int request, void *ptr);
 typedef void (*decoder_ctl_func)(void *state, int request, void *ptr);
 
+typedef void (*mode_query_func)(void *mode, int request, void *ptr);
+
 /** Struct defining a Speex mode */ 
 typedef struct SpeexMode {
    /** Pointer to the low-level mode data */
    void *mode;
 
+   /** Pointer to the mode query function */
+   mode_query_func query;
+   
    /** The name of the mode (you should not rely on this to identify the mode)*/
    char *modeName;
 
@@ -149,12 +159,15 @@ void speex_decoder_destroy(void *state);
 
 /** Uses an existing decoder state to decode one frame of speech from bit-stream 
     bits. The output speech is saved written to out. */
-void speex_decode(void *state, SpeexBits *bits, float *out, int lost);
+int speex_decode(void *state, SpeexBits *bits, float *out, int lost);
 
 /** Used like the ioctl function to control the encoder parameters */
 void speex_decoder_ctl(void *state, int request, void *ptr);
 
 
+/** Query function for mode information */
+void speex_mode_query(SpeexMode *mode, int request, void *ptr);
+
 
 /** Default narrowband mode */
 extern SpeexMode speex_nb_mode;