now compiles without warning
[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 #include "ogg/ogg.h"
27
28 #define MAX_FRAME_SIZE 2000
29 #define MAX_FRAME_BYTES 1000
30
31 void usage()
32 {
33    fprintf (stderr, "speexenc [options] <input file> <output file>\n");
34    fprintf (stderr, "options:\n");
35    fprintf (stderr, "\t--help       -h    This help\n"); 
36    fprintf (stderr, "\t--version    -v    Version information\n"); 
37 }
38
39 void version()
40 {
41    fprintf (stderr, "Speex encoder version " VERSION "\n");
42 }
43
44 int main(int argc, char **argv)
45 {
46    int c;
47    int option_index = 0;
48    char *inFile, *outFile;
49    FILE *fin, *fout;
50    short out[MAX_FRAME_SIZE];
51    float output[MAX_FRAME_SIZE];
52    int frame_size=0;
53    SpeexMode *mode=NULL;
54    void *st=NULL;
55    FrameBits bits;
56    int first = 1;
57    struct option long_options[] =
58    {
59       {"help", no_argument, NULL, 0},
60       {"version", no_argument, NULL, 0},
61       {0, 0, 0, 0}
62    };
63    ogg_sync_state oy;
64    ogg_page       og;
65    ogg_packet     op;
66    ogg_stream_state os;
67
68    while(1)
69    {
70       c = getopt_long (argc, argv, "hv",
71                        long_options, &option_index);
72       if (c==-1)
73          break;
74       
75       switch(c)
76       {
77       case 0:
78          if (strcmp(long_options[option_index].name,"help")==0)
79          {
80             usage();
81             exit(0);
82          } else if (strcmp(long_options[option_index].name,"version")==0)
83          {
84             version();
85             exit(0);
86          }
87          break;
88       case 'h':
89          usage();
90          break;
91       case 'v':
92          version();
93          exit(0);
94          break;
95       case '?':
96          usage();
97          exit(1);
98          break;
99       }
100    }
101    if (argc-optind!=2)
102    {
103       usage();
104       exit(1);
105    }
106    inFile=argv[optind];
107    outFile=argv[optind+1];
108
109    if (strcmp(inFile, "-")==0)
110       fin=stdin;
111    else 
112    {
113       fin = fopen(inFile, "r");
114       if (!fin)
115       {
116          perror(inFile);
117          exit(1);
118       }
119    }
120    if (strcmp(outFile,"-")==0)
121       fout=stdout;
122    else 
123    {
124       fout = fopen(outFile, "w");
125       if (!fout)
126       {
127          perror(outFile);
128          exit(1);
129       }
130    }
131
132    ogg_sync_init(&oy);
133    ogg_stream_init(&os, 0);
134    
135    speex_bits_init(&bits);
136    while (1/*||feof(fin)*/)
137    {
138       char *data;
139       int i, nb_read;
140       data = ogg_sync_buffer(&oy, 200);
141       nb_read = fread(data, sizeof(char), 200, fin);      
142       ogg_sync_wrote(&oy, nb_read);
143       while (ogg_sync_pageout(&oy, &og)==1)
144       {
145          ogg_stream_pagein(&os, &og);
146          while (ogg_stream_packetout(&os, &op)==1)
147          {
148             if (first)
149             {
150                if (strncmp((char *)op.packet, "speex wideband**", 12)==0)
151                {
152                   fprintf (stderr, "Wideband!!\n");
153                   mode = &speex_wb_mode;
154                } else if (strncmp((char *)op.packet, "speex narrowband", 12)==0)
155                {
156                   fprintf (stderr, "Narrowband!!\n");
157                   mode = &speex_nb_mode;
158                } else {
159                   fprintf (stderr, "This Ogg file is not a Speex bitstream\n");
160                   exit(1);
161                }
162                st = decoder_init(mode);
163                frame_size=mode->frameSize;
164                first=0;
165             } else {
166                if (strncmp((char *)op.packet, "END OF STREAM", 13)==0)
167                   break;
168                speex_bits_init_from(&bits, (char*)op.packet, op.bytes);
169                decode(st, &bits, output);
170                
171                for (i=0;i<frame_size;i++)
172                {
173                   if (output[i]>32000)
174                      output[i]=32000;
175                   else if (output[i]<-32000)
176                      output[i]=-32000;
177                }
178                for (i=0;i<frame_size;i++)
179                   out[i]=output[i];
180                fwrite(out, sizeof(short), frame_size, fout);
181             }
182          }
183       }
184       if (feof(fin))
185          break;
186
187    }
188
189    decoder_destroy(st);
190
191    exit(0);
192    return 1;
193 }