* 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.50 2002/07/16 09:26:07 xiphmont Exp $
********************************************************************/
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 */
/* 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","wb"); */
- /* Beware the evil ifdef. We avoid these where we can, but this one we
+ /* 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 );
{
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;
/*********************************************************************
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
-
+ 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);
---------------------------------------------------------------------
/* 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 */
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);
- /* 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);
- }
+ /* 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 */
/* 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);
}
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);
}