1 /********************************************************************
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
11 ********************************************************************
13 function: stdio-based convenience library for opening/seeking/decoding
15 ********************************************************************/
23 #include "vorbis/codec.h"
25 /* we don't need or want the static callback symbols here */
26 #define OV_EXCLUDE_STATIC_CALLBACKS
27 #include "vorbis/vorbisfile.h"
32 /* A 'chained bitstream' is a Vorbis bitstream that contains more than
33 one logical bitstream arranged end to end (the only form of Ogg
34 multiplexing allowed in a Vorbis bitstream; grouping [parallel
35 multiplexing] is not allowed in Vorbis) */
37 /* A Vorbis file can be played beginning to end (streamed) without
38 worrying ahead of time about chaining (see decoder_example.c). If
39 we have the whole file, however, and want random access
40 (seeking/scrubbing) or desire to know the total length/time of a
41 file, we need to account for the possibility of chaining. */
43 /* We can handle things a number of ways; we can determine the entire
44 bitstream structure right off the bat, or find pieces on demand.
45 This example determines and caches structure for the entire
46 bitstream, but builds a virtual decoder on the fly when moving
47 between links in the chain. */
49 /* There are also different ways to implement seeking. Enough
50 information exists in an Ogg bitstream to seek to
51 sample-granularity positions in the output. Or, one can seek by
52 picking some portion of the stream roughly in the desired area if
53 we only want coarse navigation through the stream. */
55 /*************************************************************************
56 * Many, many internal helpers. The intention is not to be confusing;
57 * rampant duplication and monolithic function implementation would be
58 * harder to understand anyway. The high level functions are last. Begin
59 * grokking near the end of the file */
61 /* read a little more data from the file/pipe into the ogg_sync framer
63 #define CHUNKSIZE 65536 /* greater-than-page-size granularity seeking */
64 #define READSIZE 2048 /* a smaller read size is needed for low-rate streaming. */
66 static long _get_data(OggVorbis_File *vf){
68 if(!(vf->callbacks.read_func))return(-1);
70 char *buffer=ogg_sync_buffer(&vf->oy,READSIZE);
71 long bytes=(vf->callbacks.read_func)(buffer,1,READSIZE,vf->datasource);
72 if(bytes>0)ogg_sync_wrote(&vf->oy,bytes);
73 if(bytes==0 && errno)return(-1);
79 /* save a tiny smidge of verbosity to make the code more readable */
80 static int _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){
82 /* only seek if the file position isn't already there */
83 if(vf->offset != offset){
84 if(!(vf->callbacks.seek_func)||
85 (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET) == -1)
88 ogg_sync_reset(&vf->oy);
91 /* shouldn't happen unless someone writes a broken callback */
97 /* The read/seek functions track absolute position within the stream */
99 /* from the head of the stream, get the next page. boundary specifies
100 if the function is allowed to fetch more data from the stream (and
101 how much) or only use internally buffered data.
103 boundary: -1) unbounded search
104 0) read no additional data; use cached only
105 n) search for a new page beginning for n bytes
107 return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD)
108 n) found a page at absolute offset n */
110 static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og,
111 ogg_int64_t boundary){
112 if(boundary>0)boundary+=vf->offset;
116 if(boundary>0 && vf->offset>=boundary)return(OV_FALSE);
117 more=ogg_sync_pageseek(&vf->oy,og);
120 /* skipped n bytes */
124 /* send more paramedics */
125 if(!boundary)return(OV_FALSE);
127 long ret=_get_data(vf);
128 if(ret==0)return(OV_EOF);
129 if(ret<0)return(OV_EREAD);
132 /* got a page. Return the offset at the page beginning,
133 advance the internal offset past the page end */
134 ogg_int64_t ret=vf->offset;
143 /* find the latest page beginning before the passed in position. Much
144 dirtier than the above as Ogg doesn't have any backward search
145 linkage. no 'readp' as it will certainly have to read. */
146 /* returns offset or OV_EREAD, OV_FAULT */
147 static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_int64_t begin,ogg_page *og){
148 ogg_int64_t end = begin;
150 ogg_int64_t offset=-1;
157 ret=_seek_helper(vf,begin);
160 while(vf->offset<end){
161 memset(og,0,sizeof(*og));
162 ret=_get_next_page(vf,og,end-vf->offset);
163 if(ret==OV_EREAD)return(OV_EREAD);
172 /* In a fully compliant, non-multiplexed stream, we'll still be
173 holding the last page. In multiplexed (or noncompliant streams),
174 we will probably have to re-read the last page we saw */
175 if(og->header_len==0){
176 ret=_seek_helper(vf,offset);
179 ret=_get_next_page(vf,og,CHUNKSIZE);
181 /* this shouldn't be possible */
188 static void _add_serialno(ogg_page *og,long **serialno_list, int *n){
189 long s = ogg_page_serialno(og);
193 *serialno_list = _ogg_realloc(*serialno_list, sizeof(**serialno_list)*(*n));
195 *serialno_list = _ogg_malloc(sizeof(**serialno_list));
198 (*serialno_list)[(*n)-1] = s;
201 /* returns nonzero if found */
202 static int _lookup_serialno(long s, long *serialno_list, int n){
205 if(*serialno_list == s) return 1;
212 static int _lookup_page_serialno(ogg_page *og, long *serialno_list, int n){
213 long s = ogg_page_serialno(og);
214 return _lookup_serialno(s,serialno_list,n);
217 /* performs the same search as _get_prev_page, but prefers pages of
218 the specified serial number. If a page of the specified serialno is
219 spotted during the seek-back-and-read-forward, it will return the
220 info of last page of the matching serial number instead of the very
221 last page. If no page of the specified serialno is seen, it will
222 return the info of last page and alter *serialno. */
223 static ogg_int64_t _get_prev_page_serial(OggVorbis_File *vf, ogg_int64_t begin,
224 long *serial_list, int serial_n,
225 int *serialno, ogg_int64_t *granpos){
227 ogg_int64_t end=begin;
230 ogg_int64_t prefoffset=-1;
231 ogg_int64_t offset=-1;
232 ogg_int64_t ret_serialno=-1;
233 ogg_int64_t ret_gran=-1;
240 ret=_seek_helper(vf,begin);
243 while(vf->offset<end){
244 ret=_get_next_page(vf,&og,end-vf->offset);
245 if(ret==OV_EREAD)return(OV_EREAD);
249 ret_serialno=ogg_page_serialno(&og);
250 ret_gran=ogg_page_granulepos(&og);
253 if(ret_serialno == *serialno){
258 if(!_lookup_serialno(ret_serialno,serial_list,serial_n)){
259 /* we fell off the end of the link, which means we seeked
260 back too far and shouldn't have been looking in that link
261 to begin with. If we found the preferred serial number,
262 forget that we saw it. */
269 /* we're not interested in the page... just the serialno and granpos. */
270 if(prefoffset>=0)return(prefoffset);
272 *serialno = ret_serialno;
278 /* uses the local ogg_stream storage in vf; this is important for
279 non-streaming input sources */
280 static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc,
281 long **serialno_list, int *serialno_n,
289 ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE);
290 if(llret==OV_EREAD)return(OV_EREAD);
291 if(llret<0)return(OV_ENOTVORBIS);
295 vorbis_info_init(vi);
296 vorbis_comment_init(vc);
297 vf->ready_state=OPENED;
299 /* extract the serialnos of all BOS pages + the first set of vorbis
300 headers we see in the link */
302 while(ogg_page_bos(og_ptr)){
304 if(_lookup_page_serialno(og_ptr,*serialno_list,*serialno_n)){
305 /* a dupe serialnumber in an initial header packet set == invalid stream */
306 if(*serialno_list)_ogg_free(*serialno_list);
313 _add_serialno(og_ptr,serialno_list,serialno_n);
316 if(vf->ready_state<STREAMSET){
317 /* we don't have a vorbis stream in this link yet, so begin
318 prospective stream setup. We need a stream to get packets */
319 ogg_stream_reset_serialno(&vf->os,ogg_page_serialno(og_ptr));
320 ogg_stream_pagein(&vf->os,og_ptr);
322 if(ogg_stream_packetout(&vf->os,&op) > 0 &&
323 vorbis_synthesis_idheader(&op)){
324 /* vorbis header; continue setup */
325 vf->ready_state=STREAMSET;
326 if((ret=vorbis_synthesis_headerin(vi,vc,&op))){
335 ogg_int64_t llret=_get_next_page(vf,og_ptr,CHUNKSIZE);
345 /* if this page also belongs to our vorbis stream, submit it and break */
346 if(vf->ready_state==STREAMSET &&
347 vf->os.serialno == ogg_page_serialno(og_ptr)){
348 ogg_stream_pagein(&vf->os,og_ptr);
354 if(vf->ready_state!=STREAMSET){
362 while(i<2){ /* get a page loop */
364 while(i<2){ /* get a packet loop */
366 int result=ogg_stream_packetout(&vf->os,&op);
373 if((ret=vorbis_synthesis_headerin(vi,vc,&op)))
380 if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){
385 /* if this page belongs to the correct stream, go parse it */
386 if(vf->os.serialno == ogg_page_serialno(og_ptr)){
387 ogg_stream_pagein(&vf->os,og_ptr);
391 /* if we never see the final vorbis headers before the link
393 if(ogg_page_bos(og_ptr)){
401 /* otherwise, keep looking */
409 vorbis_info_clear(vi);
410 vorbis_comment_clear(vc);
411 vf->ready_state=OPENED;
416 /* Starting from current cursor position, get initial PCM offset of
417 next page. Consumes the page in the process without decoding
418 audio, however this is only called during stream parsing upon
420 static ogg_int64_t _initial_pcmoffset(OggVorbis_File *vf, vorbis_info *vi){
422 ogg_int64_t accumulated=0;
425 int serialno = vf->os.serialno;
429 if(_get_next_page(vf,&og,-1)<0)
430 break; /* should not be possible unless the file is truncated/mangled */
432 if(ogg_page_bos(&og)) break;
433 if(ogg_page_serialno(&og)!=serialno) continue;
435 /* count blocksizes of all frames in the page */
436 ogg_stream_pagein(&vf->os,&og);
437 while((result=ogg_stream_packetout(&vf->os,&op))){
438 if(result>0){ /* ignore holes */
439 long thisblock=vorbis_packet_blocksize(vi,&op);
442 accumulated+=(lastblock+thisblock)>>2;
448 if(ogg_page_granulepos(&og)!=-1){
449 /* pcm offset of last packet on the first audio page */
450 accumulated= ogg_page_granulepos(&og)-accumulated;
455 /* less than zero? Either a corrupt file or a stream with samples
456 trimmed off the beginning, a normal occurrence; in both cases set
457 the offset to zero */
458 if(accumulated<0)accumulated=0;
463 /* finds each bitstream link one at a time using a bisection search
464 (has to begin by knowing the offset of the lb's initial page).
465 Recurses for each link so it can alloc the link storage after
466 finding them all, then unroll and fill the cache at the same time */
467 static int _bisect_forward_serialno(OggVorbis_File *vf,
469 ogg_int64_t searched,
473 long *currentno_list,
476 ogg_int64_t pcmoffset;
477 ogg_int64_t dataoffset=searched;
478 ogg_int64_t endsearched=end;
479 ogg_int64_t next=end;
480 ogg_int64_t searchgran=-1;
482 ogg_int64_t ret,last;
483 int serialno = vf->os.serialno;
486 we have the headers and serialnos for the link beginning at 'begin'
487 we have the offset and granpos of the last page in the file (potentially
488 not a page we care about)
491 /* Is the last page in our list of current serialnumbers? */
492 if(_lookup_serialno(endserial,currentno_list,currentnos)){
494 /* last page is in the starting serialno list, so we've bisected
495 down to (or just started with) a single link. Now we need to
496 find the last vorbis page belonging to the first vorbis stream
499 while(endserial != serialno){
500 endserial = serialno;
501 searched=_get_prev_page_serial(vf,searched,currentno_list,currentnos,&endserial,&endgran);
505 if(vf->offsets)_ogg_free(vf->offsets);
506 if(vf->serialnos)_ogg_free(vf->serialnos);
507 if(vf->dataoffsets)_ogg_free(vf->dataoffsets);
509 vf->offsets=_ogg_malloc((vf->links+1)*sizeof(*vf->offsets));
510 vf->vi=_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi));
511 vf->vc=_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc));
512 vf->serialnos=_ogg_malloc(vf->links*sizeof(*vf->serialnos));
513 vf->dataoffsets=_ogg_malloc(vf->links*sizeof(*vf->dataoffsets));
514 vf->pcmlengths=_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths));
516 vf->offsets[m+1]=end;
517 vf->offsets[m]=begin;
518 vf->pcmlengths[m*2+1]=(endgran<0?0:endgran);
522 /* last page is not in the starting stream's serial number list,
523 so we have multiple links. Find where the stream that begins
524 our bisection ends. */
526 long *next_serialno_list=NULL;
527 int next_serialnos=0;
530 int testserial = serialno+1;
532 /* the below guards against garbage seperating the last and
533 first pages of two links. */
534 while(searched<endsearched){
537 if(endsearched-searched<CHUNKSIZE){
540 bisect=(searched+endsearched)/2;
543 ret=_seek_helper(vf,bisect);
546 last=_get_next_page(vf,&og,-1);
547 if(last==OV_EREAD)return(OV_EREAD);
548 if(last<0 || !_lookup_page_serialno(&og,currentno_list,currentnos)){
550 if(last>=0)next=last;
556 /* Bisection point found */
557 /* for the time being, fetch end PCM offset the simple way */
559 while(testserial != serialno){
560 testserial = serialno;
561 searched = _get_prev_page_serial(vf,searched,currentno_list,currentnos,&testserial,&searchgran);
564 ret=_seek_helper(vf,next);
567 ret=_fetch_headers(vf,&vi,&vc,&next_serialno_list,&next_serialnos,NULL);
569 serialno = vf->os.serialno;
570 dataoffset = vf->offset;
572 /* this will consume a page, however the next bisection always
573 starts with a raw seek */
574 pcmoffset = _initial_pcmoffset(vf,&vi);
576 ret=_bisect_forward_serialno(vf,next,vf->offset,end,endgran,endserial,
577 next_serialno_list,next_serialnos,m+1);
580 if(next_serialno_list)_ogg_free(next_serialno_list);
582 vf->offsets[m+1]=next;
583 vf->serialnos[m+1]=serialno;
584 vf->dataoffsets[m+1]=dataoffset;
589 vf->pcmlengths[m*2+1]=searchgran;
590 vf->pcmlengths[m*2+2]=pcmoffset;
591 vf->pcmlengths[m*2+3]-=pcmoffset;
592 if(vf->pcmlengths[m*2+3]<0)vf->pcmlengths[m*2+3]=0;
597 static int _make_decode_ready(OggVorbis_File *vf){
598 if(vf->ready_state>STREAMSET)return 0;
599 if(vf->ready_state<STREAMSET)return OV_EFAULT;
601 if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link))
604 if(vorbis_synthesis_init(&vf->vd,vf->vi))
607 vorbis_block_init(&vf->vd,&vf->vb);
608 vf->ready_state=INITSET;
614 static int _open_seekable2(OggVorbis_File *vf){
615 ogg_int64_t dataoffset=vf->dataoffsets[0],end,endgran=-1;
616 int endserial=vf->os.serialno;
617 int serialno=vf->os.serialno;
619 /* we're partially open and have a first link header state in
622 /* fetch initial PCM offset */
623 ogg_int64_t pcmoffset = _initial_pcmoffset(vf,vf->vi);
625 /* we can seek, so set out learning all about this file */
626 if(vf->callbacks.seek_func && vf->callbacks.tell_func){
627 (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END);
628 vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource);
630 vf->offset=vf->end=-1;
633 /* If seek_func is implemented, tell_func must also be implemented */
634 if(vf->end==-1) return(OV_EINVAL);
636 /* Get the offset of the last page of the physical bitstream, or, if
637 we're lucky the last vorbis page of this link as most OggVorbis
638 files will contain a single logical bitstream */
639 end=_get_prev_page_serial(vf,vf->end,vf->serialnos+2,vf->serialnos[1],&endserial,&endgran);
640 if(end<0)return(end);
642 /* now determine bitstream structure recursively */
643 if(_bisect_forward_serialno(vf,0,dataoffset,end,endgran,endserial,
644 vf->serialnos+2,vf->serialnos[1],0)<0)return(OV_EREAD);
647 vf->serialnos[0]=serialno;
648 vf->dataoffsets[0]=dataoffset;
649 vf->pcmlengths[0]=pcmoffset;
650 vf->pcmlengths[1]-=pcmoffset;
651 if(vf->pcmlengths[1]<0)vf->pcmlengths[1]=0;
653 return(ov_raw_seek(vf,dataoffset));
656 /* clear out the current logical bitstream decoder */
657 static void _decode_clear(OggVorbis_File *vf){
658 vorbis_dsp_clear(&vf->vd);
659 vorbis_block_clear(&vf->vb);
660 vf->ready_state=OPENED;
663 /* fetch and process a packet. Handles the case where we're at a
664 bitstream boundary and dumps the decoding machine. If the decoding
665 machine is unloaded, it loads it. It also keeps pcm_offset up to
666 date (seek and read both use this. seek uses a special hack with
669 return: <0) error, OV_HOLE (lost packet) or OV_EOF
670 0) need more data (only if readp==0)
674 static int _fetch_and_process_packet(OggVorbis_File *vf,
680 /* handle one packet. Try to fetch it from current stream state */
681 /* extract packets from page */
684 if(vf->ready_state==STREAMSET){
685 int ret=_make_decode_ready(vf);
689 /* process a packet if we can. */
691 if(vf->ready_state==INITSET){
692 int hs=vorbis_synthesis_halfrate_p(vf->vi);
696 ogg_packet *op_ptr=(op_in?op_in:&op);
697 int result=ogg_stream_packetout(&vf->os,op_ptr);
698 ogg_int64_t granulepos;
701 if(result==-1)return(OV_HOLE); /* hole in the data. */
703 /* got a packet. process it */
704 granulepos=op_ptr->granulepos;
705 if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy
707 header packets aren't
710 vorbis_synthesis will
713 /* suck in the synthesis data and track bitrate */
715 int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL);
716 /* for proper use of libvorbis within libvorbisfile,
717 oldsamples will always be zero. */
718 if(oldsamples)return(OV_EFAULT);
720 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
721 vf->samptrack+=(vorbis_synthesis_pcmout(&vf->vd,NULL)<<hs);
722 vf->bittrack+=op_ptr->bytes*8;
725 /* update the pcm offset. */
726 if(granulepos!=-1 && !op_ptr->e_o_s){
727 int link=(vf->seekable?vf->current_link:0);
730 /* this packet has a pcm_offset on it (the last packet
731 completed on a page carries the offset) After processing
732 (above), we know the pcm position of the *last* sample
733 ready to be returned. Find the offset of the *first*
735 As an aside, this trick is inaccurate if we begin
736 reading anew right at the last page; the end-of-stream
737 granulepos declares the last frame in the stream, and the
738 last packet of the last page may be a partial frame.
739 So, we need a previous granulepos from an in-sequence page
740 to have a reference point. Thus the !op_ptr->e_o_s clause
743 if(vf->seekable && link>0)
744 granulepos-=vf->pcmlengths[link*2];
745 if(granulepos<0)granulepos=0; /* actually, this
746 shouldn't be possible
747 here unless the stream
750 samples=(vorbis_synthesis_pcmout(&vf->vd,NULL)<<hs);
754 granulepos+=vf->pcmlengths[i*2+1];
755 vf->pcm_offset=granulepos;
765 if(vf->ready_state>=OPENED){
769 /* the loop is not strictly necessary, but there's no sense in
770 doing the extra checks of the larger loop for the common
771 case in a multiplexed bistream where the page is simply
772 part of a different logical bitstream; keep reading until
773 we get one with the correct serialno */
776 if((ret=_get_next_page(vf,&og,-1))<0){
777 return(OV_EOF); /* eof. leave unitialized */
780 /* bitrate tracking; add the header's bytes here, the body bytes
781 are done by packet above */
782 vf->bittrack+=og.header_len*8;
784 if(vf->ready_state==INITSET){
785 if(vf->current_serialno!=ogg_page_serialno(&og)){
787 /* two possibilities:
788 1) our decoding just traversed a bitstream boundary
789 2) another stream is multiplexed into this logical section */
791 if(ogg_page_bos(&og)){
799 vorbis_info_clear(vf->vi);
800 vorbis_comment_clear(vf->vc);
805 continue; /* possibility #2 */
813 /* Do we need to load a new machine before submitting the page? */
814 /* This is different in the seekable and non-seekable cases.
816 In the seekable case, we already have all the header
817 information loaded and cached; we just initialize the machine
818 with it and continue on our merry way.
820 In the non-seekable (streaming) case, we'll only be at a
821 boundary if we just left the previous logical bitstream and
822 we're now nominally at the header of the next bitstream
825 if(vf->ready_state!=INITSET){
828 if(vf->ready_state<STREAMSET){
830 long serialno = ogg_page_serialno(&og);
832 /* match the serialno to bitstream section. We use this rather than
833 offset positions to avoid problems near logical bitstream
836 for(link=0;link<vf->links;link++)
837 if(vf->serialnos[link]==serialno)break;
839 if(link==vf->links) continue; /* not the desired Vorbis
840 bitstream section; keep
843 vf->current_serialno=serialno;
844 vf->current_link=link;
846 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
847 vf->ready_state=STREAMSET;
850 /* we're streaming */
851 /* fetch the three header packets, build the info struct */
853 int ret=_fetch_headers(vf,vf->vi,vf->vc,NULL,NULL,&og);
855 vf->current_serialno=vf->os.serialno;
862 /* the buffered page is the data we want, and we're ready for it;
863 add it to the stream state */
864 ogg_stream_pagein(&vf->os,&og);
869 /* if, eg, 64 bit stdio is configured by default, this will build with
871 static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){
872 if(f==NULL)return(-1);
873 return fseek(f,off,whence);
876 static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial,
877 long ibytes, ov_callbacks callbacks){
878 int offsettest=((f && callbacks.seek_func)?callbacks.seek_func(f,0,SEEK_CUR):-1);
879 long *serialno_list=NULL;
880 int serialno_list_size=0;
883 memset(vf,0,sizeof(*vf));
885 vf->callbacks = callbacks;
887 /* init the framing state */
888 ogg_sync_init(&vf->oy);
890 /* perhaps some data was previously read into a buffer for testing
891 against other stream types. Allow initialization from this
892 previously read data (especially as we may be reading from a
893 non-seekable stream) */
895 char *buffer=ogg_sync_buffer(&vf->oy,ibytes);
896 memcpy(buffer,initial,ibytes);
897 ogg_sync_wrote(&vf->oy,ibytes);
900 /* can we seek? Stevens suggests the seek test was portable */
901 if(offsettest!=-1)vf->seekable=1;
903 /* No seeking yet; Set up a 'single' (current) logical bitstream
904 entry for partial open */
906 vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi));
907 vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc));
908 ogg_stream_init(&vf->os,-1); /* fill in the serialno later */
910 /* Fetch all BOS pages, store the vorbis header and all seen serial
911 numbers, load subsequent vorbis setup headers */
912 if((ret=_fetch_headers(vf,vf->vi,vf->vc,&serialno_list,&serialno_list_size,NULL))<0){
916 /* serial number list for first link needs to be held somewhere
917 for second stage of seekable stream open; this saves having to
918 seek/reread first link's serialnumber data then. */
919 vf->serialnos=_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos));
920 vf->serialnos[0]=vf->current_serialno=vf->os.serialno;
921 vf->serialnos[1]=serialno_list_size;
922 memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos));
924 vf->offsets=_ogg_calloc(1,sizeof(*vf->offsets));
925 vf->dataoffsets=_ogg_calloc(1,sizeof(*vf->dataoffsets));
927 vf->dataoffsets[0]=vf->offset;
929 vf->ready_state=PARTOPEN;
931 if(serialno_list)_ogg_free(serialno_list);
935 static int _ov_open2(OggVorbis_File *vf){
936 if(vf->ready_state != PARTOPEN) return OV_EINVAL;
937 vf->ready_state=OPENED;
939 int ret=_open_seekable2(vf);
946 vf->ready_state=STREAMSET;
952 /* clear out the OggVorbis_File struct */
953 int ov_clear(OggVorbis_File *vf){
955 vorbis_block_clear(&vf->vb);
956 vorbis_dsp_clear(&vf->vd);
957 ogg_stream_clear(&vf->os);
959 if(vf->vi && vf->links){
961 for(i=0;i<vf->links;i++){
962 vorbis_info_clear(vf->vi+i);
963 vorbis_comment_clear(vf->vc+i);
968 if(vf->dataoffsets)_ogg_free(vf->dataoffsets);
969 if(vf->pcmlengths)_ogg_free(vf->pcmlengths);
970 if(vf->serialnos)_ogg_free(vf->serialnos);
971 if(vf->offsets)_ogg_free(vf->offsets);
972 ogg_sync_clear(&vf->oy);
973 if(vf->datasource && vf->callbacks.close_func)
974 (vf->callbacks.close_func)(vf->datasource);
975 memset(vf,0,sizeof(*vf));
983 /* inspects the OggVorbis file and finds/documents all the logical
984 bitstreams contained in it. Tries to be tolerant of logical
985 bitstream sections that are truncated/woogie.
991 int ov_open_callbacks(void *f,OggVorbis_File *vf,
992 const char *initial,long ibytes,ov_callbacks callbacks){
993 int ret=_ov_open1(f,vf,initial,ibytes,callbacks);
995 return _ov_open2(vf);
998 int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){
999 ov_callbacks callbacks = {
1000 (size_t (*)(void *, size_t, size_t, void *)) fread,
1001 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
1002 (int (*)(void *)) fclose,
1003 (long (*)(void *)) ftell
1006 return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks);
1009 int ov_fopen(const char *path,OggVorbis_File *vf){
1011 FILE *f = fopen(path,"rb");
1014 ret = ov_open(f,vf,NULL,0);
1020 /* cheap hack for game usage where downsampling is desirable; there's
1021 no need for SRC as we can just do it cheaply in libvorbis. */
1023 int ov_halfrate(OggVorbis_File *vf,int flag){
1025 if(vf->vi==NULL)return OV_EINVAL;
1026 if(vf->ready_state>STREAMSET){
1027 /* clear out stream state; dumping the decode machine is needed to
1028 reinit the MDCT lookups. */
1029 vorbis_dsp_clear(&vf->vd);
1030 vorbis_block_clear(&vf->vb);
1031 vf->ready_state=STREAMSET;
1032 if(vf->pcm_offset>=0){
1033 ogg_int64_t pos=vf->pcm_offset;
1034 vf->pcm_offset=-1; /* make sure the pos is dumped if unseekable */
1035 ov_pcm_seek(vf,pos);
1039 for(i=0;i<vf->links;i++){
1040 if(vorbis_synthesis_halfrate(vf->vi+i,flag)){
1041 if(flag) ov_halfrate(vf,0);
1048 int ov_halfrate_p(OggVorbis_File *vf){
1049 if(vf->vi==NULL)return OV_EINVAL;
1050 return vorbis_synthesis_halfrate_p(vf->vi);
1053 /* Only partially open the vorbis file; test for Vorbisness, and load
1054 the headers for the first chain. Do not seek (although test for
1055 seekability). Use ov_test_open to finish opening the file, else
1056 ov_clear to close/free it. Same return codes as open.
1058 Note that vorbisfile does _not_ take ownership of the file if the
1059 call fails; the calling applicaiton is responsible for closing the file
1060 if this call returns an error. */
1062 int ov_test_callbacks(void *f,OggVorbis_File *vf,
1063 const char *initial,long ibytes,ov_callbacks callbacks)
1065 return _ov_open1(f,vf,initial,ibytes,callbacks);
1068 int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){
1069 ov_callbacks callbacks = {
1070 (size_t (*)(void *, size_t, size_t, void *)) fread,
1071 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
1072 (int (*)(void *)) fclose,
1073 (long (*)(void *)) ftell
1076 return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks);
1079 int ov_test_open(OggVorbis_File *vf){
1080 if(vf->ready_state!=PARTOPEN)return(OV_EINVAL);
1081 return _ov_open2(vf);
1084 /* How many logical bitstreams in this physical bitstream? */
1085 long ov_streams(OggVorbis_File *vf){
1089 /* Is the FILE * associated with vf seekable? */
1090 long ov_seekable(OggVorbis_File *vf){
1091 return vf->seekable;
1094 /* returns the bitrate for a given logical bitstream or the entire
1095 physical bitstream. If the file is open for random access, it will
1096 find the *actual* average bitrate. If the file is streaming, it
1097 returns the nominal bitrate (if set) else the average of the
1098 upper/lower bounds (if set) else -1 (unset).
1100 If you want the actual bitrate field settings, get them from the
1101 vorbis_info structs */
1103 long ov_bitrate(OggVorbis_File *vf,int i){
1104 if(vf->ready_state<OPENED)return(OV_EINVAL);
1105 if(i>=vf->links)return(OV_EINVAL);
1106 if(!vf->seekable && i!=0)return(ov_bitrate(vf,0));
1111 for(i=0;i<vf->links;i++)
1112 bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8;
1113 /* This once read: return(rint(bits/ov_time_total(vf,-1)));
1114 * gcc 3.x on x86 miscompiled this at optimisation level 2 and above,
1115 * so this is slightly transformed to make it work.
1117 br = bits/ov_time_total(vf,-1);
1121 /* return the actual bitrate */
1122 return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i)));
1124 /* return nominal if set */
1125 if(vf->vi[i].bitrate_nominal>0){
1126 return vf->vi[i].bitrate_nominal;
1128 if(vf->vi[i].bitrate_upper>0){
1129 if(vf->vi[i].bitrate_lower>0){
1130 return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2;
1132 return vf->vi[i].bitrate_upper;
1141 /* returns the actual bitrate since last call. returns -1 if no
1142 additional data to offer since last call (or at beginning of stream),
1143 EINVAL if stream is only partially open
1145 long ov_bitrate_instant(OggVorbis_File *vf){
1146 int link=(vf->seekable?vf->current_link:0);
1148 if(vf->ready_state<OPENED)return(OV_EINVAL);
1149 if(vf->samptrack==0)return(OV_FALSE);
1150 ret=vf->bittrack/vf->samptrack*vf->vi[link].rate+.5;
1157 long ov_serialnumber(OggVorbis_File *vf,int i){
1158 if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1));
1159 if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1));
1161 return(vf->current_serialno);
1163 return(vf->serialnos[i]);
1167 /* returns: total raw (compressed) length of content if i==-1
1168 raw (compressed) length of that logical bitstream for i==0 to n
1169 OV_EINVAL if the stream is not seekable (we can't know the length)
1170 or if stream is only partially open
1172 ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){
1173 if(vf->ready_state<OPENED)return(OV_EINVAL);
1174 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
1178 for(i=0;i<vf->links;i++)
1179 acc+=ov_raw_total(vf,i);
1182 return(vf->offsets[i+1]-vf->offsets[i]);
1186 /* returns: total PCM length (samples) of content if i==-1 PCM length
1187 (samples) of that logical bitstream for i==0 to n
1188 OV_EINVAL if the stream is not seekable (we can't know the
1189 length) or only partially open
1191 ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){
1192 if(vf->ready_state<OPENED)return(OV_EINVAL);
1193 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
1197 for(i=0;i<vf->links;i++)
1198 acc+=ov_pcm_total(vf,i);
1201 return(vf->pcmlengths[i*2+1]);
1205 /* returns: total seconds of content if i==-1
1206 seconds in that logical bitstream for i==0 to n
1207 OV_EINVAL if the stream is not seekable (we can't know the
1208 length) or only partially open
1210 double ov_time_total(OggVorbis_File *vf,int i){
1211 if(vf->ready_state<OPENED)return(OV_EINVAL);
1212 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
1216 for(i=0;i<vf->links;i++)
1217 acc+=ov_time_total(vf,i);
1220 return((double)(vf->pcmlengths[i*2+1])/vf->vi[i].rate);
1224 /* seek to an offset relative to the *compressed* data. This also
1225 scans packets to update the PCM cursor. It will cross a logical
1226 bitstream boundary, but only if it can't get any packets out of the
1227 tail of the bitstream we seek to (so no surprises).
1229 returns zero on success, nonzero on failure */
1231 int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){
1232 ogg_stream_state work_os;
1234 if(vf->ready_state<OPENED)return(OV_EINVAL);
1236 return(OV_ENOSEEK); /* don't dump machine if we can't seek */
1238 if(pos<0 || pos>vf->end)return(OV_EINVAL);
1240 /* is the seek position outside our current link [if any]? */
1241 if(vf->ready_state>=STREAMSET){
1242 if(pos<vf->offsets[vf->current_link] || pos>=vf->offsets[vf->current_link+1])
1243 _decode_clear(vf); /* clear out stream state */
1246 /* don't yet clear out decoding machine (if it's initialized), in
1247 the case we're in the same link. Restart the decode lapping, and
1248 let _fetch_and_process_packet deal with a potential bitstream
1251 ogg_stream_reset_serialno(&vf->os,
1252 vf->current_serialno); /* must set serialno */
1253 vorbis_synthesis_restart(&vf->vd);
1255 if(_seek_helper(vf,pos)) {
1256 /* dump the machine so we're in a known state */
1262 /* we need to make sure the pcm_offset is set, but we don't want to
1263 advance the raw cursor past good packets just to get to the first
1264 with a granulepos. That's not equivalent behavior to beginning
1265 decoding as immediately after the seek position as possible.
1267 So, a hack. We use two stream states; a local scratch state and
1268 the shared vf->os stream state. We use the local state to
1269 scan, and the shared state as a buffer for later decode.
1271 Unfortuantely, on the last page we still advance to last packet
1272 because the granulepos on the last page is not necessarily on a
1273 packet boundary, and we need to make sure the granpos is
1285 ogg_int64_t pagepos=-1;
1287 ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */
1288 ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE
1289 return from not necessarily
1290 starting from the beginning */
1293 if(vf->ready_state>=STREAMSET){
1294 /* snarf/scan a packet if we can */
1295 int result=ogg_stream_packetout(&work_os,&op);
1299 if(vf->vi[vf->current_link].codec_setup){
1300 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1302 ogg_stream_packetout(&vf->os,NULL);
1306 /* We can't get a guaranteed correct pcm position out of the
1307 last page in a stream because it might have a 'short'
1308 granpos, which can only be detected in the presence of a
1309 preceding page. However, if the last page is also the first
1310 page, the granpos rules of a first page take precedence. Not
1311 only that, but for first==last, the EOS page must be treated
1312 as if its a normal first page for the stream to open/play. */
1313 if(lastflag && !firstflag)
1314 ogg_stream_packetout(&vf->os,NULL);
1316 if(lastblock)accblock+=(lastblock+thisblock)>>2;
1319 if(op.granulepos!=-1){
1320 int i,link=vf->current_link;
1321 ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2];
1322 if(granulepos<0)granulepos=0;
1325 granulepos+=vf->pcmlengths[i*2+1];
1326 vf->pcm_offset=granulepos-accblock;
1327 if(vf->pcm_offset<0)vf->pcm_offset=0;
1330 lastblock=thisblock;
1333 ogg_stream_packetout(&vf->os,NULL);
1338 pagepos=_get_next_page(vf,&og,-1);
1340 vf->pcm_offset=ov_pcm_total(vf,-1);
1344 /* huh? Bogus stream with packets but no granulepos */
1349 /* has our decoding just traversed a bitstream boundary? */
1350 if(vf->ready_state>=STREAMSET){
1351 if(vf->current_serialno!=ogg_page_serialno(&og)){
1353 /* two possibilities:
1354 1) our decoding just traversed a bitstream boundary
1355 2) another stream is multiplexed into this logical section? */
1357 if(ogg_page_bos(&og)){
1359 _decode_clear(vf); /* clear out stream state */
1360 ogg_stream_clear(&work_os);
1361 } /* else, do nothing; next loop will scoop another page */
1365 if(vf->ready_state<STREAMSET){
1367 long serialno = ogg_page_serialno(&og);
1369 for(link=0;link<vf->links;link++)
1370 if(vf->serialnos[link]==serialno)break;
1372 if(link==vf->links) continue; /* not the desired Vorbis
1373 bitstream section; keep
1375 vf->current_link=link;
1376 vf->current_serialno=serialno;
1377 ogg_stream_reset_serialno(&vf->os,serialno);
1378 ogg_stream_reset_serialno(&work_os,serialno);
1379 vf->ready_state=STREAMSET;
1380 firstflag=(pagepos<=vf->dataoffsets[link]);
1383 ogg_stream_pagein(&vf->os,&og);
1384 ogg_stream_pagein(&work_os,&og);
1385 lastflag=ogg_page_eos(&og);
1390 ogg_stream_clear(&work_os);
1396 /* Page granularity seek (faster than sample granularity because we
1397 don't do the last bit of decode to find a specific sample).
1399 Seek to the last [granule marked] page preceding the specified pos
1400 location, such that decoding past the returned point will quickly
1401 arrive at the requested position. */
1402 int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){
1404 ogg_int64_t result=0;
1405 ogg_int64_t total=ov_pcm_total(vf,-1);
1407 if(vf->ready_state<OPENED)return(OV_EINVAL);
1408 if(!vf->seekable)return(OV_ENOSEEK);
1410 if(pos<0 || pos>total)return(OV_EINVAL);
1412 /* which bitstream section does this pcm offset occur in? */
1413 for(link=vf->links-1;link>=0;link--){
1414 total-=vf->pcmlengths[link*2+1];
1415 if(pos>=total)break;
1418 /* Search within the logical bitstream for the page with the highest
1419 pcm_pos preceding pos. If we're looking for a position on the
1420 first page, bisection will halt without finding our position as
1421 it's before the first explicit granulepos fencepost. That case is
1422 handled separately below.
1424 There is a danger here; missing pages or incorrect frame number
1425 information in the bitstream could make our task impossible.
1426 Account for that (it would be an error condition) */
1428 /* new search algorithm originally by HB (Nicholas Vinen) */
1431 ogg_int64_t end=vf->offsets[link+1];
1432 ogg_int64_t begin=vf->dataoffsets[link];
1433 ogg_int64_t begintime = vf->pcmlengths[link*2];
1434 ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime;
1435 ogg_int64_t target=pos-total+begintime;
1436 ogg_int64_t best=-1;
1441 /* if we have only one page, there will be no bisection. Grab the page here */
1443 result=_seek_helper(vf,begin);
1444 if(result) goto seek_error;
1446 result=_get_next_page(vf,&og,1);
1447 if(result<0) goto seek_error;
1452 /* bisection loop */
1456 if(end-begin<CHUNKSIZE){
1459 /* take a (pretty decent) guess. */
1461 (ogg_int64_t)((double)(target-begintime)*(end-begin)/(endtime-begintime))
1463 if(bisect<begin+CHUNKSIZE)
1467 result=_seek_helper(vf,bisect);
1468 if(result) goto seek_error;
1470 /* read loop within the bisection loop */
1472 result=_get_next_page(vf,&og,end-vf->offset);
1473 if(result==OV_EREAD) goto seek_error;
1475 /* there is no next page! */
1477 /* No bisection left to perform. We've either found the
1478 best candidate already or failed. Exit loop. */
1481 /* We tried to load a fraction of the last page; back up a
1482 bit and try to get the whole last page */
1483 if(bisect==0) goto seek_error;
1486 /* don't repeat/loop on a read we've already performed */
1487 if(bisect<=begin)bisect=begin+1;
1489 /* seek and cntinue bisection */
1490 result=_seek_helper(vf,bisect);
1491 if(result) goto seek_error;
1494 ogg_int64_t granulepos;
1497 /* got a page. analyze it */
1498 /* only consider pages from primary vorbis stream */
1499 if(ogg_page_serialno(&og)!=vf->serialnos[link])
1502 /* only consider pages with the granulepos set */
1503 granulepos=ogg_page_granulepos(&og);
1504 if(granulepos==-1)continue;
1506 if(granulepos<target){
1507 /* this page is a successful candidate! Set state */
1509 best=result; /* raw offset of packet with granulepos */
1510 begin=vf->offset; /* raw offset of next page */
1511 begintime=granulepos;
1513 /* if we're before our target but within a short distance,
1514 don't bisect; read forward */
1515 if(target-begintime>44100)break;
1517 bisect=begin; /* *not* begin + 1 as above */
1520 /* This is one of our pages, but the granpos is
1521 post-target; it is not a bisection return
1522 candidate. (The only way we'd use it is if it's the
1523 first page in the stream; we handle that case later
1524 outside the bisection) */
1525 if(bisect<=begin+1){
1526 /* No bisection left to perform. We've either found the
1527 best candidate already or failed. Exit loop. */
1530 if(end==vf->offset){
1531 /* bisection read to the end; use the known page
1532 boundary (result) to update bisection, back up a
1533 little bit, and try again */
1536 if(bisect<=begin)bisect=begin+1;
1537 result=_seek_helper(vf,bisect);
1538 if(result) goto seek_error;
1540 /* Normal bisection */
1551 /* Out of bisection: did it 'fail?' */
1554 /* Check the 'looking for data in first page' special case;
1555 bisection would 'fail' because our search target was before the
1556 first PCM granule position fencepost. */
1559 begin == vf->dataoffsets[link] &&
1560 ogg_page_serialno(&og)==vf->serialnos[link]){
1562 /* Yes, this is the beginning-of-stream case. We already have
1563 our page, right at the beginning of PCM data. Set state
1566 vf->pcm_offset=total;
1568 if(link!=vf->current_link){
1569 /* Different link; dump entire decode machine */
1572 vf->current_link=link;
1573 vf->current_serialno=vf->serialnos[link];
1574 vf->ready_state=STREAMSET;
1577 vorbis_synthesis_restart(&vf->vd);
1580 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1581 ogg_stream_pagein(&vf->os,&og);
1588 /* Bisection found our page. seek to it, update pcm offset. Easier case than
1589 raw_seek, don't keep packets preceding granulepos. */
1595 result=_seek_helper(vf,best);
1597 if(result) goto seek_error;
1598 result=_get_next_page(vf,&og,-1);
1599 if(result<0) goto seek_error;
1601 if(link!=vf->current_link){
1602 /* Different link; dump entire decode machine */
1605 vf->current_link=link;
1606 vf->current_serialno=vf->serialnos[link];
1607 vf->ready_state=STREAMSET;
1610 vorbis_synthesis_restart(&vf->vd);
1613 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1614 ogg_stream_pagein(&vf->os,&og);
1616 /* pull out all but last packet; the one with granulepos */
1618 result=ogg_stream_packetpeek(&vf->os,&op);
1620 /* No packet returned; we exited the bisection with 'best'
1621 pointing to a page with a granule position, so the packet
1622 finishing this page ('best') originated on a preceding
1623 page. Keep fetching previous pages until we get one with
1624 a granulepos or without the 'continued' flag set. Then
1625 just use raw_seek for simplicity. */
1626 /* Do not rewind past the beginning of link data; if we do,
1627 it's either a bug or a broken stream */
1629 while(result>vf->dataoffsets[link]){
1630 result=_get_prev_page(vf,result,&og);
1631 if(result<0) goto seek_error;
1632 if(ogg_page_serialno(&og)==vf->current_serialno &&
1633 (ogg_page_granulepos(&og)>-1 ||
1634 !ogg_page_continued(&og))){
1635 return ov_raw_seek(vf,result);
1640 result = OV_EBADPACKET;
1643 if(op.granulepos!=-1){
1644 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1645 if(vf->pcm_offset<0)vf->pcm_offset=0;
1646 vf->pcm_offset+=total;
1649 result=ogg_stream_packetout(&vf->os,NULL);
1655 if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){
1664 /* dump machine so we're in a known state */
1670 /* seek to a sample offset relative to the decompressed pcm stream
1671 returns zero on success, nonzero on failure */
1673 int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){
1674 int thisblock,lastblock=0;
1675 int ret=ov_pcm_seek_page(vf,pos);
1676 if(ret<0)return(ret);
1677 if((ret=_make_decode_ready(vf)))return ret;
1679 /* discard leading packets we don't need for the lapping of the
1680 position we want; don't decode them */
1686 int ret=ogg_stream_packetpeek(&vf->os,&op);
1688 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1690 ogg_stream_packetout(&vf->os,NULL);
1691 continue; /* non audio packet */
1693 if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2;
1695 if(vf->pcm_offset+((thisblock+
1696 vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break;
1698 /* remove the packet from packet queue and track its granulepos */
1699 ogg_stream_packetout(&vf->os,NULL);
1700 vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with
1703 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
1705 /* end of logical stream case is hard, especially with exact
1706 length positioning. */
1708 if(op.granulepos>-1){
1710 /* always believe the stream markers */
1711 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1712 if(vf->pcm_offset<0)vf->pcm_offset=0;
1713 for(i=0;i<vf->current_link;i++)
1714 vf->pcm_offset+=vf->pcmlengths[i*2+1];
1717 lastblock=thisblock;
1720 if(ret<0 && ret!=OV_HOLE)break;
1722 /* suck in a new page */
1723 if(_get_next_page(vf,&og,-1)<0)break;
1724 if(ogg_page_bos(&og))_decode_clear(vf);
1726 if(vf->ready_state<STREAMSET){
1727 long serialno=ogg_page_serialno(&og);
1730 for(link=0;link<vf->links;link++)
1731 if(vf->serialnos[link]==serialno)break;
1732 if(link==vf->links) continue;
1733 vf->current_link=link;
1735 vf->ready_state=STREAMSET;
1736 vf->current_serialno=ogg_page_serialno(&og);
1737 ogg_stream_reset_serialno(&vf->os,serialno);
1738 ret=_make_decode_ready(vf);
1743 ogg_stream_pagein(&vf->os,&og);
1749 /* discard samples until we reach the desired position. Crossing a
1750 logical bitstream boundary with abandon is OK. */
1752 /* note that halfrate could be set differently in each link, but
1753 vorbisfile encoforces all links are set or unset */
1754 int hs=vorbis_synthesis_halfrate_p(vf->vi);
1755 while(vf->pcm_offset<((pos>>hs)<<hs)){
1756 ogg_int64_t target=(pos-vf->pcm_offset)>>hs;
1757 long samples=vorbis_synthesis_pcmout(&vf->vd,NULL);
1759 if(samples>target)samples=target;
1760 vorbis_synthesis_read(&vf->vd,samples);
1761 vf->pcm_offset+=samples<<hs;
1764 if(_fetch_and_process_packet(vf,NULL,1,1)<=0)
1765 vf->pcm_offset=ov_pcm_total(vf,-1); /* eof */
1771 /* seek to a playback time relative to the decompressed pcm stream
1772 returns zero on success, nonzero on failure */
1773 int ov_time_seek(OggVorbis_File *vf,double seconds){
1774 /* translate time to PCM position and call ov_pcm_seek */
1777 ogg_int64_t pcm_total=0;
1778 double time_total=0.;
1780 if(vf->ready_state<OPENED)return(OV_EINVAL);
1781 if(!vf->seekable)return(OV_ENOSEEK);
1782 if(seconds<0)return(OV_EINVAL);
1784 /* which bitstream section does this time offset occur in? */
1785 for(link=0;link<vf->links;link++){
1786 double addsec = ov_time_total(vf,link);
1787 if(seconds<time_total+addsec)break;
1789 pcm_total+=vf->pcmlengths[link*2+1];
1792 if(link==vf->links)return(OV_EINVAL);
1794 /* enough information to convert time offset to pcm offset */
1796 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1797 return(ov_pcm_seek(vf,target));
1801 /* page-granularity version of ov_time_seek
1802 returns zero on success, nonzero on failure */
1803 int ov_time_seek_page(OggVorbis_File *vf,double seconds){
1804 /* translate time to PCM position and call ov_pcm_seek */
1807 ogg_int64_t pcm_total=0;
1808 double time_total=0.;
1810 if(vf->ready_state<OPENED)return(OV_EINVAL);
1811 if(!vf->seekable)return(OV_ENOSEEK);
1812 if(seconds<0)return(OV_EINVAL);
1814 /* which bitstream section does this time offset occur in? */
1815 for(link=0;link<vf->links;link++){
1816 double addsec = ov_time_total(vf,link);
1817 if(seconds<time_total+addsec)break;
1819 pcm_total+=vf->pcmlengths[link*2+1];
1822 if(link==vf->links)return(OV_EINVAL);
1824 /* enough information to convert time offset to pcm offset */
1826 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1827 return(ov_pcm_seek_page(vf,target));
1831 /* tell the current stream offset cursor. Note that seek followed by
1832 tell will likely not give the set offset due to caching */
1833 ogg_int64_t ov_raw_tell(OggVorbis_File *vf){
1834 if(vf->ready_state<OPENED)return(OV_EINVAL);
1838 /* return PCM offset (sample) of next PCM sample to be read */
1839 ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){
1840 if(vf->ready_state<OPENED)return(OV_EINVAL);
1841 return(vf->pcm_offset);
1844 /* return time offset (seconds) of next PCM sample to be read */
1845 double ov_time_tell(OggVorbis_File *vf){
1847 ogg_int64_t pcm_total=0;
1848 double time_total=0.f;
1850 if(vf->ready_state<OPENED)return(OV_EINVAL);
1852 pcm_total=ov_pcm_total(vf,-1);
1853 time_total=ov_time_total(vf,-1);
1855 /* which bitstream section does this time offset occur in? */
1856 for(link=vf->links-1;link>=0;link--){
1857 pcm_total-=vf->pcmlengths[link*2+1];
1858 time_total-=ov_time_total(vf,link);
1859 if(vf->pcm_offset>=pcm_total)break;
1863 return((double)time_total+(double)(vf->pcm_offset-pcm_total)/vf->vi[link].rate);
1866 /* link: -1) return the vorbis_info struct for the bitstream section
1867 currently being decoded
1868 0-n) to request information for a specific bitstream section
1870 In the case of a non-seekable bitstream, any call returns the
1871 current bitstream. NULL in the case that the machine is not
1874 vorbis_info *ov_info(OggVorbis_File *vf,int link){
1877 if(vf->ready_state>=STREAMSET)
1878 return vf->vi+vf->current_link;
1891 /* grr, strong typing, grr, no templates/inheritence, grr */
1892 vorbis_comment *ov_comment(OggVorbis_File *vf,int link){
1895 if(vf->ready_state>=STREAMSET)
1896 return vf->vc+vf->current_link;
1909 static int host_is_big_endian() {
1910 ogg_int32_t pattern = 0xfeedface; /* deadbeef */
1911 unsigned char *bytewise = (unsigned char *)&pattern;
1912 if (bytewise[0] == 0xfe) return 1;
1916 /* up to this point, everything could more or less hide the multiple
1917 logical bitstream nature of chaining from the toplevel application
1918 if the toplevel application didn't particularly care. However, at
1919 the point that we actually read audio back, the multiple-section
1920 nature must surface: Multiple bitstream sections do not necessarily
1921 have to have the same number of channels or sampling rate.
1923 ov_read returns the sequential logical bitstream number currently
1924 being decoded along with the PCM data in order that the toplevel
1925 application can take action on channel/sample rate changes. This
1926 number will be incremented even for streamed (non-seekable) streams
1927 (for seekable streams, it represents the actual logical bitstream
1928 index within the physical bitstream. Note that the accessor
1929 functions above are aware of this dichotomy).
1931 ov_read_filter is exactly the same as ov_read except that it processes
1932 the decoded audio data through a filter before packing it into the
1933 requested format. This gives greater accuracy than applying a filter
1934 after the audio has been converted into integral PCM.
1936 input values: buffer) a buffer to hold packed PCM data for return
1937 length) the byte length requested to be placed into buffer
1938 bigendianp) should the data be packed LSB first (0) or
1940 word) word size for output. currently 1 (byte) or
1943 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
1945 n) number of bytes of PCM actually returned. The
1946 below works on a packet-by-packet basis, so the
1947 return length is not related to the 'length' passed
1948 in, just guaranteed to fit.
1950 *section) set to the logical bitstream number */
1952 long ov_read_filter(OggVorbis_File *vf,char *buffer,int length,
1953 int bigendianp,int word,int sgned,int *bitstream,
1954 void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param){
1956 int host_endian = host_is_big_endian();
1962 if(vf->ready_state<OPENED)return(OV_EINVAL);
1965 if(vf->ready_state==INITSET){
1966 samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
1970 /* suck in another packet */
1972 int ret=_fetch_and_process_packet(vf,NULL,1,1);
1983 /* yay! proceed to pack data into the byte buffer */
1985 long channels=ov_info(vf,-1)->channels;
1986 long bytespersample=word * channels;
1987 vorbis_fpu_control fpu;
1988 if(samples>length/bytespersample)samples=length/bytespersample;
1995 filter(pcm,channels,samples,filter_param);
1997 /* a tight loop to pack each size */
2001 int off=(sgned?0:128);
2002 vorbis_fpu_setround(&fpu);
2003 for(j=0;j<samples;j++)
2004 for(i=0;i<channels;i++){
2005 val=vorbis_ftoi(pcm[i][j]*128.f);
2007 else if(val<-128)val=-128;
2010 vorbis_fpu_restore(fpu);
2012 int off=(sgned?0:32768);
2014 if(host_endian==bigendianp){
2017 vorbis_fpu_setround(&fpu);
2018 for(i=0;i<channels;i++) { /* It's faster in this order */
2020 short *dest=((short *)buffer)+i;
2021 for(j=0;j<samples;j++) {
2022 val=vorbis_ftoi(src[j]*32768.f);
2023 if(val>32767)val=32767;
2024 else if(val<-32768)val=-32768;
2029 vorbis_fpu_restore(fpu);
2033 vorbis_fpu_setround(&fpu);
2034 for(i=0;i<channels;i++) {
2036 short *dest=((short *)buffer)+i;
2037 for(j=0;j<samples;j++) {
2038 val=vorbis_ftoi(src[j]*32768.f);
2039 if(val>32767)val=32767;
2040 else if(val<-32768)val=-32768;
2045 vorbis_fpu_restore(fpu);
2048 }else if(bigendianp){
2050 vorbis_fpu_setround(&fpu);
2051 for(j=0;j<samples;j++)
2052 for(i=0;i<channels;i++){
2053 val=vorbis_ftoi(pcm[i][j]*32768.f);
2054 if(val>32767)val=32767;
2055 else if(val<-32768)val=-32768;
2058 *buffer++=(val&0xff);
2060 vorbis_fpu_restore(fpu);
2064 vorbis_fpu_setround(&fpu);
2065 for(j=0;j<samples;j++)
2066 for(i=0;i<channels;i++){
2067 val=vorbis_ftoi(pcm[i][j]*32768.f);
2068 if(val>32767)val=32767;
2069 else if(val<-32768)val=-32768;
2071 *buffer++=(val&0xff);
2074 vorbis_fpu_restore(fpu);
2080 vorbis_synthesis_read(&vf->vd,samples);
2081 hs=vorbis_synthesis_halfrate_p(vf->vi);
2082 vf->pcm_offset+=(samples<<hs);
2083 if(bitstream)*bitstream=vf->current_link;
2084 return(samples*bytespersample);
2090 long ov_read(OggVorbis_File *vf,char *buffer,int length,
2091 int bigendianp,int word,int sgned,int *bitstream){
2092 return ov_read_filter(vf, buffer, length, bigendianp, word, sgned, bitstream, NULL, NULL);
2095 /* input values: pcm_channels) a float vector per channel of output
2096 length) the sample length being read by the app
2098 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
2100 n) number of samples of PCM actually returned. The
2101 below works on a packet-by-packet basis, so the
2102 return length is not related to the 'length' passed
2103 in, just guaranteed to fit.
2105 *section) set to the logical bitstream number */
2109 long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int length,
2112 if(vf->ready_state<OPENED)return(OV_EINVAL);
2115 if(vf->ready_state==INITSET){
2117 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
2119 int hs=vorbis_synthesis_halfrate_p(vf->vi);
2120 if(pcm_channels)*pcm_channels=pcm;
2121 if(samples>length)samples=length;
2122 vorbis_synthesis_read(&vf->vd,samples);
2123 vf->pcm_offset+=samples<<hs;
2124 if(bitstream)*bitstream=vf->current_link;
2130 /* suck in another packet */
2132 int ret=_fetch_and_process_packet(vf,NULL,1,1);
2133 if(ret==OV_EOF)return(0);
2134 if(ret<=0)return(ret);
2140 extern const float *vorbis_window(vorbis_dsp_state *v,int W);
2142 static void _ov_splice(float **pcm,float **lappcm,
2145 const float *w1, const float *w2){
2156 for(j=0;j<ch1 && j<ch2;j++){
2163 d[i]=d[i]*wd + s[i]*ws;
2166 /* window from zero */
2177 /* make sure vf is INITSET */
2178 static int _ov_initset(OggVorbis_File *vf){
2180 if(vf->ready_state==INITSET)break;
2181 /* suck in another packet */
2183 int ret=_fetch_and_process_packet(vf,NULL,1,0);
2184 if(ret<0 && ret!=OV_HOLE)return(ret);
2190 /* make sure vf is INITSET and that we have a primed buffer; if
2191 we're crosslapping at a stream section boundary, this also makes
2192 sure we're sanity checking against the right stream information */
2193 static int _ov_initprime(OggVorbis_File *vf){
2194 vorbis_dsp_state *vd=&vf->vd;
2196 if(vf->ready_state==INITSET)
2197 if(vorbis_synthesis_pcmout(vd,NULL))break;
2199 /* suck in another packet */
2201 int ret=_fetch_and_process_packet(vf,NULL,1,0);
2202 if(ret<0 && ret!=OV_HOLE)return(ret);
2208 /* grab enough data for lapping from vf; this may be in the form of
2209 unreturned, already-decoded pcm, remaining PCM we will need to
2210 decode, or synthetic postextrapolation from last packets. */
2211 static void _ov_getlap(OggVorbis_File *vf,vorbis_info *vi,vorbis_dsp_state *vd,
2212 float **lappcm,int lapsize){
2216 /* try first to decode the lapping data */
2217 while(lapcount<lapsize){
2218 int samples=vorbis_synthesis_pcmout(vd,&pcm);
2220 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
2221 for(i=0;i<vi->channels;i++)
2222 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
2224 vorbis_synthesis_read(vd,samples);
2226 /* suck in another packet */
2227 int ret=_fetch_and_process_packet(vf,NULL,1,0); /* do *not* span */
2228 if(ret==OV_EOF)break;
2231 if(lapcount<lapsize){
2232 /* failed to get lapping data from normal decode; pry it from the
2233 postextrapolation buffering, or the second half of the MDCT
2234 from the last packet */
2235 int samples=vorbis_synthesis_lapout(&vf->vd,&pcm);
2237 for(i=0;i<vi->channels;i++)
2238 memset(lappcm[i]+lapcount,0,sizeof(**pcm)*lapsize-lapcount);
2241 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
2242 for(i=0;i<vi->channels;i++)
2243 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
2249 /* this sets up crosslapping of a sample by using trailing data from
2250 sample 1 and lapping it into the windowing buffer of sample 2 */
2251 int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2){
2252 vorbis_info *vi1,*vi2;
2255 const float *w1,*w2;
2256 int n1,n2,i,ret,hs1,hs2;
2258 if(vf1==vf2)return(0); /* degenerate case */
2259 if(vf1->ready_state<OPENED)return(OV_EINVAL);
2260 if(vf2->ready_state<OPENED)return(OV_EINVAL);
2262 /* the relevant overlap buffers must be pre-checked and pre-primed
2263 before looking at settings in the event that priming would cross
2264 a bitstream boundary. So, do it now */
2266 ret=_ov_initset(vf1);
2268 ret=_ov_initprime(vf2);
2271 vi1=ov_info(vf1,-1);
2272 vi2=ov_info(vf2,-1);
2273 hs1=ov_halfrate_p(vf1);
2274 hs2=ov_halfrate_p(vf2);
2276 lappcm=alloca(sizeof(*lappcm)*vi1->channels);
2277 n1=vorbis_info_blocksize(vi1,0)>>(1+hs1);
2278 n2=vorbis_info_blocksize(vi2,0)>>(1+hs2);
2279 w1=vorbis_window(&vf1->vd,0);
2280 w2=vorbis_window(&vf2->vd,0);
2282 for(i=0;i<vi1->channels;i++)
2283 lappcm[i]=alloca(sizeof(**lappcm)*n1);
2285 _ov_getlap(vf1,vi1,&vf1->vd,lappcm,n1);
2287 /* have a lapping buffer from vf1; now to splice it into the lapping
2289 /* consolidate and expose the buffer. */
2290 vorbis_synthesis_lapout(&vf2->vd,&pcm);
2293 _analysis_output_always("pcmL",0,pcm[0],n1*2,0,0,0);
2294 _analysis_output_always("pcmR",0,pcm[1],n1*2,0,0,0);
2298 _ov_splice(pcm,lappcm,n1,n2,vi1->channels,vi2->channels,w1,w2);
2304 static int _ov_64_seek_lap(OggVorbis_File *vf,ogg_int64_t pos,
2305 int (*localseek)(OggVorbis_File *,ogg_int64_t)){
2309 const float *w1,*w2;
2310 int n1,n2,ch1,ch2,hs;
2313 if(vf->ready_state<OPENED)return(OV_EINVAL);
2314 ret=_ov_initset(vf);
2317 hs=ov_halfrate_p(vf);
2320 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
2321 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
2322 persistent; even if the decode state
2323 from this link gets dumped, this
2324 window array continues to exist */
2326 lappcm=alloca(sizeof(*lappcm)*ch1);
2328 lappcm[i]=alloca(sizeof(**lappcm)*n1);
2329 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
2331 /* have lapping data; seek and prime the buffer */
2332 ret=localseek(vf,pos);
2334 ret=_ov_initprime(vf);
2337 /* Guard against cross-link changes; they're perfectly legal */
2340 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
2341 w2=vorbis_window(&vf->vd,0);
2343 /* consolidate and expose the buffer. */
2344 vorbis_synthesis_lapout(&vf->vd,&pcm);
2347 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
2353 int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
2354 return _ov_64_seek_lap(vf,pos,ov_raw_seek);
2357 int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
2358 return _ov_64_seek_lap(vf,pos,ov_pcm_seek);
2361 int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos){
2362 return _ov_64_seek_lap(vf,pos,ov_pcm_seek_page);
2365 static int _ov_d_seek_lap(OggVorbis_File *vf,double pos,
2366 int (*localseek)(OggVorbis_File *,double)){
2370 const float *w1,*w2;
2371 int n1,n2,ch1,ch2,hs;
2374 if(vf->ready_state<OPENED)return(OV_EINVAL);
2375 ret=_ov_initset(vf);
2378 hs=ov_halfrate_p(vf);
2381 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
2382 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
2383 persistent; even if the decode state
2384 from this link gets dumped, this
2385 window array continues to exist */
2387 lappcm=alloca(sizeof(*lappcm)*ch1);
2389 lappcm[i]=alloca(sizeof(**lappcm)*n1);
2390 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
2392 /* have lapping data; seek and prime the buffer */
2393 ret=localseek(vf,pos);
2395 ret=_ov_initprime(vf);
2398 /* Guard against cross-link changes; they're perfectly legal */
2401 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
2402 w2=vorbis_window(&vf->vd,0);
2404 /* consolidate and expose the buffer. */
2405 vorbis_synthesis_lapout(&vf->vd,&pcm);
2408 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
2414 int ov_time_seek_lap(OggVorbis_File *vf,double pos){
2415 return _ov_d_seek_lap(vf,pos,ov_time_seek);
2418 int ov_time_seek_page_lap(OggVorbis_File *vf,double pos){
2419 return _ov_d_seek_lap(vf,pos,ov_time_seek_page);