|
1 /******************************************************************** |
|
2 * * |
|
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * |
|
4 * * |
|
5 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
|
6 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
|
7 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
|
8 * * |
|
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * |
|
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * |
|
11 * * |
|
12 ******************************************************************** |
|
13 |
|
14 function: simple example decoder using vorbisidec |
|
15 |
|
16 ********************************************************************/ |
|
17 |
|
18 /* Takes a vorbis bitstream from stdin and writes raw stereo PCM to |
|
19 stdout using vorbisfile. Using vorbisfile is much simpler than |
|
20 dealing with libvorbis. */ |
|
21 |
|
22 #include <stdio.h> |
|
23 #include <stdlib.h> |
|
24 #include <vorbis/ivorbiscodec.h> |
|
25 #include <vorbis/ivorbisfile.h> |
|
26 |
|
27 #ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ |
|
28 #include <io.h> |
|
29 #include <fcntl.h> |
|
30 #endif |
|
31 |
|
32 char pcmout[4096]; /* take 4k out of the data segment, not the stack */ |
|
33 |
|
34 int main(){ |
|
35 OggVorbis_File vf; |
|
36 int eof=0; |
|
37 int current_section; |
|
38 |
|
39 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ |
|
40 /* Beware the evil ifdef. We avoid these where we can, but this one we |
|
41 cannot. Don't add any more, you'll probably go to hell if you do. */ |
|
42 _setmode( _fileno( stdin ), _O_BINARY ); |
|
43 _setmode( _fileno( stdout ), _O_BINARY ); |
|
44 #endif |
|
45 |
|
46 if(ov_open(stdin, &vf, NULL, 0) < 0) { |
|
47 fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n"); |
|
48 exit(1); |
|
49 } |
|
50 |
|
51 /* Throw the comments plus a few lines about the bitstream we're |
|
52 decoding */ |
|
53 { |
|
54 char **ptr=ov_comment(&vf,-1)->user_comments; |
|
55 vorbis_info *vi=ov_info(&vf,-1); |
|
56 while(*ptr){ |
|
57 fprintf(stderr,"%s\n",*ptr); |
|
58 ++ptr; |
|
59 } |
|
60 fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate); |
|
61 fprintf(stderr,"\nDecoded length: %ld samples\n", |
|
62 (long)ov_pcm_total(&vf,-1)); |
|
63 fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor); |
|
64 } |
|
65 |
|
66 while(!eof){ |
|
67 long ret=ov_read(&vf,pcmout,sizeof(pcmout),¤t_section); |
|
68 if (ret == 0) { |
|
69 /* EOF */ |
|
70 eof=1; |
|
71 } else if (ret < 0) { |
|
72 /* error in the stream. Not a problem, just reporting it in |
|
73 case we (the app) cares. In this case, we don't. */ |
|
74 } else { |
|
75 /* we don't bother dealing with sample rate changes, etc, but |
|
76 you'll have to*/ |
|
77 fwrite(pcmout,1,ret,stdout); |
|
78 } |
|
79 } |
|
80 |
|
81 /* cleanup */ |
|
82 ov_clear(&vf); |
|
83 |
|
84 fprintf(stderr,"Done.\n"); |
|
85 return(0); |
|
86 } |