int pack_books(Buffer opb){
    opb.write(0x05,8);
    opb.write(_vorbis);

    // books
    opb.write(books-1,8);
    for(int i=0;i<books;i++){
      if(book_param[i].pack(opb)!=0){
	//goto err_out;
	return(-1);
      }
    }

    // times
    opb.write(times-1,6);
    for(int i=0;i<times;i++){
      opb.write(time_type[i],16);
      FuncTime.time_P[time_type[i]].pack(this.time_param[i],opb);
    }

    // floors
    opb.write(floors-1,6);
    for(int i=0;i<floors;i++){
      opb.write(floor_type[i],16);
      FuncFloor.floor_P[floor_type[i]].pack(floor_param[i],opb);
    }

    // residues
    opb.write(residues-1,6);
    for(int i=0;i<residues;i++){
      opb.write(residue_type[i],16);
      FuncResidue.residue_P[residue_type[i]].pack(residue_param[i],opb);
    }
    
    // maps
    opb.write(maps-1,6);
    for(int i=0;i<maps;i++){
      opb.write(map_type[i],16);
      FuncMapping.mapping_P[map_type[i]].pack(this,map_param[i],opb);
    }

    // modes
    opb.write(modes-1,6);
    for(int i=0;i<modes;i++){
      opb.write(mode_param[i].blockflag,1);
      opb.write(mode_param[i].windowtype,16);
      opb.write(mode_param[i].transformtype,16);
      opb.write(mode_param[i].mapping,8);
    }
    opb.write(1,1);
    return(0);
  //err_out:
    //return(-1);
  }