diff options
author | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-27 06:40:32 +0300 |
---|---|---|
committer | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-27 06:40:32 +0300 |
commit | 05b7bed82809ce142dba07a00c77a584e9388dfe (patch) | |
tree | c9432751ca0fee55e45f686462e4c74c0ea62400 | |
parent | 251630f15692164cd1d1c32620c807612ca5f419 (diff) |
Don't fill the last byte in the frame before saving (saves a couple bits
per frame).
git-svn-id: http://svn.xiph.org/trunk/speex@3191 0101bb08-14d6-0310-b084-bc0e0c8e3800
-rw-r--r-- | libspeex/bits.c | 15 | ||||
-rw-r--r-- | libspeex/bits.h | 2 | ||||
-rw-r--r-- | src/speexenc.c | 40 |
3 files changed, 48 insertions, 9 deletions
diff --git a/libspeex/bits.c b/libspeex/bits.c index 42636d3..ab24c72 100644 --- a/libspeex/bits.c +++ b/libspeex/bits.c @@ -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; diff --git a/libspeex/bits.h b/libspeex/bits.h index c5ed0bf..259ddc3 100644 --- a/libspeex/bits.h +++ b/libspeex/bits.h @@ -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); diff --git a/src/speexenc.c b/src/speexenc.c index d83fac5..6a5ba5d 100644 --- a/src/speexenc.c +++ b/src/speexenc.c @@ -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; |