Think the encoder and decoder work! Still a couple fixes left...
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 27 Mar 2002 06:30:37 +0000 (06:30 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 27 Mar 2002 06:30:37 +0000 (06:30 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3192 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/bits.c
libspeex/bits.h
src/Makefile.am
src/speexdec.c [new file with mode: 0644]
src/speexenc.c

index ab24c72..d194311 100644 (file)
@@ -69,6 +69,30 @@ void frame_bits_init_from(FrameBits *bits, char *bytes, int len)
    bits->bitPtr=0;
 }
 
+void frame_bits_flush(FrameBits *bits)
+{
+   int i;
+   if (bits->bytePtr>0)
+   {
+      for (i=bits->bytePtr;i<((bits->nbBits+7)>>3);i++)
+         bits->bytes[i-bits->bytePtr]=bits->bytes[i];
+   }
+   bits->nbBits -= bits->bytePtr<<3;
+   bits->bytePtr=0;
+}
+
+void frame_bits_read_whole_bytes(FrameBits *bits, char *bytes, int len)
+{
+   int i,pos;
+   printf ("reading:\n");
+   printf ("%d %d %d\n", bits->nbBits, bits->bytePtr, bits->bitPtr);
+   /*frame_bits_flush(bits);*/
+   pos=bits->nbBits>>3;
+   for (i=0;i<len;i++)
+      bits->bytes[pos+i]=bytes[i];
+   bits->nbBits+=len<<3;
+}
+
 int frame_bits_write(FrameBits *bits, char *bytes, int max_len)
 {
    int i;
@@ -86,10 +110,15 @@ int frame_bits_write_whole_bytes(FrameBits *bits, char *bytes, int max_len)
       max_len = ((bits->nbBits)>>3);
    for (i=0;i<max_len;i++)
       bytes[i]=bits->bytes[i];
-
-   bits->bytes[0]=bits->bytes[max_len];
+   
+   if (bits->bitPtr>0)
+      bits->bytes[0]=bits->bytes[max_len];
+   else
+      bits->bytes[0]=0;
+   for (i=1;i<((bits->nbBits)>>3)+1;i++)
+      bits->bytes[i]=0;
    bits->bytePtr=0;
-   bits->nbBits-=((bits->nbBits)>>3)<<3;
+   bits->nbBits &= 7;
    return max_len;
 }
 
index 259ddc3..fb5dd0c 100644 (file)
@@ -22,7 +22,7 @@
 #ifndef BITS_H
 #define BITS_H
 
-#define MAX_BYTES_PER_FRAME 1000
+#define MAX_BYTES_PER_FRAME 1000000
 
 typedef struct FrameBits {
    char bytes[MAX_BYTES_PER_FRAME];
@@ -41,6 +41,8 @@ void frame_bits_rewind(FrameBits *bits);
 
 void frame_bits_init_from(FrameBits *bits, char *bytes, int len);
 
+void frame_bits_read_whole_bytes(FrameBits *bits, char *bytes, int len);
+
 int frame_bits_write(FrameBits *bits, char *bytes, int max_len);
 
 int frame_bits_write_whole_bytes(FrameBits *bits, char *bytes, int max_len);
index c69ef40..1a8269d 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in. -*-Makefile-*-
 
-# $Id: Makefile.am,v 1.1 2002/03/26 23:24:47 jmvalin Exp $
+# $Id: Makefile.am,v 1.2 2002/03/27 06:30:37 jmvalin Exp $
 
 # Disable automatic dependency tracking if using other tools than gcc and gmake
 #AUTOMAKE_OPTIONS = no-dependencies
@@ -10,7 +10,10 @@ INCLUDES = -I$(top_srcdir)/libspeex
 include_HEADERS = 
 noinst_HEADERS = 
 
-bin_PROGRAMS = speexenc
+bin_PROGRAMS = speexenc speexdec
 
 speexenc_SOURCES = speexenc.c
 speexenc_LDADD = $(top_srcdir)/libspeex/libspeex.la
+
+speexdec_SOURCES = speexdec.c
+speexdec_LDADD = $(top_srcdir)/libspeex/libspeex.la
diff --git a/src/speexdec.c b/src/speexdec.c
new file mode 100644 (file)
index 0000000..dde2c3a
--- /dev/null
@@ -0,0 +1,167 @@
+/* Copyright (C) 2002 Jean-Marc Valin 
+   File: speexdec.c
+
+   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 <stdio.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "modes.h"
+#include "speex.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"); 
+}
+
+void version()
+{
+   fprintf (stderr, "Speex encoder version " VERSION "\n");
+}
+
+int main(int argc, char **argv)
+{
+   int c;
+   int option_index = 0;
+   int narrowband=0, wideband=0;
+   char *inFile, *outFile;
+   FILE *fin, *fout;
+   short out[MAX_FRAME_SIZE];
+   float output[MAX_FRAME_SIZE];
+   int frame_size;
+   SpeexMode *mode=NULL;
+   DecState st;
+   FrameBits bits;
+   char cbits[MAX_FRAME_BYTES];
+   int at_end=0;
+   struct option long_options[] =
+   {
+      {"help", no_argument, NULL, 0},
+      {"version", no_argument, NULL, 0},
+      {0, 0, 0, 0}
+   };
+
+   while(1)
+   {
+      c = getopt_long (argc, argv, "nwhv",
+                       long_options, &option_index);
+      if (c==-1)
+         break;
+      
+      switch(c)
+      {
+      case 0:
+         if (strcmp(long_options[option_index].name,"help")==0)
+         {
+            usage();
+            exit(0);
+         } else if (strcmp(long_options[option_index].name,"version")==0)
+         {
+            version();
+            exit(0);
+         }
+         break;
+      case 'h':
+         usage();
+         break;
+      case 'v':
+         version();
+         exit(0);
+         break;
+      case '?':
+         usage();
+         exit(1);
+         break;
+      }
+   }
+   if (argc-optind!=2)
+   {
+      usage();
+      exit(1);
+   }
+   inFile=argv[optind];
+   outFile=argv[optind+1];
+
+   if (strcmp(inFile, "-")==0)
+      fin=stdin;
+   else 
+   {
+      fin = fopen(inFile, "r");
+      if (!fin)
+      {
+         perror(inFile);
+         exit(1);
+      }
+   }
+   if (strcmp(outFile,"-")==0)
+      fout=stdout;
+   else 
+   {
+      fout = fopen(outFile, "w");
+      if (!fout)
+      {
+         perror(outFile);
+         exit(1);
+      }
+   }
+
+   mode=&mp_nb_mode;
+   decoder_init(&st, mode);
+   frame_size=mode->frameSize;
+   frame_bits_init(&bits);
+   while (1)
+   {
+      int i,nbBytes, nb_read;
+      nb_read=300-((bits.nbBits>>3)-bits.bytePtr);
+      if (nb_read>0&&!at_end)
+      {
+         nb_read=fread(cbits, sizeof(char), nb_read, fin);
+         printf ("nb_read = %d\n", nb_read);
+         if (feof(fin))
+            at_end=1;
+         if (nb_read>0 && !at_end)
+            frame_bits_read_whole_bytes(&bits, cbits, nb_read);
+      }
+      
+      printf ("bits.nbBits = %d, bits.bytePtr = %d\n", bits.nbBits>>3, bits.bytePtr);
+      if (((bits.nbBits>>3)-bits.bytePtr)<1)
+         break;
+
+      decode(&st, &bits, output);
+      for (i=0;i<frame_size;i++)
+      {
+         if (output[i]>32000)
+            output[i]=32000;
+         else if (output[i]<-32000)
+            output[i]=-32000;
+      }
+      for (i=0;i<frame_size;i++)
+         out[i]=output[i];
+      fwrite(out, sizeof(short), frame_size, fout);
+   }
+   decoder_destroy(&st);
+   exit(0);
+   return 1;
+}
index 6a5ba5d..67b1281 100644 (file)
@@ -36,7 +36,7 @@ void usage()
    fprintf (stderr, "\t--wideband   -w    Wideband (16 kHz) input file\n"); 
    fprintf (stderr, "\t--help       -h    This help\n"); 
    fprintf (stderr, "\t--version    -v    Version information\n"); 
-   fprintf (stderr, "\nInputs and outputs must be raw audio (no header), 16 bits\n"); 
+   fprintf (stderr, "\nInput must be raw audio (no header), 16 bits\n"); 
 }
 
 void version()
@@ -54,6 +54,7 @@ int main(int argc, char **argv)
    short in[MAX_FRAME_SIZE];
    float input[MAX_FRAME_SIZE];
    int frame_size;
+   int i,nbBytes;
    SpeexMode *mode=NULL;
    EncState st;
    FrameBits bits;
@@ -158,7 +159,6 @@ int main(int argc, char **argv)
 
    while (1)
    {
-      int i,nbBytes;
       fread(in, sizeof(short), frame_size, fin);
       if (feof(fin))
          break;
@@ -168,7 +168,8 @@ int main(int argc, char **argv)
       nbBytes = frame_bits_write_whole_bytes(&bits, cbits, 200);
       fwrite(cbits, 1, nbBytes, fout);
    }
-   frame_bits_write(&bits, cbits, 200);
+   nbBytes = frame_bits_write(&bits, cbits, 200);
+   fwrite(cbits, 1, nbBytes, fout);
    encoder_destroy(&st);
    exit(0);
    return 1;