diff options
author | Monty <xiphmont@xiph.org> | 2009-07-11 10:03:10 +0000 |
---|---|---|
committer | Monty <xiphmont@xiph.org> | 2009-07-11 10:03:10 +0000 |
commit | 4ce4ec7859e7f8074341cfb00af1c207f5d24d3f (patch) | |
tree | 90bbcd709f76579ee1da1702f1a39db1c9299d4d /iseeking_example.c | |
parent | afdecda7fe28e347380e98ca66a00cbbee4cd9f3 (diff) | |
download | tremor-4ce4ec7859e7f8074341cfb00af1c207f5d24d3f.tar.gz |
Merge recent vorbifile changes, extensions and fixes back from
reference 1.2.2 and 1.2.3 into tremor.
git-svn-id: https://svn.xiph.org/trunk/Tremor@16259 0101bb08-14d6-0310-b084-bc0e0c8e3800
Diffstat (limited to 'iseeking_example.c')
-rw-r--r-- | iseeking_example.c | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/iseeking_example.c b/iseeking_example.c new file mode 100644 index 0000000..aaf0d39 --- /dev/null +++ b/iseeking_example.c @@ -0,0 +1,259 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: illustrate seeking, and test it too + last mod: $Id: iseeking_example.c 16037 2009-05-26 21:10:58Z xiphmont $ + + ********************************************************************/ + +#include <stdlib.h> +#include <stdio.h> +#include <vorbis/ivorbiscodec.h> +#include <vorbis/ivorbisfile.h> + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +# include <io.h> +# include <fcntl.h> +#endif + +void _verify(OggVorbis_File *ov, + ogg_int64_t val, + ogg_int64_t pcmval, + ogg_int64_t timeval, + ogg_int64_t pcmlength, + char *bigassbuffer){ + int j; + long bread; + char buffer[4096]; + int dummy; + ogg_int64_t pos; + + /* verify the raw position, the pcm position and position decode */ + if(val!=-1 && ov_raw_tell(ov)<val){ + fprintf(stderr,"raw position out of tolerance: requested %ld, got %ld\n", + (long)val,(long)ov_raw_tell(ov)); + exit(1); + } + if(pcmval!=-1 && ov_pcm_tell(ov)>pcmval){ + fprintf(stderr,"pcm position out of tolerance: requested %ld, got %ld\n", + (long)pcmval,(long)ov_pcm_tell(ov)); + exit(1); + } + if(timeval!=-1 && ov_time_tell(ov)>timeval){ + fprintf(stderr,"time position out of tolerance: requested %ld, got %ld\n", + (long)timeval,(long)ov_time_tell(ov)); + exit(1); + } + pos=ov_pcm_tell(ov); + if(pos<0 || pos>pcmlength){ + fprintf(stderr,"pcm position out of bounds: got %ld\n",(long)pos); + exit(1); + } + bread=ov_read(ov,buffer,4096,&dummy); + for(j=0;j<bread;j++){ + if(buffer[j]!=bigassbuffer[j+pos*4]){ + fprintf(stderr,"data position after seek doesn't match pcm position\n"); + + { + FILE *f=fopen("a.m","w"); + for(j=0;j<bread;j++)fprintf(f,"%d\n",(int)buffer[j]); + fclose(f); + f=fopen("b.m","w"); + for(j=0;j<bread;j++)fprintf(f,"%d\n",(int)bigassbuffer[j+pos*2]); + fclose(f); + } + + exit(1); + } + } +} + +int main(){ + OggVorbis_File ov; + int i,ret; + ogg_int64_t pcmlength; + ogg_int64_t timelength; + char *bigassbuffer; + int dummy; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + _setmode( _fileno( stdin ), _O_BINARY ); +#endif + + + /* open the file/pipe on stdin */ + if(ov_open(stdin, &ov, NULL, 0) < 0) { + fprintf(stderr,"Could not open input as an OggVorbis file.\n\n"); + exit(1); + } + + if(ov_seekable(&ov)){ + + /* to simplify our own lives, we want to assume the whole file is + stereo. Verify this to avoid potentially mystifying users + (pissing them off is OK, just don't confuse them) */ + for(i=0;i<ov.links;i++){ + vorbis_info *vi=ov_info(&ov,i); + if(vi->channels!=2){ + fprintf(stderr,"Sorry; right now seeking_test can only use Vorbis files\n" + "that are entirely stereo.\n\n"); + exit(1); + } + } + + /* because we want to do sample-level verification that the seek + does what it claimed, decode the entire file into memory */ + pcmlength=ov_pcm_total(&ov,-1); + timelength=ov_time_total(&ov,-1); + bigassbuffer=malloc(pcmlength*4); /* w00t */ + i=0; + while(i<pcmlength*4){ + int ret=ov_read(&ov,bigassbuffer+i,pcmlength*4-i,&dummy); + if(ret<0)continue; + if(ret){ + i+=ret; + }else{ + pcmlength=i/4; + } + fprintf(stderr,"\rloading.... [%ld left] ", + (long)(pcmlength*4-i)); + } + + { + ogg_int64_t length=ov.end; + fprintf(stderr,"\rtesting raw seeking to random places in %ld bytes....\n", + (long)length); + + for(i=0;i<1000;i++){ + ogg_int64_t val=rand()*length/RAND_MAX; + fprintf(stderr,"\r\t%d [raw position %ld]... ",i,(long)val); + ret=ov_raw_seek(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + + _verify(&ov,val,-1,-1.,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r"); + { + fprintf(stderr,"testing pcm page seeking to random places in %ld samples....\n", + (long)pcmlength); + + for(i=0;i<1000;i++){ + ogg_int64_t val=rand()*pcmlength/RAND_MAX; + fprintf(stderr,"\r\t%d [pcm position %ld]... ",i,(long)val); + ret=ov_pcm_seek_page(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + + _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r"); + { + fprintf(stderr,"testing pcm exact seeking to random places in %ld samples....\n", + (long)pcmlength); + + for(i=0;i<1000;i++){ + ogg_int64_t val=rand()*pcmlength/RAND_MAX; + fprintf(stderr,"\r\t%d [pcm position %ld]... ",i,(long)val); + ret=ov_pcm_seek(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + if(ov_pcm_tell(&ov)!=val){ + fprintf(stderr,"Declared position didn't perfectly match request: %ld != %ld\n", + (long)val,(long)ov_pcm_tell(&ov)); + exit(1); + } + + _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r"); + { + fprintf(stderr,"testing time page seeking to random places in %ld seconds....\n", + (long)timelength); + + for(i=0;i<1000;i++){ + ogg_int64_t val=rand()*timelength/RAND_MAX; + fprintf(stderr,"\r\t%d [time position %ld]... ",i,(long)val); + ret=ov_time_seek_page(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + + _verify(&ov,-1,-1,val,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r"); + { + fprintf(stderr,"testing time exact seeking to random places in %ld seconds....\n", + (long)timelength); + + for(i=0;i<1000;i++){ + ogg_int64_t val=rand()*timelength/RAND_MAX; + fprintf(stderr,"\r\t%d [time position %ld]... ",i,(long)val); + ret=ov_time_seek(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + if(ov_time_tell(&ov)<val-1 || ov_time_tell(&ov)>val+1){ + fprintf(stderr,"Declared position didn't perfectly match request: %ld != %ld\n", + (long)val,(long)ov_time_tell(&ov)); + exit(1); + } + + _verify(&ov,-1,-1,val,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r \nOK.\n\n"); + + + }else{ + fprintf(stderr,"Standard input was not seekable.\n"); + } + + ov_clear(&ov); + return 0; +} + + + + + + + + + + + + + |