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);
  }