18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/********************************************************************
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: illustrate seeking, and test it too
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: seeking_example.c 16329 2009-07-24 01:53:20Z xiphmont $
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdlib.h>
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdio.h>
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "vorbis/codec.h"
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "vorbis/vorbisfile.h"
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# include <io.h>
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# include <fcntl.h>
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid _verify(OggVorbis_File *ov,
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             ogg_int64_t val,ogg_int64_t pcmval,double timeval,
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             ogg_int64_t pcmlength,
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             char *bigassbuffer){
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int j;
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long bread;
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  char buffer[4096];
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int dummy;
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_int64_t pos;
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* verify the raw position, the pcm position and position decode */
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(val!=-1 && ov_raw_tell(ov)<val){
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"raw position out of tolerance: requested %ld, got %ld\n",
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           (long)val,(long)ov_raw_tell(ov));
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit(1);
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(pcmval!=-1 && ov_pcm_tell(ov)>pcmval){
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"pcm position out of tolerance: requested %ld, got %ld\n",
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           (long)pcmval,(long)ov_pcm_tell(ov));
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit(1);
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(timeval!=-1 && ov_time_tell(ov)>timeval){
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"time position out of tolerance: requested %f, got %f\n",
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           timeval,ov_time_tell(ov));
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit(1);
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  pos=ov_pcm_tell(ov);
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(pos<0 || pos>pcmlength){
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"pcm position out of bounds: got %ld\n",(long)pos);
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit(1);
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  bread=ov_read(ov,buffer,4096,1,1,1,&dummy);
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(j=0;j<bread;j++){
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(buffer[j]!=bigassbuffer[j+pos*2]){
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fprintf(stderr,"data position after seek doesn't match pcm position\n");
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      {
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        FILE *f=fopen("a.m","w");
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        for(j=0;j<bread;j++)fprintf(f,"%d\n",(int)buffer[j]);
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fclose(f);
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        f=fopen("b.m","w");
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        for(j=0;j<bread;j++)fprintf(f,"%d\n",(int)bigassbuffer[j+pos*2]);
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fclose(f);
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      exit(1);
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsint main(){
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  OggVorbis_File ov;
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int i,ret;
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_int64_t pcmlength;
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  double timelength;
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  char *bigassbuffer;
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int dummy;
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  _setmode( _fileno( stdin ), _O_BINARY );
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* open the file/pipe on stdin */
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)<0){
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"Could not open input as an OggVorbis file.\n\n");
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit(1);
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(ov_seekable(&ov)){
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* to simplify our own lives, we want to assume the whole file is
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       stereo.  Verify this to avoid potentially mystifying users
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       (pissing them off is OK, just don't confuse them) */
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(i=0;i<ov.links;i++){
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      vorbis_info *vi=ov_info(&ov,i);
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(vi->channels!=2){
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fprintf(stderr,"Sorry; right now seeking_test can only use Vorbis files\n"
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels               "that are entirely stereo.\n\n");
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        exit(1);
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* because we want to do sample-level verification that the seek
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       does what it claimed, decode the entire file into memory */
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    pcmlength=ov_pcm_total(&ov,-1);
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    timelength=ov_time_total(&ov,-1);
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    bigassbuffer=malloc(pcmlength*2); /* w00t */
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    i=0;
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    while(i<pcmlength*2){
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      int ret=ov_read(&ov,bigassbuffer+i,pcmlength*2-i,1,1,1,&dummy);
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(ret<0){
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fprintf(stderr,"Error reading file.\n");
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        exit(1);
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(ret){
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        i+=ret;
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }else{
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        pcmlength=i/2;
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fprintf(stderr,"\rloading.... [%ld left]              ",
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels              (long)(pcmlength*2-i));
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    {
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      ogg_int64_t length=ov.end;
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fprintf(stderr,"\rtesting raw seeking to random places in %ld bytes....\n",
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             (long)length);
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<1000;i++){
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ogg_int64_t val=(double)rand()/RAND_MAX*length;
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fprintf(stderr,"\r\t%d [raw position %ld]...     ",i,(long)val);
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ret=ov_raw_seek(&ov,val);
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ret<0){
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fprintf(stderr,"seek failed: %d\n",ret);
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          exit(1);
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _verify(&ov,val,-1,-1.,pcmlength,bigassbuffer);
1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"\r");
1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    {
1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fprintf(stderr,"testing pcm page seeking to random places in %ld samples....\n",
1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             (long)pcmlength);
1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<1000;i++){
1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ogg_int64_t val=(double)rand()/RAND_MAX*pcmlength;
1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fprintf(stderr,"\r\t%d [pcm position %ld]...     ",i,(long)val);
1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ret=ov_pcm_seek_page(&ov,val);
1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ret<0){
1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fprintf(stderr,"seek failed: %d\n",ret);
1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          exit(1);
1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer);
1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"\r");
1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    {
1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fprintf(stderr,"testing pcm exact seeking to random places in %ld samples....\n",
1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             (long)pcmlength);
1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<1000;i++){
1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ogg_int64_t val=(double)rand()/RAND_MAX*pcmlength;
1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fprintf(stderr,"\r\t%d [pcm position %ld]...     ",i,(long)val);
1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ret=ov_pcm_seek(&ov,val);
1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ret<0){
1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fprintf(stderr,"seek failed: %d\n",ret);
1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          exit(1);
1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ov_pcm_tell(&ov)!=val){
1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fprintf(stderr,"Declared position didn't perfectly match request: %ld != %ld\n",
1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                 (long)val,(long)ov_pcm_tell(&ov));
1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          exit(1);
1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer);
1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"\r");
1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    {
1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fprintf(stderr,"testing time page seeking to random places in %f seconds....\n",
1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             timelength);
1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<1000;i++){
2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        double val=(double)rand()/RAND_MAX*timelength;
2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fprintf(stderr,"\r\t%d [time position %f]...     ",i,val);
2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ret=ov_time_seek_page(&ov,val);
2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ret<0){
2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fprintf(stderr,"seek failed: %d\n",ret);
2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          exit(1);
2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _verify(&ov,-1,-1,val,pcmlength,bigassbuffer);
2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"\r");
2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    {
2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      fprintf(stderr,"testing time exact seeking to random places in %f seconds....\n",
2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             timelength);
2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<1000;i++){
2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        double val=(double)rand()/RAND_MAX*timelength;
2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        fprintf(stderr,"\r\t%d [time position %f]...     ",i,val);
2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ret=ov_time_seek(&ov,val);
2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ret<0){
2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fprintf(stderr,"seek failed: %d\n",ret);
2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          exit(1);
2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ov_time_tell(&ov)<val-1 || ov_time_tell(&ov)>val+1){
2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          fprintf(stderr,"Declared position didn't perfectly match request: %f != %f\n",
2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                 val,ov_time_tell(&ov));
2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          exit(1);
2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _verify(&ov,-1,-1,val,pcmlength,bigassbuffer);
2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"\r                                           \nOK.\n\n");
2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }else{
2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    fprintf(stderr,"Standard input was not seekable.\n");
2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ov_clear(&ov);
2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return 0;
2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
260