1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
9 * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: stdio-based convenience library for opening/seeking/decoding
15 last mod: $Id: vorbisfile.c,v 1.14 2000/01/28 09:05:18 xiphmont Exp $
17 ********************************************************************/
22 #include "vorbis/codec.h"
23 #include "vorbis/vorbisfile.h"
27 /* A 'chained bitstream' is a Vorbis bitstream that contains more than
28 one logical bitstream arranged end to end (the only form of Ogg
29 multiplexing allowed in a Vorbis bitstream; grouping [parallel
30 multiplexing] is not allowed in Vorbis) */
32 /* A Vorbis file can be played beginning to end (streamed) without
33 worrying ahead of time about chaining (see decoder_example.c). If
34 we have the whole file, however, and want random access
35 (seeking/scrubbing) or desire to know the total length/time of a
36 file, we need to account for the possibility of chaining. */
38 /* We can handle things a number of ways; we can determine the entire
39 bitstream structure right off the bat, or find pieces on demand.
40 This example determines and caches structure for the entire
41 bitstream, but builds a virtual decoder on the fly when moving
42 between links in the chain. */
44 /* There are also different ways to implement seeking. Enough
45 information exists in an Ogg bitstream to seek to
46 sample-granularity positions in the output. Or, one can seek by
47 picking some portion of the stream roughly in the desired area if
48 we only want course navigation through the stream. */
50 /*************************************************************************
51 * Many, many internal helpers. The intention is not to be confusing;
52 * rampant duplication and monolithic function implementation would be
53 * harder to understand anyway. The high level functions are last. Begin
54 * grokking near the end of the file */
56 /* read a little more data from the file/pipe into the ogg_sync framer */
57 #define CHUNKSIZE 4096
58 static long _get_data(OggVorbis_File *vf){
59 char *buffer=ogg_sync_buffer(&vf->oy,4096);
60 long bytes=fread(buffer,1,4096,vf->f);
61 ogg_sync_wrote(&vf->oy,bytes);
65 /* save a tiny smidge of verbosity to make the code more readable */
66 static void _seek_helper(OggVorbis_File *vf,long offset){
67 fseek(vf->f,offset,SEEK_SET);
69 ogg_sync_reset(&vf->oy);
72 /* The read/seek functions track absolute position within the stream */
74 /* from the head of the stream, get the next page. boundary specifies
75 if the function is allowed to fetch more data from the stream (and
76 how much) or only use internally buffered data.
78 boundary: -1) unbounded search
79 0) read no additional data; use cached only
80 n) search for a new page beginning for n bytes
82 return: -1) did not find a page
83 n) found a page at absolute offset n */
85 static long _get_next_page(OggVorbis_File *vf,ogg_page *og,int boundary){
86 if(boundary>0)boundary+=vf->offset;
90 if(boundary>0 && vf->offset>=boundary)return(-1);
91 more=ogg_sync_pageseek(&vf->oy,og);
98 /* send more paramedics */
99 if(!boundary)return(-1);
100 if(_get_data(vf)<=0)return(-1);
102 /* got a page. Return the offset at the page beginning,
103 advance the internal offset past the page end */
113 /* find the latest page beginning before the current stream cursor
114 position. Much dirtier than the above as Ogg doesn't have any
115 backward search linkage. no 'readp' as it will certainly have to
117 static long _get_prev_page(OggVorbis_File *vf,ogg_page *og){
118 long begin=vf->offset;
124 _seek_helper(vf,begin);
125 while(vf->offset<begin+CHUNKSIZE){
126 ret=_get_next_page(vf,og,begin+CHUNKSIZE-vf->offset);
135 /* we have the offset. Actually snork and hold the page now */
136 _seek_helper(vf,offset);
137 ret=_get_next_page(vf,og,CHUNKSIZE);
139 /* this shouldn't be possible */
140 fprintf(stderr,"Missed page fencepost at end of logical bitstream. "
147 /* finds each bitstream link one at a time using a bisection search
148 (has to begin by knowing the offset of the lb's initial page).
149 Recurses for each link so it can alloc the link storage after
150 finding them all, then unroll and fill the cache at the same time */
151 static void _bisect_forward_serialno(OggVorbis_File *vf,
157 long endsearched=end;
162 /* the below guards against garbage seperating the last and
163 first pages of two links. */
164 while(searched<endsearched){
167 if(endsearched-searched<CHUNKSIZE){
170 bisect=(searched+endsearched)/2;
173 _seek_helper(vf,bisect);
174 ret=_get_next_page(vf,&og,-1);
175 if(ret<0 || ogg_page_serialno(&og)!=currentno){
179 searched=ret+og.header_len+og.body_len;
183 _seek_helper(vf,next);
184 ret=_get_next_page(vf,&og,-1);
186 if(searched>=end || ret==-1){
188 vf->offsets=malloc((m+2)*sizeof(long));
189 vf->offsets[m+1]=searched;
191 _bisect_forward_serialno(vf,next,vf->offset,
192 end,ogg_page_serialno(&og),m+1);
195 vf->offsets[m]=begin;
198 /* uses the local ogg_stream storage in vf; this is important for
199 non-streaming input sources */
200 static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc,
206 ret=_get_next_page(vf,&og,CHUNKSIZE);
208 fprintf(stderr,"Did not find initial header for bitstream.\n");
212 if(serialno)*serialno=ogg_page_serialno(&og);
213 ogg_stream_init(&vf->os,ogg_page_serialno(&og));
215 /* extract the initial header from the first page and verify that the
216 Ogg bitstream is in fact Vorbis data */
218 vorbis_info_init(vi);
219 vorbis_comment_init(vc);
223 ogg_stream_pagein(&vf->os,&og);
225 int result=ogg_stream_packetout(&vf->os,&op);
228 fprintf(stderr,"Corrupt header in logical bitstream.\n");
231 if(vorbis_synthesis_headerin(vi,vc,&op)){
232 fprintf(stderr,"Illegal header in logical bitstream.\n");
238 if(_get_next_page(vf,&og,1)<0){
239 fprintf(stderr,"Missing header in logical bitstream.\n");
243 ogg_stream_clear(&vf->os);
247 vorbis_info_clear(vi);
248 vorbis_comment_clear(vc);
249 ogg_stream_clear(&vf->os);
253 /* last step of the OggVorbis_File initialization; get all the
254 vorbis_info structs and PCM positions. Only called by the seekable
255 initialization (local stream storage is hacked slightly; pay
256 attention to how that's done) */
257 static void _prefetch_all_headers(OggVorbis_File *vf,vorbis_info *first_i,
258 vorbis_comment *first_c,
263 vf->vi=calloc(vf->links,sizeof(vorbis_info));
264 vf->dataoffsets=malloc(vf->links*sizeof(long));
265 vf->pcmlengths=malloc(vf->links*sizeof(int64_t));
266 vf->serialnos=malloc(vf->links*sizeof(long));
268 for(i=0;i<vf->links;i++){
269 if(first_i && first_c && i==0){
270 /* we already grabbed the initial header earlier. This just
271 saves the waste of grabbing it again */
272 memcpy(vf->vi+i,first_i,sizeof(vorbis_info));
273 memcpy(vf->vc+i,first_c,sizeof(vorbis_comment));
274 vf->dataoffsets[i]=dataoffset;
277 /* seek to the location of the initial header */
279 _seek_helper(vf,vf->offsets[i]);
280 if(_fetch_headers(vf,vf->vi+i,vf->vc+i,NULL)==-1){
281 fprintf(stderr,"Error opening logical bitstream #%d.\n\n",i+1);
283 ogg_stream_clear(&vf->os); /* clear local storage. This is not
284 done in _fetch_headers, as that may
285 be called in a non-seekable stream
286 (in which case, we need to preserve
287 the stream local storage) */
288 vf->dataoffsets[i]=-1;
290 vf->dataoffsets[i]=vf->offset;
293 /* get the serial number and PCM length of this link. To do this,
294 get the last page of the stream */
296 long end=vf->offsets[i+1];
297 _seek_helper(vf,end);
300 ret=_get_prev_page(vf,&og);
302 /* this should not be possible */
303 fprintf(stderr,"Could not find last page of logical "
304 "bitstream #%d\n\n",i);
305 vorbis_info_clear(vf->vi+i);
306 vorbis_comment_clear(vf->vc+i);
309 if(ogg_page_frameno(&og)!=-1){
310 vf->serialnos[i]=ogg_page_serialno(&og);
311 vf->pcmlengths[i]=ogg_page_frameno(&og);
319 static int _open_seekable(OggVorbis_File *vf){
320 vorbis_info initial_i;
321 vorbis_comment initial_c;
327 /* is this even vorbis...? */
328 vorbis_info_init(&initial_i);
329 vorbis_comment_init(&initial_c);
330 ret=_fetch_headers(vf,&initial_i,&initial_c,&serialno);
331 dataoffset=vf->offset;
332 ogg_stream_clear(&vf->os);
333 if(ret==-1)return(-1);
335 /* we can seek, so set out learning all about this file */
337 fseek(vf->f,0,SEEK_END);
338 vf->offset=vf->end=ftell(vf->f);
340 /* We get the offset for the last page of the physical bitstream.
341 Most OggVorbis files will contain a single logical bitstream */
342 end=_get_prev_page(vf,&og);
344 /* moer than one logical bitstream? */
345 if(ogg_page_serialno(&og)!=serialno){
347 /* Chained bitstream. Bisect-search each logical bitstream
348 section. Do so based on serial number only */
349 _bisect_forward_serialno(vf,0,0,end+1,serialno,0);
353 /* Only one logical bitstream */
354 _bisect_forward_serialno(vf,0,end,end+1,serialno,0);
358 _prefetch_all_headers(vf,&initial_i,&initial_c,dataoffset);
364 static int _open_nonseekable(OggVorbis_File *vf){
365 /* we cannot seek. Set up a 'single' (current) logical bitstream entry */
367 vf->vi=malloc(sizeof(vorbis_info));
369 /* Try to fetch the headers, maintaining all the storage */
370 if(_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno)==-1)return(-1);
375 /* clear out the current logical bitstream decoder */
376 static void _decode_clear(OggVorbis_File *vf){
377 ogg_stream_clear(&vf->os);
378 vorbis_dsp_clear(&vf->vd);
379 vorbis_block_clear(&vf->vb);
384 /* fetch and process a packet. Handles the case where we're at a
385 bitstream boundary and dumps the decoding machine. If the decoding
386 machine is unloaded, it loads it. It also keeps pcm_offset up to
387 date (seek and read both use this. seek uses a special hack with
390 return: -1) hole in the data (lost packet)
391 0) need more date (only if readp==0)/eof
395 static int _process_packet(OggVorbis_File *vf,int readp){
398 /* handle one packet. Try to fetch it from current stream state */
399 /* extract packets from page */
402 /* process a packet if we can. If the machine isn't loaded,
404 if(vf->decode_ready){
406 int result=ogg_stream_packetout(&vf->os,&op);
409 if(result==-1)return(-1); /* hole in the data. alert the toplevel */
411 /* got a packet. process it */
413 if(!vorbis_synthesis(&vf->vb,&op)){ /* lazy check for lazy
415 header packets aren't
418 vorbis_synthesis will
420 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
422 /* update the pcm offset. */
424 int link=(vf->seekable?vf->current_link:0);
428 /* this packet has a pcm_offset on it (the last packet
429 completed on a page carries the offset) After processing
430 (above), we know the pcm position of the *last* sample
431 ready to be returned. Find the offset of the *first* */
433 samples=vorbis_synthesis_pcmout(&vf->vd,&dummy);
437 frameno+=vf->pcmlengths[i];
438 vf->pcm_offset=frameno;
446 if(_get_next_page(vf,&og,-1)<0)return(0); /* eof. leave unitialized */
448 /* has our decoding just traversed a bitstream boundary? */
449 if(vf->decode_ready){
450 if(vf->current_serialno!=ogg_page_serialno(&og)){
455 /* Do we need to load a new machine before submitting the page? */
456 /* This is different in the seekable and non-seekable cases.
458 In the seekable case, we already have all the header
459 information loaded and cached; we just initialize the machine
460 with it and continue on our merry way.
462 In the non-seekable (streaming) case, we'll only be at a
463 boundary if we just left the previous logical bitstream and
464 we're now nominally at the header of the next bitstream
467 if(!vf->decode_ready){
470 vf->current_serialno=ogg_page_serialno(&og);
472 /* match the serialno to bitstream section. We use this rather than
473 offset positions to avoid problems near logical bitstream
475 for(link=0;link<vf->links;link++)
476 if(vf->serialnos[link]==vf->current_serialno)break;
477 if(link==vf->links)return(-1); /* sign of a bogus stream. error out,
478 leave machine uninitialized */
480 vf->current_link=link;
482 /* we're streaming */
483 /* fetch the three header packets, build the info struct */
485 _fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno);
491 ogg_stream_init(&vf->os,vf->current_serialno);
492 ogg_stream_reset(&vf->os,ogg_page_pageno(&og));
493 vorbis_synthesis_init(&vf->vd,vf->vi+link);
494 vorbis_block_init(&vf->vd,&vf->vb);
497 ogg_stream_pagein(&vf->os,&og);
501 /**********************************************************************
502 * The helpers are over; it's all toplevel interface from here on out */
504 /* clear out the OggVorbis_File struct */
505 int ov_clear(OggVorbis_File *vf){
507 vorbis_block_clear(&vf->vb);
508 vorbis_dsp_clear(&vf->vd);
509 ogg_stream_clear(&vf->os);
511 if(vf->vi && vf->links){
513 for(i=0;i<vf->links;i++){
514 vorbis_info_clear(vf->vi+i);
515 vorbis_comment_clear(vf->vc+i);
519 if(vf->dataoffsets)free(vf->dataoffsets);
520 if(vf->pcmlengths)free(vf->pcmlengths);
521 if(vf->serialnos)free(vf->serialnos);
522 if(vf->offsets)free(vf->offsets);
523 ogg_sync_clear(&vf->oy);
524 if(vf->f)fclose(vf->f);
525 memset(vf,0,sizeof(OggVorbis_File));
530 /* inspects the OggVorbis file and finds/documents all the logical
531 bitstreams contained in it. Tries to be tolerant of logical
532 bitstream sections that are truncated/woogie.
538 int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){
539 long offset=fseek(f,0,SEEK_CUR);
542 memset(vf,0,sizeof(OggVorbis_File));
545 /* init the framing state */
546 ogg_sync_init(&vf->oy);
548 /* perhaps some data was previously read into a buffer for testing
549 against other stream types. Allow initialization from this
550 previously read data (as we may be reading from a non-seekable
553 char *buffer=ogg_sync_buffer(&vf->oy,ibytes);
554 memcpy(buffer,initial,ibytes);
555 ogg_sync_wrote(&vf->oy,ibytes);
558 /* can we seek? Stevens suggests the seek test was portable */
560 ret=_open_seekable(vf);
562 ret=_open_nonseekable(vf);
568 ogg_stream_init(&vf->os,vf->current_serialno);
569 vorbis_synthesis_init(&vf->vd,vf->vi);
570 vorbis_block_init(&vf->vd,&vf->vb);
576 /* How many logical bitstreams in this physical bitstream? */
577 long ov_streams(OggVorbis_File *vf){
581 /* Is the FILE * associated with vf seekable? */
582 long ov_seekable(OggVorbis_File *vf){
586 /* returns the bitrate for a given logical bitstream or the entire
587 physical bitstream. If the file is open for random access, it will
588 find the *actual* average bitrate. If the file is streaming, it
589 returns the nominal bitrate (if set) else the average of the
590 upper/lower bounds (if set) else -1 (unset).
592 If you want the actual bitrate field settings, get them from the
593 vorbis_info structs */
595 long ov_bitrate(OggVorbis_File *vf,int i){
596 if(i>=vf->links)return(-1);
597 if(!vf->seekable && i!=0)return(ov_bitrate(vf,0));
601 for(i=0;i<vf->links;i++)
602 bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8;
603 return(rint(bits/ov_time_total(vf,-1)));
606 /* return the actual bitrate */
607 return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i)));
609 /* return nominal if set */
610 if(vf->vi[i].bitrate_nominal>0){
611 return vf->vi[i].bitrate_nominal;
613 if(vf->vi[i].bitrate_upper>0){
614 if(vf->vi[i].bitrate_lower>0){
615 return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2;
617 return vf->vi[i].bitrate_upper;
627 long ov_serialnumber(OggVorbis_File *vf,int i){
628 if(i>=vf->links)return(-1);
629 if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1));
631 return(vf->current_serialno);
633 return(vf->serialnos[i]);
637 /* returns: total raw (compressed) length of content if i==-1
638 raw (compressed) length of that logical bitstream for i==0 to n
639 -1 if the stream is not seekable (we can't know the length)
641 long ov_raw_total(OggVorbis_File *vf,int i){
642 if(!vf->seekable || i>=vf->links)return(-1);
646 for(i=0;i<vf->links;i++)
647 acc+=ov_raw_total(vf,i);
650 return(vf->offsets[i+1]-vf->offsets[i]);
654 /* returns: total PCM length (samples) of content if i==-1
655 PCM length (samples) of that logical bitstream for i==0 to n
656 -1 if the stream is not seekable (we can't know the length)
658 int64_t ov_pcm_total(OggVorbis_File *vf,int i){
659 if(!vf->seekable || i>=vf->links)return(-1);
663 for(i=0;i<vf->links;i++)
664 acc+=ov_pcm_total(vf,i);
667 return(vf->pcmlengths[i]);
671 /* returns: total seconds of content if i==-1
672 seconds in that logical bitstream for i==0 to n
673 -1 if the stream is not seekable (we can't know the length)
675 double ov_time_total(OggVorbis_File *vf,int i){
676 if(!vf->seekable || i>=vf->links)return(-1);
680 for(i=0;i<vf->links;i++)
681 acc+=ov_time_total(vf,i);
684 return((float)(vf->pcmlengths[i])/vf->vi[i].rate);
688 /* seek to an offset relative to the *compressed* data. This also
689 immediately sucks in and decodes pages to update the PCM cursor. It
690 will cross a logical bitstream boundary, but only if it can't get
691 any packets out of the tail of the bitstream we seek to (so no
694 returns zero on success, nonzero on failure */
696 int ov_raw_seek(OggVorbis_File *vf,long pos){
698 if(!vf->seekable)return(-1); /* don't dump machine if we can't seek */
699 if(pos<0 || pos>vf->offsets[vf->links])goto seek_error;
701 /* clear out decoding machine state */
705 _seek_helper(vf,pos);
707 /* we need to make sure the pcm_offset is set. We use the
708 _fetch_packet helper to process one packet with readp set, then
709 call it until it returns '0' with readp not set (the last packet
710 from a page has the 'frameno' field set, and that's how the
711 helper updates the offset */
713 switch(_process_packet(vf,1)){
715 /* oh, eof. There are no packets remaining. Set the pcm offset to
717 vf->pcm_offset=ov_pcm_total(vf,-1);
720 /* error! missing data or invalid bitstream structure */
728 switch(_process_packet(vf,0)){
730 /* the offset is set. If it's a bogus bitstream with no offset
731 information, it's not but that's not our fault. We still run
732 gracefully, we're just missing the offset */
735 /* error! missing data or invalid bitstream structure */
738 /* continue processing packets */
744 /* dump the machine so we're in a known state */
749 /* seek to a sample offset relative to the decompressed pcm stream
751 returns zero on success, nonzero on failure */
753 int ov_pcm_seek(OggVorbis_File *vf,int64_t pos){
755 int64_t total=ov_pcm_total(vf,-1);
757 if(!vf->seekable)return(-1); /* don't dump machine if we can't seek */
758 if(pos<0 || pos>total)goto seek_error;
760 /* which bitstream section does this pcm offset occur in? */
761 for(link=vf->links-1;link>=0;link--){
762 total-=vf->pcmlengths[link];
766 /* search within the logical bitstream for the page with the highest
767 pcm_pos preceeding (or equal to) pos. There is a danger here;
768 missing pages or incorrect frame number information in the
769 bitstream could make our task impossible. Account for that (it
770 would be an error condition) */
772 int64_t target=pos-total;
773 long end=vf->offsets[link+1];
774 long begin=vf->offsets[link];
782 if(end-begin<CHUNKSIZE){
785 bisect=(end+begin)/2;
788 _seek_helper(vf,bisect);
789 ret=_get_next_page(vf,&og,end-bisect);
794 int64_t frameno=ogg_page_frameno(&og);
796 best=ret; /* raw offset of packet with frameno */
797 begin=vf->offset; /* raw offset of next packet */
804 /* found our page. seek to it (call raw_seek). */
806 if(ov_raw_seek(vf,best))goto seek_error;
810 if(vf->pcm_offset>=pos)goto seek_error;
811 if(pos>ov_pcm_total(vf,-1))goto seek_error;
813 /* discard samples until we reach the desired position. Crossing a
814 logical bitstream boundary with abandon is OK. */
815 while(vf->pcm_offset<pos){
817 long target=pos-vf->pcm_offset;
818 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
820 if(samples>target)samples=target;
821 vorbis_synthesis_read(&vf->vd,samples);
822 vf->pcm_offset+=samples;
825 if(_process_packet(vf,1)==0)
826 vf->pcm_offset=ov_pcm_total(vf,-1); /* eof */
831 /* dump machine so we're in a known state */
836 /* seek to a playback time relative to the decompressed pcm stream
837 returns zero on success, nonzero on failure */
838 int ov_time_seek(OggVorbis_File *vf,double seconds){
839 /* translate time to PCM position and call ov_pcm_seek */
842 int64_t pcm_total=ov_pcm_total(vf,-1);
843 double time_total=ov_time_total(vf,-1);
845 if(!vf->seekable)return(-1); /* don't dump machine if we can't seek */
846 if(seconds<0 || seconds>time_total)goto seek_error;
848 /* which bitstream section does this time offset occur in? */
849 for(link=vf->links-1;link>=0;link--){
850 pcm_total-=vf->pcmlengths[link];
851 time_total-=ov_time_total(vf,link);
852 if(seconds>=time_total)break;
855 /* enough information to convert time offset to pcm offset */
857 int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
858 return(ov_pcm_seek(vf,target));
862 /* dump machine so we're in a known state */
867 /* tell the current stream offset cursor. Note that seek followed by
868 tell will likely not give the set offset due to caching */
869 long ov_raw_tell(OggVorbis_File *vf){
873 /* return PCM offset (sample) of next PCM sample to be read */
874 int64_t ov_pcm_tell(OggVorbis_File *vf){
875 return(vf->pcm_offset);
878 /* return time offset (seconds) of next PCM sample to be read */
879 double ov_time_tell(OggVorbis_File *vf){
880 /* translate time to PCM position and call ov_pcm_seek */
884 double time_total=0.;
887 pcm_total=ov_pcm_total(vf,-1);
888 time_total=ov_time_total(vf,-1);
890 /* which bitstream section does this time offset occur in? */
891 for(link=vf->links-1;link>=0;link--){
892 pcm_total-=vf->pcmlengths[link];
893 time_total-=ov_time_total(vf,link);
894 if(vf->pcm_offset>pcm_total)break;
898 return(time_total+(vf->pcm_offset-pcm_total)/vf->vi[link].rate);
901 /* link: -1) return the vorbis_info struct for the bitstream section
902 currently being decoded
903 0-n) to request information for a specific bitstream section
905 In the case of a non-seekable bitstream, any call returns the
906 current bitstream. NULL in the case that the machine is not
909 vorbis_info *ov_info(OggVorbis_File *vf,int link){
913 return vf->vi+vf->current_link;
929 /* grr, strong typing, grr, no templates/inheritence, grr */
930 vorbis_comment *ov_comment(OggVorbis_File *vf,int link){
934 return vf->vc+vf->current_link;
950 /* up to this point, everything could more or less hide the multiple
951 logical bitstream nature of chaining from the toplevel application
952 if the toplevel application didn't particularly care. However, at
953 the point that we actually read audio back, the multiple-section
954 nature must surface: Multiple bitstream sections do not necessarily
955 have to have the same number of channels or sampling rate.
957 ov_read returns the sequential logical bitstream number currently
958 being decoded along with the PCM data in order that the toplevel
959 application can take action on channel/sample rate changes. This
960 number will be incremented even for streamed (non-seekable) streams
961 (for seekable streams, it represents the actual logical bitstream
962 index within the physical bitstream. Note that the accessor
963 functions above are aware of this dichotomy).
965 input values: buffer) a buffer to hold packed PCM data for return
966 length) the byte length requested to be placed into buffer
967 bigendianp) should the data be packed LSB first (0) or
969 word) word size for output. currently 1 (byte) or
972 return values: -1) error/hole in data
974 n) number of bytes of PCM actually returned. The
975 below works on a packet-by-packet basis, so the
976 return length is not related to the 'length' passed
977 in, just guaranteed to fit.
979 *section) set to the logical bitstream number */
981 long ov_read(OggVorbis_File *vf,char *buffer,int length,
982 int bigendianp,int word,int sgned,int *bitstream){
986 if(vf->decode_ready){
988 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
990 /* yay! proceed to pack data into the byte buffer */
992 long channels=ov_info(vf,-1)->channels;
993 long bytespersample=word * channels;
994 if(samples>length/bytespersample)samples=length/bytespersample;
996 /* a tight loop to pack each size */
999 int off=(sgned?0:128);
1000 for(j=0;j<samples;j++)
1001 for(i=0;i<channels;i++){
1002 int val=rint(pcm[i][j]*128.);
1004 if(val<-128)val=-128;
1008 int off=(sgned?0:32768);
1011 for(j=0;j<samples;j++)
1012 for(i=0;i<channels;i++){
1013 int val=rint(pcm[i][j]*32768.);
1014 if(val>32767)val=32767;
1015 if(val<-32768)val=-32768;
1018 *buffer++=(val&0xff);
1021 for(j=0;j<samples;j++)
1022 for(i=0;i<channels;i++){
1023 int val=rint(pcm[i][j]*32768.);
1024 if(val>32767)val=32767;
1025 if(val<-32768)val=-32768;
1027 *buffer++=(val&0xff);
1035 vorbis_synthesis_read(&vf->vd,samples);
1036 vf->pcm_offset+=samples;
1037 if(bitstream)*bitstream=vf->current_link;
1038 return(samples*bytespersample);
1042 /* suck in another packet */
1043 switch(_process_packet(vf,1)){