Header work...
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 12 Jun 2002 05:15:53 +0000 (05:15 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 12 Jun 2002 05:15:53 +0000 (05:15 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3378 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/Makefile.am
libspeex/misc.c [new file with mode: 0644]
libspeex/misc.h [new file with mode: 0644]
libspeex/modes.c
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/speex.h
libspeex/speex_header.c [new file with mode: 0644]
libspeex/speex_header.h

index e873735..c73d0ec 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in. -*-Makefile-*-
 
-# $Id: Makefile.am,v 1.32 2002/06/11 08:34:39 jmvalin Exp $
+# $Id: Makefile.am,v 1.33 2002/06/12 05:15:53 jmvalin Exp $
 
 # Disable automatic dependency tracking if using other tools than gcc and gmake
 #AUTOMAKE_OPTIONS = no-dependencies
@@ -29,6 +29,8 @@ libspeex_la_SOURCES = nb_celp.c \
        exc_5_256_table.c \
        exc_5_64_table.c \
        exc_10_32_table.c \
+       misc.c \
+       speex_header.c \
        post_filter.c
 
 
@@ -48,7 +50,8 @@ noinst_HEADERS = lsp.h \
        modes.h \
        sb_celp.h \
        vbr.h \
-       post_filter.h
+       post_filter.h \
+       misc.h
        
        
 libspeex_la_LDFLAGS = -release $(LT_RELEASE)
diff --git a/libspeex/misc.c b/libspeex/misc.c
new file mode 100644 (file)
index 0000000..ca5a4e6
--- /dev/null
@@ -0,0 +1,65 @@
+/* Copyright (C) 2002 Jean-Marc Valin 
+   File: mics.c
+   Various utility routines for Speex
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+   
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "misc.h"
+
+
+unsigned int be_int(unsigned int i)
+{
+   unsigned int ret=i;
+#ifndef WORDS_BIGENDIAN
+   ret =  i>>24;
+   ret += (i>>8)&0x0000ff00;
+   ret += (i<<8)&0x00ff0000;
+   ret += (i<<24);
+#endif
+   return ret;
+}
+
+unsigned int le_int(unsigned int i)
+{
+   unsigned int ret=i;
+#ifdef WORDS_BIGENDIAN
+   ret =  i>>24;
+   ret += (i>>8)&0x0000ff00;
+   ret += (i<<8)&0x00ff0000;
+   ret += (i<<24);
+#endif
+   return ret;
+}
+
+unsigned short be_short(unsigned short s)
+{
+   unsigned short ret=s;
+#ifndef WORDS_BIGENDIAN
+   ret =  s>>8;
+   ret += s<<8;
+#endif
+   return ret;
+}
+
+unsigned short le_short(unsigned short s)
+{
+   unsigned short ret=s;
+#ifdef WORDS_BIGENDIAN
+   ret =  s>>8;
+   ret += s<<8;
+#endif
+   return ret;
+}
diff --git a/libspeex/misc.h b/libspeex/misc.h
new file mode 100644 (file)
index 0000000..9758612
--- /dev/null
@@ -0,0 +1,32 @@
+/* Copyright (C) 2002 Jean-Marc Valin 
+   File: mics.h
+   Various utility routines for Speex
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+   
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef MISC_H
+#define MISC_H
+
+
+unsigned int be_int(unsigned int i);
+unsigned int le_int(unsigned int i);
+
+
+unsigned short be_short(unsigned short s);
+unsigned short le_short(unsigned short s);
+
+
+#endif
index b00e7b2..41c7c19 100644 (file)
@@ -28,6 +28,9 @@
 #include "nb_celp.h"
 #include "post_filter.h"
 
+
+SpeexMode *speex_mode_list[] = {&speex_nb_mode, &speex_nb_lbr_mode, &speex_wb_mode};
+
 /* Extern declarations for all codebooks we use here */
 extern float gain_cdbk_nb[];
 extern float gain_cdbk_lbr[];
@@ -207,6 +210,9 @@ SpeexMode low_wb_mode = {
    &nb_decode,
    &nb_encoder_ctl,
    &nb_decoder_ctl,
+   160,
+   17950,
+   0
 };
 
 SpeexMode speex_nb_mode = {
@@ -219,6 +225,9 @@ SpeexMode speex_nb_mode = {
    &nb_decode,
    &nb_encoder_ctl,
    &nb_decoder_ctl,
+   160,
+   14750,
+   0
 };
 
 SpeexMode speex_nb_lbr_mode = {
@@ -231,6 +240,9 @@ SpeexMode speex_nb_lbr_mode = {
    &nb_decode,
    &nb_encoder_ctl,
    &nb_decoder_ctl,
+   160,
+   7900,
+   0
 };
 
 /* Split-band wideband CELP mode*/
@@ -266,11 +278,18 @@ SpeexMode speex_wb_mode = {
    &sb_decode,
    &sb_encoder_ctl,
    &sb_decoder_ctl,
+   320,
+   27350,
+   0
 };
 
 
 
 
+
+
+
+
 void *speex_encoder_init(SpeexMode *mode)
 {
    return mode->enc_init(mode);
index aa9f1d9..1ed0a05 100644 (file)
@@ -715,7 +715,7 @@ void nb_decode(void *state, SpeexBits *bits, float *out, int lost)
    int pitch;
    float pitch_gain[3];
    float ol_gain;
-   int ol_pitch;
+   int ol_pitch=0;
    st=state;
 
    memmove(st->inBuf, st->inBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
index 29c14de..fa63f0a 100644 (file)
@@ -17,8 +17,8 @@
 
 */
 
-#ifndef SPEEX_H
-#define SPEEX_H
+#ifndef NB_CELP_H
+#define NB_CELP_H
 
 #include "modes.h"
 #include "speex_bits.h"
index 70d06d2..4ba9ce0 100644 (file)
@@ -19,8 +19,8 @@
 
 */
 
-#ifndef SPEEX_MODES_H
-#define SPEEX_MODES_H
+#ifndef SPEEX_H
+#define SPEEX_H
 
 #include "speex_bits.h"
 
@@ -32,7 +32,6 @@ extern "C" {
 #define SPEEX_GET_PF 1
 #define SPEEX_GET_FRAME_SIZE 3
 
-
 struct SpeexMode;
 
 typedef void *(*encoder_init_func)(struct SpeexMode *mode);
@@ -73,6 +72,15 @@ typedef struct SpeexMode {
    /** ioctl-like requests for decoder */
    decoder_ctl_func dec_ctl;
 
+   /** Frame size used for the mode*/
+   int frame_size;
+   
+   /** Bit-rate for the mode (highest in case of VBR) */
+   int bitrate;
+
+   /** VBR info (currently 0 for constant bit-rate and 1 for VBR) */
+   int vbr;
+
 } SpeexMode;
 
 /**Returns a handle to a newly created Speex encoder state structure. For now, the 
@@ -117,6 +125,7 @@ extern SpeexMode speex_nb_lbr_mode;
 /** Default wideband mode */
 extern SpeexMode speex_wb_mode;
 
+extern SpeexMode *speex_mode_list[];
 
 #ifdef __cplusplus
 }
diff --git a/libspeex/speex_header.c b/libspeex/speex_header.c
new file mode 100644 (file)
index 0000000..f6c56bc
--- /dev/null
@@ -0,0 +1,118 @@
+/* Copyright (C) 2002 Jean-Marc Valin 
+   File: speex_header.c
+   Describes the Speex header
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+   
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*/
+
+#include "speex_header.h"
+#include <string.h>
+#include "misc.h"
+#include <stdio.h>
+#include "speex.h"
+#include <stdlib.h>
+
+#define ENDIAN_SWITCH(x) {x=le_int(x);}
+/*
+typedef struct SpeexHeader {
+   char speex_version[SPEEX_HEADER_VERSION_LENGTH];
+   int speex_header_version;
+   int header_size;
+   int rate;
+   int mode;
+   int nb_channels;
+   int bitrate;
+   int frame_size;
+   int vbr;
+   int reserved1;
+   int reserved2;
+   int reserved3;
+   int reserved4;
+} SpeexHeader;
+*/
+
+void init_header(SpeexHeader *header, int rate, int nb_channels, int mode)
+{
+   SpeexMode *m;
+   
+   m = speex_mode_list[mode];
+
+   strncpy(header->speex_string, "Speex   ", 8);
+   strncpy(header->speex_version, VERSION, SPEEX_HEADER_VERSION_LENGTH-1);
+   header->speex_version[SPEEX_HEADER_VERSION_LENGTH-1]=0;
+   
+   header->speex_header_version = SPEEX_HEADER_VERSION;
+   header->header_size = sizeof(SpeexHeader);
+   
+   header->rate = rate;
+   header->mode = mode;
+   header->nb_channels = nb_channels;
+   header->bitrate = nb_channels * m->bitrate;
+   header->frame_size = m->frame_size;
+   header->vbr = m->vbr;
+
+   header->reserved1 = 0;
+   header->reserved2 = 0;
+   header->reserved3 = 0;
+   header->reserved4 = 0;
+}
+
+char *speex_header_to_packet(SpeexHeader *header, int *size)
+{
+   SpeexHeader *le_header;
+   le_header = malloc(sizeof(SpeexHeader));
+   
+   memcpy(le_header, header, sizeof(SpeexHeader));
+   
+   /*Make sure everything is now little-endian*/
+   ENDIAN_SWITCH(le_header->speex_header_version);
+   ENDIAN_SWITCH(le_header->header_size);
+   ENDIAN_SWITCH(le_header->rate);
+   ENDIAN_SWITCH(le_header->mode);
+   ENDIAN_SWITCH(le_header->nb_channels);
+   ENDIAN_SWITCH(le_header->bitrate);
+   ENDIAN_SWITCH(le_header->frame_size);
+   ENDIAN_SWITCH(le_header->vbr);
+
+   *size = sizeof(SpeexHeader);
+   return (char *)le_header;
+}
+
+SpeexHeader *speex_packet_to_header(char *packet, int size)
+{
+   SpeexHeader *le_header;
+
+   if (sizeof(SpeexHeader) != size)
+   {
+      fprintf (stderr, "Speex header size mismarch\n");
+   }
+   le_header = malloc(sizeof(SpeexHeader));
+   
+   memcpy(le_header, packet, sizeof(SpeexHeader));
+   
+   /*Make sure everything is converted correctly from little-endian*/
+   ENDIAN_SWITCH(le_header->speex_header_version);
+   ENDIAN_SWITCH(le_header->header_size);
+   ENDIAN_SWITCH(le_header->rate);
+   ENDIAN_SWITCH(le_header->mode);
+   ENDIAN_SWITCH(le_header->nb_channels);
+   ENDIAN_SWITCH(le_header->bitrate);
+   ENDIAN_SWITCH(le_header->frame_size);
+   ENDIAN_SWITCH(le_header->vbr);
+
+   return le_header;
+
+}
index ef34ee5..44b85b3 100644 (file)
@@ -1,7 +1,6 @@
 /* Copyright (C) 2002 Jean-Marc Valin 
    File: speex_header.h
-
-   Describes the different modes of the codec
+   Describes the Speex header
 
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
 #ifndef SPEEX_HEADER_H
 #define SPEEX_HEADER_H
 
+#define SPEEX_HEADER_VERSION_LENGTH 20
+
+#define SPEEX_HEADER_VERSION -1
+
 typedef struct SpeexHeader {
-   char speex_version[20];
+   char speex_string[8];
+   char speex_version[SPEEX_HEADER_VERSION_LENGTH];
    int speex_header_version;
+   int header_size;
    int rate;
    int mode;
    int nb_channels;
-   int byte_rate;
+   int bitrate;
    int frame_size;
+   int vbr;
+   int reserved1;
+   int reserved2;
+   int reserved3;
+   int reserved4;
 } SpeexHeader;
 
+void init_header(SpeexHeader *header, int rate, int nb_channels, int mode);
+
 char *speex_header_to_packet(SpeexHeader *header, int *size);
 
 SpeexHeader *speex_packet_to_header(char *packet, int size);