Don't fill the last byte in the frame before saving (saves a couple bits
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 27 Mar 2002 03:40:32 +0000 (03:40 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 27 Mar 2002 03:40:32 +0000 (03:40 +0000)
per frame).

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

libspeex/bits.c
libspeex/bits.h
src/speexenc.c

index 42636d3..ab24c72 100644 (file)
@@ -79,6 +79,21 @@ int frame_bits_write(FrameBits *bits, char *bytes, int max_len)
    return max_len;
 }
 
+int frame_bits_write_whole_bytes(FrameBits *bits, char *bytes, int max_len)
+{
+   int i;
+   if (max_len > ((bits->nbBits)>>3))
+      max_len = ((bits->nbBits)>>3);
+   for (i=0;i<max_len;i++)
+      bytes[i]=bits->bytes[i];
+
+   bits->bytes[0]=bits->bytes[max_len];
+   bits->bytePtr=0;
+   bits->nbBits-=((bits->nbBits)>>3)<<3;
+   return max_len;
+}
+
+
 void frame_bits_pack(FrameBits *bits, int data, int nbBits)
 {
    unsigned int d=data;
index c5ed0bf..259ddc3 100644 (file)
@@ -43,6 +43,8 @@ void frame_bits_init_from(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);
+
 void frame_bits_pack(FrameBits *bits, int data, int nbBits);
 
 int frame_bits_unpack_signed(FrameBits *bits, int nbBits);
index d83fac5..6a5ba5d 100644 (file)
@@ -20,6 +20,7 @@
 #include <unistd.h>
 #include <getopt.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "modes.h"
 #include "speex.h"
@@ -53,9 +54,10 @@ int main(int argc, char **argv)
    short in[MAX_FRAME_SIZE];
    float input[MAX_FRAME_SIZE];
    int frame_size;
-   SpeexMode *mode;
+   SpeexMode *mode=NULL;
    EncState st;
    FrameBits bits;
+   char cbits[MAX_FRAME_BYTES];
    struct option long_options[] =
    {
       {"wideband", no_argument, NULL, 0},
@@ -115,7 +117,7 @@ int main(int argc, char **argv)
    }
    inFile=argv[optind];
    outFile=argv[optind+1];
-   printf ("input: %s\noutput: %s\n", inFile, outFile);
+
    if (wideband && narrowband)
    {
       fprintf (stderr,"Cannot specify both wideband and narrowband at the same time\n");
@@ -128,25 +130,45 @@ int main(int argc, char **argv)
    if (wideband)
       mode=&mp_wb_mode;
 
-   fin = fopen(inFile, "r");
-   fout = fopen(outFile, "w");
+   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);
+      }
+   }
 
    encoder_init(&st, mode);
    frame_size=mode->frameSize;
 
-   while (!feof(fin))
+   while (1)
    {
       int i,nbBytes;
-      char cbits[MAX_FRAME_BYTES];
       fread(in, sizeof(short), frame_size, fin);
+      if (feof(fin))
+         break;
       for (i=0;i<frame_size;i++)
          input[i]=in[i];
-      frame_bits_reset(&bits);
       encode(&st, input, &bits);
-      nbBytes = frame_bits_write(&bits, cbits, 200);
+      nbBytes = frame_bits_write_whole_bytes(&bits, cbits, 200);
       fwrite(cbits, 1, nbBytes, fout);
    }
-   
+   frame_bits_write(&bits, cbits, 200);
    encoder_destroy(&st);
    exit(0);
    return 1;