69ec0a236c1100cb6c63dc34bdfeb5cdbc2705fa
[speexdsp.git] / src / speexenc.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: speexenc.c
3
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8    
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13    
14    You should have received a copy of the GNU Lesser General Public
15    License along with this library; if not, write to the Free Software
16    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 */
18
19 #include <stdio.h>
20 #include <unistd.h>
21 #include <getopt.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 #include "speex_modes.h"
26
27 #define MAX_FRAME_SIZE 2000
28 #define MAX_FRAME_BYTES 1000
29
30 void usage()
31 {
32    fprintf (stderr, "speexenc [options] <input file> <output file>\n");
33    fprintf (stderr, "options:\n");
34    fprintf (stderr, "\t--narrowband -n    Narrowband (8 kHz) input file\n"); 
35    fprintf (stderr, "\t--wideband   -w    Wideband (16 kHz) input file\n"); 
36    fprintf (stderr, "\t--help       -h    This help\n"); 
37    fprintf (stderr, "\t--version    -v    Version information\n"); 
38    fprintf (stderr, "\nInput must be raw audio (no header), 16 bits\n"); 
39 }
40
41 void version()
42 {
43    fprintf (stderr, "Speex encoder version " VERSION "\n");
44 }
45
46 int main(int argc, char **argv)
47 {
48    int c;
49    int option_index = 0;
50    int narrowband=0, wideband=0;
51    char *inFile, *outFile;
52    FILE *fin, *fout;
53    short in[MAX_FRAME_SIZE];
54    float input[MAX_FRAME_SIZE];
55    int frame_size;
56    int i,nbBytes;
57    SpeexMode *mode=NULL;
58    void *st;
59    FrameBits bits;
60    char cbits[MAX_FRAME_BYTES];
61    struct option long_options[] =
62    {
63       {"wideband", no_argument, NULL, 0},
64       {"narrowband", no_argument, NULL, 0},
65       {"help", no_argument, NULL, 0},
66       {"version", no_argument, NULL, 0},
67       {0, 0, 0, 0}
68    };
69
70    while(1)
71    {
72       c = getopt_long (argc, argv, "nwhv",
73                        long_options, &option_index);
74       if (c==-1)
75          break;
76       
77       switch(c)
78       {
79       case 0:
80          if (strcmp(long_options[option_index].name,"narrowband")==0)
81             narrowband=1;
82          else if (strcmp(long_options[option_index].name,"wideband")==0)
83                wideband=1;
84          else if (strcmp(long_options[option_index].name,"help")==0)
85          {
86             usage();
87             exit(0);
88          } else if (strcmp(long_options[option_index].name,"version")==0)
89          {
90             version();
91             exit(0);
92          }
93          break;
94       case 'n':
95          narrowband=1;
96          break;
97       case 'h':
98          usage();
99          break;
100       case 'v':
101          version();
102          exit(0);
103          break;
104       case 'w':
105          wideband=1;
106          break;
107       case '?':
108          usage();
109          exit(1);
110          break;
111       }
112    }
113    if (argc-optind!=2)
114    {
115       usage();
116       exit(1);
117    }
118    inFile=argv[optind];
119    outFile=argv[optind+1];
120
121    if (wideband && narrowband)
122    {
123       fprintf (stderr,"Cannot specify both wideband and narrowband at the same time\n");
124       exit(1);
125    };
126    if (!wideband)
127       narrowband=1;
128    if (narrowband)
129       mode=&nb_mode;
130    if (wideband)
131       mode=&wb_mode;
132
133    st = encoder_init(mode);
134
135    if (strcmp(inFile, "-")==0)
136       fin=stdin;
137    else 
138    {
139       fin = fopen(inFile, "r");
140       if (!fin)
141       {
142          perror(inFile);
143          exit(1);
144       }
145    }
146    if (strcmp(outFile,"-")==0)
147       fout=stdout;
148    else 
149    {
150       fout = fopen(outFile, "w");
151       if (!fout)
152       {
153          perror(outFile);
154          exit(1);
155       }
156    }
157
158    /*Temporary header*/
159    {
160       char *header="";
161       if (narrowband)
162          header="spexn";
163       if (wideband)
164          header="spexw";
165       if (fwrite(header, 1, 5, fout)!=5)
166       {
167          perror("Cannot write header");
168       }
169    }
170
171    frame_size=mode->frameSize;
172
173    while (1)
174    {
175       fread(in, sizeof(short), frame_size, fin);
176       if (feof(fin))
177          break;
178       for (i=0;i<frame_size;i++)
179          input[i]=in[i];
180       encode(st, input, &bits);
181       nbBytes = frame_bits_write_whole_bytes(&bits, cbits, 200);
182       fwrite(cbits, 1, nbBytes, fout);
183    }
184    nbBytes = frame_bits_write(&bits, cbits, 200);
185    fwrite(cbits, 1, nbBytes, fout);
186
187    encoder_destroy(st);
188    exit(0);
189    return 1;
190 }