ee657bfaafdc9b0c5fc2298b8fed3a3a3dde3266
[speexdsp.git] / src / speexdec.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: speexdec.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.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--help       -h    This help\n"); 
35    fprintf (stderr, "\t--version    -v    Version information\n"); 
36 }
37
38 void version()
39 {
40    fprintf (stderr, "Speex encoder version " VERSION "\n");
41 }
42
43 int main(int argc, char **argv)
44 {
45    int c;
46    int option_index = 0;
47    char *inFile, *outFile;
48    FILE *fin, *fout;
49    short out[MAX_FRAME_SIZE];
50    float output[MAX_FRAME_SIZE];
51    int frame_size;
52    SpeexMode *mode=NULL;
53    void *st;
54    FrameBits bits;
55    char cbits[MAX_FRAME_BYTES];
56
57    int at_end=0;
58    int narrowband=0, wideband=0;
59    struct option long_options[] =
60    {
61       {"help", no_argument, NULL, 0},
62       {"version", no_argument, NULL, 0},
63       {0, 0, 0, 0}
64    };
65    
66    while(1)
67    {
68       c = getopt_long (argc, argv, "nwhv",
69                        long_options, &option_index);
70       if (c==-1)
71          break;
72       
73       switch(c)
74       {
75       case 0:
76          if (strcmp(long_options[option_index].name,"help")==0)
77          {
78             usage();
79             exit(0);
80          } else if (strcmp(long_options[option_index].name,"version")==0)
81          {
82             version();
83             exit(0);
84          }
85          break;
86       case 'h':
87          usage();
88          break;
89       case 'v':
90          version();
91          exit(0);
92          break;
93       case '?':
94          usage();
95          exit(1);
96          break;
97       }
98    }
99    if (argc-optind!=2)
100    {
101       usage();
102       exit(1);
103    }
104    inFile=argv[optind];
105    outFile=argv[optind+1];
106
107    if (strcmp(inFile, "-")==0)
108       fin=stdin;
109    else 
110    {
111       fin = fopen(inFile, "r");
112       if (!fin)
113       {
114          perror(inFile);
115          exit(1);
116       }
117    }
118    if (strcmp(outFile,"-")==0)
119       fout=stdout;
120    else 
121    {
122       fout = fopen(outFile, "w");
123       if (!fout)
124       {
125          perror(outFile);
126          exit(1);
127       }
128    }
129
130    /*This is only the temporary header*/
131    {
132       char header[6];
133       if(fread(header, sizeof(char), 5, fin)!=5)
134       {
135          perror("cannot read header");
136          exit(1);
137       }
138       header[5]=0;
139       if (strcmp(header,"spexn")==0)
140       {
141          mode=&nb_mode;
142          narrowband=1;
143       } else if (strcmp(header,"spexw")==0)
144       {
145          mode=&wb_mode;
146          wideband=1;
147       } else 
148       {
149          fprintf (stderr, "This does not look like a Speex " VERSION " file\n");
150          exit(1);
151       }
152
153    }
154
155    st = decoder_init(mode);
156
157    frame_size=mode->frameSize;
158
159    speex_bits_init(&bits);
160    while (1)
161    {
162       int i, nb_read;
163       nb_read=200-((bits.nbBits>>3)-bits.bytePtr);
164       if (nb_read>0&&!at_end)
165       {
166          nb_read=fread(cbits, sizeof(char), nb_read, fin);
167          if (feof(fin))
168             at_end=1;
169          if (nb_read>0 && !at_end)
170             speex_bits_read_whole_bytes(&bits, cbits, nb_read);
171       }
172       
173       if (((bits.nbBits>>3)-bits.bytePtr)<2)
174          break;
175       
176       decode(st, &bits, output);
177
178       for (i=0;i<frame_size;i++)
179       {
180          if (output[i]>32000)
181             output[i]=32000;
182          else if (output[i]<-32000)
183             output[i]=-32000;
184       }
185       for (i=0;i<frame_size;i++)
186          out[i]=output[i];
187       fwrite(out, sizeof(short), frame_size, fout);
188    }
189
190    decoder_destroy(st);
191
192    exit(0);
193    return 1;
194 }