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