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.74 2003/09/12 18:30:16 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 0;
392 if(vf->ready_state<STREAMSET)return OV_EFAULT;
394 if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link))
397 if(vorbis_synthesis_init(&vf->vd,vf->vi))
400 vorbis_block_init(&vf->vd,&vf->vb);
401 vf->ready_state=INITSET;
407 static int _open_seekable2(OggVorbis_File *vf){
408 long serialno=vf->current_serialno;
409 ogg_int64_t dataoffset=vf->offset, end;
412 /* we're partially open and have a first link header state in
414 /* we can seek, so set out learning all about this file */
415 (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END);
416 vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource);
418 /* We get the offset for the last page of the physical bitstream.
419 Most OggVorbis files will contain a single logical bitstream */
420 end=_get_prev_page(vf,&og);
421 if(end<0)return(end);
423 /* more than one logical bitstream? */
424 if(ogg_page_serialno(&og)!=serialno){
426 /* Chained bitstream. Bisect-search each logical bitstream
427 section. Do so based on serial number only */
428 if(_bisect_forward_serialno(vf,0,0,end+1,serialno,0)<0)return(OV_EREAD);
432 /* Only one logical bitstream */
433 if(_bisect_forward_serialno(vf,0,end,end+1,serialno,0))return(OV_EREAD);
437 /* the initial header memory is referenced by vf after; don't free it */
438 _prefetch_all_headers(vf,dataoffset);
439 return(ov_raw_seek(vf,0));
442 /* clear out the current logical bitstream decoder */
443 static void _decode_clear(OggVorbis_File *vf){
444 vorbis_dsp_clear(&vf->vd);
445 vorbis_block_clear(&vf->vb);
446 vf->ready_state=OPENED;
449 /* fetch and process a packet. Handles the case where we're at a
450 bitstream boundary and dumps the decoding machine. If the decoding
451 machine is unloaded, it loads it. It also keeps pcm_offset up to
452 date (seek and read both use this. seek uses a special hack with
455 return: <0) error, OV_HOLE (lost packet) or OV_EOF
456 0) need more data (only if readp==0)
460 static int _fetch_and_process_packet(OggVorbis_File *vf,
466 /* handle one packet. Try to fetch it from current stream state */
467 /* extract packets from page */
470 /* process a packet if we can. If the machine isn't loaded,
472 if(vf->ready_state==INITSET){
475 ogg_packet *op_ptr=(op_in?op_in:&op);
476 int result=ogg_stream_packetout(&vf->os,op_ptr);
477 ogg_int64_t granulepos;
480 if(result==-1)return(OV_HOLE); /* hole in the data. */
482 /* got a packet. process it */
483 granulepos=op_ptr->granulepos;
484 if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy
486 header packets aren't
489 vorbis_synthesis will
492 /* suck in the synthesis data and track bitrate */
494 int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL);
495 /* for proper use of libvorbis within libvorbisfile,
496 oldsamples will always be zero. */
497 if(oldsamples)return(OV_EFAULT);
499 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
500 vf->samptrack+=vorbis_synthesis_pcmout(&vf->vd,NULL)-oldsamples;
501 vf->bittrack+=op_ptr->bytes*8;
504 /* update the pcm offset. */
505 if(granulepos!=-1 && !op_ptr->e_o_s){
506 int link=(vf->seekable?vf->current_link:0);
509 /* this packet has a pcm_offset on it (the last packet
510 completed on a page carries the offset) After processing
511 (above), we know the pcm position of the *last* sample
512 ready to be returned. Find the offset of the *first*
514 As an aside, this trick is inaccurate if we begin
515 reading anew right at the last page; the end-of-stream
516 granulepos declares the last frame in the stream, and the
517 last packet of the last page may be a partial frame.
518 So, we need a previous granulepos from an in-sequence page
519 to have a reference point. Thus the !op_ptr->e_o_s clause
522 if(vf->seekable && link>0)
523 granulepos-=vf->pcmlengths[link*2];
524 if(granulepos<0)granulepos=0; /* actually, this
525 shouldn't be possible
526 here unless the stream
529 samples=vorbis_synthesis_pcmout(&vf->vd,NULL);
533 granulepos+=vf->pcmlengths[i*2+1];
534 vf->pcm_offset=granulepos;
544 if(vf->ready_state>=OPENED){
547 if((ret=_get_next_page(vf,&og,-1))<0){
548 return(OV_EOF); /* eof.
552 /* bitrate tracking; add the header's bytes here, the body bytes
553 are done by packet above */
554 vf->bittrack+=og.header_len*8;
556 /* has our decoding just traversed a bitstream boundary? */
557 if(vf->ready_state==INITSET){
558 if(vf->current_serialno!=ogg_page_serialno(&og)){
565 vorbis_info_clear(vf->vi);
566 vorbis_comment_clear(vf->vc);
572 /* Do we need to load a new machine before submitting the page? */
573 /* This is different in the seekable and non-seekable cases.
575 In the seekable case, we already have all the header
576 information loaded and cached; we just initialize the machine
577 with it and continue on our merry way.
579 In the non-seekable (streaming) case, we'll only be at a
580 boundary if we just left the previous logical bitstream and
581 we're now nominally at the header of the next bitstream
584 if(vf->ready_state!=INITSET){
587 if(vf->ready_state<STREAMSET){
589 vf->current_serialno=ogg_page_serialno(&og);
591 /* match the serialno to bitstream section. We use this rather than
592 offset positions to avoid problems near logical bitstream
594 for(link=0;link<vf->links;link++)
595 if(vf->serialnos[link]==vf->current_serialno)break;
596 if(link==vf->links)return(OV_EBADLINK); /* sign of a bogus
601 vf->current_link=link;
603 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
604 vf->ready_state=STREAMSET;
607 /* we're streaming */
608 /* fetch the three header packets, build the info struct */
610 int ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,&og);
618 int ret=_make_decode_ready(vf);
622 ogg_stream_pagein(&vf->os,&og);
626 /* if, eg, 64 bit stdio is configured by default, this will build with
628 static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){
629 if(f==NULL)return(-1);
630 return fseek(f,off,whence);
633 static int _ov_open1(void *f,OggVorbis_File *vf,char *initial,
634 long ibytes, ov_callbacks callbacks){
635 int offsettest=(f?callbacks.seek_func(f,0,SEEK_CUR):-1);
638 memset(vf,0,sizeof(*vf));
640 vf->callbacks = callbacks;
642 /* init the framing state */
643 ogg_sync_init(&vf->oy);
645 /* perhaps some data was previously read into a buffer for testing
646 against other stream types. Allow initialization from this
647 previously read data (as we may be reading from a non-seekable
650 char *buffer=ogg_sync_buffer(&vf->oy,ibytes);
651 memcpy(buffer,initial,ibytes);
652 ogg_sync_wrote(&vf->oy,ibytes);
655 /* can we seek? Stevens suggests the seek test was portable */
656 if(offsettest!=-1)vf->seekable=1;
658 /* No seeking yet; Set up a 'single' (current) logical bitstream
659 entry for partial open */
661 vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi));
662 vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc));
663 ogg_stream_init(&vf->os,-1); /* fill in the serialno later */
665 /* Try to fetch the headers, maintaining all the storage */
666 if((ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,NULL))<0){
670 vf->ready_state=PARTOPEN;
674 static int _ov_open2(OggVorbis_File *vf){
675 if(vf->ready_state < OPENED)
676 vf->ready_state=OPENED;
678 int ret=_open_seekable2(vf);
689 /* clear out the OggVorbis_File struct */
690 int ov_clear(OggVorbis_File *vf){
692 vorbis_block_clear(&vf->vb);
693 vorbis_dsp_clear(&vf->vd);
694 ogg_stream_clear(&vf->os);
696 if(vf->vi && vf->links){
698 for(i=0;i<vf->links;i++){
699 vorbis_info_clear(vf->vi+i);
700 vorbis_comment_clear(vf->vc+i);
705 if(vf->dataoffsets)_ogg_free(vf->dataoffsets);
706 if(vf->pcmlengths)_ogg_free(vf->pcmlengths);
707 if(vf->serialnos)_ogg_free(vf->serialnos);
708 if(vf->offsets)_ogg_free(vf->offsets);
709 ogg_sync_clear(&vf->oy);
710 if(vf->datasource)(vf->callbacks.close_func)(vf->datasource);
711 memset(vf,0,sizeof(*vf));
719 /* inspects the OggVorbis file and finds/documents all the logical
720 bitstreams contained in it. Tries to be tolerant of logical
721 bitstream sections that are truncated/woogie.
727 int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes,
728 ov_callbacks callbacks){
729 int ret=_ov_open1(f,vf,initial,ibytes,callbacks);
731 return _ov_open2(vf);
734 int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){
735 ov_callbacks callbacks = {
736 (size_t (*)(void *, size_t, size_t, void *)) fread,
737 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
738 (int (*)(void *)) fclose,
739 (long (*)(void *)) ftell
742 return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks);
745 /* cheap hack for game usage where downsampling is desirable; there's
746 no need for SRC as we can just do it cheaply in libvorbis. */
748 int ov_halfrate(OggVorbis_File *vf,int flag){
750 if(vf->vi==NULL)return OV_EINVAL;
751 if(!vf->seekable)return OV_EINVAL;
752 if(vf->ready_state>=STREAMSET)
753 _decode_clear(vf); /* clear out stream state; later on libvorbis
754 will be able to swap this on the fly, but
755 for now dumping the decode machine is needed
756 to reinit the MDCT lookups. 1.1 libvorbis
757 is planned to be able to switch on the fly */
759 for(i=0;i<vf->links;i++){
760 if(vorbis_synthesis_halfrate(vf->vi+i,flag)){
768 int ov_halfrate_p(OggVorbis_File *vf){
769 if(vf->vi==NULL)return OV_EINVAL;
770 return vorbis_synthesis_halfrate_p(vf->vi);
773 /* Only partially open the vorbis file; test for Vorbisness, and load
774 the headers for the first chain. Do not seek (although test for
775 seekability). Use ov_test_open to finish opening the file, else
776 ov_clear to close/free it. Same return codes as open. */
778 int ov_test_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes,
779 ov_callbacks callbacks)
781 return _ov_open1(f,vf,initial,ibytes,callbacks);
784 int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){
785 ov_callbacks callbacks = {
786 (size_t (*)(void *, size_t, size_t, void *)) fread,
787 (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap,
788 (int (*)(void *)) fclose,
789 (long (*)(void *)) ftell
792 return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks);
795 int ov_test_open(OggVorbis_File *vf){
796 if(vf->ready_state!=PARTOPEN)return(OV_EINVAL);
797 return _ov_open2(vf);
800 /* How many logical bitstreams in this physical bitstream? */
801 long ov_streams(OggVorbis_File *vf){
805 /* Is the FILE * associated with vf seekable? */
806 long ov_seekable(OggVorbis_File *vf){
810 /* returns the bitrate for a given logical bitstream or the entire
811 physical bitstream. If the file is open for random access, it will
812 find the *actual* average bitrate. If the file is streaming, it
813 returns the nominal bitrate (if set) else the average of the
814 upper/lower bounds (if set) else -1 (unset).
816 If you want the actual bitrate field settings, get them from the
817 vorbis_info structs */
819 long ov_bitrate(OggVorbis_File *vf,int i){
820 if(vf->ready_state<OPENED)return(OV_EINVAL);
821 if(i>=vf->links)return(OV_EINVAL);
822 if(!vf->seekable && i!=0)return(ov_bitrate(vf,0));
827 for(i=0;i<vf->links;i++)
828 bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8;
829 /* This once read: return(rint(bits/ov_time_total(vf,-1)));
830 * gcc 3.x on x86 miscompiled this at optimisation level 2 and above,
831 * so this is slightly transformed to make it work.
833 br = bits/ov_time_total(vf,-1);
837 /* return the actual bitrate */
838 return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i)));
840 /* return nominal if set */
841 if(vf->vi[i].bitrate_nominal>0){
842 return vf->vi[i].bitrate_nominal;
844 if(vf->vi[i].bitrate_upper>0){
845 if(vf->vi[i].bitrate_lower>0){
846 return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2;
848 return vf->vi[i].bitrate_upper;
857 /* returns the actual bitrate since last call. returns -1 if no
858 additional data to offer since last call (or at beginning of stream),
859 EINVAL if stream is only partially open
861 long ov_bitrate_instant(OggVorbis_File *vf){
862 int link=(vf->seekable?vf->current_link:0);
864 if(vf->ready_state<OPENED)return(OV_EINVAL);
865 if(vf->samptrack==0)return(OV_FALSE);
866 ret=vf->bittrack/vf->samptrack*vf->vi[link].rate+.5;
873 long ov_serialnumber(OggVorbis_File *vf,int i){
874 if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1));
875 if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1));
877 return(vf->current_serialno);
879 return(vf->serialnos[i]);
883 /* returns: total raw (compressed) length of content if i==-1
884 raw (compressed) length of that logical bitstream for i==0 to n
885 OV_EINVAL if the stream is not seekable (we can't know the length)
886 or if stream is only partially open
888 ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){
889 if(vf->ready_state<OPENED)return(OV_EINVAL);
890 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
894 for(i=0;i<vf->links;i++)
895 acc+=ov_raw_total(vf,i);
898 return(vf->offsets[i+1]-vf->offsets[i]);
902 /* returns: total PCM length (samples) of content if i==-1 PCM length
903 (samples) of that logical bitstream for i==0 to n
904 OV_EINVAL if the stream is not seekable (we can't know the
905 length) or only partially open
907 ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){
908 if(vf->ready_state<OPENED)return(OV_EINVAL);
909 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
913 for(i=0;i<vf->links;i++)
914 acc+=ov_pcm_total(vf,i);
917 return(vf->pcmlengths[i*2+1]);
921 /* returns: total seconds of content if i==-1
922 seconds in that logical bitstream for i==0 to n
923 OV_EINVAL if the stream is not seekable (we can't know the
924 length) or only partially open
926 double ov_time_total(OggVorbis_File *vf,int i){
927 if(vf->ready_state<OPENED)return(OV_EINVAL);
928 if(!vf->seekable || i>=vf->links)return(OV_EINVAL);
932 for(i=0;i<vf->links;i++)
933 acc+=ov_time_total(vf,i);
936 return((double)(vf->pcmlengths[i*2+1])/vf->vi[i].rate);
940 /* seek to an offset relative to the *compressed* data. This also
941 scans packets to update the PCM cursor. It will cross a logical
942 bitstream boundary, but only if it can't get any packets out of the
943 tail of the bitstream we seek to (so no surprises).
945 returns zero on success, nonzero on failure */
947 int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){
948 ogg_stream_state work_os;
950 if(vf->ready_state<OPENED)return(OV_EINVAL);
952 return(OV_ENOSEEK); /* don't dump machine if we can't seek */
954 if(pos<0 || pos>vf->end)return(OV_EINVAL);
956 /* don't yet clear out decoding machine (if it's initialized), in
957 the case we're in the same link. Restart the decode lapping, and
958 let _fetch_and_process_packet deal with a potential bitstream
961 ogg_stream_reset_serialno(&vf->os,
962 vf->current_serialno); /* must set serialno */
963 vorbis_synthesis_restart(&vf->vd);
965 _seek_helper(vf,pos);
967 /* we need to make sure the pcm_offset is set, but we don't want to
968 advance the raw cursor past good packets just to get to the first
969 with a granulepos. That's not equivalent behavior to beginning
970 decoding as immediately after the seek position as possible.
972 So, a hack. We use two stream states; a local scratch state and
973 the shared vf->os stream state. We use the local state to
974 scan, and the shared state as a buffer for later decode.
976 Unfortuantely, on the last page we still advance to last packet
977 because the granulepos on the last page is not necessarily on a
978 packet boundary, and we need to make sure the granpos is
990 ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */
991 ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE
992 return from not necessarily
993 starting from the beginning */
996 if(vf->ready_state>=STREAMSET){
997 /* snarf/scan a packet if we can */
998 int result=ogg_stream_packetout(&work_os,&op);
1002 if(vf->vi[vf->current_link].codec_setup){
1003 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1005 ogg_stream_packetout(&vf->os,NULL);
1010 ogg_stream_packetout(&vf->os,NULL);
1012 if(lastblock)accblock+=(lastblock+thisblock)>>2;
1015 if(op.granulepos!=-1){
1016 int i,link=vf->current_link;
1017 ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2];
1018 if(granulepos<0)granulepos=0;
1021 granulepos+=vf->pcmlengths[i*2+1];
1022 vf->pcm_offset=granulepos-accblock;
1025 lastblock=thisblock;
1028 ogg_stream_packetout(&vf->os,NULL);
1033 if(_get_next_page(vf,&og,-1)<0){
1034 vf->pcm_offset=ov_pcm_total(vf,-1);
1038 /* huh? Bogus stream with packets but no granulepos */
1043 /* has our decoding just traversed a bitstream boundary? */
1044 if(vf->ready_state>=STREAMSET)
1045 if(vf->current_serialno!=ogg_page_serialno(&og)){
1046 _decode_clear(vf); /* clear out stream state */
1047 ogg_stream_clear(&work_os);
1050 if(vf->ready_state<STREAMSET){
1053 vf->current_serialno=ogg_page_serialno(&og);
1054 for(link=0;link<vf->links;link++)
1055 if(vf->serialnos[link]==vf->current_serialno)break;
1056 if(link==vf->links)goto seek_error; /* sign of a bogus stream.
1058 machine uninitialized */
1059 vf->current_link=link;
1061 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1062 ogg_stream_reset_serialno(&work_os,vf->current_serialno);
1063 vf->ready_state=STREAMSET;
1067 ogg_stream_pagein(&vf->os,&og);
1068 ogg_stream_pagein(&work_os,&og);
1069 eosflag=ogg_page_eos(&og);
1073 ogg_stream_clear(&work_os);
1079 /* dump the machine so we're in a known state */
1081 ogg_stream_clear(&work_os);
1086 /* Page granularity seek (faster than sample granularity because we
1087 don't do the last bit of decode to find a specific sample).
1089 Seek to the last [granule marked] page preceeding the specified pos
1090 location, such that decoding past the returned point will quickly
1091 arrive at the requested position. */
1092 int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){
1094 ogg_int64_t result=0;
1095 ogg_int64_t total=ov_pcm_total(vf,-1);
1097 if(vf->ready_state<OPENED)return(OV_EINVAL);
1098 if(!vf->seekable)return(OV_ENOSEEK);
1100 if(pos<0 || pos>total)return(OV_EINVAL);
1102 /* which bitstream section does this pcm offset occur in? */
1103 for(link=vf->links-1;link>=0;link--){
1104 total-=vf->pcmlengths[link*2+1];
1105 if(pos>=total)break;
1108 /* search within the logical bitstream for the page with the highest
1109 pcm_pos preceeding (or equal to) pos. There is a danger here;
1110 missing pages or incorrect frame number information in the
1111 bitstream could make our task impossible. Account for that (it
1112 would be an error condition) */
1114 /* new search algorithm by HB (Nicholas Vinen) */
1116 ogg_int64_t end=vf->offsets[link+1];
1117 ogg_int64_t begin=vf->offsets[link];
1118 ogg_int64_t begintime = vf->pcmlengths[link*2];
1119 ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime;
1120 ogg_int64_t target=pos-total+begintime;
1121 ogg_int64_t best=begin;
1127 if(end-begin<CHUNKSIZE){
1130 /* take a (pretty decent) guess. */
1132 (target-begintime)*(end-begin)/(endtime-begintime) - CHUNKSIZE;
1137 _seek_helper(vf,bisect);
1140 result=_get_next_page(vf,&og,end-vf->offset);
1141 if(result==OV_EREAD) goto seek_error;
1144 end=begin; /* found it */
1146 if(bisect==0) goto seek_error;
1148 if(bisect<=begin)bisect=begin+1;
1149 _seek_helper(vf,bisect);
1152 ogg_int64_t granulepos=ogg_page_granulepos(&og);
1153 if(granulepos==-1)continue;
1154 if(granulepos<target){
1155 best=result; /* raw offset of packet with granulepos */
1156 begin=vf->offset; /* raw offset of next page */
1157 begintime=granulepos;
1159 if(target-begintime>44100)break;
1160 bisect=begin; /* *not* begin + 1 */
1163 end=begin; /* found it */
1165 if(end==vf->offset){ /* we're pretty close - we'd be stuck in */
1167 bisect-=CHUNKSIZE; /* an endless loop otherwise. */
1168 if(bisect<=begin)bisect=begin+1;
1169 _seek_helper(vf,bisect);
1181 /* found our page. seek to it, update pcm offset. Easier case than
1182 raw_seek, don't keep packets preceeding granulepos. */
1188 _seek_helper(vf,best);
1191 if(_get_next_page(vf,&og,-1)<0)return(OV_EOF); /* shouldn't happen */
1193 if(link!=vf->current_link){
1194 /* Different link; dump entire decode machine */
1197 vf->current_link=link;
1198 vf->current_serialno=ogg_page_serialno(&og);
1199 vf->ready_state=STREAMSET;
1202 vorbis_synthesis_restart(&vf->vd);
1205 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1206 ogg_stream_pagein(&vf->os,&og);
1208 /* pull out all but last packet; the one with granulepos */
1210 result=ogg_stream_packetpeek(&vf->os,&op);
1212 /* !!! the packet finishing this page originated on a
1213 preceeding page. Keep fetching previous pages until we
1214 get one with a granulepos or without the 'continued' flag
1215 set. Then just use raw_seek for simplicity. */
1217 _seek_helper(vf,best);
1220 result=_get_prev_page(vf,&og);
1221 if(result<0) goto seek_error;
1222 if(ogg_page_granulepos(&og)>-1 ||
1223 !ogg_page_continued(&og)){
1224 return ov_raw_seek(vf,result);
1230 result = OV_EBADPACKET;
1233 if(op.granulepos!=-1){
1234 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1235 if(vf->pcm_offset<0)vf->pcm_offset=0;
1236 vf->pcm_offset+=total;
1239 result=ogg_stream_packetout(&vf->os,NULL);
1245 if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){
1254 /* dump machine so we're in a known state */
1260 /* seek to a sample offset relative to the decompressed pcm stream
1261 returns zero on success, nonzero on failure */
1263 int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){
1264 int thisblock,lastblock=0;
1265 int ret=ov_pcm_seek_page(vf,pos);
1266 if(ret<0)return(ret);
1267 if((ret=_make_decode_ready(vf)))return ret;
1269 /* discard leading packets we don't need for the lapping of the
1270 position we want; don't decode them */
1276 int ret=ogg_stream_packetpeek(&vf->os,&op);
1278 thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op);
1280 ogg_stream_packetout(&vf->os,NULL);
1281 continue; /* non audio packet */
1283 if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2;
1285 if(vf->pcm_offset+((thisblock+
1286 vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break;
1288 /* remove the packet from packet queue and track its granulepos */
1289 ogg_stream_packetout(&vf->os,NULL);
1290 vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with
1293 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
1295 /* end of logical stream case is hard, especially with exact
1296 length positioning. */
1298 if(op.granulepos>-1){
1300 /* always believe the stream markers */
1301 vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2];
1302 if(vf->pcm_offset<0)vf->pcm_offset=0;
1303 for(i=0;i<vf->current_link;i++)
1304 vf->pcm_offset+=vf->pcmlengths[i*2+1];
1307 lastblock=thisblock;
1310 if(ret<0 && ret!=OV_HOLE)break;
1312 /* suck in a new page */
1313 if(_get_next_page(vf,&og,-1)<0)break;
1314 if(vf->current_serialno!=ogg_page_serialno(&og))_decode_clear(vf);
1316 if(vf->ready_state<STREAMSET){
1319 vf->current_serialno=ogg_page_serialno(&og);
1320 for(link=0;link<vf->links;link++)
1321 if(vf->serialnos[link]==vf->current_serialno)break;
1322 if(link==vf->links)return(OV_EBADLINK);
1323 vf->current_link=link;
1325 ogg_stream_reset_serialno(&vf->os,vf->current_serialno);
1326 vf->ready_state=STREAMSET;
1327 ret=_make_decode_ready(vf);
1332 ogg_stream_pagein(&vf->os,&og);
1338 /* discard samples until we reach the desired position. Crossing a
1339 logical bitstream boundary with abandon is OK. */
1340 while(vf->pcm_offset<pos){
1341 ogg_int64_t target=pos-vf->pcm_offset;
1342 long samples=vorbis_synthesis_pcmout(&vf->vd,NULL);
1344 if(samples>target)samples=target;
1345 vorbis_synthesis_read(&vf->vd,samples);
1346 vf->pcm_offset+=samples;
1349 if(_fetch_and_process_packet(vf,NULL,1,1)<=0)
1350 vf->pcm_offset=ov_pcm_total(vf,-1); /* eof */
1355 /* seek to a playback time relative to the decompressed pcm stream
1356 returns zero on success, nonzero on failure */
1357 int ov_time_seek(OggVorbis_File *vf,double seconds){
1358 /* translate time to PCM position and call ov_pcm_seek */
1361 ogg_int64_t pcm_total=ov_pcm_total(vf,-1);
1362 double time_total=ov_time_total(vf,-1);
1364 if(vf->ready_state<OPENED)return(OV_EINVAL);
1365 if(!vf->seekable)return(OV_ENOSEEK);
1366 if(seconds<0 || seconds>time_total)return(OV_EINVAL);
1368 /* which bitstream section does this time offset occur in? */
1369 for(link=vf->links-1;link>=0;link--){
1370 pcm_total-=vf->pcmlengths[link*2+1];
1371 time_total-=ov_time_total(vf,link);
1372 if(seconds>=time_total)break;
1375 /* enough information to convert time offset to pcm offset */
1377 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1378 return(ov_pcm_seek(vf,target));
1382 /* page-granularity version of ov_time_seek
1383 returns zero on success, nonzero on failure */
1384 int ov_time_seek_page(OggVorbis_File *vf,double seconds){
1385 /* translate time to PCM position and call ov_pcm_seek */
1388 ogg_int64_t pcm_total=ov_pcm_total(vf,-1);
1389 double time_total=ov_time_total(vf,-1);
1391 if(vf->ready_state<OPENED)return(OV_EINVAL);
1392 if(!vf->seekable)return(OV_ENOSEEK);
1393 if(seconds<0 || seconds>time_total)return(OV_EINVAL);
1395 /* which bitstream section does this time offset occur in? */
1396 for(link=vf->links-1;link>=0;link--){
1397 pcm_total-=vf->pcmlengths[link*2+1];
1398 time_total-=ov_time_total(vf,link);
1399 if(seconds>=time_total)break;
1402 /* enough information to convert time offset to pcm offset */
1404 ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
1405 return(ov_pcm_seek_page(vf,target));
1409 /* tell the current stream offset cursor. Note that seek followed by
1410 tell will likely not give the set offset due to caching */
1411 ogg_int64_t ov_raw_tell(OggVorbis_File *vf){
1412 if(vf->ready_state<OPENED)return(OV_EINVAL);
1416 /* return PCM offset (sample) of next PCM sample to be read */
1417 ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){
1418 if(vf->ready_state<OPENED)return(OV_EINVAL);
1419 return(vf->pcm_offset);
1422 /* return time offset (seconds) of next PCM sample to be read */
1423 double ov_time_tell(OggVorbis_File *vf){
1425 ogg_int64_t pcm_total=0;
1426 double time_total=0.f;
1428 if(vf->ready_state<OPENED)return(OV_EINVAL);
1430 pcm_total=ov_pcm_total(vf,-1);
1431 time_total=ov_time_total(vf,-1);
1433 /* which bitstream section does this time offset occur in? */
1434 for(link=vf->links-1;link>=0;link--){
1435 pcm_total-=vf->pcmlengths[link*2+1];
1436 time_total-=ov_time_total(vf,link);
1437 if(vf->pcm_offset>=pcm_total)break;
1441 return((double)time_total+(double)(vf->pcm_offset-pcm_total)/vf->vi[link].rate);
1444 /* link: -1) return the vorbis_info struct for the bitstream section
1445 currently being decoded
1446 0-n) to request information for a specific bitstream section
1448 In the case of a non-seekable bitstream, any call returns the
1449 current bitstream. NULL in the case that the machine is not
1452 vorbis_info *ov_info(OggVorbis_File *vf,int link){
1455 if(vf->ready_state>=STREAMSET)
1456 return vf->vi+vf->current_link;
1469 /* grr, strong typing, grr, no templates/inheritence, grr */
1470 vorbis_comment *ov_comment(OggVorbis_File *vf,int link){
1473 if(vf->ready_state>=STREAMSET)
1474 return vf->vc+vf->current_link;
1487 static int host_is_big_endian() {
1488 ogg_int32_t pattern = 0xfeedface; /* deadbeef */
1489 unsigned char *bytewise = (unsigned char *)&pattern;
1490 if (bytewise[0] == 0xfe) return 1;
1494 /* up to this point, everything could more or less hide the multiple
1495 logical bitstream nature of chaining from the toplevel application
1496 if the toplevel application didn't particularly care. However, at
1497 the point that we actually read audio back, the multiple-section
1498 nature must surface: Multiple bitstream sections do not necessarily
1499 have to have the same number of channels or sampling rate.
1501 ov_read returns the sequential logical bitstream number currently
1502 being decoded along with the PCM data in order that the toplevel
1503 application can take action on channel/sample rate changes. This
1504 number will be incremented even for streamed (non-seekable) streams
1505 (for seekable streams, it represents the actual logical bitstream
1506 index within the physical bitstream. Note that the accessor
1507 functions above are aware of this dichotomy).
1509 input values: buffer) a buffer to hold packed PCM data for return
1510 length) the byte length requested to be placed into buffer
1511 bigendianp) should the data be packed LSB first (0) or
1513 word) word size for output. currently 1 (byte) or
1516 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
1518 n) number of bytes of PCM actually returned. The
1519 below works on a packet-by-packet basis, so the
1520 return length is not related to the 'length' passed
1521 in, just guaranteed to fit.
1523 *section) set to the logical bitstream number */
1525 long ov_read(OggVorbis_File *vf,char *buffer,int length,
1526 int bigendianp,int word,int sgned,int *bitstream){
1528 int host_endian = host_is_big_endian();
1533 if(vf->ready_state<OPENED)return(OV_EINVAL);
1536 if(vf->ready_state==INITSET){
1537 samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
1541 /* suck in another packet */
1543 int ret=_fetch_and_process_packet(vf,NULL,1,1);
1554 /* yay! proceed to pack data into the byte buffer */
1556 long channels=ov_info(vf,-1)->channels;
1557 long bytespersample=word * channels;
1558 vorbis_fpu_control fpu;
1559 if(samples>length/bytespersample)samples=length/bytespersample;
1564 /* a tight loop to pack each size */
1568 int off=(sgned?0:128);
1569 vorbis_fpu_setround(&fpu);
1570 for(j=0;j<samples;j++)
1571 for(i=0;i<channels;i++){
1572 val=vorbis_ftoi(pcm[i][j]*128.f);
1574 else if(val<-128)val=-128;
1577 vorbis_fpu_restore(fpu);
1579 int off=(sgned?0:32768);
1581 if(host_endian==bigendianp){
1584 vorbis_fpu_setround(&fpu);
1585 for(i=0;i<channels;i++) { /* It's faster in this order */
1587 short *dest=((short *)buffer)+i;
1588 for(j=0;j<samples;j++) {
1589 val=vorbis_ftoi(src[j]*32768.f);
1590 if(val>32767)val=32767;
1591 else if(val<-32768)val=-32768;
1596 vorbis_fpu_restore(fpu);
1600 vorbis_fpu_setround(&fpu);
1601 for(i=0;i<channels;i++) {
1603 short *dest=((short *)buffer)+i;
1604 for(j=0;j<samples;j++) {
1605 val=vorbis_ftoi(src[j]*32768.f);
1606 if(val>32767)val=32767;
1607 else if(val<-32768)val=-32768;
1612 vorbis_fpu_restore(fpu);
1615 }else if(bigendianp){
1617 vorbis_fpu_setround(&fpu);
1618 for(j=0;j<samples;j++)
1619 for(i=0;i<channels;i++){
1620 val=vorbis_ftoi(pcm[i][j]*32768.f);
1621 if(val>32767)val=32767;
1622 else if(val<-32768)val=-32768;
1625 *buffer++=(val&0xff);
1627 vorbis_fpu_restore(fpu);
1631 vorbis_fpu_setround(&fpu);
1632 for(j=0;j<samples;j++)
1633 for(i=0;i<channels;i++){
1634 val=vorbis_ftoi(pcm[i][j]*32768.f);
1635 if(val>32767)val=32767;
1636 else if(val<-32768)val=-32768;
1638 *buffer++=(val&0xff);
1641 vorbis_fpu_restore(fpu);
1647 vorbis_synthesis_read(&vf->vd,samples);
1648 vf->pcm_offset+=samples;
1649 if(bitstream)*bitstream=vf->current_link;
1650 return(samples*bytespersample);
1656 /* input values: pcm_channels) a float vector per channel of output
1657 length) the sample length being read by the app
1659 return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL)
1661 n) number of samples of PCM actually returned. The
1662 below works on a packet-by-packet basis, so the
1663 return length is not related to the 'length' passed
1664 in, just guaranteed to fit.
1666 *section) set to the logical bitstream number */
1670 long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int length,
1673 if(vf->ready_state<OPENED)return(OV_EINVAL);
1676 if(vf->ready_state==INITSET){
1678 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
1680 if(pcm_channels)*pcm_channels=pcm;
1681 if(samples>length)samples=length;
1682 vorbis_synthesis_read(&vf->vd,samples);
1683 vf->pcm_offset+=samples;
1684 if(bitstream)*bitstream=vf->current_link;
1690 /* suck in another packet */
1692 int ret=_fetch_and_process_packet(vf,NULL,1,1);
1693 if(ret==OV_EOF)return(0);
1694 if(ret<=0)return(ret);
1700 extern float *vorbis_window(vorbis_dsp_state *v,int W);
1701 extern void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,
1704 static void _ov_splice(float **pcm,float **lappcm,
1707 float *w1, float *w2){
1718 for(j=0;j<ch1 && j<ch2;j++){
1725 d[i]=d[i]*wd + s[i]*ws;
1728 /* window from zero */
1739 /* make sure vf is INITSET */
1740 static int _ov_initset(OggVorbis_File *vf){
1742 if(vf->ready_state==INITSET)break;
1743 /* suck in another packet */
1745 int ret=_fetch_and_process_packet(vf,NULL,1,0);
1746 if(ret<0 && ret!=OV_HOLE)return(ret);
1752 /* make sure vf is INITSET and that we have a primed buffer; if
1753 we're crosslapping at a stream section boundary, this also makes
1754 sure we're sanity checking against the right stream information */
1755 static int _ov_initprime(OggVorbis_File *vf){
1756 vorbis_dsp_state *vd=&vf->vd;
1758 if(vf->ready_state==INITSET)
1759 if(vorbis_synthesis_pcmout(vd,NULL))break;
1761 /* suck in another packet */
1763 int ret=_fetch_and_process_packet(vf,NULL,1,0);
1764 if(ret<0 && ret!=OV_HOLE)return(ret);
1770 /* grab enough data for lapping from vf; this may be in the form of
1771 unreturned, already-decoded pcm, remaining PCM we will need to
1772 decode, or synthetic postextrapolation from last packets. */
1773 static void _ov_getlap(OggVorbis_File *vf,vorbis_info *vi,vorbis_dsp_state *vd,
1774 float **lappcm,int lapsize){
1778 /* try first to decode the lapping data */
1779 while(lapcount<lapsize){
1780 int samples=vorbis_synthesis_pcmout(vd,&pcm);
1782 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
1783 for(i=0;i<vi->channels;i++)
1784 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
1786 vorbis_synthesis_read(vd,samples);
1788 /* suck in another packet */
1789 int ret=_fetch_and_process_packet(vf,NULL,1,0); /* do *not* span */
1790 if(ret==OV_EOF)break;
1793 if(lapcount<lapsize){
1794 /* failed to get lapping data from normal decode; pry it from the
1795 postextrapolation buffering, or the second half of the MDCT
1796 from the last packet */
1797 int samples=vorbis_synthesis_lapout(&vf->vd,&pcm);
1799 for(i=0;i<vi->channels;i++)
1800 memset(lappcm[i]+lapcount,0,sizeof(**pcm)*lapsize-lapcount);
1803 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
1804 for(i=0;i<vi->channels;i++)
1805 memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples);
1811 /* this sets up crosslapping of a sample by using trailing data from
1812 sample 1 and lapping it into the windowing buffer of sample 2 */
1813 int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2){
1814 vorbis_info *vi1,*vi2;
1818 int n1,n2,i,ret,hs1,hs2;
1820 if(vf1==vf2)return(0); /* degenerate case */
1821 if(vf1->ready_state<OPENED)return(OV_EINVAL);
1822 if(vf2->ready_state<OPENED)return(OV_EINVAL);
1824 /* the relevant overlap buffers must be pre-checked and pre-primed
1825 before looking at settings in the event that priming would cross
1826 a bitstream boundary. So, do it now */
1828 ret=_ov_initset(vf1);
1830 ret=_ov_initprime(vf2);
1833 vi1=ov_info(vf1,-1);
1834 vi2=ov_info(vf2,-1);
1835 hs1=ov_halfrate_p(vf1);
1836 hs2=ov_halfrate_p(vf2);
1838 lappcm=alloca(sizeof(*lappcm)*vi1->channels);
1839 n1=vorbis_info_blocksize(vi1,0)>>(1+hs1);
1840 n2=vorbis_info_blocksize(vi2,0)>>(1+hs2);
1841 w1=vorbis_window(&vf1->vd,0);
1842 w2=vorbis_window(&vf2->vd,0);
1844 for(i=0;i<vi1->channels;i++)
1845 lappcm[i]=alloca(sizeof(**lappcm)*n1);
1847 _ov_getlap(vf1,vi1,&vf1->vd,lappcm,n1);
1849 /* have a lapping buffer from vf1; now to splice it into the lapping
1851 /* consolidate and expose the buffer. */
1852 vorbis_synthesis_lapout(&vf2->vd,&pcm);
1853 _analysis_output_always("pcmL",0,pcm[0],n1*2,0,0,0);
1854 _analysis_output_always("pcmR",0,pcm[1],n1*2,0,0,0);
1857 _ov_splice(pcm,lappcm,n1,n2,vi1->channels,vi2->channels,w1,w2);
1863 static int _ov_64_seek_lap(OggVorbis_File *vf,ogg_int64_t pos,
1864 int (*localseek)(OggVorbis_File *,ogg_int64_t)){
1869 int n1,n2,ch1,ch2,hs;
1872 if(vf->ready_state<OPENED)return(OV_EINVAL);
1873 ret=_ov_initset(vf);
1876 hs=ov_halfrate_p(vf);
1879 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
1880 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
1881 persistent; even if the decode state
1882 from this link gets dumped, this
1883 window array continues to exist */
1885 lappcm=alloca(sizeof(*lappcm)*ch1);
1887 lappcm[i]=alloca(sizeof(**lappcm)*n1);
1888 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
1890 /* have lapping data; seek and prime the buffer */
1891 ret=localseek(vf,pos);
1893 ret=_ov_initprime(vf);
1896 /* Guard against cross-link changes; they're perfectly legal */
1899 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
1900 w2=vorbis_window(&vf->vd,0);
1902 /* consolidate and expose the buffer. */
1903 vorbis_synthesis_lapout(&vf->vd,&pcm);
1906 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
1912 int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
1913 return _ov_64_seek_lap(vf,pos,ov_raw_seek);
1916 int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){
1917 return _ov_64_seek_lap(vf,pos,ov_pcm_seek);
1920 int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos){
1921 return _ov_64_seek_lap(vf,pos,ov_pcm_seek_page);
1924 static int _ov_d_seek_lap(OggVorbis_File *vf,double pos,
1925 int (*localseek)(OggVorbis_File *,double)){
1930 int n1,n2,ch1,ch2,hs;
1933 if(vf->ready_state<OPENED)return(OV_EINVAL);
1934 ret=_ov_initset(vf);
1937 hs=ov_halfrate_p(vf);
1940 n1=vorbis_info_blocksize(vi,0)>>(1+hs);
1941 w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are
1942 persistent; even if the decode state
1943 from this link gets dumped, this
1944 window array continues to exist */
1946 lappcm=alloca(sizeof(*lappcm)*ch1);
1948 lappcm[i]=alloca(sizeof(**lappcm)*n1);
1949 _ov_getlap(vf,vi,&vf->vd,lappcm,n1);
1951 /* have lapping data; seek and prime the buffer */
1952 ret=localseek(vf,pos);
1954 ret=_ov_initprime(vf);
1957 /* Guard against cross-link changes; they're perfectly legal */
1960 n2=vorbis_info_blocksize(vi,0)>>(1+hs);
1961 w2=vorbis_window(&vf->vd,0);
1963 /* consolidate and expose the buffer. */
1964 vorbis_synthesis_lapout(&vf->vd,&pcm);
1967 _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2);
1973 int ov_time_seek_lap(OggVorbis_File *vf,double pos){
1974 return _ov_d_seek_lap(vf,pos,ov_time_seek);
1977 int ov_time_seek_page_lap(OggVorbis_File *vf,double pos){
1978 return _ov_d_seek_lap(vf,pos,ov_time_seek_page);