27 #define OV_EXCLUDE_STATIC_CALLBACKS
64 #define CHUNKSIZE 65536
74 if(bytes==0 && errno)
return(-1);
110 if(boundary>0)boundary+=vf->
offset;
193 *serialno_list =
_ogg_realloc(*serialno_list,
sizeof(**serialno_list)*(*n));
195 *serialno_list =
_ogg_malloc(
sizeof(**serialno_list));
198 (*serialno_list)[(*n)-1] =
s;
205 if(*serialno_list == s)
return 1;
224 long *serial_list,
int serial_n,
254 if(ret_serialno == *serialno){
271 if(prefoffset>=0)
return(prefoffset);
273 *serialno = ret_serialno;
282 long **serialno_list,
int *serialno_n,
307 if(*serialno_list)
_ogg_free(*serialno_list);
442 accumulated+=(lastblock+thisblock)>>2;
457 if(accumulated<0)accumulated=0;
472 long *currentno_list,
498 while(endserial != serialno){
499 endserial = serialno;
521 long *next_serialno_list=
NULL;
522 int next_serialnos=0;
528 while(searched<endsearched){
534 bisect=(searched+endsearched)/2;
546 if(last>=0)next=last;
556 int testserial = serialno+1;
558 while(testserial != serialno){
559 testserial = serialno;
579 next_serialno_list,next_serialnos,m+1);
582 if(next_serialno_list)
_ogg_free(next_serialno_list);
728 if(granulepos!=-1 && !op_ptr->
e_o_s){
747 if(granulepos<0)granulepos=0;
838 for(link=0;link<vf->
links;link++)
841 if(link==vf->
links)
continue;
874 if(f==
NULL)
return(-1);
875 return fseek(f,off,whence);
881 long *serialno_list=
NULL;
882 int serialno_list_size=0;
898 memcpy(buffer,initial,ibytes);
933 if(serialno_list)
_ogg_free(serialno_list);
963 for(i=0;i<vf->
links;i++){
994 const char *initial,
long ibytes,
ov_callbacks callbacks){
1004 (
int (*)(
void *)) fclose,
1005 (long (*)(
void *)) ftell
1013 FILE *
f = fopen(path,
"rb");
1041 for(i=0;i<vf->
links;i++){
1061 const char *initial,
long ibytes,
ov_callbacks callbacks)
1063 return _ov_open1(f,vf,initial,ibytes,callbacks);
1070 (
int (*)(
void *)) fclose,
1071 (long (*)(
void *)) ftell
1109 for(i=0;i<vf->
links;i++)
1176 for(i=0;i<vf->
links;i++)
1195 for(i=0;i<vf->
links;i++)
1214 for(i=0;i<vf->
links;i++)
1255 if(ret)
goto seek_error;
1308 if(lastflag && !firstflag)
1311 if(lastblock)accblock+=(lastblock+thisblock)>>2;
1317 if(granulepos<0)granulepos=0;
1325 lastblock=thisblock;
1364 for(link=0;link<vf->
links;link++)
1367 if(link==vf->
links)
continue;
1412 if(pos<0 || pos>total)
return(
OV_EINVAL);
1415 for(link=vf->
links-1;link>=0;link--){
1417 if(pos>=total)
break;
1444 (
ogg_int64_t)((
double)(target-begintime)*(end-begin)/(endtime-begintime))
1452 if(result)
goto seek_error;
1457 if(result==
OV_EREAD)
goto seek_error;
1462 if(bisect==0)
goto seek_error;
1464 if(bisect<=begin)bisect=begin+1;
1466 if(result)
goto seek_error;
1475 if(granulepos==-1)
continue;
1477 if(granulepos<target){
1480 begintime=granulepos;
1482 if(target-begintime>44100)
break;
1491 if(bisect<=begin)bisect=begin+1;
1493 if(result)
goto seek_error;
1514 if(result)
goto seek_error;
1516 if(result<0)
goto seek_error;
1543 if(result<0)
goto seek_error;
1547 if(result<0)
goto seek_error;
1591 int thisblock,lastblock=0;
1593 if(ret<0)
return(ret);
1610 if(lastblock)vf->
pcm_offset+=(lastblock+thisblock)>>2;
1634 lastblock=thisblock;
1637 if(ret<0 && ret!=
OV_HOLE)
break;
1647 for(link=0;link<vf->
links;link++)
1649 if(link==vf->
links)
continue;
1676 if(samples>target)samples=
target;
1695 double time_total=0.;
1702 for(link=0;link<vf->
links;link++){
1704 if(seconds<time_total+addsec)
break;
1725 double time_total=0.;
1732 for(link=0;link<vf->
links;link++){
1734 if(seconds<time_total+addsec)
break;
1765 double time_total=0.f;
1773 for(link=vf->
links-1;link>=0;link--){
1780 return((
double)time_total+(
double)(vf->
pcm_offset-pcm_total)/vf->
vi[link].
rate);
1828 unsigned char *bytewise = (
unsigned char *)&pattern;
1829 if (bytewise[0] == 0xfe)
return 1;
1870 int bigendianp,
int word,
int sgned,
int *bitstream,
1871 void (*
filter)(
float **pcm,
long channels,
long samples,
void *filter_param),
void *filter_param){
1903 long bytespersample=word * channels;
1905 if(samples>length/bytespersample)samples=length/bytespersample;
1912 filter(pcm,channels,samples,filter_param);
1918 int off=(sgned?0:128);
1921 for(i=0;i<channels;i++){
1924 else if(val<-128)val=-128;
1929 int off=(sgned?0:32768);
1931 if(host_endian==bigendianp){
1935 for(i=0;i<channels;i++) {
1937 short *dest=((
short *)buffer)+
i;
1940 if(val>32767)val=32767;
1941 else if(val<-32768)val=-32768;
1951 for(i=0;i<channels;i++) {
1953 short *dest=((
short *)buffer)+
i;
1956 if(val>32767)val=32767;
1957 else if(val<-32768)val=-32768;
1965 }
else if(bigendianp){
1969 for(i=0;i<channels;i++){
1971 if(val>32767)val=32767;
1972 else if(val<-32768)val=-32768;
1975 *buffer++=(val&0xff);
1983 for(i=0;i<channels;i++){
1985 if(val>32767)val=32767;
1986 else if(val<-32768)val=-32768;
1988 *buffer++=(val&0xff);
2001 return(samples*bytespersample);
2008 int bigendianp,
int word,
int sgned,
int *bitstream){
2037 if(pcm_channels)*pcm_channels=pcm;
2038 if(samples>length)samples=
length;
2050 if(ret==
OV_EOF)
return(0);
2051 if(ret<=0)
return(ret);
2062 float *
w1,
float *
w2){
2073 for(j=0;j<ch1 && j<ch2;j++){
2080 d[
i]=d[
i]*wd + s[
i]*ws;
2101 if(ret<0 && ret!=
OV_HOLE)
return(ret);
2119 if(ret<0 && ret!=
OV_HOLE)
return(ret);
2129 float **lappcm,
int lapsize){
2134 while(lapcount<lapsize){
2137 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
2139 memcpy(lappcm[
i]+lapcount,pcm[
i],
sizeof(**pcm)*samples);
2148 if(lapcount<lapsize){
2155 memset(lappcm[
i]+lapcount,0,
sizeof(**pcm)*lapsize-lapcount);
2158 if(samples>lapsize-lapcount)samples=lapsize-lapcount;
2160 memcpy(lappcm[
i]+lapcount,pcm[
i],
sizeof(**pcm)*samples);
2173 int n1,n2,
i,
ret,hs1,hs2;
2175 if(vf1==vf2)
return(0);
2193 lappcm=alloca(
sizeof(*lappcm)*vi1->
channels);
2200 lappcm[i]=alloca(
sizeof(**lappcm)*n1);
2210 _analysis_output_always(
"pcmL",0,pcm[0],n1*2,0,0,0);
2211 _analysis_output_always(
"pcmR",0,pcm[1],n1*2,0,0,0);
2227 int n1,n2,ch1,ch2,hs;
2243 lappcm=alloca(
sizeof(*lappcm)*ch1);
2245 lappcm[i]=alloca(
sizeof(**lappcm)*n1);
2249 ret=localseek(vf,pos);
2288 int n1,n2,ch1,ch2,hs;
2304 lappcm=alloca(
sizeof(*lappcm)*ch1);
2306 lappcm[i]=alloca(
sizeof(**lappcm)*n1);
2310 ret=localseek(vf,pos);
int ogg_page_eos(const ogg_page *og)
int(* close_func)(void *datasource)
ogg_int64_t ov_pcm_tell(OggVorbis_File *vf)
void vorbis_comment_init(vorbis_comment *vc)
GLuint const GLfloat * val
static int _fseek64_wrap(FILE *f, ogg_int64_t off, int whence)
int ov_open_callbacks(void *datasource, OggVorbis_File *vf, const char *initial, long ibytes, ov_callbacks callbacks)
int ov_time_seek_lap(OggVorbis_File *vf, double pos)
static void _decode_clear(OggVorbis_File *vf)
static int _make_decode_ready(OggVorbis_File *vf)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
int ov_test(FILE *f, OggVorbis_File *vf, const char *initial, long ibytes)
static int _seek_helper(OggVorbis_File *vf, ogg_int64_t offset)
int ov_test_open(OggVorbis_File *vf)
int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb)
double ov_time_total(OggVorbis_File *vf, int i)
static void _ov_getlap(OggVorbis_File *vf, vorbis_info *vi, vorbis_dsp_state *vd, float **lappcm, int lapsize)
int vorbis_synthesis_halfrate_p(vorbis_info *v)
static int vorbis_ftoi(double f)
GLuint GLsizei const GLuint const GLintptr * offsets
long ov_seekable(OggVorbis_File *vf)
int vorbis_synthesis_headerin(vorbis_info *vi, vorbis_comment *vc, ogg_packet *op)
void vorbis_comment_clear(vorbis_comment *vc)
static long _get_data(OggVorbis_File *vf)
int ov_clear(OggVorbis_File *vf)
int ogg_sync_wrote(ogg_sync_state *oy, long bytes)
int vorbis_synthesis_blockin(vorbis_dsp_state *v, vorbis_block *vb)
static int _ov_initprime(OggVorbis_File *vf)
return Display return Display Bool Bool int d
size_t(* read_func)(void *ptr, size_t size, size_t nmemb, void *datasource)
#define vorbis_fpu_setround(vorbis_fpu_control)
int vorbis_synthesis_read(vorbis_dsp_state *v, int samples)
static int _ov_open1(void *f, OggVorbis_File *vf, const char *initial, long ibytes, ov_callbacks callbacks)
int ov_fopen(const char *path, OggVorbis_File *vf)
int vorbis_synthesis_pcmout(vorbis_dsp_state *v, float ***pcm)
GLsizei const GLchar *const * path
static void _ov_splice(float **pcm, float **lappcm, int n1, int n2, int ch1, int ch2, float *w1, float *w2)
int ov_open(FILE *f, OggVorbis_File *vf, const char *initial, long ibytes)
int ov_test_callbacks(void *datasource, OggVorbis_File *vf, const char *initial, long ibytes, ov_callbacks callbacks)
ogg_int64_t ov_pcm_total(OggVorbis_File *vf, int i)
int ov_pcm_seek_page(OggVorbis_File *vf, ogg_int64_t pos)
double ov_time_tell(OggVorbis_File *vf)
int ov_halfrate_p(OggVorbis_File *vf)
int vorbis_synthesis_init(vorbis_dsp_state *v, vorbis_info *vi)
EGLContext EGLenum target
EGLContext EGLenum EGLClientBuffer buffer
int ov_raw_seek(OggVorbis_File *vf, ogg_int64_t pos)
char * ogg_sync_buffer(ogg_sync_state *oy, long size)
int ogg_sync_reset(ogg_sync_state *oy)
int ov_halfrate(OggVorbis_File *vf, int flag)
int vorbis_synthesis_lapout(vorbis_dsp_state *v, float ***pcm)
int ogg_page_continued(const ogg_page *og)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble GLdouble w2
long ov_bitrate(OggVorbis_File *vf, int i)
int vorbis_synthesis_restart(vorbis_dsp_state *v)
static ogg_int64_t _initial_pcmoffset(OggVorbis_File *vf, vorbis_info *vi)
static int _lookup_serialno(long s, long *serialno_list, int n)
float * vorbis_window(vorbis_dsp_state *v, int W)
void vorbis_dsp_clear(vorbis_dsp_state *v)
vorbis_info * ov_info(OggVorbis_File *vf, int link)
ogg_int64_t ov_raw_total(OggVorbis_File *vf, int i)
static int _bisect_forward_serialno(OggVorbis_File *vf, ogg_int64_t begin, ogg_int64_t searched, ogg_int64_t end, ogg_int64_t endgran, int endserial, long *currentno_list, int currentnos, long m)
int ogg_stream_packetpeek(ogg_stream_state *os, ogg_packet *op)
int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og)
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
int ogg_page_bos(const ogg_page *og)
int vorbis_info_blocksize(vorbis_info *vi, int zo)
int ogg_sync_clear(ogg_sync_state *oy)
long ov_read(OggVorbis_File *vf, char *buffer, int length, int bigendianp, int word, int sgned, int *bitstream)
int ov_pcm_seek_lap(OggVorbis_File *vf, ogg_int64_t pos)
long ov_bitrate_instant(OggVorbis_File *vf)
static ogg_int64_t _get_prev_page(OggVorbis_File *vf, ogg_page *og)
static int _ov_d_seek_lap(OggVorbis_File *vf, double pos, int(*localseek)(OggVorbis_File *, double))
long(* tell_func)(void *datasource)
int(* seek_func)(void *datasource, ogg_int64_t offset, int whence)
static void _add_serialno(ogg_page *og, long **serialno_list, int *n)
int ogg_stream_clear(ogg_stream_state *os)
static ogg_int64_t _get_prev_page_serial(OggVorbis_File *vf, long *serial_list, int serial_n, int *serialno, ogg_int64_t *granpos)
int ov_raw_seek_lap(OggVorbis_File *vf, ogg_int64_t pos)
static ogg_int64_t _get_next_page(OggVorbis_File *vf, ogg_page *og, ogg_int64_t boundary)
#define vorbis_fpu_restore(vorbis_fpu_control)
ogg_int64_t * dataoffsets
static int host_is_big_endian()
long ogg_sync_pageseek(ogg_sync_state *oy, ogg_page *og)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble w1
int vorbis_synthesis_idheader(ogg_packet *op)
vorbis_comment * ov_comment(OggVorbis_File *vf, int link)
static int _ov_initset(OggVorbis_File *vf)
int vorbis_synthesis(vorbis_block *vb, ogg_packet *op)
int vorbis_synthesis_trackonly(vorbis_block *vb, ogg_packet *op)
static int _lookup_page_serialno(ogg_page *og, long *serialno_list, int n)
int ogg_stream_packetout(ogg_stream_state *os, ogg_packet *op)
void vorbis_info_clear(vorbis_info *vi)
long ov_read_float(OggVorbis_File *vf, float ***pcm_channels, int samples, int *bitstream)
int ov_time_seek_page_lap(OggVorbis_File *vf, double pos)
void vorbis_info_init(vorbis_info *vi)
GLint GLint GLint GLint GLint w
static int _ov_open2(OggVorbis_File *vf)
int ov_pcm_seek_page_lap(OggVorbis_File *vf, ogg_int64_t pos)
int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2)
int ogg_stream_reset(ogg_stream_state *os)
int ogg_sync_init(ogg_sync_state *oy)
int vorbis_synthesis_halfrate(vorbis_info *v, int flag)
long vorbis_packet_blocksize(vorbis_info *vi, ogg_packet *op)
int ogg_stream_reset_serialno(ogg_stream_state *os, int serialno)
int ogg_page_serialno(const ogg_page *og)
static int _fetch_headers(OggVorbis_File *vf, vorbis_info *vi, vorbis_comment *vc, long **serialno_list, int *serialno_n, ogg_page *og_ptr)
ogg_int64_t ov_raw_tell(OggVorbis_File *vf)
int ov_time_seek(OggVorbis_File *vf, double pos)
long ov_read_filter(OggVorbis_File *vf, char *buffer, int length, int bigendianp, int word, int sgned, int *bitstream, void(*filter)(float **pcm, long channels, long samples, void *filter_param), void *filter_param)
long ov_streams(OggVorbis_File *vf)
static int _ov_64_seek_lap(OggVorbis_File *vf, ogg_int64_t pos, int(*localseek)(OggVorbis_File *, ogg_int64_t))
int ov_pcm_seek(OggVorbis_File *vf, ogg_int64_t pos)
long ov_serialnumber(OggVorbis_File *vf, int i)
ogg_int64_t ogg_page_granulepos(const ogg_page *og)
int ogg_stream_init(ogg_stream_state *os, int serialno)
int vorbis_block_clear(vorbis_block *vb)
static int _fetch_and_process_packet(OggVorbis_File *vf, ogg_packet *op_in, int readp, int spanp)
static int _open_seekable2(OggVorbis_File *vf)
int ov_time_seek_page(OggVorbis_File *vf, double pos)