Bump libvorbisenc version for 1.3.5 release.
[platform/upstream/libvorbis.git] / examples / decoder_example.c
index 6ee9898..68c40d1 100644 (file)
@@ -5,7 +5,7 @@
  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
  *                                                                  *
- * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
  * by the Xiph.Org Foundation http://www.xiph.org/                  *
  *                                                                  *
  ********************************************************************
@@ -43,21 +43,21 @@ extern void _VDBG_dump(void);
 int main(){
   ogg_sync_state   oy; /* sync and verify incoming physical bitstream */
   ogg_stream_state os; /* take physical pages, weld into a logical
-                         stream of packets */
+                          stream of packets */
   ogg_page         og; /* one Ogg bitstream page. Vorbis packets are inside */
   ogg_packet       op; /* one raw packet of data for decode */
-  
+
   vorbis_info      vi; /* struct that stores all the static vorbis bitstream
-                         settings */
+                          settings */
   vorbis_comment   vc; /* struct that stores all the bitstream user comments */
   vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
   vorbis_block     vb; /* local working space for packet->PCM decode */
-  
+
   char *buffer;
   int  bytes;
 
 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
-  /* Beware the evil ifdef. We avoid these where we can, but this one we 
+  /* Beware the evil ifdef. We avoid these where we can, but this one we
      cannot. Don't add any more, you'll probably go to hell if you do. */
   _setmode( _fileno( stdin ), _O_BINARY );
   _setmode( _fileno( stdout ), _O_BINARY );
@@ -129,7 +129,7 @@ int main(){
     if(vorbis_synthesis_headerin(&vi,&vc,&op)<0){ 
       /* error case; not a vorbis header */
       fprintf(stderr,"This Ogg bitstream does not contain Vorbis "
-             "audio data.\n");
+              "audio data.\n");
       exit(1);
     }
     
@@ -146,38 +146,38 @@ int main(){
     i=0;
     while(i<2){
       while(i<2){
-       int result=ogg_sync_pageout(&oy,&og);
-       if(result==0)break; /* Need more data */
-       /* Don't complain about missing or corrupt data yet. We'll
-          catch it at the packet output phase */
-       if(result==1){
-         ogg_stream_pagein(&os,&og); /* we can ignore any errors here
-                                        as they'll also become apparent
-                                        at packetout */
-         while(i<2){
-           result=ogg_stream_packetout(&os,&op);
-           if(result==0)break;
-           if(result<0){
-             /* Uh oh; data at some point was corrupted or missing!
-                We can't tolerate that in a header.  Die. */
-             fprintf(stderr,"Corrupt secondary header.  Exiting.\n");
-             exit(1);
-           }
-           result=vorbis_synthesis_headerin(&vi,&vc,&op);
-           if(result<0){
-             fprintf(stderr,"Corrupt secondary header.  Exiting.\n");
-             exit(1);
-           }
-           i++;
-         }
-       }
+        int result=ogg_sync_pageout(&oy,&og);
+        if(result==0)break; /* Need more data */
+        /* Don't complain about missing or corrupt data yet. We'll
+           catch it at the packet output phase */
+        if(result==1){
+          ogg_stream_pagein(&os,&og); /* we can ignore any errors here
+                                         as they'll also become apparent
+                                         at packetout */
+          while(i<2){
+            result=ogg_stream_packetout(&os,&op);
+            if(result==0)break;
+            if(result<0){
+              /* Uh oh; data at some point was corrupted or missing!
+                 We can't tolerate that in a header.  Die. */
+              fprintf(stderr,"Corrupt secondary header.  Exiting.\n");
+              exit(1);
+            }
+            result=vorbis_synthesis_headerin(&vi,&vc,&op);
+            if(result<0){
+              fprintf(stderr,"Corrupt secondary header.  Exiting.\n");
+              exit(1);
+            }
+            i++;
+          }
+        }
       }
       /* no harm in not checking before adding more */
       buffer=ogg_sync_buffer(&oy,4096);
       bytes=fread(buffer,1,4096,stdin);
       if(bytes==0 && i<2){
-       fprintf(stderr,"End of file before finding all Vorbis headers!\n");
-       exit(1);
+        fprintf(stderr,"End of file before finding all Vorbis headers!\n");
+        exit(1);
       }
       ogg_sync_wrote(&oy,bytes);
     }
@@ -187,8 +187,8 @@ int main(){
     {
       char **ptr=vc.user_comments;
       while(*ptr){
-       fprintf(stderr,"%s\n",*ptr);
-       ++ptr;
+        fprintf(stderr,"%s\n",*ptr);
+        ++ptr;
       }
       fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi.channels,vi.rate);
       fprintf(stderr,"Encoded by: %s\n\n",vc.vendor);
@@ -200,97 +200,97 @@ int main(){
        packet->PCM decoder. */
     if(vorbis_synthesis_init(&vd,&vi)==0){ /* central decode state */
       vorbis_block_init(&vd,&vb);          /* local state for most of the decode
-                                             so multiple block decodes can
-                                             proceed in parallel. We could init
-                                             multiple vorbis_block structures
-                                             for vd here */
+                                              so multiple block decodes can
+                                              proceed in parallel. We could init
+                                              multiple vorbis_block structures
+                                              for vd here */
       
       /* The rest is just a straight decode loop until end of stream */
       while(!eos){
-       while(!eos){
-         int result=ogg_sync_pageout(&oy,&og);
-         if(result==0)break; /* need more data */
-         if(result<0){ /* missing or corrupt data at this page position */
-           fprintf(stderr,"Corrupt or missing data in bitstream; "
-                   "continuing...\n");
-         }else{
-           ogg_stream_pagein(&os,&og); /* can safely ignore errors at
-                                          this point */
-           while(1){
-             result=ogg_stream_packetout(&os,&op);
-             
-             if(result==0)break; /* need more data */
-             if(result<0){ /* missing or corrupt data at this page position */
-               /* no reason to complain; already complained above */
-             }else{
-               /* we have a packet.  Decode it */
-               float **pcm;
-               int samples;
-               
-               if(vorbis_synthesis(&vb,&op)==0) /* test for success! */
-                 vorbis_synthesis_blockin(&vd,&vb);
-               /* 
-                  
-               **pcm is a multichannel float vector.  In stereo, for
-               example, pcm[0] is left, and pcm[1] is right.  samples is
-               the size of each channel.  Convert the float values
-               (-1.<=range<=1.) to whatever PCM format and write it out */
-               
-               while((samples=vorbis_synthesis_pcmout(&vd,&pcm))>0){
-                 int j;
-                 int clipflag=0;
-                 int bout=(samples<convsize?samples:convsize);
-                 
-                 /* convert floats to 16 bit signed ints (host order) and
-                    interleave */
-                 for(i=0;i<vi.channels;i++){
-                   ogg_int16_t *ptr=convbuffer+i;
-                   float  *mono=pcm[i];
-                   for(j=0;j<bout;j++){
+        while(!eos){
+          int result=ogg_sync_pageout(&oy,&og);
+          if(result==0)break; /* need more data */
+          if(result<0){ /* missing or corrupt data at this page position */
+            fprintf(stderr,"Corrupt or missing data in bitstream; "
+                    "continuing...\n");
+          }else{
+            ogg_stream_pagein(&os,&og); /* can safely ignore errors at
+                                           this point */
+            while(1){
+              result=ogg_stream_packetout(&os,&op);
+              
+              if(result==0)break; /* need more data */
+              if(result<0){ /* missing or corrupt data at this page position */
+                /* no reason to complain; already complained above */
+              }else{
+                /* we have a packet.  Decode it */
+                float **pcm;
+                int samples;
+                
+                if(vorbis_synthesis(&vb,&op)==0) /* test for success! */
+                  vorbis_synthesis_blockin(&vd,&vb);
+                /* 
+                   
+                **pcm is a multichannel float vector.  In stereo, for
+                example, pcm[0] is left, and pcm[1] is right.  samples is
+                the size of each channel.  Convert the float values
+                (-1.<=range<=1.) to whatever PCM format and write it out */
+                
+                while((samples=vorbis_synthesis_pcmout(&vd,&pcm))>0){
+                  int j;
+                  int clipflag=0;
+                  int bout=(samples<convsize?samples:convsize);
+                  
+                  /* convert floats to 16 bit signed ints (host order) and
+                     interleave */
+                  for(i=0;i<vi.channels;i++){
+                    ogg_int16_t *ptr=convbuffer+i;
+                    float  *mono=pcm[i];
+                    for(j=0;j<bout;j++){
 #if 1
-                     int val=mono[j]*32767.f;
+                      int val=floor(mono[j]*32767.f+.5f);
 #else /* optional dither */
-                     int val=mono[j]*32767.f+drand48()-0.5f;
+                      int val=mono[j]*32767.f+drand48()-0.5f;
 #endif
-                     /* might as well guard against clipping */
-                     if(val>32767){
-                       val=32767;
-                       clipflag=1;
-                     }
-                     if(val<-32768){
-                       val=-32768;
-                       clipflag=1;
-                     }
-                     *ptr=val;
-                     ptr+=vi.channels;
-                   }
-                 }
-                 
-                 if(clipflag)
-                   fprintf(stderr,"Clipping in frame %ld\n",(long)(vd.sequence));
-                 
-                 
-                 fwrite(convbuffer,2*vi.channels,bout,stdout);
-                 
-                 vorbis_synthesis_read(&vd,bout); /* tell libvorbis how
-                                                     many samples we
-                                                     actually consumed */
-               }           
-             }
-           }
-           if(ogg_page_eos(&og))eos=1;
-         }
-       }
-       if(!eos){
-         buffer=ogg_sync_buffer(&oy,4096);
-         bytes=fread(buffer,1,4096,stdin);
-         ogg_sync_wrote(&oy,bytes);
-         if(bytes==0)eos=1;
-       }
+                      /* might as well guard against clipping */
+                      if(val>32767){
+                        val=32767;
+                        clipflag=1;
+                      }
+                      if(val<-32768){
+                        val=-32768;
+                        clipflag=1;
+                      }
+                      *ptr=val;
+                      ptr+=vi.channels;
+                    }
+                  }
+                  
+                  if(clipflag)
+                    fprintf(stderr,"Clipping in frame %ld\n",(long)(vd.sequence));
+                  
+                  
+                  fwrite(convbuffer,2*vi.channels,bout,stdout);
+                  
+                  vorbis_synthesis_read(&vd,bout); /* tell libvorbis how
+                                                      many samples we
+                                                      actually consumed */
+                }            
+              }
+            }
+            if(ogg_page_eos(&og))eos=1;
+          }
+        }
+        if(!eos){
+          buffer=ogg_sync_buffer(&oy,4096);
+          bytes=fread(buffer,1,4096,stdin);
+          ogg_sync_wrote(&oy,bytes);
+          if(bytes==0)eos=1;
+        }
       }
       
       /* ogg_page and ogg_packet structs always point to storage in
-        libvorbis.  They're never freed or manipulated directly */
+         libvorbis.  They're never freed or manipulated directly */
       
       vorbis_block_clear(&vb);
       vorbis_dsp_clear(&vd);