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-2009 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
11 ********************************************************************
13 function: stdio-based convenience library for opening/seeking/decoding
16 ********************************************************************/
24 #include "vorbis/codec.h"
26 /* we don't need or want the static callback symbols here */
27 #define OV_EXCLUDE_STATIC_CALLBACKS
28 #include "vorbis/vorbisfile.h"
33 /* A 'chained bitstream' is a Vorbis bitstream that contains more than
34 one logical bitstream arranged end to end (the only form of Ogg
35 multiplexing allowed in a Vorbis bitstream; grouping [parallel
36 multiplexing] is not allowed in Vorbis) */
38 /* A Vorbis file can be played beginning to end (streamed) without
39 worrying ahead of time about chaining (see decoder_example.c). If
40 we have the whole file, however, and want random access
41 (seeking/scrubbing) or desire to know the total length/time of a
42 file, we need to account for the possibility of chaining. */
44 /* We can handle things a number of ways; we can determine the entire
45 bitstream structure right off the bat, or find pieces on demand.
46 This example determines and caches structure for the entire
47 bitstream, but builds a virtual decoder on the fly when moving
48 between links in the chain. */
50 /* There are also different ways to implement seeking. Enough
51 information exists in an Ogg bitstream to seek to
52 sample-granularity positions in the output. Or, one can seek by
53 picking some portion of the stream roughly in the desired area if
54 we only want coarse navigation through the stream. */
56 /*************************************************************************
57 * Many, many internal helpers. The intention is not to be confusing;
58 * rampant duplication and monolithic function implementation would be
59 * harder to understand anyway. The high level functions are last. Begin
60 * grokking near the end of the file */
62 /* read a little more data from the file/pipe into the ogg_sync framer
64 #define CHUNKSIZE 65536 /* greater-than-page-size granularity seeking */
65 #define READSIZE 2048 /* a smaller read size is needed for low-rate streaming. */
67 static long _get_data(OggVorbis_File *vf){
69 if(!(vf->callbacks.read_func))return(-1);
71 char *buffer=ogg_sync_buffer(&vf->oy,READSIZE);
72 long bytes=(vf->callbacks.read_func)(buffer,1,READSIZE,vf->datasource);
73 if(bytes>0)ogg_sync_wrote(&vf->oy,bytes);
74 if(bytes==0 && errno)return(-1);
80 /* save a tiny smidge of verbosity to make the code more readable */
81 static int _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){
83 if(!(vf->callbacks.seek_func)||
84 (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET) == -1)
87 ogg_sync_reset(&vf->oy);
89 /* shouldn't happen unless someone writes a broken callback */
95 /* The read/seek functions track absolute position within the stream */
97 /* from the head of the stream, get the next page. boundary specifies
98 if the function is allowed to fetch more data from the stream (and
99 how much) or only use internally buffered data.
101 boundary: -1) unbounded search
102 0) read no additional data; use cached only
103 n) search for a new page beginning for n bytes
105 return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD)
106 n) found a page at absolute offset n */
108 static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og,
109 ogg_int64_t boundary){
110 if(boundary>0)boundary+=vf->offset;
114 if(boundary>0 && vf->offset>=boundary)return(OV_FALSE);
115 more=ogg_sync_pageseek(&vf->oy,og);
118 /* skipped n bytes */
122 /* send more paramedics */
123 if(!boundary)return(OV_FALSE);
125 long ret=_get_data(vf);
126 if(ret==0)return(OV_EOF);
127 if(ret<0)return(OV_EREAD);
130 /* got a page. Return the offset at the page beginning,
131 advance the internal offset past the page end */
132 ogg_int64_t ret=vf->offset;
141 /* find the latest page beginning before the current stream cursor
142 position. Much dirtier than the above as Ogg doesn't have any
143 backward search linkage. no 'readp' as it will certainly have to
145 /* returns offset or OV_EREAD, OV_FAULT */
146 static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_page *og){
147 ogg_int64_t begin=vf->offset;
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,
224 long *serial_list, int serial_n,
225 int *serialno, ogg_int64_t *granpos){
227 ogg_int64_t begin=vf->offset;
228 ogg_int64_t end=begin;
231 ogg_int64_t prefoffset=-1;
232 ogg_int64_t offset=-1;
233 ogg_int64_t ret_serialno=-1;
234 ogg_int64_t ret_gran=-1;
241 ret=_seek_helper(vf,begin);
244 while(vf->offset<end){
245 ret=_get_next_page(vf,&og,end-vf->offset);
246 if(ret==OV_EREAD)return(OV_EREAD);
250 ret_serialno=ogg_page_serialno(&og);
251 ret_gran=ogg_page_granulepos(&og);
254 if(ret_serialno == *serialno){
259 if(!_lookup_serialno(ret_serialno,serial_list,serial_n)){
260 /* we fell off the end of the link, which means we seeked
261 back too far and shouldn't have been looking in that link
262 to begin with. If we found the preferred serial number,
263 forget that we saw it. */
270 /* we're not interested in the page... just the serialno and granpos. */
271 if(prefoffset>=0)return(prefoffset);
273 *serialno = ret_serialno;
279 /* uses the local ogg_stream storage in vf; this is important for
280 non-streaming input sources */
281 static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc,
282 long **serialno_list, int *serialno_n,
290 ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE);
291 if(llret==OV_EREAD)return(OV_EREAD);
292 if(llret<0)return(OV_ENOTVORBIS);
296 vorbis_info_init(vi);
297 vorbis_comment_init(vc);
298 vf->ready_state=OPENED;
300 /* extract the serialnos of all BOS pages + the first set of vorbis
301 headers we see in the link */
303 while(ogg_page_bos(og_ptr)){
305 if(_lookup_page_serialno(og_ptr,*serialno_list,*serialno_n)){
306 /* a dupe serialnumber in an initial header packet set == invalid stream */
307 if(*serialno_list)_ogg_free(*serialno_list);
314 _add_serialno(og_ptr,serialno_list,serialno_n);
317 if(vf->ready_state<STREAMSET){
318 /* we don't have a vorbis stream in this link yet, so begin
319 prospective stream setup. We need a stream to get packets */
320 ogg_stream_reset_serialno(&vf->os,ogg_page_serialno(og_ptr));
321 ogg_stream_pagein(&vf->os,og_ptr);
323 if(ogg_stream_packetout(&vf->os,&op) > 0 &&
324 vorbis_synthesis_idheader(&op)){
325 /* vorbis header; continue setup */
326 vf->ready_state=STREAMSET;
327 if((ret=vorbis_synthesis_headerin(vi,vc,&op))){
336 ogg_int64_t llret=_get_next_page(vf,og_ptr,CHUNKSIZE);
346 /* if this page also belongs to our vorbis stream, submit it and break */
347 if(vf->ready_state==STREAMSET &&
348 vf->os.serialno == ogg_page_serialno(og_ptr)){
349 ogg_stream_pagein(&vf->os,og_ptr);
355 if(vf->ready_state!=STREAMSET){
363 while(i<2){ /* get a page loop */
365 while(i<2){ /* get a packet loop */
367 int result=ogg_stream_packetout(&vf->os,&op);
374 if((ret=vorbis_synthesis_headerin(vi,vc,&op)))
381 if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){
386 /* if this page belongs to the correct stream, go parse it */
387 if(vf->os.serialno == ogg_page_serialno(og_ptr)){
388 ogg_stream_pagein(&vf->os,og_ptr);
392 /* if we never see the final vorbis headers before the link
394 if(ogg_page_bos(og_ptr)){
402 /* otherwise, keep looking */
410 vorbis_info_clear(vi);
411 vorbis_comment_clear(vc);
412 vf->ready_state=OPENED;
417 /* Starting from current cursor position, get initial PCM offset of
418 next page. Consumes the page in the process without decoding
419 audio, however this is only called during stream parsing upon
421 static ogg_int64_t _initial_pcmoffset(OggVorbis_File *vf, vorbis_info *vi){
423 ogg_int64_t accumulated=0;
426 int serialno = vf->os.serialno;
430 if(_get_next_page(vf,&og,-1)<0)
431 break; /* should not be possible unless the file is truncated/mangled */
433 if(ogg_page_bos(&og)) break;
434 if(ogg_page_serialno(&og)!=serialno) continue;
436 /* count blocksizes of all frames in the page */
437 ogg_stream_pagein(&vf->os,&og);
438 while((result=ogg_stream_packetout(&vf->os,&op))){
439 if(result>0){ /* ignore holes */
440 long thisblock=vorbis_packet_blocksize(vi,&op);
442 accumulated+=(lastblock+thisblock)>>2;
447 if(ogg_page_granulepos(&og)!=-1){
448 /* pcm offset of last packet on the first audio page */
449 accumulated= ogg_page_granulepos(&og)-accumulated;
454 /* less than zero? Either a corrupt file or a stream with samples
455 trimmed off the beginning, a normal occurrence; in both cases set
456 the offset to zero */
457 if(accumulated<0)accumulated=0;
462 /* finds each bitstream link one at a time using a bisection search
463 (has to begin by knowing the offset of the lb's initial page).
464 Recurses for each link so it can alloc the link storage after
465 finding them all, then unroll and fill the cache at the same time */
466 static int _bisect_forward_serialno(OggVorbis_File *vf,
468 ogg_int64_t searched,
472 long *currentno_list,
475 ogg_int64_t pcmoffset;
476 ogg_int64_t dataoffset=searched;
477 ogg_int64_t endsearched=end;
478 ogg_int64_t next=end;
479 ogg_int64_t searchgran=-1;
481 ogg_int64_t ret,last;
482 int serialno = vf->os.serialno;
485 we have the headers and serialnos for the link beginning at 'begin'
486 we have the offset and granpos of the last page in the file (potentially
487 not a page we care about)
490 /* Is the last page in our list of current serialnumbers? */
491 if(_lookup_serialno(endserial,currentno_list,currentnos)){
493 /* last page is in the starting serialno list, so we've bisected
494 down to (or just started with) a single link. Now we need to
495 find the last vorbis page belonging to the first vorbis stream
498 while(endserial != serialno){
499 endserial = serialno;
500 vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&endserial,&endgran);
504 if(vf->offsets)_ogg_free(vf->offsets);
505 if(vf->serialnos)_ogg_free(vf->serialnos);
506 if(vf->dataoffsets)_ogg_free(vf->dataoffsets);
508 vf->offsets=_ogg_malloc((vf->links+1)*sizeof(*vf->offsets));
509 vf->vi=_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi));
510 vf->vc=_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc));
511 vf->serialnos=_ogg_malloc(vf->links*sizeof(*vf->serialnos));
512 vf->dataoffsets=_ogg_malloc(vf->links*sizeof(*vf->dataoffsets));
513 vf->pcmlengths=_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths));
515 vf->offsets[m+1]=end;
516 vf->offsets[m]=begin;
517 vf->pcmlengths[m*2+1]=(endgran<0?0:endgran);
521 long *next_serialno_list=NULL;
522 int next_serialnos=0;
526 /* the below guards against garbage seperating the last and
527 first pages of two links. */
528 while(searched<endsearched){
531 if(endsearched-searched<CHUNKSIZE){
534 bisect=(searched+endsearched)/2;
537 if(bisect != vf->offset){
538 ret=_seek_helper(vf,bisect);
542 last=_get_next_page(vf,&og,-1);
543 if(last==OV_EREAD)return(OV_EREAD);
544 if(last<0 || !_lookup_page_serialno(&og,currentno_list,currentnos)){
546 if(last>=0)next=last;
552 /* Bisection point found */
554 /* for the time being, fetch end PCM offset the simple way */
556 int testserial = serialno+1;
558 while(testserial != serialno){
559 testserial = serialno;
560 vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&testserial,&searchgran);
564 if(vf->offset!=next){
565 ret=_seek_helper(vf,next);
569 ret=_fetch_headers(vf,&vi,&vc,&next_serialno_list,&next_serialnos,NULL);
571 serialno = vf->os.serialno;
572 dataoffset = vf->offset;
574 /* this will consume a page, however the next bistection always
575 starts with a raw seek */
576 pcmoffset = _initial_pcmoffset(vf,&vi);
578 ret=_bisect_forward_serialno(vf,next,vf->offset,end,endgran,endserial,
579 next_serialno_list,next_serialnos,m+1);
582 if(next_serialno_list)_ogg_free(next_serialno_list);
584 vf->offsets[m+1]=next;
585 vf->serialnos[m+1]=serialno;
586 vf->dataoffsets[m+1]=dataoffset;
591 vf->pcmlengths[m*2+1]=searchgran;
592 vf->pcmlengths[m*2+2]=pcmoffset;
593 vf->pcmlengths[m*2+3]-=pcmoffset;
594 if(vf->pcmlengths[m*2+3]<0)vf->pcmlengths[m*2+3]=0;
599 static int _make_decode_ready(OggVorbis_File *vf){
600 if(vf->ready_state>STREAMSET)return 0;
601 if(vf->ready_state<STREAMSET)return OV_EFAULT;
603 if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link))
606 if(vorbis_synthesis_init(&vf->vd,vf->vi))
609 vorbis_block_init(&vf->vd,&vf->vb);
610 vf->ready_state=INITSET;
616 static int _open_seekable2(OggVorbis_File *vf){
617 ogg_int64_t dataoffset=vf->dataoffsets[0],end,endgran=-1;
618 int endserial=vf->os.serialno;
619 int serialno=vf->os.serialno;
621 /* we're partially open and have a first link header state in
624 /* fetch initial PCM offset */
625 ogg_int64_t pcmoffset = _initial_pcmoffset(vf,vf->vi);
627 /* we can seek, so set out learning all about this file */
628 if(vf->callbacks.seek_func && vf->callbacks.tell_func){
629 (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END);
630 vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource);
632 vf->offset=vf->end=-1;
635 /* If seek_func is implemented, tell_func must also be implemented */
636 if(vf->end==-1) return(OV_EINVAL);
638 /* Get the offset of the last page of the physical bitstream, or, if
639 we're lucky the last vorbis page of this link as most OggVorbis
640 files will contain a single logical bitstream */
641 end=_get_prev_page_serial(vf,vf->serialnos+2,vf->serialnos[1],&endserial,&endgran);
642 if(end<0)return(end);
644 /* now determine bitstream structure recursively */
645 if(_bisect_forward_serialno(vf,0,dataoffset,vf->offset,endgran,endserial,
646 vf->serialnos+2,vf->serialnos[1],0)<0)return(OV_EREAD);
649 vf->serialnos[0]=serialno;
650 vf->dataoffsets[0]=dataoffset;
651 vf->pcmlengths[0]=pcmoffset;
652 vf->pcmlengths[1]-=pcmoffset;
653 if(vf->pcmlengths[1]<0)vf->pcmlengths[1]=0;
655 return(ov_raw_seek(vf,dataoffset));
658 /* clear out the current logical bitstream decoder */
659 static void _decode_clear(OggVorbis_File *vf){
660 vorbis_dsp_clear(&vf->vd);
661 vorbis_block_clear(&vf->vb);
662 vf->ready_state=OPENED;
665 /* fetch and process a packet. Handles the case where we're at a
666 bitstream boundary and dumps the decoding machine. If the decoding
667 machine is unloaded, it loads it. It also keeps pcm_offset up to
668 date (seek and read both use this. seek uses a special hack with
671 return: <0) error, OV_HOLE (lost packet) or OV_EOF
672 0) need more data (only if readp==0)
676 static int _fetch_and_process_packet(OggVorbis_File *vf,
682 /* handle one packet. Try to fetch it from current stream state */
683 /* extract packets from page */
686 if(vf->ready_state==STREAMSET){
687 int ret=_make_decode_ready(vf);
691 /* process a packet if we can. */
693 if(vf->ready_state==INITSET){
694 int hs=vorbis_synthesis_halfrate_p(vf->vi);
698 ogg_packet *op_ptr=(op_in?op_in:&op);
699 int result=ogg_stream_packetout(&vf->os,op_ptr);
700 ogg_int64_t granulepos;
703 if(result==-1)return(OV_HOLE); /* hole in the data. */
705 /* got a packet. process it */
706 granulepos=op_ptr->granulepos;
707 if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy
709 header packets aren't
712 vorbis_synthesis will
715 /* suck in the synthesis data and track bitrate */
717 int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL);
718 /* for proper use of libvorbis within libvorbisfile,
719 oldsamples will always be zero. */
720 if(oldsamples)return(OV_EFAULT);
722 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
723 vf->samptrack+=(vorbis_synthesis_pcmout(&vf->vd,NULL)<<hs);
724 vf->bittrack+=op_ptr->bytes*8;
727 /* update the pcm offset. */
728 if(granulepos!=-1 && !op_ptr->e_o_s){
729 int link=(vf->seekable?vf->current_link:0);
732 /* this packet has a pcm_offset on it (the last packet
733 completed on a page carries the offset) After processing
734 (above), we know the pcm position of the *last* sample
735 ready to be returned. Find the offset of the *first*
737 As an aside, this trick is inaccurate if we begin
738 reading anew right at the last page; the end-of-stream
739 granulepos declares the last frame in the stream, and the
740 last packet of the last page may be a partial frame.
741 So, we need a previous granulepos from an in-sequence page
742 to have a reference point. Thus the !op_ptr->e_o_s clause
745 if(vf->seekable && link>0)
746 granulepos-=vf->pcmlengths[link*2];
747 if(granulepos<0)granulepos=0; /* actually, this
748 shouldn't be possible
749 here unless the stream
752 samples=(vorbis_synthesis_pcmout(&vf->vd,NULL)<<hs);
756 granulepos+=vf->pcmlengths[i*2+1];
757 vf->pcm_offset=granulepos;
767 if(vf->ready_state>=OPENED){
771 /* the loop is not strictly necessary, but there's no sense in
772 doing the extra checks of the larger loop for the common
773 case in a multiplexed bistream where the page is simply
774 part of a different logical bitstream; keep reading until
775 we get one with the correct serialno */
778 if((ret=_get_next_page(vf,&og,-1))<0){
779 return(OV_EOF); /* eof. leave unitialized */
782 /* bitrate tracking; add the header's bytes here, the body bytes
783 are done by packet above */
784 vf->bittrack+=og.header_len*8;
786 if(vf->ready_state==INITSET){
787 if(vf->current_serialno!=ogg_page_serialno(&og)){
789 /* two possibilities:
790 1) our decoding just traversed a bitstream boundary
791 2) another stream is multiplexed into this logical section */
793 if(ogg_page_bos(&og)){
801 vorbis_info_clear(vf->vi);
802 vorbis_comment_clear(vf->vc);
807 continue; /* possibility #2 */
815 /* Do we need to load a new machine before submitting the page? */
816 /* This is different in the seekable and non-seekable cases.
818 In the seekable case, we already have all the header
819 information loaded and cached; we just initialize the machine
820 with it and continue on our merry way.
822 In the non-seekable (streaming) case, we'll only be at a
823 boundary if we just left the previous logical bitstream and
824 we're now nominally at the header of the next bitstream
827 if(vf->ready_state!=INITSET){
830 if(vf->ready_state<STREAMSET){
832 long serialno = ogg_page_serialno(&og);
834 /* match the serialno to bitstream section. We use this rather than
835 offset positions to avoid problems near logical bitstream
838 for(link=0;link<vf->links;link++)
839 if(vf->serialnos[link]==serialno)break;
841 if(link==vf->links) continue; /* not the desired Vorbis
842 bitstream section; keep
845 vf->current_serialno=serialno;
846 vf->current_link=link;
848 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
849 vf->ready_state=STREAMSET;
852 /* we're streaming */
853 /* fetch the three header packets, build the info struct */
855 int ret=_fetch_headers(vf,vf->vi,vf->vc,NULL,NULL,&og);
857 vf->current_serialno=vf->os.serialno;
864 /* the buffered page is the data we want, and we're ready for it;
865 add it to the stream state */
866 ogg_stream_pagein(&vf->os,&og);
871 /* if, eg, 64 bit stdio is configured by default, this will build with
873 static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){
874 if(f==NULL)return(-1);
875 return fseek(f,off,whence);
878 static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial,
879 long ibytes, ov_callbacks callbacks){
880 int offsettest=((f && callbacks.seek_func)?callbacks.seek_func(f,0,SEEK_CUR):-1);
881 long *serialno_list=NULL;
882 int serialno_list_size=0;
885 memset(vf,0,sizeof(*vf));
887 vf->callbacks = callbacks;
889 /* init the framing state */
890 ogg_sync_init(&vf->oy);
892 /* perhaps some data was previously read into a buffer for testing
893 against other stream types. Allow initialization from this
894 previously read data (especially as we may be reading from a
895 non-seekable stream) */
897 char *buffer=ogg_sync_buffer(&vf->oy,ibytes);
898 memcpy(buffer,initial,ibytes);
899 ogg_sync_wrote(&vf->oy,ibytes);
902 /* can we seek? Stevens suggests the seek test was portable */
903 if(offsettest!=-1)vf->seekable=1;
905 /* No seeking yet; Set up a 'single' (current) logical bitstream
906 entry for partial open */
908 vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi));
909 vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc));
910 ogg_stream_init(&vf->os,-1); /* fill in the serialno later */
912 /* Fetch all BOS pages, store the vorbis header and all seen serial
913 numbers, load subsequent vorbis setup headers */
914 if((ret=_fetch_headers(vf,vf->vi,vf->vc,&serialno_list,&serialno_list_size,NULL))<0){
918 /* serial number list for first link needs to be held somewhere
919 for second stage of seekable stream open; this saves having to
920 seek/reread first link's serialnumber data then. */
921 vf->serialnos=_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos));
922 vf->serialnos[0]=vf->current_serialno=vf->os.serialno;
923 vf->serialnos[1]=serialno_list_size;
924 memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos));
926 vf->offsets=_ogg_calloc(1,sizeof(*vf->offsets));
927 vf->dataoffsets=_ogg_calloc(1,sizeof(*vf->dataoffsets));
929 vf->dataoffsets[0]=vf->offset;
931 vf->ready_state=PARTOPEN;
933 if(serialno_list)_ogg_free(serialno_list);
937 static int _ov_open2(OggVorbis_File *vf){
938 if(vf->ready_state != PARTOPEN) return OV_EINVAL;
939 vf->ready_state=OPENED;
941 int ret=_open_seekable2(vf);
948 vf->ready_state=STREAMSET;
954 /* clear out the OggVorbis_File struct */
955 int ov_clear(OggVorbis_File *vf){
957 vorbis_block_clear(&vf->vb);
958 vorbis_dsp_clear(&vf->vd);
959 ogg_stream_clear(&vf->os);
961 if(vf->vi && vf->links){
963 for(i=0;i<vf->links;i++){
964 vorbis_info_clear(vf->vi+i);
965 vorbis_comment_clear(vf->vc+i);
970 if(vf->dataoffsets)_ogg_free(vf->dataoffsets);
971 if(vf->pcmlengths)_ogg_free(vf->pcmlengths);
972 if(vf->serialnos)_ogg_free(vf->serialnos);
973 if(vf->offsets)_ogg_free(vf->offsets);
974 ogg_sync_clear(&vf->oy);
975 if(vf->datasource && vf->callbacks.close_func)
976 (vf->callbacks.close_func)(vf->datasource);
977 memset(vf,0,sizeof(*vf));
985 /* inspects the OggVorbis file and finds/documents all the logical
986 bitstreams contained in it. Tries to be tolerant of logical
987 bitstream sections that are truncated/woogie.
993 int ov_open_callbacks(void *f,OggVorbis_File *vf,
994 const char *initial,long ibytes,ov_callbacks callbacks){
995 int ret=_ov_open1(f,vf,initial,ibytes,callbacks);
997 return _ov_open2(vf);
1000 int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){
1001 ov_callbacks callbacks = {
1002 (size_t (*)(void *, size_t, size_t, void *)) fread,
1003 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
1004 (int (*)(void *)) fclose,
1005 (long (*)(void *)) ftell
1008 return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks);
1011 int ov_fopen(const char *path,OggVorbis_File *vf){
1013 FILE *f = fopen(path,"rb");
1016 ret = ov_open(f,vf,NULL,0);
1022 /* cheap hack for game usage where downsampling is desirable; there's
1023 no need for SRC as we can just do it cheaply in libvorbis. */
1025 int ov_halfrate(OggVorbis_File *vf,int flag){
1027 if(vf->vi==NULL)return OV_EINVAL;
1028 if(vf->ready_state>STREAMSET){
1029 /* clear out stream state; dumping the decode machine is needed to
1030 reinit the MDCT lookups. */
1031 vorbis_dsp_clear(&vf->vd);
1032 vorbis_block_clear(&vf->vb);
1033 vf->ready_state=STREAMSET;
1034 if(vf->pcm_offset>=0){
1035 ogg_int64_t pos=vf->pcm_offset;
1036 vf->pcm_offset=-1; /* make sure the pos is dumped if unseekable */
1037 ov_pcm_seek(vf,pos);
1041 for(i=0;i<vf->links;i++){
1042 if(vorbis_synthesis_halfrate(vf->vi+i,flag)){
1043 if(flag) ov_halfrate(vf,0);
1050 int ov_halfrate_p(OggVorbis_File *vf){
1051 if(vf->vi==NULL)return OV_EINVAL;
1052 return vorbis_synthesis_halfrate_p(vf->vi);
1055 /* Only partially open the vorbis file; test for Vorbisness, and load
1056 the headers for the first chain. Do not seek (although test for
1057 seekability). Use ov_test_open to finish opening the file, else
1058 ov_clear to close/free it. Same return codes as open.
1060 Note that vorbisfile does _not_ take ownership of the file if the
1061 call fails; the calling applicaiton is responsible for closing the file
1062 if this call returns an error. */
1064 int ov_test_callbacks(void *f,OggVorbis_File *vf,
1065 const char *initial,long ibytes,ov_callbacks callbacks)
1067 return _ov_open1(f,vf,initial,ibytes,callbacks);
1070 int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){
1071 ov_callbacks callbacks = {
1072 (size_t (*)(void *, size_t, size_t, void *)) fread,
1073 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
1074 (int (*)(void *)) fclose,
1075 (long (*)(void *)) ftell
1078 return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks);
1081 int ov_test_open(OggVorbis_File *vf){
1082 if(vf->ready_state!=PARTOPEN)return(OV_EINVAL);
1083 return _ov_open2(vf);
1086 /* How many logical bitstreams in this physical bitstream? */
1087 long ov_streams(OggVorbis_File *vf){
1091 /* Is the FILE * associated with vf seekable? */
1092 long ov_seekable(OggVorbis_File *vf){
1093 return vf->seekable;
1096 /* returns the bitrate for a given logical bitstream or the entire
1097 physical bitstream. If the file is open for random access, it will
1098 find the *actual* average bitrate. If the file is streaming, it
1099 returns the nominal bitrate (if set) else the average of the
1100 upper/lower bounds (if set) else -1 (unset).
1102 If you want the actual bitrate field settings, get them from the
1103 vorbis_info structs */
1105 long ov_bitrate(OggVorbis_File *vf,int i){
1106 if(vf->ready_state<OPENED)return(OV_EINVAL);
1107 if(i>=vf->links)return(OV_EINVAL);
1108 if(!vf->seekable && i!=0)return(ov_bitrate(vf,0));
1113 for(i=0;i<vf->links;i++)
1114 bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8;
1115 /* This once read: return(rint(bits/ov_time_total(vf,-1)));
1116 * gcc 3.x on x86 miscompiled this at optimisation level 2 and above,
1117 * so this is slightly transformed to make it work.
1119 br = bits/ov_time_total(vf,-1);
1123 /* return the actual bitrate */
1124 return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i)));
1126 /* return nominal if set */
1127 if(vf->vi[i].bitrate_nominal>0){
1128 return vf->vi[i].bitrate_nominal;
1130 if(vf->vi[i].bitrate_upper>0){
1131 if(vf->vi[i].bitrate_lower>0){
1132 return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2;
1134 return vf->vi[i].bitrate_upper;
1143 /* returns the actual bitrate since last call. returns -1 if no
1144 additional data to offer since last call (or at beginning of stream),
1145 EINVAL if stream is only partially open
1147 long ov_bitrate_instant(OggVorbis_File *vf){
1148 int link=(vf->seekable?vf->current_link:0);
1150 if(vf->ready_state<OPENED)return(OV_EINVAL);
1151 if(vf->samptrack==0)return(OV_FALSE);
1152 ret=vf->bittrack/vf->samptrack*vf->vi[link].rate+.5;
1159 long ov_serialnumber(OggVorbis_File *vf,int i){
1160 if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1));
1161 if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1));
1163 return(vf->current_serialno);
1165 return(vf->serialnos[i]);
1169 /* returns: total raw (compressed) length of content if i==-1
1170 raw (compressed) length of that logical bitstream for i==0 to n
1171 OV_EINVAL if the stream is not seekable (we can't know the length)
1172 or if stream is only partially open
1174 ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){
1175 if(vf->ready_state<OPENED)return(OV_EINVAL);
1176 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
1180 for(i=0;i<vf->links;i++)
1181 acc+=ov_raw_total(vf,i);
1184 return(vf->offsets[i+1]-vf->offsets[i]);
1188 /* returns: total PCM length (samples) of content if i==-1 PCM length
1189 (samples) of that logical bitstream for i==0 to n
1190 OV_EINVAL if the stream is not seekable (we can't know the
1191 length) or only partially open
1193 ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){
1194 if(vf->ready_state<OPENED)return(OV_EINVAL);
1195 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
1199 for(i=0;i<vf->links;i++)
1200 acc+=ov_pcm_total(vf,i);
1203 return(vf->pcmlengths[i*2+1]);
1207 /* returns: total seconds of content if i==-1
1208 seconds in that logical bitstream for i==0 to n
1209 OV_EINVAL if the stream is not seekable (we can't know the
1210 length) or only partially open
1212 double ov_time_total(OggVorbis_File *vf,int i){
1213 if(vf->ready_state<OPENED)return(OV_EINVAL);
1214 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
1218 for(i=0;i<vf->links;i++)
1219 acc+=ov_time_total(vf,i);
1222 return((double)(vf->pcmlengths[i*2+1])/vf->vi[i].rate);
1226 /* seek to an offset relative to the *compressed* data. This also
1227 scans packets to update the PCM cursor. It will cross a logical
1228 bitstream boundary, but only if it can't get any packets out of the
1229 tail of the bitstream we seek to (so no surprises).
1231 returns zero on success, nonzero on failure */
1233 int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){
1234 ogg_stream_state work_os;
1237 if(vf->ready_state<OPENED)return(OV_EINVAL);
1239 return(OV_ENOSEEK); /* don't dump machine if we can't seek */
1241 if(pos<0 || pos>vf->end)return(OV_EINVAL);
1243 /* is the seek position outside our current link [if any]? */
1244 if(vf->ready_state>=STREAMSET){
1245 if(pos<vf->offsets[vf->current_link] || pos>=vf->offsets[vf->current_link+1])
1246 _decode_clear(vf); /* clear out stream state */
1249 /* don't yet clear out decoding machine (if it's initialized), in
1250 the case we're in the same link. Restart the decode lapping, and
1251 let _fetch_and_process_packet deal with a potential bitstream
1254 ogg_stream_reset_serialno(&vf->os,
1255 vf->current_serialno); /* must set serialno */
1256 vorbis_synthesis_restart(&vf->vd);
1258 ret=_seek_helper(vf,pos);
1259 if(ret)goto seek_error;
1261 /* we need to make sure the pcm_offset is set, but we don't want to
1262 advance the raw cursor past good packets just to get to the first
1263 with a granulepos. That's not equivalent behavior to beginning
1264 decoding as immediately after the seek position as possible.
1266 So, a hack. We use two stream states; a local scratch state and
1267 the shared vf->os stream state. We use the local state to
1268 scan, and the shared state as a buffer for later decode.
1270 Unfortuantely, on the last page we still advance to last packet
1271 because the granulepos on the last page is not necessarily on a
1272 packet boundary, and we need to make sure the granpos is
1284 ogg_int64_t pagepos=-1;
1286 ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */
1287 ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE
1288 return from not necessarily
1289 starting from the beginning */
1292 if(vf->ready_state>=STREAMSET){
1293 /* snarf/scan a packet if we can */
1294 int result=ogg_stream_packetout(&work_os,&op);
1298 if(vf->vi[vf->current_link].codec_setup){
1299 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1301 ogg_stream_packetout(&vf->os,NULL);
1305 /* We can't get a guaranteed correct pcm position out of the
1306 last page in a stream because it might have a 'short'
1307 granpos, which can only be detected in the presence of a
1308 preceding page. However, if the last page is also the first
1309 page, the granpos rules of a first page take precedence. Not
1310 only that, but for first==last, the EOS page must be treated
1311 as if its a normal first page for the stream to open/play. */
1312 if(lastflag && !firstflag)
1313 ogg_stream_packetout(&vf->os,NULL);
1315 if(lastblock)accblock+=(lastblock+thisblock)>>2;
1318 if(op.granulepos!=-1){
1319 int i,link=vf->current_link;
1320 ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2];
1321 if(granulepos<0)granulepos=0;
1324 granulepos+=vf->pcmlengths[i*2+1];
1325 vf->pcm_offset=granulepos-accblock;
1326 if(vf->pcm_offset<0)vf->pcm_offset=0;
1329 lastblock=thisblock;
1332 ogg_stream_packetout(&vf->os,NULL);
1337 pagepos=_get_next_page(vf,&og,-1);
1339 vf->pcm_offset=ov_pcm_total(vf,-1);
1343 /* huh? Bogus stream with packets but no granulepos */
1348 /* has our decoding just traversed a bitstream boundary? */
1349 if(vf->ready_state>=STREAMSET){
1350 if(vf->current_serialno!=ogg_page_serialno(&og)){
1352 /* two possibilities:
1353 1) our decoding just traversed a bitstream boundary
1354 2) another stream is multiplexed into this logical section? */
1356 if(ogg_page_bos(&og)){
1358 _decode_clear(vf); /* clear out stream state */
1359 ogg_stream_clear(&work_os);
1360 } /* else, do nothing; next loop will scoop another page */
1364 if(vf->ready_state<STREAMSET){
1366 long serialno = ogg_page_serialno(&og);
1368 for(link=0;link<vf->links;link++)
1369 if(vf->serialnos[link]==serialno)break;
1371 if(link==vf->links) continue; /* not the desired Vorbis
1372 bitstream section; keep
1374 vf->current_link=link;
1375 vf->current_serialno=serialno;
1376 ogg_stream_reset_serialno(&vf->os,serialno);
1377 ogg_stream_reset_serialno(&work_os,serialno);
1378 vf->ready_state=STREAMSET;
1379 firstflag=(pagepos<=vf->dataoffsets[link]);
1382 ogg_stream_pagein(&vf->os,&og);
1383 ogg_stream_pagein(&work_os,&og);
1384 lastflag=ogg_page_eos(&og);
1389 ogg_stream_clear(&work_os);
1395 /* dump the machine so we're in a known state */
1397 ogg_stream_clear(&work_os);
1402 /* Page granularity seek (faster than sample granularity because we
1403 don't do the last bit of decode to find a specific sample).
1405 Seek to the last [granule marked] page preceding the specified pos
1406 location, such that decoding past the returned point will quickly
1407 arrive at the requested position. */
1408 int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){
1410 ogg_int64_t result=0;
1411 ogg_int64_t total=ov_pcm_total(vf,-1);
1413 if(vf->ready_state<OPENED)return(OV_EINVAL);
1414 if(!vf->seekable)return(OV_ENOSEEK);
1416 if(pos<0 || pos>total)return(OV_EINVAL);
1418 /* which bitstream section does this pcm offset occur in? */
1419 for(link=vf->links-1;link>=0;link--){
1420 total-=vf->pcmlengths[link*2+1];
1421 if(pos>=total)break;
1424 /* Search within the logical bitstream for the page with the highest
1425 pcm_pos preceding pos. If we're looking for a position on the
1426 first page, bisection will halt without finding our position as
1427 it's before the first explicit granulepos fencepost. That case is
1428 handled separately below.
1430 There is a danger here; missing pages or incorrect frame number
1431 information in the bitstream could make our task impossible.
1432 Account for that (it would be an error condition) */
1434 /* new search algorithm originally by HB (Nicholas Vinen) */
1437 ogg_int64_t end=vf->offsets[link+1];
1438 ogg_int64_t begin=vf->dataoffsets[link];
1439 ogg_int64_t begintime = vf->pcmlengths[link*2];
1440 ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime;
1441 ogg_int64_t target=pos-total+begintime;
1442 ogg_int64_t best=-1;
1445 /* bisection loop */
1449 if(end-begin<CHUNKSIZE){
1452 /* take a (pretty decent) guess. */
1454 (ogg_int64_t)((double)(target-begintime)*(end-begin)/(endtime-begintime))
1456 if(bisect<begin+CHUNKSIZE)
1460 /* only seek if the file position isn't already there */
1461 if(bisect!=vf->offset){
1462 result=_seek_helper(vf,bisect);
1463 if(result) goto seek_error;
1466 /* read loop within the bisection loop */
1468 result=_get_next_page(vf,&og,end-vf->offset);
1469 if(result==OV_EREAD) goto seek_error;
1471 /* there is no next page! */
1473 /* No bisection left to perform. We've either found the
1474 best candidate already or failed. Exit loop. */
1477 /* We tried to load a fraction of the last page; back up a
1478 bit and try to get the whole last page */
1479 if(bisect==0) goto seek_error;
1482 /* don't repeat/loop on a read we've already performed */
1483 if(bisect<=begin)bisect=begin+1;
1485 /* seek and cntinue bisection */
1486 result=_seek_helper(vf,bisect);
1487 if(result) goto seek_error;
1490 ogg_int64_t granulepos;
1492 /* got a page. analyze it */
1493 /* only consider pages from primary vorbis stream */
1494 if(ogg_page_serialno(&og)!=vf->serialnos[link])
1497 /* only consider pages with the granulepos set */
1498 granulepos=ogg_page_granulepos(&og);
1499 if(granulepos==-1)continue;
1501 if(granulepos<target){
1502 /* this page is a successful candidate! Set state */
1504 best=result; /* raw offset of packet with granulepos */
1505 begin=vf->offset; /* raw offset of next page */
1506 begintime=granulepos;
1508 /* if we're before our target but within a short distance,
1509 don't bisect; read forward */
1510 if(target-begintime>44100)break;
1512 bisect=begin; /* *not* begin + 1 as above */
1515 /* This is one of our pages, but the granpos is
1516 post-target; it is not a bisection return
1517 candidate. (The only way we'd use it is if it's the
1518 first page in the stream; we handle that case later
1519 outside the bisection) */
1520 if(bisect<=begin+1){
1521 /* No bisection left to perform. We've either found the
1522 best candidate already or failed. Exit loop. */
1525 if(end==vf->offset){
1526 /* bisection read to the end; use the known page
1527 boundary (result) to update bisection, back up a
1528 little bit, and try again */
1531 if(bisect<=begin)bisect=begin+1;
1532 result=_seek_helper(vf,bisect);
1533 if(result) goto seek_error;
1535 /* Normal bisection */
1546 /* Out of bisection: did it 'fail?' */
1549 /* Check the 'looking for data in first page' special case;
1550 bisection would 'fail' because our search target was before the
1551 first PCM granule position fencepost. */
1553 if(begin == vf->dataoffsets[link] &&
1554 ogg_page_serialno(&og)==vf->serialnos[link]){
1556 /* Yes, this is the beginning-of-stream case. We already have
1557 our page, right at the beginning of PCM data. Set state
1561 vf->pcm_offset=total;
1563 if(link!=vf->current_link){
1564 /* Different link; dump entire decode machine */
1567 vf->current_link=link;
1568 vf->current_serialno=vf->serialnos[link];
1569 vf->ready_state=STREAMSET;
1572 vorbis_synthesis_restart(&vf->vd);
1575 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1576 ogg_stream_pagein(&vf->os,&og);
1583 /* Bisection found our page. seek to it, update pcm offset. Easier case than
1584 raw_seek, don't keep packets preceding granulepos. */
1590 result=_seek_helper(vf,best);
1592 if(result) goto seek_error;
1593 result=_get_next_page(vf,&og,-1);
1594 if(result<0) goto seek_error;
1596 if(link!=vf->current_link){
1597 /* Different link; dump entire decode machine */
1600 vf->current_link=link;
1601 vf->current_serialno=vf->serialnos[link];
1602 vf->ready_state=STREAMSET;
1605 vorbis_synthesis_restart(&vf->vd);
1608 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1609 ogg_stream_pagein(&vf->os,&og);
1611 /* pull out all but last packet; the one with granulepos */
1613 result=ogg_stream_packetpeek(&vf->os,&op);
1615 /* No packet returned; we exited the bisection with 'best'
1616 pointing to a page with a granule position, so the packet
1617 finishing this page ('best') originated on a preceding
1618 page. Keep fetching previous pages until we get one with
1619 a granulepos or without the 'continued' flag set. Then
1620 just use raw_seek for simplicity. */
1622 result=_seek_helper(vf,best);
1623 if(result<0) goto seek_error;
1625 /* Do not rewind past the beginning of link data; if we do,
1626 it's either a bug or a broken stream */
1627 while(result>vf->dataoffsets[link]){
1628 result=_get_prev_page(vf,&og);
1629 if(result<0) goto seek_error;
1630 if(ogg_page_serialno(&og)==vf->current_serialno &&
1631 (ogg_page_granulepos(&og)>-1 ||
1632 !ogg_page_continued(&og))){
1633 return ov_raw_seek(vf,result);
1639 result = OV_EBADPACKET;
1642 if(op.granulepos!=-1){
1643 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1644 if(vf->pcm_offset<0)vf->pcm_offset=0;
1645 vf->pcm_offset+=total;
1648 result=ogg_stream_packetout(&vf->os,NULL);
1654 if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){
1663 /* dump machine so we're in a known state */
1669 /* seek to a sample offset relative to the decompressed pcm stream
1670 returns zero on success, nonzero on failure */
1672 int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){
1673 int thisblock,lastblock=0;
1674 int ret=ov_pcm_seek_page(vf,pos);
1675 if(ret<0)return(ret);
1676 if((ret=_make_decode_ready(vf)))return ret;
1678 /* discard leading packets we don't need for the lapping of the
1679 position we want; don't decode them */
1685 int ret=ogg_stream_packetpeek(&vf->os,&op);
1687 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1689 ogg_stream_packetout(&vf->os,NULL);
1690 continue; /* non audio packet */
1692 if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2;
1694 if(vf->pcm_offset+((thisblock+
1695 vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break;
1697 /* remove the packet from packet queue and track its granulepos */
1698 ogg_stream_packetout(&vf->os,NULL);
1699 vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with
1702 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
1704 /* end of logical stream case is hard, especially with exact
1705 length positioning. */
1707 if(op.granulepos>-1){
1709 /* always believe the stream markers */
1710 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1711 if(vf->pcm_offset<0)vf->pcm_offset=0;
1712 for(i=0;i<vf->current_link;i++)
1713 vf->pcm_offset+=vf->pcmlengths[i*2+1];
1716 lastblock=thisblock;
1719 if(ret<0 && ret!=OV_HOLE)break;
1721 /* suck in a new page */
1722 if(_get_next_page(vf,&og,-1)<0)break;
1723 if(ogg_page_bos(&og))_decode_clear(vf);
1725 if(vf->ready_state<STREAMSET){
1726 long serialno=ogg_page_serialno(&og);
1729 for(link=0;link<vf->links;link++)
1730 if(vf->serialnos[link]==serialno)break;
1731 if(link==vf->links) continue;
1732 vf->current_link=link;
1734 vf->ready_state=STREAMSET;
1735 vf->current_serialno=ogg_page_serialno(&og);
1736 ogg_stream_reset_serialno(&vf->os,serialno);
1737 ret=_make_decode_ready(vf);
1742 ogg_stream_pagein(&vf->os,&og);
1748 /* discard samples until we reach the desired position. Crossing a
1749 logical bitstream boundary with abandon is OK. */
1751 /* note that halfrate could be set differently in each link, but
1752 vorbisfile encoforces all links are set or unset */
1753 int hs=vorbis_synthesis_halfrate_p(vf->vi);
1754 while(vf->pcm_offset<((pos>>hs)<<hs)){
1755 ogg_int64_t target=(pos-vf->pcm_offset)>>hs;
1756 long samples=vorbis_synthesis_pcmout(&vf->vd,NULL);
1758 if(samples>target)samples=target;
1759 vorbis_synthesis_read(&vf->vd,samples);
1760 vf->pcm_offset+=samples<<hs;
1763 if(_fetch_and_process_packet(vf,NULL,1,1)<=0)
1764 vf->pcm_offset=ov_pcm_total(vf,-1); /* eof */
1770 /* seek to a playback time relative to the decompressed pcm stream
1771 returns zero on success, nonzero on failure */
1772 int ov_time_seek(OggVorbis_File *vf,double seconds){
1773 /* translate time to PCM position and call ov_pcm_seek */
1776 ogg_int64_t pcm_total=0;
1777 double time_total=0.;
1779 if(vf->ready_state<OPENED)return(OV_EINVAL);
1780 if(!vf->seekable)return(OV_ENOSEEK);
1781 if(seconds<0)return(OV_EINVAL);
1783 /* which bitstream section does this time offset occur in? */
1784 for(link=0;link<vf->links;link++){
1785 double addsec = ov_time_total(vf,link);
1786 if(seconds<time_total+addsec)break;
1788 pcm_total+=vf->pcmlengths[link*2+1];
1791 if(link==vf->links)return(OV_EINVAL);
1793 /* enough information to convert time offset to pcm offset */
1795 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1796 return(ov_pcm_seek(vf,target));
1800 /* page-granularity version of ov_time_seek
1801 returns zero on success, nonzero on failure */
1802 int ov_time_seek_page(OggVorbis_File *vf,double seconds){
1803 /* translate time to PCM position and call ov_pcm_seek */
1806 ogg_int64_t pcm_total=0;
1807 double time_total=0.;
1809 if(vf->ready_state<OPENED)return(OV_EINVAL);
1810 if(!vf->seekable)return(OV_ENOSEEK);
1811 if(seconds<0)return(OV_EINVAL);
1813 /* which bitstream section does this time offset occur in? */
1814 for(link=0;link<vf->links;link++){
1815 double addsec = ov_time_total(vf,link);
1816 if(seconds<time_total+addsec)break;
1818 pcm_total+=vf->pcmlengths[link*2+1];
1821 if(link==vf->links)return(OV_EINVAL);
1823 /* enough information to convert time offset to pcm offset */
1825 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1826 return(ov_pcm_seek_page(vf,target));
1830 /* tell the current stream offset cursor. Note that seek followed by
1831 tell will likely not give the set offset due to caching */
1832 ogg_int64_t ov_raw_tell(OggVorbis_File *vf){
1833 if(vf->ready_state<OPENED)return(OV_EINVAL);
1837 /* return PCM offset (sample) of next PCM sample to be read */
1838 ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){
1839 if(vf->ready_state<OPENED)return(OV_EINVAL);
1840 return(vf->pcm_offset);
1843 /* return time offset (seconds) of next PCM sample to be read */
1844 double ov_time_tell(OggVorbis_File *vf){
1846 ogg_int64_t pcm_total=0;
1847 double time_total=0.f;
1849 if(vf->ready_state<OPENED)return(OV_EINVAL);
1851 pcm_total=ov_pcm_total(vf,-1);
1852 time_total=ov_time_total(vf,-1);
1854 /* which bitstream section does this time offset occur in? */
1855 for(link=vf->links-1;link>=0;link--){
1856 pcm_total-=vf->pcmlengths[link*2+1];
1857 time_total-=ov_time_total(vf,link);
1858 if(vf->pcm_offset>=pcm_total)break;
1862 return((double)time_total+(double)(vf->pcm_offset-pcm_total)/vf->vi[link].rate);
1865 /* link: -1) return the vorbis_info struct for the bitstream section
1866 currently being decoded
1867 0-n) to request information for a specific bitstream section
1869 In the case of a non-seekable bitstream, any call returns the
1870 current bitstream. NULL in the case that the machine is not
1873 vorbis_info *ov_info(OggVorbis_File *vf,int link){
1876 if(vf->ready_state>=STREAMSET)
1877 return vf->vi+vf->current_link;
1890 /* grr, strong typing, grr, no templates/inheritence, grr */
1891 vorbis_comment *ov_comment(OggVorbis_File *vf,int link){
1894 if(vf->ready_state>=STREAMSET)
1895 return vf->vc+vf->current_link;
1908 static int host_is_big_endian() {
1909 ogg_int32_t pattern = 0xfeedface; /* deadbeef */
1910 unsigned char *bytewise = (unsigned char *)&pattern;
1911 if (bytewise[0] == 0xfe) return 1;
1915 /* up to this point, everything could more or less hide the multiple
1916 logical bitstream nature of chaining from the toplevel application
1917 if the toplevel application didn't particularly care. However, at
1918 the point that we actually read audio back, the multiple-section
1919 nature must surface: Multiple bitstream sections do not necessarily
1920 have to have the same number of channels or sampling rate.
1922 ov_read returns the sequential logical bitstream number currently
1923 being decoded along with the PCM data in order that the toplevel
1924 application can take action on channel/sample rate changes. This
1925 number will be incremented even for streamed (non-seekable) streams
1926 (for seekable streams, it represents the actual logical bitstream
1927 index within the physical bitstream. Note that the accessor
1928 functions above are aware of this dichotomy).
1930 ov_read_filter is exactly the same as ov_read except that it processes
1931 the decoded audio data through a filter before packing it into the
1932 requested format. This gives greater accuracy than applying a filter
1933 after the audio has been converted into integral PCM.
1935 input values: buffer) a buffer to hold packed PCM data for return
1936 length) the byte length requested to be placed into buffer
1937 bigendianp) should the data be packed LSB first (0) or
1939 word) word size for output. currently 1 (byte) or
1942 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
1944 n) number of bytes of PCM actually returned. The
1945 below works on a packet-by-packet basis, so the
1946 return length is not related to the 'length' passed
1947 in, just guaranteed to fit.
1949 *section) set to the logical bitstream number */
1951 long ov_read_filter(OggVorbis_File *vf,char *buffer,int length,
1952 int bigendianp,int word,int sgned,int *bitstream,
1953 void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param){
1955 int host_endian = host_is_big_endian();
1961 if(vf->ready_state<OPENED)return(OV_EINVAL);
1964 if(vf->ready_state==INITSET){
1965 samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
1969 /* suck in another packet */
1971 int ret=_fetch_and_process_packet(vf,NULL,1,1);
1982 /* yay! proceed to pack data into the byte buffer */
1984 long channels=ov_info(vf,-1)->channels;
1985 long bytespersample=word * channels;
1986 vorbis_fpu_control fpu;
1987 if(samples>length/bytespersample)samples=length/bytespersample;
1994 filter(pcm,channels,samples,filter_param);
1996 /* a tight loop to pack each size */
2000 int off=(sgned?0:128);
2001 vorbis_fpu_setround(&fpu);
2002 for(j=0;j<samples;j++)
2003 for(i=0;i<channels;i++){
2004 val=vorbis_ftoi(pcm[i][j]*128.f);
2006 else if(val<-128)val=-128;
2009 vorbis_fpu_restore(fpu);
2011 int off=(sgned?0:32768);
2013 if(host_endian==bigendianp){
2016 vorbis_fpu_setround(&fpu);
2017 for(i=0;i<channels;i++) { /* It's faster in this order */
2019 short *dest=((short *)buffer)+i;
2020 for(j=0;j<samples;j++) {
2021 val=vorbis_ftoi(src[j]*32768.f);
2022 if(val>32767)val=32767;
2023 else if(val<-32768)val=-32768;
2028 vorbis_fpu_restore(fpu);
2032 vorbis_fpu_setround(&fpu);
2033 for(i=0;i<channels;i++) {
2035 short *dest=((short *)buffer)+i;
2036 for(j=0;j<samples;j++) {
2037 val=vorbis_ftoi(src[j]*32768.f);
2038 if(val>32767)val=32767;
2039 else if(val<-32768)val=-32768;
2044 vorbis_fpu_restore(fpu);
2047 }else if(bigendianp){
2049 vorbis_fpu_setround(&fpu);
2050 for(j=0;j<samples;j++)
2051 for(i=0;i<channels;i++){
2052 val=vorbis_ftoi(pcm[i][j]*32768.f);
2053 if(val>32767)val=32767;
2054 else if(val<-32768)val=-32768;
2057 *buffer++=(val&0xff);
2059 vorbis_fpu_restore(fpu);
2063 vorbis_fpu_setround(&fpu);
2064 for(j=0;j<samples;j++)
2065 for(i=0;i<channels;i++){
2066 val=vorbis_ftoi(pcm[i][j]*32768.f);
2067 if(val>32767)val=32767;
2068 else if(val<-32768)val=-32768;
2070 *buffer++=(val&0xff);
2073 vorbis_fpu_restore(fpu);
2079 vorbis_synthesis_read(&vf->vd,samples);
2080 hs=vorbis_synthesis_halfrate_p(vf->vi);
2081 vf->pcm_offset+=(samples<<hs);
2082 if(bitstream)*bitstream=vf->current_link;
2083 return(samples*bytespersample);
2089 long ov_read(OggVorbis_File *vf,char *buffer,int length,
2090 int bigendianp,int word,int sgned,int *bitstream){
2091 return ov_read_filter(vf, buffer, length, bigendianp, word, sgned, bitstream, NULL, NULL);
2094 /* input values: pcm_channels) a float vector per channel of output
2095 length) the sample length being read by the app
2097 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
2099 n) number of samples of PCM actually returned. The
2100 below works on a packet-by-packet basis, so the
2101 return length is not related to the 'length' passed
2102 in, just guaranteed to fit.
2104 *section) set to the logical bitstream number */
2108 long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int length,
2111 if(vf->ready_state<OPENED)return(OV_EINVAL);
2114 if(vf->ready_state==INITSET){
2116 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
2118 int hs=vorbis_synthesis_halfrate_p(vf->vi);
2119 if(pcm_channels)*pcm_channels=pcm;
2120 if(samples>length)samples=length;
2121 vorbis_synthesis_read(&vf->vd,samples);
2122 vf->pcm_offset+=samples<<hs;
2123 if(bitstream)*bitstream=vf->current_link;
2129 /* suck in another packet */
2131 int ret=_fetch_and_process_packet(vf,NULL,1,1);
2132 if(ret==OV_EOF)return(0);
2133 if(ret<=0)return(ret);
2139 extern const float *vorbis_window(vorbis_dsp_state *v,int W);
2141 static void _ov_splice(float **pcm,float **lappcm,
2144 const float *w1, const float *w2){
2155 for(j=0;j<ch1 && j<ch2;j++){
2162 d[i]=d[i]*wd + s[i]*ws;
2165 /* window from zero */
2176 /* make sure vf is INITSET */
2177 static int _ov_initset(OggVorbis_File *vf){
2179 if(vf->ready_state==INITSET)break;
2180 /* suck in another packet */
2182 int ret=_fetch_and_process_packet(vf,NULL,1,0);
2183 if(ret<0 && ret!=OV_HOLE)return(ret);
2189 /* make sure vf is INITSET and that we have a primed buffer; if
2190 we're crosslapping at a stream section boundary, this also makes
2191 sure we're sanity checking against the right stream information */
2192 static int _ov_initprime(OggVorbis_File *vf){
2193 vorbis_dsp_state *vd=&vf->vd;
2195 if(vf->ready_state==INITSET)
2196 if(vorbis_synthesis_pcmout(vd,NULL))break;
2198 /* suck in another packet */
2200 int ret=_fetch_and_process_packet(vf,NULL,1,0);
2201 if(ret<0 && ret!=OV_HOLE)return(ret);
2207 /* grab enough data for lapping from vf; this may be in the form of
2208 unreturned, already-decoded pcm, remaining PCM we will need to
2209 decode, or synthetic postextrapolation from last packets. */
2210 static void _ov_getlap(OggVorbis_File *vf,vorbis_info *vi,vorbis_dsp_state *vd,
2211 float **lappcm,int lapsize){
2215 /* try first to decode the lapping data */
2216 while(lapcount<lapsize){
2217 int samples=vorbis_synthesis_pcmout(vd,&pcm);
2219 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
2220 for(i=0;i<vi->channels;i++)
2221 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
2223 vorbis_synthesis_read(vd,samples);
2225 /* suck in another packet */
2226 int ret=_fetch_and_process_packet(vf,NULL,1,0); /* do *not* span */
2227 if(ret==OV_EOF)break;
2230 if(lapcount<lapsize){
2231 /* failed to get lapping data from normal decode; pry it from the
2232 postextrapolation buffering, or the second half of the MDCT
2233 from the last packet */
2234 int samples=vorbis_synthesis_lapout(&vf->vd,&pcm);
2236 for(i=0;i<vi->channels;i++)
2237 memset(lappcm[i]+lapcount,0,sizeof(**pcm)*lapsize-lapcount);
2240 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
2241 for(i=0;i<vi->channels;i++)
2242 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
2248 /* this sets up crosslapping of a sample by using trailing data from
2249 sample 1 and lapping it into the windowing buffer of sample 2 */
2250 int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2){
2251 vorbis_info *vi1,*vi2;
2254 const float *w1,*w2;
2255 int n1,n2,i,ret,hs1,hs2;
2257 if(vf1==vf2)return(0); /* degenerate case */
2258 if(vf1->ready_state<OPENED)return(OV_EINVAL);
2259 if(vf2->ready_state<OPENED)return(OV_EINVAL);
2261 /* the relevant overlap buffers must be pre-checked and pre-primed
2262 before looking at settings in the event that priming would cross
2263 a bitstream boundary. So, do it now */
2265 ret=_ov_initset(vf1);
2267 ret=_ov_initprime(vf2);
2270 vi1=ov_info(vf1,-1);
2271 vi2=ov_info(vf2,-1);
2272 hs1=ov_halfrate_p(vf1);
2273 hs2=ov_halfrate_p(vf2);
2275 lappcm=alloca(sizeof(*lappcm)*vi1->channels);
2276 n1=vorbis_info_blocksize(vi1,0)>>(1+hs1);
2277 n2=vorbis_info_blocksize(vi2,0)>>(1+hs2);
2278 w1=vorbis_window(&vf1->vd,0);
2279 w2=vorbis_window(&vf2->vd,0);
2281 for(i=0;i<vi1->channels;i++)
2282 lappcm[i]=alloca(sizeof(**lappcm)*n1);
2284 _ov_getlap(vf1,vi1,&vf1->vd,lappcm,n1);
2286 /* have a lapping buffer from vf1; now to splice it into the lapping
2288 /* consolidate and expose the buffer. */
2289 vorbis_synthesis_lapout(&vf2->vd,&pcm);
2292 _analysis_output_always("pcmL",0,pcm[0],n1*2,0,0,0);
2293 _analysis_output_always("pcmR",0,pcm[1],n1*2,0,0,0);
2297 _ov_splice(pcm,lappcm,n1,n2,vi1->channels,vi2->channels,w1,w2);
2303 static int _ov_64_seek_lap(OggVorbis_File *vf,ogg_int64_t pos,
2304 int (*localseek)(OggVorbis_File *,ogg_int64_t)){
2308 const float *w1,*w2;
2309 int n1,n2,ch1,ch2,hs;
2312 if(vf->ready_state<OPENED)return(OV_EINVAL);
2313 ret=_ov_initset(vf);
2316 hs=ov_halfrate_p(vf);
2319 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
2320 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
2321 persistent; even if the decode state
2322 from this link gets dumped, this
2323 window array continues to exist */
2325 lappcm=alloca(sizeof(*lappcm)*ch1);
2327 lappcm[i]=alloca(sizeof(**lappcm)*n1);
2328 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
2330 /* have lapping data; seek and prime the buffer */
2331 ret=localseek(vf,pos);
2333 ret=_ov_initprime(vf);
2336 /* Guard against cross-link changes; they're perfectly legal */
2339 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
2340 w2=vorbis_window(&vf->vd,0);
2342 /* consolidate and expose the buffer. */
2343 vorbis_synthesis_lapout(&vf->vd,&pcm);
2346 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
2352 int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
2353 return _ov_64_seek_lap(vf,pos,ov_raw_seek);
2356 int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
2357 return _ov_64_seek_lap(vf,pos,ov_pcm_seek);
2360 int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos){
2361 return _ov_64_seek_lap(vf,pos,ov_pcm_seek_page);
2364 static int _ov_d_seek_lap(OggVorbis_File *vf,double pos,
2365 int (*localseek)(OggVorbis_File *,double)){
2369 const float *w1,*w2;
2370 int n1,n2,ch1,ch2,hs;
2373 if(vf->ready_state<OPENED)return(OV_EINVAL);
2374 ret=_ov_initset(vf);
2377 hs=ov_halfrate_p(vf);
2380 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
2381 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
2382 persistent; even if the decode state
2383 from this link gets dumped, this
2384 window array continues to exist */
2386 lappcm=alloca(sizeof(*lappcm)*ch1);
2388 lappcm[i]=alloca(sizeof(**lappcm)*n1);
2389 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
2391 /* have lapping data; seek and prime the buffer */
2392 ret=localseek(vf,pos);
2394 ret=_ov_initprime(vf);
2397 /* Guard against cross-link changes; they're perfectly legal */
2400 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
2401 w2=vorbis_window(&vf->vd,0);
2403 /* consolidate and expose the buffer. */
2404 vorbis_synthesis_lapout(&vf->vd,&pcm);
2407 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
2413 int ov_time_seek_lap(OggVorbis_File *vf,double pos){
2414 return _ov_d_seek_lap(vf,pos,ov_time_seek);
2417 int ov_time_seek_page_lap(OggVorbis_File *vf,double pos){
2418 return _ov_d_seek_lap(vf,pos,ov_time_seek_page);