Include CMake build scripts in release archives
[platform/upstream/libvorbis.git] / examples / encoder_example.c
index 00bc0a8..d46a051 100644 (file)
@@ -5,13 +5,12 @@
  * 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-2002             *
- * by the XIPHOPHORUS Company http://www.xiph.org/                  *
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *
+ * by the Xiph.Org Foundation http://www.xiph.org/                  *
  *                                                                  *
  ********************************************************************
 
  function: simple example encoder
- last mod: $Id: encoder_example.c,v 1.48 2002/07/12 15:07:52 giles Exp $
 
  ********************************************************************/
 
@@ -41,12 +40,12 @@ signed char readbuffer[READ*4+44]; /* out of the data segment, not the stack */
 
 int main(){
   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 user comments */
 
   vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
@@ -62,14 +61,14 @@ int main(){
                           /* this also lets the user set stdin and stdout */
 #endif
 
-  /* we cheat on the WAV header; we just bypass 44 bytes and never
-     verify that it matches 16bit/stereo/44.1kHz.  This is just an
-     example, after all. */
+  /* we cheat on the WAV header; we just bypass 44 bytes (simplest WAV
+     header is 44 bytes) and assume that the data is 44.1khz, stereo, 16 bit
+     little endian pcm samples. This is just an example, after all. */
 
 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
   /* if we were reading/writing a file, it would also need to in
-     binary mode, eg, 'fopen("file.wav","rb"); */
-  /* Beware the evil ifdef. We avoid these where we can, but this one we 
+     binary mode, eg, fopen("file.wav","wb"); */
+  /* 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 );
@@ -85,8 +84,7 @@ int main(){
   {
     fread(readbuffer,1,2,stdin);
 
-    if ( ! strncmp((char*)readbuffer, "da", 2) )
-    {
+    if ( ! strncmp((char*)readbuffer, "da", 2) ){
       founddata = 1;
       fread(readbuffer,1,6,stdin);
       break;
@@ -103,30 +101,30 @@ int main(){
   /*********************************************************************
    Encoding using a VBR quality mode.  The usable range is -.1
    (lowest quality, smallest file) to 1. (highest quality, largest file).
-   Example quality mode .4: 44kHz stereo coupled, roughly 128kbps VBR 
-  
-   ret = vorbis_encode_init_vbr(&vi,2,44100,-.4);
+   Example quality mode .4: 44kHz stereo coupled, roughly 128kbps VBR
+
+   ret = vorbis_encode_init_vbr(&vi,2,44100,.4);
 
    ---------------------------------------------------------------------
 
    Encoding using an average bitrate mode (ABR).
-   example: 44kHz stereo coupled, average 128kbps VBR 
-  
+   example: 44kHz stereo coupled, average 128kbps VBR
+
    ret = vorbis_encode_init(&vi,2,44100,-1,128000,-1);
 
    ---------------------------------------------------------------------
 
-   Encode using a qulity mode, but select that quality mode by asking for
+   Encode using a quality mode, but select that quality mode by asking for
    an approximate bitrate.  This is not ABR, it is true VBR, but selected
    using the bitrate interface, and then turning bitrate management off:
 
    ret = ( vorbis_encode_setup_managed(&vi,2,44100,-1,128000,-1) ||
-           vorbis_encode_ctl(&vi,OV_ECTL_RATEMANAGE_AVG,NULL) ||
+           vorbis_encode_ctl(&vi,OV_ECTL_RATEMANAGE2_SET,NULL) ||
            vorbis_encode_setup_init(&vi));
 
    *********************************************************************/
 
-  ret=vorbis_encode_init_vbr(&vi,2,44100,.3);
+  ret=vorbis_encode_init_vbr(&vi,2,44100,0.1);
 
   /* do not continue if setup failed; this can happen if we ask for a
      mode that libVorbis does not support (eg, too low a bitrate, etc,
@@ -141,7 +139,7 @@ int main(){
   /* set up the analysis state and auxiliary encoding storage */
   vorbis_analysis_init(&vd,&vi);
   vorbis_block_init(&vd,&vb);
-  
+
   /* set up our packet->stream encoder */
   /* pick a random serial number; that way we can more likely build
      chained streams just by concatenation */
@@ -162,23 +160,22 @@ int main(){
 
     vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code);
     ogg_stream_packetin(&os,&header); /* automatically placed in its own
-                                        page */
+                                         page */
     ogg_stream_packetin(&os,&header_comm);
     ogg_stream_packetin(&os,&header_code);
 
-       /* We don't have to write out here, but doing so makes streaming 
-        * much easier, so we do, flushing ALL pages. This ensures the actual
-        * audio data will start on a new page
-        */
-       while(!eos){
-               int result=ogg_stream_flush(&os,&og);
-               if(result==0)break;
-               fwrite(og.header,1,og.header_len,stdout);
-               fwrite(og.body,1,og.body_len,stdout);
-       }
+    /* This ensures the actual
+     * audio data will start on a new page, as per spec
+     */
+    while(!eos){
+      int result=ogg_stream_flush(&os,&og);
+      if(result==0)break;
+      fwrite(og.header,1,og.header_len,stdout);
+      fwrite(og.body,1,og.body_len,stdout);
+    }
 
   }
-  
+
   while(!eos){
     long i;
     long bytes=fread(readbuffer,1,READ*4,stdin); /* stereo hardwired here */
@@ -195,15 +192,15 @@ int main(){
 
       /* expose the buffer to submit data */
       float **buffer=vorbis_analysis_buffer(&vd,READ);
-      
+
       /* uninterleave samples */
       for(i=0;i<bytes/4;i++){
-       buffer[0][i]=((readbuffer[i*4+1]<<8)|
-                     (0x00ff&(int)readbuffer[i*4]))/32768.f;
-       buffer[1][i]=((readbuffer[i*4+3]<<8)|
-                     (0x00ff&(int)readbuffer[i*4+2]))/32768.f;
+        buffer[0][i]=((readbuffer[i*4+1]<<8)|
+                      (0x00ff&(int)readbuffer[i*4]))/32768.f;
+        buffer[1][i]=((readbuffer[i*4+3]<<8)|
+                      (0x00ff&(int)readbuffer[i*4+2]))/32768.f;
       }
-    
+
       /* tell the library how much we actually submitted */
       vorbis_analysis_wrote(&vd,i);
     }
@@ -218,37 +215,37 @@ int main(){
       vorbis_bitrate_addblock(&vb);
 
       while(vorbis_bitrate_flushpacket(&vd,&op)){
-       
-       /* weld the packet into the bitstream */
-       ogg_stream_packetin(&os,&op);
-       
-       /* write out pages (if any) */
-       while(!eos){
-         int result=ogg_stream_pageout(&os,&og);
-         if(result==0)break;
-         fwrite(og.header,1,og.header_len,stdout);
-         fwrite(og.body,1,og.body_len,stdout);
-         
-         /* this could be set above, but for illustrative purposes, I do
-            it here (to show that vorbis does know where the stream ends) */
-         
-         if(ogg_page_eos(&og))eos=1;
-       }
+
+        /* weld the packet into the bitstream */
+        ogg_stream_packetin(&os,&op);
+
+        /* write out pages (if any) */
+        while(!eos){
+          int result=ogg_stream_pageout(&os,&og);
+          if(result==0)break;
+          fwrite(og.header,1,og.header_len,stdout);
+          fwrite(og.body,1,og.body_len,stdout);
+
+          /* this could be set above, but for illustrative purposes, I do
+             it here (to show that vorbis does know where the stream ends) */
+
+          if(ogg_page_eos(&og))eos=1;
+        }
       }
     }
   }
 
   /* clean up and exit.  vorbis_info_clear() must be called last */
-  
+
   ogg_stream_clear(&os);
   vorbis_block_clear(&vb);
   vorbis_dsp_clear(&vd);
   vorbis_comment_clear(&vc);
   vorbis_info_clear(&vi);
-  
+
   /* ogg_page and ogg_packet structs always point to storage in
      libvorbis.  They're never freed or manipulated directly */
-  
+
   fprintf(stderr,"Done.\n");
   return(0);
 }