X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fencoder_example.c;h=d46a051a2dcdee553088b993527d4cadc2f0feda;hb=10064bfdd51f7c59aa7724c206aae84b62def5e8;hp=530e27f2301665adf1aacdc56f06750029c42d59;hpb=5ccc61230de45f33b8d976c97fad2c09a2d6b1e7;p=platform%2Fupstream%2Flibvorbis.git diff --git a/examples/encoder_example.c b/examples/encoder_example.c index 530e27f..d46a051 100644 --- a/examples/encoder_example.c +++ b/examples/encoder_example.c @@ -1,18 +1,16 @@ /******************************************************************** * * - * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY * - * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. * - * PLEASE READ THESE TERMS DISTRIBUTING. * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * - * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 * - * by Monty and 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.6 2000/01/28 15:25:07 xiphmont Exp $ ********************************************************************/ @@ -23,53 +21,130 @@ #include #include +#include #include #include -#include "vorbis/modes.h" +#include + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +#include +#include +#endif + +#if defined(__MACOS__) && defined(__MWERKS__) +#include /* CodeWarrior's Mac "command-line" support */ +#endif #define READ 1024 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 */ + + vorbis_info vi; /* struct that stores all the static vorbis bitstream + 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__) + int argc = 0; + char **argv = NULL; + argc = ccommand(&argv); /* get a "command line" from the Mac user */ + /* this also lets the user set stdin and stdout */ +#endif + + /* 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. */ - /* we cheat on the WAV header; we just bypass 44 bytes and never +#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","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 ); +#endif + + + /* we cheat on the WAV header; we just bypass the header and never verify that it matches 16bit/stereo/44.1kHz. This is just an example, after all. */ - fread(readbuffer,1,44,stdin); + readbuffer[0] = '\0'; + for (i=0, founddata=0; i<30 && ! feof(stdin) && ! ferror(stdin); i++) + { + fread(readbuffer,1,2,stdin); + + if ( ! strncmp((char*)readbuffer, "da", 2) ){ + founddata = 1; + fread(readbuffer,1,6,stdin); + break; + } + } /********** Encode setup ************/ - /* choose an encoding mode */ - /* (mode 0: 44kHz stereo uncoupled, roughly 128kbps VBR) */ - vi=&info_A; + vorbis_info_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); - vorbis_comment_add(&vc,"Track encoded by encoder_example.c"); + vorbis_comment_add_tag(&vc,"ENCODER","encoder_example.c"); /* set up the analysis state and auxiliary encoding storage */ - vorbis_analysis_init(&vd,vi); + 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 */ - srandom(time(NULL)); - ogg_stream_init(&os,random()); + srand(time(NULL)); + ogg_stream_init(&os,rand()); /* Vorbis streams begin with three headers; the initial header (with most of the codec setup parameters) which is mandated by the Ogg @@ -85,13 +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); - /* no need to write out here. We'll get to that in the main loop */ + /* 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 */ @@ -107,16 +191,16 @@ int main(){ /* data to encode */ /* expose the buffer to submit data */ - double **buffer=vorbis_analysis_buffer(&vd,READ); - + float **buffer=vorbis_analysis_buffer(&vd,READ); + /* uninterleave samples */ for(i=0;i