void prefetch_all_headers(Info first_i,Comment first_c,
                           int dataoffset) throws JOrbisException {
    Page og=new Page();
    int ret;
  
    vi=new Info[links];
    vc=new Comment[links];
    dataoffsets=new long[links];
    pcmlengths=new long[links];
    serialnos=new int[links];
  
    for(int i=0;i<links;i++){
      if(first_i!=null && first_c!=null && i==0){
	// we already grabbed the initial header earlier.  This just
	// saves the waste of grabbing it again
	// !!!!!!!!!!!!!
	vi[i]=first_i;
	//memcpy(vf->vi+i,first_i,sizeof(vorbis_info));
	vc[i]=first_c;
	//memcpy(vf->vc+i,first_c,sizeof(vorbis_comment));
	dataoffsets[i]=dataoffset;
      }
      else{
	// seek to the location of the initial header
	seek_helper(offsets[i]); //!!!
	vi[i]=new Info();
	vc[i]=new Comment();
	if(fetch_headers(vi[i], vc[i], null, null)==-1){
	  //System.err.println("Error opening logical bitstream #"+(i+1)+"\n");
	  dataoffsets[i]=-1;
	}
	else{
	  dataoffsets[i]=offset;
	  os.clear();
	}
      }

      // get the serial number and PCM length of this link. To do this,
      // get the last page of the stream
      {
	long end=offsets[i+1]; //!!!
	seek_helper(end);

	while(true){
	  ret=get_prev_page(og);
	  if(ret==-1){
	    // this should not be possible
	    //System.err.println("Could not find last page of logical "+
	    //		       "bitstream #"+(i)+"\n");
	    vi[i].clear();
	    vc[i].clear();
	    break;
	  }
	  if(og.granulepos()!=-1){
	    serialnos[i]=og.serialno();
	    pcmlengths[i]=og.granulepos();
	    break;
	  }
	}
      }
    }
  }