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: illustrate seeking, and test it too
16 ********************************************************************/
20 #include "vorbis/codec.h"
21 #include "vorbis/vorbisfile.h"
23 #ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
28 void _verify(OggVorbis_File *ov,
29 ogg_int64_t val,ogg_int64_t pcmval,double timeval,
30 ogg_int64_t pcmlength,
38 /* verify the raw position, the pcm position and position decode */
39 if(val!=-1 && ov_raw_tell(ov)<val){
40 printf("raw position out of tolerance: requested %ld, got %ld\n",
41 (long)val,(long)ov_raw_tell(ov));
44 if(pcmval!=-1 && ov_pcm_tell(ov)>pcmval){
45 printf("pcm position out of tolerance: requested %ld, got %ld\n",
46 (long)pcmval,(long)ov_pcm_tell(ov));
49 if(timeval!=-1 && ov_time_tell(ov)>timeval){
50 printf("time position out of tolerance: requested %f, got %f\n",
51 timeval,ov_time_tell(ov));
55 if(pos<0 || pos>pcmlength){
56 printf("pcm position out of bounds: got %ld\n",(long)pos);
59 bread=ov_read(ov,buffer,4096,1,1,1,&dummy);
61 if(buffer[j]!=bigassbuffer[j+pos*2]){
62 printf("data position after seek doesn't match pcm position\n");
65 FILE *f=fopen("a.m","w");
66 for(j=0;j<bread;j++)fprintf(f,"%d\n",(int)buffer[j]);
69 for(j=0;j<bread;j++)fprintf(f,"%d\n",(int)bigassbuffer[j+pos*2]);
81 ogg_int64_t pcmlength;
86 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
87 _setmode( _fileno( stdin ), _O_BINARY );
88 _setmode( _fileno( stdout ), _O_BINARY );
92 /* open the file/pipe on stdin */
93 if(ov_open(stdin,&ov,NULL,-1)<0){
94 printf("Could not open input as an OggVorbis file.\n\n");
100 /* to simplify our own lives, we want to assume the whole file is
101 stereo. Verify this to avoid potentially mystifying users
102 (pissing them off is OK, just don't confuse them) */
103 for(i=0;i<ov.links;i++){
104 vorbis_info *vi=ov_info(&ov,i);
106 printf("Sorry; right now seeking_test can only use Vorbis files\n"
107 "that are entirely stereo.\n\n");
112 /* because we want to do sample-level verification that the seek
113 does what it claimed, decode the entire file into memory */
115 pcmlength=ov_pcm_total(&ov,-1);
116 timelength=ov_time_total(&ov,-1);
117 bigassbuffer=malloc(pcmlength*2); /* w00t */
119 while(i<pcmlength*2){
120 int ret=ov_read(&ov,bigassbuffer+i,pcmlength*2-i,1,1,1,&dummy);
127 fprintf(stderr,"\rloading.... [%ld left] ",
128 (long)(pcmlength*2-i));
132 ogg_int64_t length=ov.end;
133 printf("\rtesting raw seeking to random places in %ld bytes....\n",
137 ogg_int64_t val=(double)rand()/RAND_MAX*length;
138 printf("\r\t%d [raw position %ld]... ",i,(long)val);
140 ret=ov_raw_seek(&ov,val);
142 printf("seek failed: %d\n",ret);
146 _verify(&ov,val,-1,-1.,pcmlength,bigassbuffer);
153 printf("testing pcm page seeking to random places in %ld samples....\n",
157 ogg_int64_t val=(double)rand()/RAND_MAX*pcmlength;
158 printf("\r\t%d [pcm position %ld]... ",i,(long)val);
160 ret=ov_pcm_seek_page(&ov,val);
162 printf("seek failed: %d\n",ret);
166 _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer);
173 printf("testing pcm exact seeking to random places in %ld samples....\n",
177 ogg_int64_t val=(double)rand()/RAND_MAX*pcmlength;
178 printf("\r\t%d [pcm position %ld]... ",i,(long)val);
180 ret=ov_pcm_seek(&ov,val);
182 printf("seek failed: %d\n",ret);
185 if(ov_pcm_tell(&ov)!=val){
186 printf("Declared position didn't perfectly match request: %ld != %ld\n",
187 (long)val,(long)ov_pcm_tell(&ov));
191 _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer);
198 printf("testing time page seeking to random places in %f seconds....\n",
202 double val=(double)rand()/RAND_MAX*timelength;
203 printf("\r\t%d [time position %f]... ",i,val);
205 ret=ov_time_seek_page(&ov,val);
207 printf("seek failed: %d\n",ret);
211 _verify(&ov,-1,-1,val,pcmlength,bigassbuffer);
218 printf("testing time exact seeking to random places in %f seconds....\n",
222 double val=(double)rand()/RAND_MAX*timelength;
223 printf("\r\t%d [time position %f]... ",i,val);
225 ret=ov_time_seek(&ov,val);
227 printf("seek failed: %d\n",ret);
230 if(ov_time_tell(&ov)<val-1 || ov_time_tell(&ov)>val+1){
231 printf("Declared position didn't perfectly match request: %f != %f\n",
232 val,ov_time_tell(&ov));
236 _verify(&ov,-1,-1,val,pcmlength,bigassbuffer);
241 printf("\r \nOK.\n\n");
245 printf("Standard input was not seekable.\n");