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-2002 *
9 * by the XIPHOPHORUS Company http://www.xiph.org/ *
11 ********************************************************************
13 function: stdio-based convenience library for opening/seeking/decoding
14 last mod: $Id: vorbisfile.c,v 1.73 2003/09/02 04:39:26 xiphmont Exp $
16 ********************************************************************/
24 #include "vorbis/codec.h"
25 #include "vorbis/vorbisfile.h"
30 /* A 'chained bitstream' is a Vorbis bitstream that contains more than
31 one logical bitstream arranged end to end (the only form of Ogg
32 multiplexing allowed in a Vorbis bitstream; grouping [parallel
33 multiplexing] is not allowed in Vorbis) */
35 /* A Vorbis file can be played beginning to end (streamed) without
36 worrying ahead of time about chaining (see decoder_example.c). If
37 we have the whole file, however, and want random access
38 (seeking/scrubbing) or desire to know the total length/time of a
39 file, we need to account for the possibility of chaining. */
41 /* We can handle things a number of ways; we can determine the entire
42 bitstream structure right off the bat, or find pieces on demand.
43 This example determines and caches structure for the entire
44 bitstream, but builds a virtual decoder on the fly when moving
45 between links in the chain. */
47 /* There are also different ways to implement seeking. Enough
48 information exists in an Ogg bitstream to seek to
49 sample-granularity positions in the output. Or, one can seek by
50 picking some portion of the stream roughly in the desired area if
51 we only want coarse navigation through the stream. */
53 /*************************************************************************
54 * Many, many internal helpers. The intention is not to be confusing;
55 * rampant duplication and monolithic function implementation would be
56 * harder to understand anyway. The high level functions are last. Begin
57 * grokking near the end of the file */
59 /* read a little more data from the file/pipe into the ogg_sync framer
61 #define CHUNKSIZE 8500 /* a shade over 8k; anyone using pages well
62 over 8k gets what they deserve */
63 static long _get_data(OggVorbis_File *vf){
66 char *buffer=ogg_sync_buffer(&vf->oy,CHUNKSIZE);
67 long bytes=(vf->callbacks.read_func)(buffer,1,CHUNKSIZE,vf->datasource);
68 if(bytes>0)ogg_sync_wrote(&vf->oy,bytes);
69 if(bytes==0 && errno)return(-1);
75 /* save a tiny smidge of verbosity to make the code more readable */
76 static void _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){
78 (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET);
80 ogg_sync_reset(&vf->oy);
82 /* shouldn't happen unless someone writes a broken callback */
87 /* The read/seek functions track absolute position within the stream */
89 /* from the head of the stream, get the next page. boundary specifies
90 if the function is allowed to fetch more data from the stream (and
91 how much) or only use internally buffered data.
93 boundary: -1) unbounded search
94 0) read no additional data; use cached only
95 n) search for a new page beginning for n bytes
97 return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD)
98 n) found a page at absolute offset n */
100 static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og,
101 ogg_int64_t boundary){
102 if(boundary>0)boundary+=vf->offset;
106 if(boundary>0 && vf->offset>=boundary)return(OV_FALSE);
107 more=ogg_sync_pageseek(&vf->oy,og);
110 /* skipped n bytes */
114 /* send more paramedics */
115 if(!boundary)return(OV_FALSE);
117 long ret=_get_data(vf);
118 if(ret==0)return(OV_EOF);
119 if(ret<0)return(OV_EREAD);
122 /* got a page. Return the offset at the page beginning,
123 advance the internal offset past the page end */
124 ogg_int64_t ret=vf->offset;
133 /* find the latest page beginning before the current stream cursor
134 position. Much dirtier than the above as Ogg doesn't have any
135 backward search linkage. no 'readp' as it will certainly have to
137 /* returns offset or OV_EREAD, OV_FAULT */
138 static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_page *og){
139 ogg_int64_t begin=vf->offset;
140 ogg_int64_t end=begin;
142 ogg_int64_t offset=-1;
148 _seek_helper(vf,begin);
149 while(vf->offset<end){
150 ret=_get_next_page(vf,og,end-vf->offset);
151 if(ret==OV_EREAD)return(OV_EREAD);
160 /* we have the offset. Actually snork and hold the page now */
161 _seek_helper(vf,offset);
162 ret=_get_next_page(vf,og,CHUNKSIZE);
164 /* this shouldn't be possible */
170 /* finds each bitstream link one at a time using a bisection search
171 (has to begin by knowing the offset of the lb's initial page).
172 Recurses for each link so it can alloc the link storage after
173 finding them all, then unroll and fill the cache at the same time */
174 static int _bisect_forward_serialno(OggVorbis_File *vf,
176 ogg_int64_t searched,
180 ogg_int64_t endsearched=end;
181 ogg_int64_t next=end;
185 /* the below guards against garbage seperating the last and
186 first pages of two links. */
187 while(searched<endsearched){
190 if(endsearched-searched<CHUNKSIZE){
193 bisect=(searched+endsearched)/2;
196 _seek_helper(vf,bisect);
197 ret=_get_next_page(vf,&og,-1);
198 if(ret==OV_EREAD)return(OV_EREAD);
199 if(ret<0 || ogg_page_serialno(&og)!=currentno){
203 searched=ret+og.header_len+og.body_len;
207 _seek_helper(vf,next);
208 ret=_get_next_page(vf,&og,-1);
209 if(ret==OV_EREAD)return(OV_EREAD);
211 if(searched>=end || ret<0){
213 vf->offsets=_ogg_malloc((vf->links+1)*sizeof(*vf->offsets));
214 vf->serialnos=_ogg_malloc(vf->links*sizeof(*vf->serialnos));
215 vf->offsets[m+1]=searched;
217 ret=_bisect_forward_serialno(vf,next,vf->offset,
218 end,ogg_page_serialno(&og),m+1);
219 if(ret==OV_EREAD)return(OV_EREAD);
222 vf->offsets[m]=begin;
223 vf->serialnos[m]=currentno;
227 /* uses the local ogg_stream storage in vf; this is important for
228 non-streaming input sources */
229 static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc,
230 long *serialno,ogg_page *og_ptr){
236 ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE);
237 if(llret==OV_EREAD)return(OV_EREAD);
238 if(llret<0)return OV_ENOTVORBIS;
242 ogg_stream_reset_serialno(&vf->os,ogg_page_serialno(og_ptr));
243 if(serialno)*serialno=vf->os.serialno;
244 vf->ready_state=STREAMSET;
246 /* extract the initial header from the first page and verify that the
247 Ogg bitstream is in fact Vorbis data */
249 vorbis_info_init(vi);
250 vorbis_comment_init(vc);
254 ogg_stream_pagein(&vf->os,og_ptr);
256 int result=ogg_stream_packetout(&vf->os,&op);
262 if((ret=vorbis_synthesis_headerin(vi,vc,&op))){
268 if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){
276 vorbis_info_clear(vi);
277 vorbis_comment_clear(vc);
278 vf->ready_state=OPENED;
283 /* last step of the OggVorbis_File initialization; get all the
284 vorbis_info structs and PCM positions. Only called by the seekable
285 initialization (local stream storage is hacked slightly; pay
286 attention to how that's done) */
288 /* this is void and does not propogate errors up because we want to be
289 able to open and use damaged bitstreams as well as we can. Just
290 watch out for missing information for links in the OggVorbis_File
292 static void _prefetch_all_headers(OggVorbis_File *vf, ogg_int64_t dataoffset){
297 vf->vi=_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi));
298 vf->vc=_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc));
299 vf->dataoffsets=_ogg_malloc(vf->links*sizeof(*vf->dataoffsets));
300 vf->pcmlengths=_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths));
302 for(i=0;i<vf->links;i++){
304 /* we already grabbed the initial header earlier. Just set the offset */
305 vf->dataoffsets[i]=dataoffset;
306 _seek_helper(vf,dataoffset);
310 /* seek to the location of the initial header */
312 _seek_helper(vf,vf->offsets[i]);
313 if(_fetch_headers(vf,vf->vi+i,vf->vc+i,NULL,NULL)<0){
314 vf->dataoffsets[i]=-1;
316 vf->dataoffsets[i]=vf->offset;
320 /* fetch beginning PCM offset */
322 if(vf->dataoffsets[i]!=-1){
323 ogg_int64_t accumulated=0;
327 ogg_stream_reset_serialno(&vf->os,vf->serialnos[i]);
332 ret=_get_next_page(vf,&og,-1);
334 /* this should not be possible unless the file is
338 if(ogg_page_serialno(&og)!=vf->serialnos[i])
341 /* count blocksizes of all frames in the page */
342 ogg_stream_pagein(&vf->os,&og);
343 while((result=ogg_stream_packetout(&vf->os,&op))){
344 if(result>0){ /* ignore holes */
345 long thisblock=vorbis_packet_blocksize(vf->vi+i,&op);
347 accumulated+=(lastblock+thisblock)>>2;
352 if(ogg_page_granulepos(&og)!=-1){
353 /* pcm offset of last packet on the first audio page */
354 accumulated= ogg_page_granulepos(&og)-accumulated;
359 /* less than zero? This is a stream with samples trimmed off
360 the beginning, a normal occurrence; set the offset to zero */
361 if(accumulated<0)accumulated=0;
363 vf->pcmlengths[i*2]=accumulated;
366 /* get the PCM length of this link. To do this,
367 get the last page of the stream */
369 ogg_int64_t end=vf->offsets[i+1];
370 _seek_helper(vf,end);
373 ret=_get_prev_page(vf,&og);
375 /* this should not be possible */
376 vorbis_info_clear(vf->vi+i);
377 vorbis_comment_clear(vf->vc+i);
380 if(ogg_page_granulepos(&og)!=-1){
381 vf->pcmlengths[i*2+1]=ogg_page_granulepos(&og)-vf->pcmlengths[i*2];
390 static int _make_decode_ready(OggVorbis_File *vf){
391 if(vf->ready_state!=STREAMSET)return OV_EFAULT;
393 if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link))
396 if(vorbis_synthesis_init(&vf->vd,vf->vi))
399 vorbis_block_init(&vf->vd,&vf->vb);
400 vf->ready_state=INITSET;
406 static int _open_seekable2(OggVorbis_File *vf){
407 long serialno=vf->current_serialno;
408 ogg_int64_t dataoffset=vf->offset, end;
411 /* we're partially open and have a first link header state in
413 /* we can seek, so set out learning all about this file */
414 (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END);
415 vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource);
417 /* We get the offset for the last page of the physical bitstream.
418 Most OggVorbis files will contain a single logical bitstream */
419 end=_get_prev_page(vf,&og);
420 if(end<0)return(end);
422 /* more than one logical bitstream? */
423 if(ogg_page_serialno(&og)!=serialno){
425 /* Chained bitstream. Bisect-search each logical bitstream
426 section. Do so based on serial number only */
427 if(_bisect_forward_serialno(vf,0,0,end+1,serialno,0)<0)return(OV_EREAD);
431 /* Only one logical bitstream */
432 if(_bisect_forward_serialno(vf,0,end,end+1,serialno,0))return(OV_EREAD);
436 /* the initial header memory is referenced by vf after; don't free it */
437 _prefetch_all_headers(vf,dataoffset);
438 return(ov_raw_seek(vf,0));
441 /* clear out the current logical bitstream decoder */
442 static void _decode_clear(OggVorbis_File *vf){
443 vorbis_dsp_clear(&vf->vd);
444 vorbis_block_clear(&vf->vb);
445 vf->ready_state=OPENED;
448 /* fetch and process a packet. Handles the case where we're at a
449 bitstream boundary and dumps the decoding machine. If the decoding
450 machine is unloaded, it loads it. It also keeps pcm_offset up to
451 date (seek and read both use this. seek uses a special hack with
454 return: <0) error, OV_HOLE (lost packet) or OV_EOF
455 0) need more data (only if readp==0)
459 static int _fetch_and_process_packet(OggVorbis_File *vf,
465 /* handle one packet. Try to fetch it from current stream state */
466 /* extract packets from page */
469 /* process a packet if we can. If the machine isn't loaded,
471 if(vf->ready_state==INITSET){
474 ogg_packet *op_ptr=(op_in?op_in:&op);
475 int result=ogg_stream_packetout(&vf->os,op_ptr);
476 ogg_int64_t granulepos;
479 if(result==-1)return(OV_HOLE); /* hole in the data. */
481 /* got a packet. process it */
482 granulepos=op_ptr->granulepos;
483 if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy
485 header packets aren't
488 vorbis_synthesis will
491 /* suck in the synthesis data and track bitrate */
493 int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL);
494 /* for proper use of libvorbis within libvorbisfile,
495 oldsamples will always be zero. */
496 if(oldsamples)return(OV_EFAULT);
498 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
499 vf->samptrack+=vorbis_synthesis_pcmout(&vf->vd,NULL)-oldsamples;
500 vf->bittrack+=op_ptr->bytes*8;
503 /* update the pcm offset. */
504 if(granulepos!=-1 && !op_ptr->e_o_s){
505 int link=(vf->seekable?vf->current_link:0);
508 /* this packet has a pcm_offset on it (the last packet
509 completed on a page carries the offset) After processing
510 (above), we know the pcm position of the *last* sample
511 ready to be returned. Find the offset of the *first*
513 As an aside, this trick is inaccurate if we begin
514 reading anew right at the last page; the end-of-stream
515 granulepos declares the last frame in the stream, and the
516 last packet of the last page may be a partial frame.
517 So, we need a previous granulepos from an in-sequence page
518 to have a reference point. Thus the !op_ptr->e_o_s clause
521 if(vf->seekable && link>0)
522 granulepos-=vf->pcmlengths[link*2];
523 if(granulepos<0)granulepos=0; /* actually, this
524 shouldn't be possible
525 here unless the stream
528 samples=vorbis_synthesis_pcmout(&vf->vd,NULL);
532 granulepos+=vf->pcmlengths[i*2+1];
533 vf->pcm_offset=granulepos;
543 if(vf->ready_state>=OPENED){
546 if((ret=_get_next_page(vf,&og,-1))<0){
547 return(OV_EOF); /* eof.
551 /* bitrate tracking; add the header's bytes here, the body bytes
552 are done by packet above */
553 vf->bittrack+=og.header_len*8;
555 /* has our decoding just traversed a bitstream boundary? */
556 if(vf->ready_state==INITSET){
557 if(vf->current_serialno!=ogg_page_serialno(&og)){
564 vorbis_info_clear(vf->vi);
565 vorbis_comment_clear(vf->vc);
571 /* Do we need to load a new machine before submitting the page? */
572 /* This is different in the seekable and non-seekable cases.
574 In the seekable case, we already have all the header
575 information loaded and cached; we just initialize the machine
576 with it and continue on our merry way.
578 In the non-seekable (streaming) case, we'll only be at a
579 boundary if we just left the previous logical bitstream and
580 we're now nominally at the header of the next bitstream
583 if(vf->ready_state!=INITSET){
586 if(vf->ready_state<STREAMSET){
588 vf->current_serialno=ogg_page_serialno(&og);
590 /* match the serialno to bitstream section. We use this rather than
591 offset positions to avoid problems near logical bitstream
593 for(link=0;link<vf->links;link++)
594 if(vf->serialnos[link]==vf->current_serialno)break;
595 if(link==vf->links)return(OV_EBADLINK); /* sign of a bogus
600 vf->current_link=link;
602 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
603 vf->ready_state=STREAMSET;
606 /* we're streaming */
607 /* fetch the three header packets, build the info struct */
609 int ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,&og);
617 int ret=_make_decode_ready(vf);
621 ogg_stream_pagein(&vf->os,&og);
625 /* if, eg, 64 bit stdio is configured by default, this will build with
627 static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){
628 if(f==NULL)return(-1);
629 return fseek(f,off,whence);
632 static int _ov_open1(void *f,OggVorbis_File *vf,char *initial,
633 long ibytes, ov_callbacks callbacks){
634 int offsettest=(f?callbacks.seek_func(f,0,SEEK_CUR):-1);
637 memset(vf,0,sizeof(*vf));
639 vf->callbacks = callbacks;
641 /* init the framing state */
642 ogg_sync_init(&vf->oy);
644 /* perhaps some data was previously read into a buffer for testing
645 against other stream types. Allow initialization from this
646 previously read data (as we may be reading from a non-seekable
649 char *buffer=ogg_sync_buffer(&vf->oy,ibytes);
650 memcpy(buffer,initial,ibytes);
651 ogg_sync_wrote(&vf->oy,ibytes);
654 /* can we seek? Stevens suggests the seek test was portable */
655 if(offsettest!=-1)vf->seekable=1;
657 /* No seeking yet; Set up a 'single' (current) logical bitstream
658 entry for partial open */
660 vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi));
661 vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc));
662 ogg_stream_init(&vf->os,-1); /* fill in the serialno later */
664 /* Try to fetch the headers, maintaining all the storage */
665 if((ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,NULL))<0){
669 vf->ready_state=PARTOPEN;
673 static int _ov_open2(OggVorbis_File *vf){
674 if(vf->ready_state < OPENED)
675 vf->ready_state=OPENED;
677 int ret=_open_seekable2(vf);
688 /* clear out the OggVorbis_File struct */
689 int ov_clear(OggVorbis_File *vf){
691 vorbis_block_clear(&vf->vb);
692 vorbis_dsp_clear(&vf->vd);
693 ogg_stream_clear(&vf->os);
695 if(vf->vi && vf->links){
697 for(i=0;i<vf->links;i++){
698 vorbis_info_clear(vf->vi+i);
699 vorbis_comment_clear(vf->vc+i);
704 if(vf->dataoffsets)_ogg_free(vf->dataoffsets);
705 if(vf->pcmlengths)_ogg_free(vf->pcmlengths);
706 if(vf->serialnos)_ogg_free(vf->serialnos);
707 if(vf->offsets)_ogg_free(vf->offsets);
708 ogg_sync_clear(&vf->oy);
709 if(vf->datasource)(vf->callbacks.close_func)(vf->datasource);
710 memset(vf,0,sizeof(*vf));
718 /* inspects the OggVorbis file and finds/documents all the logical
719 bitstreams contained in it. Tries to be tolerant of logical
720 bitstream sections that are truncated/woogie.
726 int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes,
727 ov_callbacks callbacks){
728 int ret=_ov_open1(f,vf,initial,ibytes,callbacks);
730 return _ov_open2(vf);
733 int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){
734 ov_callbacks callbacks = {
735 (size_t (*)(void *, size_t, size_t, void *)) fread,
736 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
737 (int (*)(void *)) fclose,
738 (long (*)(void *)) ftell
741 return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks);
744 /* cheap hack for game usage where downsampling is desirable; there's
745 no need for SRC as we can just do it cheaply in libvorbis. */
747 int ov_halfrate(OggVorbis_File *vf,int flag){
749 if(vf->vi==NULL)return OV_EINVAL;
750 if(!vf->seekable)return OV_EINVAL;
751 if(vf->ready_state>=STREAMSET)
752 _decode_clear(vf); /* clear out stream state; later on libvorbis
753 will be able to swap this on the fly, but
754 for now dumping the decode machine is needed
755 to reinit the MDCT lookups. 1.1 libvorbis
756 is planned to be able to switch on the fly */
758 for(i=0;i<vf->links;i++){
759 if(vorbis_synthesis_halfrate(vf->vi+i,flag)){
767 int ov_halfrate_p(OggVorbis_File *vf){
768 if(vf->vi==NULL)return OV_EINVAL;
769 return vorbis_synthesis_halfrate_p(vf->vi);
772 /* Only partially open the vorbis file; test for Vorbisness, and load
773 the headers for the first chain. Do not seek (although test for
774 seekability). Use ov_test_open to finish opening the file, else
775 ov_clear to close/free it. Same return codes as open. */
777 int ov_test_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes,
778 ov_callbacks callbacks)
780 return _ov_open1(f,vf,initial,ibytes,callbacks);
783 int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){
784 ov_callbacks callbacks = {
785 (size_t (*)(void *, size_t, size_t, void *)) fread,
786 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
787 (int (*)(void *)) fclose,
788 (long (*)(void *)) ftell
791 return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks);
794 int ov_test_open(OggVorbis_File *vf){
795 if(vf->ready_state!=PARTOPEN)return(OV_EINVAL);
796 return _ov_open2(vf);
799 /* How many logical bitstreams in this physical bitstream? */
800 long ov_streams(OggVorbis_File *vf){
804 /* Is the FILE * associated with vf seekable? */
805 long ov_seekable(OggVorbis_File *vf){
809 /* returns the bitrate for a given logical bitstream or the entire
810 physical bitstream. If the file is open for random access, it will
811 find the *actual* average bitrate. If the file is streaming, it
812 returns the nominal bitrate (if set) else the average of the
813 upper/lower bounds (if set) else -1 (unset).
815 If you want the actual bitrate field settings, get them from the
816 vorbis_info structs */
818 long ov_bitrate(OggVorbis_File *vf,int i){
819 if(vf->ready_state<OPENED)return(OV_EINVAL);
820 if(i>=vf->links)return(OV_EINVAL);
821 if(!vf->seekable && i!=0)return(ov_bitrate(vf,0));
826 for(i=0;i<vf->links;i++)
827 bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8;
828 /* This once read: return(rint(bits/ov_time_total(vf,-1)));
829 * gcc 3.x on x86 miscompiled this at optimisation level 2 and above,
830 * so this is slightly transformed to make it work.
832 br = bits/ov_time_total(vf,-1);
836 /* return the actual bitrate */
837 return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i)));
839 /* return nominal if set */
840 if(vf->vi[i].bitrate_nominal>0){
841 return vf->vi[i].bitrate_nominal;
843 if(vf->vi[i].bitrate_upper>0){
844 if(vf->vi[i].bitrate_lower>0){
845 return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2;
847 return vf->vi[i].bitrate_upper;
856 /* returns the actual bitrate since last call. returns -1 if no
857 additional data to offer since last call (or at beginning of stream),
858 EINVAL if stream is only partially open
860 long ov_bitrate_instant(OggVorbis_File *vf){
861 int link=(vf->seekable?vf->current_link:0);
863 if(vf->ready_state<OPENED)return(OV_EINVAL);
864 if(vf->samptrack==0)return(OV_FALSE);
865 ret=vf->bittrack/vf->samptrack*vf->vi[link].rate+.5;
872 long ov_serialnumber(OggVorbis_File *vf,int i){
873 if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1));
874 if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1));
876 return(vf->current_serialno);
878 return(vf->serialnos[i]);
882 /* returns: total raw (compressed) length of content if i==-1
883 raw (compressed) length of that logical bitstream for i==0 to n
884 OV_EINVAL if the stream is not seekable (we can't know the length)
885 or if stream is only partially open
887 ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){
888 if(vf->ready_state<OPENED)return(OV_EINVAL);
889 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
893 for(i=0;i<vf->links;i++)
894 acc+=ov_raw_total(vf,i);
897 return(vf->offsets[i+1]-vf->offsets[i]);
901 /* returns: total PCM length (samples) of content if i==-1 PCM length
902 (samples) of that logical bitstream for i==0 to n
903 OV_EINVAL if the stream is not seekable (we can't know the
904 length) or only partially open
906 ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){
907 if(vf->ready_state<OPENED)return(OV_EINVAL);
908 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
912 for(i=0;i<vf->links;i++)
913 acc+=ov_pcm_total(vf,i);
916 return(vf->pcmlengths[i*2+1]);
920 /* returns: total seconds of content if i==-1
921 seconds in that logical bitstream for i==0 to n
922 OV_EINVAL if the stream is not seekable (we can't know the
923 length) or only partially open
925 double ov_time_total(OggVorbis_File *vf,int i){
926 if(vf->ready_state<OPENED)return(OV_EINVAL);
927 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
931 for(i=0;i<vf->links;i++)
932 acc+=ov_time_total(vf,i);
935 return((double)(vf->pcmlengths[i*2+1])/vf->vi[i].rate);
939 /* seek to an offset relative to the *compressed* data. This also
940 scans packets to update the PCM cursor. It will cross a logical
941 bitstream boundary, but only if it can't get any packets out of the
942 tail of the bitstream we seek to (so no surprises).
944 returns zero on success, nonzero on failure */
946 int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){
947 ogg_stream_state work_os;
949 if(vf->ready_state<OPENED)return(OV_EINVAL);
951 return(OV_ENOSEEK); /* don't dump machine if we can't seek */
953 if(pos<0 || pos>vf->end)return(OV_EINVAL);
955 /* don't yet clear out decoding machine (if it's initialized), in
956 the case we're in the same link. Restart the decode lapping, and
957 let _fetch_and_process_packet deal with a potential bitstream
960 ogg_stream_reset_serialno(&vf->os,
961 vf->current_serialno); /* must set serialno */
962 vorbis_synthesis_restart(&vf->vd);
964 _seek_helper(vf,pos);
966 /* we need to make sure the pcm_offset is set, but we don't want to
967 advance the raw cursor past good packets just to get to the first
968 with a granulepos. That's not equivalent behavior to beginning
969 decoding as immediately after the seek position as possible.
971 So, a hack. We use two stream states; a local scratch state and
972 the shared vf->os stream state. We use the local state to
973 scan, and the shared state as a buffer for later decode.
975 Unfortuantely, on the last page we still advance to last packet
976 because the granulepos on the last page is not necessarily on a
977 packet boundary, and we need to make sure the granpos is
989 ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */
990 ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE
991 return from not necessarily
992 starting from the beginning */
995 if(vf->ready_state>=STREAMSET){
996 /* snarf/scan a packet if we can */
997 int result=ogg_stream_packetout(&work_os,&op);
1001 if(vf->vi[vf->current_link].codec_setup){
1002 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1004 ogg_stream_packetout(&vf->os,NULL);
1009 ogg_stream_packetout(&vf->os,NULL);
1011 if(lastblock)accblock+=(lastblock+thisblock)>>2;
1014 if(op.granulepos!=-1){
1015 int i,link=vf->current_link;
1016 ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2];
1017 if(granulepos<0)granulepos=0;
1020 granulepos+=vf->pcmlengths[i*2+1];
1021 vf->pcm_offset=granulepos-accblock;
1024 lastblock=thisblock;
1027 ogg_stream_packetout(&vf->os,NULL);
1032 if(_get_next_page(vf,&og,-1)<0){
1033 vf->pcm_offset=ov_pcm_total(vf,-1);
1037 /* huh? Bogus stream with packets but no granulepos */
1042 /* has our decoding just traversed a bitstream boundary? */
1043 if(vf->ready_state>=STREAMSET)
1044 if(vf->current_serialno!=ogg_page_serialno(&og)){
1045 _decode_clear(vf); /* clear out stream state */
1046 ogg_stream_clear(&work_os);
1049 if(vf->ready_state<STREAMSET){
1052 vf->current_serialno=ogg_page_serialno(&og);
1053 for(link=0;link<vf->links;link++)
1054 if(vf->serialnos[link]==vf->current_serialno)break;
1055 if(link==vf->links)goto seek_error; /* sign of a bogus stream.
1057 machine uninitialized */
1058 vf->current_link=link;
1060 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1061 ogg_stream_reset_serialno(&work_os,vf->current_serialno);
1062 vf->ready_state=STREAMSET;
1066 ogg_stream_pagein(&vf->os,&og);
1067 ogg_stream_pagein(&work_os,&og);
1068 eosflag=ogg_page_eos(&og);
1072 ogg_stream_clear(&work_os);
1078 /* dump the machine so we're in a known state */
1080 ogg_stream_clear(&work_os);
1085 /* Page granularity seek (faster than sample granularity because we
1086 don't do the last bit of decode to find a specific sample).
1088 Seek to the last [granule marked] page preceeding the specified pos
1089 location, such that decoding past the returned point will quickly
1090 arrive at the requested position. */
1091 int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){
1093 ogg_int64_t result=0;
1094 ogg_int64_t total=ov_pcm_total(vf,-1);
1096 if(vf->ready_state<OPENED)return(OV_EINVAL);
1097 if(!vf->seekable)return(OV_ENOSEEK);
1099 if(pos<0 || pos>total)return(OV_EINVAL);
1101 /* which bitstream section does this pcm offset occur in? */
1102 for(link=vf->links-1;link>=0;link--){
1103 total-=vf->pcmlengths[link*2+1];
1104 if(pos>=total)break;
1107 /* search within the logical bitstream for the page with the highest
1108 pcm_pos preceeding (or equal to) pos. There is a danger here;
1109 missing pages or incorrect frame number information in the
1110 bitstream could make our task impossible. Account for that (it
1111 would be an error condition) */
1113 /* new search algorithm by HB (Nicholas Vinen) */
1115 ogg_int64_t end=vf->offsets[link+1];
1116 ogg_int64_t begin=vf->offsets[link];
1117 ogg_int64_t begintime = vf->pcmlengths[link*2];
1118 ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime;
1119 ogg_int64_t target=pos-total+begintime;
1120 ogg_int64_t best=begin;
1126 if(end-begin<CHUNKSIZE){
1129 /* take a (pretty decent) guess. */
1131 (target-begintime)*(end-begin)/(endtime-begintime) - CHUNKSIZE;
1136 _seek_helper(vf,bisect);
1139 result=_get_next_page(vf,&og,end-vf->offset);
1140 if(result==OV_EREAD) goto seek_error;
1143 end=begin; /* found it */
1145 if(bisect==0) goto seek_error;
1147 if(bisect<=begin)bisect=begin+1;
1148 _seek_helper(vf,bisect);
1151 ogg_int64_t granulepos=ogg_page_granulepos(&og);
1152 if(granulepos==-1)continue;
1153 if(granulepos<target){
1154 best=result; /* raw offset of packet with granulepos */
1155 begin=vf->offset; /* raw offset of next page */
1156 begintime=granulepos;
1158 if(target-begintime>44100)break;
1159 bisect=begin; /* *not* begin + 1 */
1162 end=begin; /* found it */
1164 if(end==vf->offset){ /* we're pretty close - we'd be stuck in */
1166 bisect-=CHUNKSIZE; /* an endless loop otherwise. */
1167 if(bisect<=begin)bisect=begin+1;
1168 _seek_helper(vf,bisect);
1180 /* found our page. seek to it, update pcm offset. Easier case than
1181 raw_seek, don't keep packets preceeding granulepos. */
1187 _seek_helper(vf,best);
1190 if(_get_next_page(vf,&og,-1)<0)return(OV_EOF); /* shouldn't happen */
1192 if(link!=vf->current_link){
1193 /* Different link; dump entire decode machine */
1196 vf->current_link=link;
1197 vf->current_serialno=ogg_page_serialno(&og);
1198 vf->ready_state=STREAMSET;
1201 vorbis_synthesis_restart(&vf->vd);
1204 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1205 ogg_stream_pagein(&vf->os,&og);
1207 /* pull out all but last packet; the one with granulepos */
1209 result=ogg_stream_packetpeek(&vf->os,&op);
1211 /* !!! the packet finishing this page originated on a
1212 preceeding page. Keep fetching previous pages until we
1213 get one with a granulepos or without the 'continued' flag
1214 set. Then just use raw_seek for simplicity. */
1216 _seek_helper(vf,best);
1219 result=_get_prev_page(vf,&og);
1220 if(result<0) goto seek_error;
1221 if(ogg_page_granulepos(&og)>-1 ||
1222 !ogg_page_continued(&og)){
1223 return ov_raw_seek(vf,result);
1229 result = OV_EBADPACKET;
1232 if(op.granulepos!=-1){
1233 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1234 if(vf->pcm_offset<0)vf->pcm_offset=0;
1235 vf->pcm_offset+=total;
1238 result=ogg_stream_packetout(&vf->os,NULL);
1244 if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){
1253 /* dump machine so we're in a known state */
1259 /* seek to a sample offset relative to the decompressed pcm stream
1260 returns zero on success, nonzero on failure */
1262 int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){
1263 int thisblock,lastblock=0;
1264 int ret=ov_pcm_seek_page(vf,pos);
1265 if(ret<0)return(ret);
1266 if((ret=_make_decode_ready(vf)))return ret;
1268 /* discard leading packets we don't need for the lapping of the
1269 position we want; don't decode them */
1275 int ret=ogg_stream_packetpeek(&vf->os,&op);
1277 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1279 ogg_stream_packetout(&vf->os,NULL);
1280 continue; /* non audio packet */
1282 if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2;
1284 if(vf->pcm_offset+((thisblock+
1285 vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break;
1287 /* remove the packet from packet queue and track its granulepos */
1288 ogg_stream_packetout(&vf->os,NULL);
1289 vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with
1292 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
1294 /* end of logical stream case is hard, especially with exact
1295 length positioning. */
1297 if(op.granulepos>-1){
1299 /* always believe the stream markers */
1300 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1301 if(vf->pcm_offset<0)vf->pcm_offset=0;
1302 for(i=0;i<vf->current_link;i++)
1303 vf->pcm_offset+=vf->pcmlengths[i*2+1];
1306 lastblock=thisblock;
1309 if(ret<0 && ret!=OV_HOLE)break;
1311 /* suck in a new page */
1312 if(_get_next_page(vf,&og,-1)<0)break;
1313 if(vf->current_serialno!=ogg_page_serialno(&og))_decode_clear(vf);
1315 if(vf->ready_state<STREAMSET){
1318 vf->current_serialno=ogg_page_serialno(&og);
1319 for(link=0;link<vf->links;link++)
1320 if(vf->serialnos[link]==vf->current_serialno)break;
1321 if(link==vf->links)return(OV_EBADLINK);
1322 vf->current_link=link;
1324 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1325 vf->ready_state=STREAMSET;
1326 ret=_make_decode_ready(vf);
1331 ogg_stream_pagein(&vf->os,&og);
1337 /* discard samples until we reach the desired position. Crossing a
1338 logical bitstream boundary with abandon is OK. */
1339 while(vf->pcm_offset<pos){
1340 ogg_int64_t target=pos-vf->pcm_offset;
1341 long samples=vorbis_synthesis_pcmout(&vf->vd,NULL);
1343 if(samples>target)samples=target;
1344 vorbis_synthesis_read(&vf->vd,samples);
1345 vf->pcm_offset+=samples;
1348 if(_fetch_and_process_packet(vf,NULL,1,1)<=0)
1349 vf->pcm_offset=ov_pcm_total(vf,-1); /* eof */
1354 /* seek to a playback time relative to the decompressed pcm stream
1355 returns zero on success, nonzero on failure */
1356 int ov_time_seek(OggVorbis_File *vf,double seconds){
1357 /* translate time to PCM position and call ov_pcm_seek */
1360 ogg_int64_t pcm_total=ov_pcm_total(vf,-1);
1361 double time_total=ov_time_total(vf,-1);
1363 if(vf->ready_state<OPENED)return(OV_EINVAL);
1364 if(!vf->seekable)return(OV_ENOSEEK);
1365 if(seconds<0 || seconds>time_total)return(OV_EINVAL);
1367 /* which bitstream section does this time offset occur in? */
1368 for(link=vf->links-1;link>=0;link--){
1369 pcm_total-=vf->pcmlengths[link*2+1];
1370 time_total-=ov_time_total(vf,link);
1371 if(seconds>=time_total)break;
1374 /* enough information to convert time offset to pcm offset */
1376 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1377 return(ov_pcm_seek(vf,target));
1381 /* page-granularity version of ov_time_seek
1382 returns zero on success, nonzero on failure */
1383 int ov_time_seek_page(OggVorbis_File *vf,double seconds){
1384 /* translate time to PCM position and call ov_pcm_seek */
1387 ogg_int64_t pcm_total=ov_pcm_total(vf,-1);
1388 double time_total=ov_time_total(vf,-1);
1390 if(vf->ready_state<OPENED)return(OV_EINVAL);
1391 if(!vf->seekable)return(OV_ENOSEEK);
1392 if(seconds<0 || seconds>time_total)return(OV_EINVAL);
1394 /* which bitstream section does this time offset occur in? */
1395 for(link=vf->links-1;link>=0;link--){
1396 pcm_total-=vf->pcmlengths[link*2+1];
1397 time_total-=ov_time_total(vf,link);
1398 if(seconds>=time_total)break;
1401 /* enough information to convert time offset to pcm offset */
1403 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1404 return(ov_pcm_seek_page(vf,target));
1408 /* tell the current stream offset cursor. Note that seek followed by
1409 tell will likely not give the set offset due to caching */
1410 ogg_int64_t ov_raw_tell(OggVorbis_File *vf){
1411 if(vf->ready_state<OPENED)return(OV_EINVAL);
1415 /* return PCM offset (sample) of next PCM sample to be read */
1416 ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){
1417 if(vf->ready_state<OPENED)return(OV_EINVAL);
1418 return(vf->pcm_offset);
1421 /* return time offset (seconds) of next PCM sample to be read */
1422 double ov_time_tell(OggVorbis_File *vf){
1424 ogg_int64_t pcm_total=0;
1425 double time_total=0.f;
1427 if(vf->ready_state<OPENED)return(OV_EINVAL);
1429 pcm_total=ov_pcm_total(vf,-1);
1430 time_total=ov_time_total(vf,-1);
1432 /* which bitstream section does this time offset occur in? */
1433 for(link=vf->links-1;link>=0;link--){
1434 pcm_total-=vf->pcmlengths[link*2+1];
1435 time_total-=ov_time_total(vf,link);
1436 if(vf->pcm_offset>=pcm_total)break;
1440 return((double)time_total+(double)(vf->pcm_offset-pcm_total)/vf->vi[link].rate);
1443 /* link: -1) return the vorbis_info struct for the bitstream section
1444 currently being decoded
1445 0-n) to request information for a specific bitstream section
1447 In the case of a non-seekable bitstream, any call returns the
1448 current bitstream. NULL in the case that the machine is not
1451 vorbis_info *ov_info(OggVorbis_File *vf,int link){
1454 if(vf->ready_state>=STREAMSET)
1455 return vf->vi+vf->current_link;
1468 /* grr, strong typing, grr, no templates/inheritence, grr */
1469 vorbis_comment *ov_comment(OggVorbis_File *vf,int link){
1472 if(vf->ready_state>=STREAMSET)
1473 return vf->vc+vf->current_link;
1486 static int host_is_big_endian() {
1487 ogg_int32_t pattern = 0xfeedface; /* deadbeef */
1488 unsigned char *bytewise = (unsigned char *)&pattern;
1489 if (bytewise[0] == 0xfe) return 1;
1493 /* up to this point, everything could more or less hide the multiple
1494 logical bitstream nature of chaining from the toplevel application
1495 if the toplevel application didn't particularly care. However, at
1496 the point that we actually read audio back, the multiple-section
1497 nature must surface: Multiple bitstream sections do not necessarily
1498 have to have the same number of channels or sampling rate.
1500 ov_read returns the sequential logical bitstream number currently
1501 being decoded along with the PCM data in order that the toplevel
1502 application can take action on channel/sample rate changes. This
1503 number will be incremented even for streamed (non-seekable) streams
1504 (for seekable streams, it represents the actual logical bitstream
1505 index within the physical bitstream. Note that the accessor
1506 functions above are aware of this dichotomy).
1508 input values: buffer) a buffer to hold packed PCM data for return
1509 length) the byte length requested to be placed into buffer
1510 bigendianp) should the data be packed LSB first (0) or
1512 word) word size for output. currently 1 (byte) or
1515 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
1517 n) number of bytes of PCM actually returned. The
1518 below works on a packet-by-packet basis, so the
1519 return length is not related to the 'length' passed
1520 in, just guaranteed to fit.
1522 *section) set to the logical bitstream number */
1524 long ov_read(OggVorbis_File *vf,char *buffer,int length,
1525 int bigendianp,int word,int sgned,int *bitstream){
1527 int host_endian = host_is_big_endian();
1532 if(vf->ready_state<OPENED)return(OV_EINVAL);
1535 if(vf->ready_state==INITSET){
1536 samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
1540 /* suck in another packet */
1542 int ret=_fetch_and_process_packet(vf,NULL,1,1);
1553 /* yay! proceed to pack data into the byte buffer */
1555 long channels=ov_info(vf,-1)->channels;
1556 long bytespersample=word * channels;
1557 vorbis_fpu_control fpu;
1558 if(samples>length/bytespersample)samples=length/bytespersample;
1563 /* a tight loop to pack each size */
1567 int off=(sgned?0:128);
1568 vorbis_fpu_setround(&fpu);
1569 for(j=0;j<samples;j++)
1570 for(i=0;i<channels;i++){
1571 val=vorbis_ftoi(pcm[i][j]*128.f);
1573 else if(val<-128)val=-128;
1576 vorbis_fpu_restore(fpu);
1578 int off=(sgned?0:32768);
1580 if(host_endian==bigendianp){
1583 vorbis_fpu_setround(&fpu);
1584 for(i=0;i<channels;i++) { /* It's faster in this order */
1586 short *dest=((short *)buffer)+i;
1587 for(j=0;j<samples;j++) {
1588 val=vorbis_ftoi(src[j]*32768.f);
1589 if(val>32767)val=32767;
1590 else if(val<-32768)val=-32768;
1595 vorbis_fpu_restore(fpu);
1599 vorbis_fpu_setround(&fpu);
1600 for(i=0;i<channels;i++) {
1602 short *dest=((short *)buffer)+i;
1603 for(j=0;j<samples;j++) {
1604 val=vorbis_ftoi(src[j]*32768.f);
1605 if(val>32767)val=32767;
1606 else if(val<-32768)val=-32768;
1611 vorbis_fpu_restore(fpu);
1614 }else if(bigendianp){
1616 vorbis_fpu_setround(&fpu);
1617 for(j=0;j<samples;j++)
1618 for(i=0;i<channels;i++){
1619 val=vorbis_ftoi(pcm[i][j]*32768.f);
1620 if(val>32767)val=32767;
1621 else if(val<-32768)val=-32768;
1624 *buffer++=(val&0xff);
1626 vorbis_fpu_restore(fpu);
1630 vorbis_fpu_setround(&fpu);
1631 for(j=0;j<samples;j++)
1632 for(i=0;i<channels;i++){
1633 val=vorbis_ftoi(pcm[i][j]*32768.f);
1634 if(val>32767)val=32767;
1635 else if(val<-32768)val=-32768;
1637 *buffer++=(val&0xff);
1640 vorbis_fpu_restore(fpu);
1646 vorbis_synthesis_read(&vf->vd,samples);
1647 vf->pcm_offset+=samples;
1648 if(bitstream)*bitstream=vf->current_link;
1649 return(samples*bytespersample);
1655 /* input values: pcm_channels) a float vector per channel of output
1656 length) the sample length being read by the app
1658 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
1660 n) number of samples of PCM actually returned. The
1661 below works on a packet-by-packet basis, so the
1662 return length is not related to the 'length' passed
1663 in, just guaranteed to fit.
1665 *section) set to the logical bitstream number */
1669 long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int length,
1672 if(vf->ready_state<OPENED)return(OV_EINVAL);
1675 if(vf->ready_state==INITSET){
1677 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
1679 if(pcm_channels)*pcm_channels=pcm;
1680 if(samples>length)samples=length;
1681 vorbis_synthesis_read(&vf->vd,samples);
1682 vf->pcm_offset+=samples;
1683 if(bitstream)*bitstream=vf->current_link;
1689 /* suck in another packet */
1691 int ret=_fetch_and_process_packet(vf,NULL,1,1);
1692 if(ret==OV_EOF)return(0);
1693 if(ret<=0)return(ret);
1699 extern float *vorbis_window(vorbis_dsp_state *v,int W);
1700 extern void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,
1703 static void _ov_splice(float **pcm,float **lappcm,
1706 float *w1, float *w2){
1717 for(j=0;j<ch1 && j<ch2;j++){
1724 d[i]=d[i]*wd + s[i]*ws;
1727 /* window from zero */
1738 /* make sure vf is INITSET */
1739 static int _ov_initset(OggVorbis_File *vf){
1741 if(vf->ready_state==INITSET)break;
1742 /* suck in another packet */
1744 int ret=_fetch_and_process_packet(vf,NULL,1,0);
1745 if(ret<0 && ret!=OV_HOLE)return(ret);
1751 /* make sure vf is INITSET and that we have a primed buffer; if
1752 we're crosslapping at a stream section boundary, this also makes
1753 sure we're sanity checking against the right stream information */
1754 static int _ov_initprime(OggVorbis_File *vf){
1755 vorbis_dsp_state *vd=&vf->vd;
1757 if(vf->ready_state==INITSET)
1758 if(vorbis_synthesis_pcmout(vd,NULL))break;
1760 /* suck in another packet */
1762 int ret=_fetch_and_process_packet(vf,NULL,1,0);
1763 if(ret<0 && ret!=OV_HOLE)return(ret);
1769 /* grab enough data for lapping from vf; this may be in the form of
1770 unreturned, already-decoded pcm, remaining PCM we will need to
1771 decode, or synthetic postextrapolation from last packets. */
1772 static void _ov_getlap(OggVorbis_File *vf,vorbis_info *vi,vorbis_dsp_state *vd,
1773 float **lappcm,int lapsize){
1777 /* try first to decode the lapping data */
1778 while(lapcount<lapsize){
1779 int samples=vorbis_synthesis_pcmout(vd,&pcm);
1781 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
1782 for(i=0;i<vi->channels;i++)
1783 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
1785 vorbis_synthesis_read(vd,samples);
1787 /* suck in another packet */
1788 int ret=_fetch_and_process_packet(vf,NULL,1,0); /* do *not* span */
1789 if(ret==OV_EOF)break;
1792 if(lapcount<lapsize){
1793 /* failed to get lapping data from normal decode; pry it from the
1794 postextrapolation buffering, or the second half of the MDCT
1795 from the last packet */
1796 int samples=vorbis_synthesis_lapout(&vf->vd,&pcm);
1798 for(i=0;i<vi->channels;i++)
1799 memset(lappcm[i]+lapcount,0,sizeof(**pcm)*lapsize-lapcount);
1802 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
1803 for(i=0;i<vi->channels;i++)
1804 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
1810 /* this sets up crosslapping of a sample by using trailing data from
1811 sample 1 and lapping it into the windowing buffer of sample 2 */
1812 int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2){
1813 vorbis_info *vi1,*vi2;
1817 int n1,n2,i,ret,hs1,hs2;
1819 if(vf1==vf2)return(0); /* degenerate case */
1820 if(vf1->ready_state<OPENED)return(OV_EINVAL);
1821 if(vf2->ready_state<OPENED)return(OV_EINVAL);
1823 /* the relevant overlap buffers must be pre-checked and pre-primed
1824 before looking at settings in the event that priming would cross
1825 a bitstream boundary. So, do it now */
1827 ret=_ov_initset(vf1);
1829 ret=_ov_initprime(vf2);
1832 vi1=ov_info(vf1,-1);
1833 vi2=ov_info(vf2,-1);
1834 hs1=ov_halfrate_p(vf1);
1835 hs2=ov_halfrate_p(vf2);
1837 lappcm=alloca(sizeof(*lappcm)*vi1->channels);
1838 n1=vorbis_info_blocksize(vi1,0)>>(1+hs1);
1839 n2=vorbis_info_blocksize(vi2,0)>>(1+hs2);
1840 w1=vorbis_window(&vf1->vd,0);
1841 w2=vorbis_window(&vf2->vd,0);
1843 for(i=0;i<vi1->channels;i++)
1844 lappcm[i]=alloca(sizeof(**lappcm)*n1);
1846 _ov_getlap(vf1,vi1,&vf1->vd,lappcm,n1);
1848 /* have a lapping buffer from vf1; now to splice it into the lapping
1850 /* consolidate and expose the buffer. */
1851 vorbis_synthesis_lapout(&vf2->vd,&pcm);
1852 _analysis_output_always("pcmL",0,pcm[0],n1*2,0,0,0);
1853 _analysis_output_always("pcmR",0,pcm[1],n1*2,0,0,0);
1856 _ov_splice(pcm,lappcm,n1,n2,vi1->channels,vi2->channels,w1,w2);
1862 static int _ov_64_seek_lap(OggVorbis_File *vf,ogg_int64_t pos,
1863 int (*localseek)(OggVorbis_File *,ogg_int64_t)){
1868 int n1,n2,ch1,ch2,hs;
1871 if(vf->ready_state<OPENED)return(OV_EINVAL);
1872 ret=_ov_initset(vf);
1875 hs=ov_halfrate_p(vf);
1878 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
1879 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
1880 persistent; even if the decode state
1881 from this link gets dumped, this
1882 window array continues to exist */
1884 lappcm=alloca(sizeof(*lappcm)*ch1);
1886 lappcm[i]=alloca(sizeof(**lappcm)*n1);
1887 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
1889 /* have lapping data; seek and prime the buffer */
1890 ret=localseek(vf,pos);
1892 ret=_ov_initprime(vf);
1895 /* Guard against cross-link changes; they're perfectly legal */
1898 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
1899 w2=vorbis_window(&vf->vd,0);
1901 /* consolidate and expose the buffer. */
1902 vorbis_synthesis_lapout(&vf->vd,&pcm);
1905 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
1911 int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
1912 return _ov_64_seek_lap(vf,pos,ov_raw_seek);
1915 int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
1916 return _ov_64_seek_lap(vf,pos,ov_pcm_seek);
1919 int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos){
1920 return _ov_64_seek_lap(vf,pos,ov_pcm_seek_page);
1923 static int _ov_d_seek_lap(OggVorbis_File *vf,double pos,
1924 int (*localseek)(OggVorbis_File *,double)){
1929 int n1,n2,ch1,ch2,hs;
1932 if(vf->ready_state<OPENED)return(OV_EINVAL);
1933 ret=_ov_initset(vf);
1936 hs=ov_halfrate_p(vf);
1939 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
1940 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
1941 persistent; even if the decode state
1942 from this link gets dumped, this
1943 window array continues to exist */
1945 lappcm=alloca(sizeof(*lappcm)*ch1);
1947 lappcm[i]=alloca(sizeof(**lappcm)*n1);
1948 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
1950 /* have lapping data; seek and prime the buffer */
1951 ret=localseek(vf,pos);
1953 ret=_ov_initprime(vf);
1956 /* Guard against cross-link changes; they're perfectly legal */
1959 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
1960 w2=vorbis_window(&vf->vd,0);
1962 /* consolidate and expose the buffer. */
1963 vorbis_synthesis_lapout(&vf->vd,&pcm);
1966 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
1972 int ov_time_seek_lap(OggVorbis_File *vf,double pos){
1973 return _ov_d_seek_lap(vf,pos,ov_time_seek);
1976 int ov_time_seek_page_lap(OggVorbis_File *vf,double pos){
1977 return _ov_d_seek_lap(vf,pos,ov_time_seek_page);