summaryrefslogtreecommitdiff
path: root/gr-vocoder/lib/codec2/c2enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gr-vocoder/lib/codec2/c2enc.c')
-rw-r--r--gr-vocoder/lib/codec2/c2enc.c71
1 files changed, 48 insertions, 23 deletions
diff --git a/gr-vocoder/lib/codec2/c2enc.c b/gr-vocoder/lib/codec2/c2enc.c
index 0e5b26cfdc..ab1ebe4387 100644
--- a/gr-vocoder/lib/codec2/c2enc.c
+++ b/gr-vocoder/lib/codec2/c2enc.c
@@ -33,49 +33,74 @@
#include <string.h>
#include <errno.h>
-#define BITS_SIZE ((CODEC2_BITS_PER_FRAME + 7) / 8)
-
int main(int argc, char *argv[])
{
- void *codec2;
- FILE *fin;
- FILE *fout;
- short buf[CODEC2_SAMPLES_PER_FRAME];
- unsigned char bits[BITS_SIZE];
-
- if (argc != 3) {
- printf("usage: %s InputRawspeechFile OutputBitFile\n", argv[0]);
+ int mode;
+ void *codec2;
+ FILE *fin;
+ FILE *fout;
+ short *buf;
+ unsigned char *bits;
+ int nsam, nbit, nbyte;
+
+ if (argc != 4) {
+ printf("usage: c2enc 3200|2400|1600|1400|1300|1200 InputRawspeechFile OutputBitFile\n");
+ printf("e.g c2enc 1400 ../raw/hts1a.raw hts1a.c2\n");
exit(1);
}
- if (strcmp(argv[1], "-") == 0) fin = stdin;
- else if ( (fin = fopen(argv[1],"rb")) == NULL ) {
- fprintf(stderr, "Error opening input bit file: %s: %s.\n",
- argv[1], strerror(errno));
+ if (strcmp(argv[1],"3200") == 0)
+ mode = CODEC2_MODE_3200;
+ else if (strcmp(argv[1],"2400") == 0)
+ mode = CODEC2_MODE_2400;
+ else if (strcmp(argv[1],"1600") == 0)
+ mode = CODEC2_MODE_1600;
+ else if (strcmp(argv[1],"1400") == 0)
+ mode = CODEC2_MODE_1400;
+ else if (strcmp(argv[1],"1300") == 0)
+ mode = CODEC2_MODE_1300;
+ else if (strcmp(argv[1],"1200") == 0)
+ mode = CODEC2_MODE_1200;
+ else {
+ fprintf(stderr, "Error in mode: %s. Must be 3200, 2400, 1600, 1400, 1300 or 1200\n", argv[1]);
exit(1);
}
- if (strcmp(argv[2], "-") == 0) fout = stdout;
- else if ( (fout = fopen(argv[2],"wb")) == NULL ) {
- fprintf(stderr, "Error opening output speech file: %s: %s.\n",
+ if (strcmp(argv[2], "-") == 0) fin = stdin;
+ else if ( (fin = fopen(argv[2],"rb")) == NULL ) {
+ fprintf(stderr, "Error opening input speech file: %s: %s.\n",
argv[2], strerror(errno));
exit(1);
}
- codec2 = codec2_create();
+ if (strcmp(argv[3], "-") == 0) fout = stdout;
+ else if ( (fout = fopen(argv[3],"wb")) == NULL ) {
+ fprintf(stderr, "Error opening output compressed bit file: %s: %s.\n",
+ argv[3], strerror(errno));
+ exit(1);
+ }
+
+ codec2 = codec2_create(mode);
+ nsam = codec2_samples_per_frame(codec2);
+ nbit = codec2_bits_per_frame(codec2);
+ buf = (short*)malloc(nsam*sizeof(short));
+ nbyte = (nbit + 7) / 8;
+
+ bits = (unsigned char*)malloc(nbyte*sizeof(char));
- while(fread(buf, sizeof(short), CODEC2_SAMPLES_PER_FRAME, fin) ==
- CODEC2_SAMPLES_PER_FRAME) {
+ while(fread(buf, sizeof(short), nsam, fin) == (size_t)nsam) {
codec2_encode(codec2, bits, buf);
- fwrite(bits, sizeof(char), BITS_SIZE, fout);
- //if this is in a pipeline, we probably don't want the usual
- //buffering to occur
+ fwrite(bits, sizeof(char), nbyte, fout);
+ // if this is in a pipeline, we probably don't want the usual
+ // buffering to occur
if (fout == stdout) fflush(stdout);
if (fin == stdin) fflush(stdin);
}
codec2_destroy(codec2);
+ free(buf);
+ free(bits);
fclose(fin);
fclose(fout);