X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fencoder_example.c;h=d46a051a2dcdee553088b993527d4cadc2f0feda;hb=1ffc217cb77636d1a06939638d14c583e1e89525;hp=62daf8438b12f8d07ff6c153d17907969ec5a473;hpb=f52a198945b80fbdede1b5509720c80059a5962e;p=platform%2Fupstream%2Flibvorbis.git diff --git a/examples/encoder_example.c b/examples/encoder_example.c index 62daf84..d46a051 100644 --- a/examples/encoder_example.c +++ b/examples/encoder_example.c @@ -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-2001 * - * 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.42 2002/06/30 08:45:02 xiphmont Exp $ ********************************************************************/ @@ -32,7 +31,7 @@ #include #endif -#if defined(macintosh) && defined(__MWERKS__) +#if defined(__MACOS__) && defined(__MWERKS__) #include /* CodeWarrior's Mac "command-line" support */ #endif @@ -41,18 +40,18 @@ 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 */ vorbis_block vb; /* local working space for packet->PCM decode */ - int eos=0; + int eos=0,ret; int i, founddata; #if defined(macintosh) && defined(__MWERKS__) @@ -62,12 +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. */ - /* Beware the evil ifdef. We avoid these where we can, but this one we + /* if we were reading/writing a file, it would also need to in + 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 ); @@ -83,8 +84,7 @@ int main(){ { fread(readbuffer,1,2,stdin); - if ( ! strncmp(readbuffer, "da", 2) ) - { + if ( ! strncmp((char*)readbuffer, "da", 2) ){ founddata = 1; fread(readbuffer,1,6,stdin); break; @@ -93,15 +93,44 @@ int main(){ /********** Encode setup ************/ - /* choose an encoding mode */ - /* (quality mode .4: 44kHz stereo coupled, roughly 128kbps VBR) */ vorbis_info_init(&vi); - vorbis_encode_setup_managed(&vi,2,44100,-1,128000,-1); - //vorbis_encode_init(&vi,2,44100,-1,128000,-1); - //vorbis_encode_init_vbr(&vi,2,44100,.45); - vorbis_encode_ctl(&vi,OV_ECTL_RATEMANAGE_AVG,NULL); - vorbis_encode_setup_init(&vi); + /* choose an encoding mode. A few possibilities commented out, one + actually used: */ + + /********************************************************************* + 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); + + --------------------------------------------------------------------- + + Encoding using an average bitrate mode (ABR). + example: 44kHz stereo coupled, average 128kbps VBR + + ret = vorbis_encode_init(&vi,2,44100,-1,128000,-1); + + --------------------------------------------------------------------- + + 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_RATEMANAGE2_SET,NULL) || + vorbis_encode_setup_init(&vi)); + + *********************************************************************/ + + 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, + will return 'OV_EIMPL') */ + + if(ret)exit(1); /* add a comment */ vorbis_comment_init(&vc); @@ -110,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 */ @@ -131,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 */ @@ -164,15 +192,15 @@ int main(){ /* expose the buffer to submit data */ float **buffer=vorbis_analysis_buffer(&vd,READ); - + /* uninterleave samples */ for(i=0;i