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