18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/********************************************************************
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: simple example encoder
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: encoder_example.c 16946 2010-03-03 16:12:40Z xiphmont $
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* takes a stereo 16bit 44.1kHz WAV file from stdin and encodes it into
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   a Vorbis bitstream */
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* Note that this is POSIX, not ANSI, code */
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdio.h>
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdlib.h>
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <string.h>
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <time.h>
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <math.h>
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <vorbis/vorbisenc.h>
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <io.h>
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <fcntl.h>
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if defined(__MACOS__) && defined(__MWERKS__)
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <console.h>      /* CodeWarrior's Mac "command-line" support */
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define READ 1024
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssigned char readbuffer[READ*4+44]; /* out of the data segment, not the stack */
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsint main(){
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_stream_state os; /* take physical pages, weld into a logical
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                          stream of packets */
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_page         og; /* one Ogg bitstream page.  Vorbis packets are inside */
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_packet       op; /* one raw packet of data for decode */
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info      vi; /* struct that stores all the static vorbis bitstream
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                          settings */
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_comment   vc; /* struct that stores all the user comments */
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_block     vb; /* local working space for packet->PCM decode */
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int eos=0,ret;
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int i, founddata;
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if defined(macintosh) && defined(__MWERKS__)
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int argc = 0;
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  char **argv = NULL;
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  argc = ccommand(&argv); /* get a "command line" from the Mac user */
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                          /* this also lets the user set stdin and stdout */
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* we cheat on the WAV header; we just bypass 44 bytes (simplest WAV
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     header is 44 bytes) and assume that the data is 44.1khz, stereo, 16 bit
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     little endian pcm samples. This is just an example, after all. */
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* if we were reading/writing a file, it would also need to in
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     binary mode, eg, fopen("file.wav","wb"); */
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* Beware the evil ifdef. We avoid these where we can, but this one we
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     cannot. Don't add any more, you'll probably go to hell if you do. */
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  _setmode( _fileno( stdin ), _O_BINARY );
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  _setmode( _fileno( stdout ), _O_BINARY );
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* we cheat on the WAV header; we just bypass the header and never
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     verify that it matches 16bit/stereo/44.1kHz.  This is just an
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     example, after all. */
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  readbuffer[0] = '\0';
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for (i=0, founddata=0; i<30 && ! feof(stdin) && ! ferror(stdin); i++)
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  {
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fread(readbuffer,1,2,stdin);
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if ( ! strncmp((char*)readbuffer, "da", 2) ){
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      founddata = 1;
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fread(readbuffer,1,6,stdin);
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      break;
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /********** Encode setup ************/
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_init(&vi);
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* choose an encoding mode.  A few possibilities commented out, one
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     actually used: */
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /*********************************************************************
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   Encoding using a VBR quality mode.  The usable range is -.1
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   (lowest quality, smallest file) to 1. (highest quality, largest file).
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   Example quality mode .4: 44kHz stereo coupled, roughly 128kbps VBR
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   ret = vorbis_encode_init_vbr(&vi,2,44100,.4);
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   ---------------------------------------------------------------------
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   Encoding using an average bitrate mode (ABR).
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   example: 44kHz stereo coupled, average 128kbps VBR
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   ret = vorbis_encode_init(&vi,2,44100,-1,128000,-1);
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   ---------------------------------------------------------------------
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   Encode using a quality mode, but select that quality mode by asking for
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   an approximate bitrate.  This is not ABR, it is true VBR, but selected
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   using the bitrate interface, and then turning bitrate management off:
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   ret = ( vorbis_encode_setup_managed(&vi,2,44100,-1,128000,-1) ||
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           vorbis_encode_ctl(&vi,OV_ECTL_RATEMANAGE2_SET,NULL) ||
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           vorbis_encode_setup_init(&vi));
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   *********************************************************************/
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ret=vorbis_encode_init_vbr(&vi,2,44100,0.1);
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* do not continue if setup failed; this can happen if we ask for a
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     mode that libVorbis does not support (eg, too low a bitrate, etc,
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     will return 'OV_EIMPL') */
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(ret)exit(1);
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* add a comment */
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_comment_init(&vc);
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_comment_add_tag(&vc,"ENCODER","encoder_example.c");
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* set up the analysis state and auxiliary encoding storage */
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_analysis_init(&vd,&vi);
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_block_init(&vd,&vb);
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* set up our packet->stream encoder */
1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* pick a random serial number; that way we can more likely build
1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     chained streams just by concatenation */
1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  srand(time(NULL));
1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_stream_init(&os,rand());
1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* Vorbis streams begin with three headers; the initial header (with
1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     most of the codec setup parameters) which is mandated by the Ogg
1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     bitstream spec.  The second header holds any comment fields.  The
1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     third header holds the bitstream codebook.  We merely need to
1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     make the headers, then pass them to libvorbis one at a time;
1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     libvorbis handles the additional Ogg bitstream constraints */
1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  {
1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_packet header;
1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_packet header_comm;
1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_packet header_code;
1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code);
1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_stream_packetin(&os,&header); /* automatically placed in its own
1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                         page */
1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_stream_packetin(&os,&header_comm);
1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_stream_packetin(&os,&header_code);
1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* This ensures the actual
1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     * audio data will start on a new page, as per spec
1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     */
1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    while(!eos){
1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      int result=ogg_stream_flush(&os,&og);
1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(result==0)break;
1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fwrite(og.header,1,og.header_len,stdout);
1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fwrite(og.body,1,og.body_len,stdout);
1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  while(!eos){
1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    long i;
1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    long bytes=fread(readbuffer,1,READ*4,stdin); /* stereo hardwired here */
1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(bytes==0){
1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* end of file.  this can be done implicitly in the mainline,
1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         but it's easier to see here in non-clever fashion.
1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         Tell the library we're at end of stream so that it can handle
1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         the last frame and mark end of stream in the output properly */
1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      vorbis_analysis_wrote(&vd,0);
1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }else{
1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* data to encode */
1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* expose the buffer to submit data */
1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float **buffer=vorbis_analysis_buffer(&vd,READ);
1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* uninterleave samples */
1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<bytes/4;i++){
1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        buffer[0][i]=((readbuffer[i*4+1]<<8)|
2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                      (0x00ff&(int)readbuffer[i*4]))/32768.f;
2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        buffer[1][i]=((readbuffer[i*4+3]<<8)|
2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                      (0x00ff&(int)readbuffer[i*4+2]))/32768.f;
2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* tell the library how much we actually submitted */
2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      vorbis_analysis_wrote(&vd,i);
2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* vorbis does some data preanalysis, then divvies up blocks for
2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       more involved (potentially parallel) processing.  Get a single
2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       block for encoding now */
2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    while(vorbis_analysis_blockout(&vd,&vb)==1){
2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* analysis, assume we want to use bitrate management */
2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      vorbis_analysis(&vb,NULL);
2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      vorbis_bitrate_addblock(&vb);
2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      while(vorbis_bitrate_flushpacket(&vd,&op)){
2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        /* weld the packet into the bitstream */
2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ogg_stream_packetin(&os,&op);
2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        /* write out pages (if any) */
2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        while(!eos){
2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          int result=ogg_stream_pageout(&os,&og);
2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if(result==0)break;
2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fwrite(og.header,1,og.header_len,stdout);
2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fwrite(og.body,1,og.body_len,stdout);
2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          /* this could be set above, but for illustrative purposes, I do
2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             it here (to show that vorbis does know where the stream ends) */
2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if(ogg_page_eos(&og))eos=1;
2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* clean up and exit.  vorbis_info_clear() must be called last */
2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_stream_clear(&os);
2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_block_clear(&vb);
2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_dsp_clear(&vd);
2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_comment_clear(&vc);
2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_clear(&vi);
2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* ogg_page and ogg_packet structs always point to storage in
2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     libvorbis.  They're never freed or manipulated directly */
2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  fprintf(stderr,"Done.\n");
2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return(0);
2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
253