/* all of the real encoding details are here. The modes, books, * everything */ public static int _vorbis_unpack_books(vorbis_info vi, oggpack_buffer opb) { codec_setup_info ci = vi.codec_setup; int i; /* codebooks */ ci.books = (int)oggpack_read(opb, 8) + 1; if (ci.books <= 0) { goto err_out; } for (i = 0; i < ci.books; i++) { ci.book_param[i] = vorbis_staticbook_unpack(opb); if (ci.book_param[i] == null) { goto err_out; } } /* time backend settings; hooks are unused */ { int times = (int)oggpack_read(opb, 6) + 1; if (times <= 0) { goto err_out; } for (i = 0; i < times; i++) { int test = (int)oggpack_read(opb, 16); if (test < 0 || test >= VI_TIMEB) { goto err_out; } } } /* floor backend settings */ ci.floors = (int)oggpack_read(opb, 6) + 1; if (ci.floors <= 0) { goto err_out; } for (i = 0; i < ci.floors; i++) { ci.floor_type[i] = (int)oggpack_read(opb, 16); if (ci.floor_type[i] < 0 || ci.floor_type[i] >= VI_FLOORB) { goto err_out; } ci.floor_param[i] = _floor_P[ci.floor_type[i]].unpack(vi, opb); if (ci.floor_param[i] == null) { goto err_out; } } /* residue backend settings */ ci.residues = (int)oggpack_read(opb, 6) + 1; if (ci.residues <= 0) { goto err_out; } for (i = 0; i < ci.residues; i++) { ci.residue_type[i] = (int)oggpack_read(opb, 16); if (ci.residue_type[i] < 0 || ci.residue_type[i] >= VI_RESB) { goto err_out; } ci.residue_param[i] = _residue_P[ci.residue_type[i]].unpack(vi, opb); if (ci.residue_param[i] == null) { goto err_out; } } /* map backend settings */ ci.maps = (int)oggpack_read(opb, 6) + 1; if (ci.maps <= 0) { goto err_out; } for (i = 0; i < ci.maps; i++) { ci.map_type[i] = (int)oggpack_read(opb, 16); if (ci.map_type[i] < 0 || ci.map_type[i] >= VI_MAPB) { goto err_out; } ci.map_param[i] = _mapping_P[ci.map_type[i]].unpack(vi, opb); if (ci.map_param[i] == null) { goto err_out; } } /* mode settings */ ci.modes = (int)oggpack_read(opb, 6) + 1; if (ci.modes <= 0) { goto err_out; } for (i = 0; i < ci.modes; i++) { ci.mode_param[i] = new vorbis_info_mode(); //_ogg_calloc(1, sizeof(*ci.mode_param[i])); ci.mode_param[i].blockflag = (int)oggpack_read(opb, 1); ci.mode_param[i].windowtype = (int)oggpack_read(opb, 16); ci.mode_param[i].transformtype = (int)oggpack_read(opb, 16); ci.mode_param[i].mapping = (int)oggpack_read(opb, 8); if (ci.mode_param[i].windowtype >= VI_WINDOWB) { goto err_out; } if (ci.mode_param[i].transformtype >= VI_WINDOWB) { goto err_out; } if (ci.mode_param[i].mapping >= ci.maps) { goto err_out; } if (ci.mode_param[i].mapping < 0) { goto err_out; } } if (oggpack_read(opb, 1) != 1) { goto err_out; /* top level EOP check */ } return(0); err_out: vorbis_info_clear(vi); return(OV_EBADHEADER); }
public static void vorbis_info_clear(vorbis_info vi) { codec_setup_info ci = vi.codec_setup; int i; if (ci != null) { for (i = 0; i < ci.modes; i++) { if (ci.mode_param[i] != null) //_ogg_free(ci.mode_param[i]); { ci.mode_param[i] = null; } } for (i = 0; i < ci.maps; i++) /* unpack does the range checking */ { if (ci.map_param[i] != null) /* this may be cleaning up an aborted * unpack, in which case the below type * cannot be trusted */ //_mapping_P[ci.map_type[i]].free_info(ci.map_param[i]); { ci.map_param[i] = null; } } for (i = 0; i < ci.floors; i++) /* unpack does the range checking */ { if (ci.floor_param[i] != null) /* this may be cleaning up an aborted * unpack, in which case the below type * cannot be trusted */ //_floor_P[ci.floor_type[i]].free_info(ci.floor_param[i]); { ci.floor_param[i] = null; } } for (i = 0; i < ci.residues; i++) /* unpack does the range checking */ { if (ci.residue_param[i] != null) /* this may be cleaning up an aborted * unpack, in which case the below type * cannot be trusted */ //_residue_P[ci.residue_type[i]].free_info(ci.residue_param[i]); { ci.residue_param[i] = null; } } for (i = 0; i < ci.books; i++) { if (ci.book_param[i] != null) { /* knows if the book was not alloced */ vorbis_staticbook_destroy(ci.book_param[i]); } //if (ci.fullbooks != null) // vorbis_book_clear(ci.fullbooks + i); } if (ci.fullbooks != null) { //_ogg_free(ci.fullbooks); ci.fullbooks = null; } for (i = 0; i < ci.psys; i++) { //_vi_psy_free(ci.psy_param[i]); ci.psy_param[i] = null; } //_ogg_free(ci); vi.codec_setup = null; } //memset(vi, 0, sizeof(*vi)); }
/* Header packing/unpacking ********************************************/ public static int _vorbis_unpack_info(vorbis_info vi, oggpack_buffer opb) { codec_setup_info ci = vi.codec_setup; int bs; if (ci == null) { return(OV_EFAULT); } vi.version = oggpack_read(opb, 32); if (vi.version != 0) { return(OV_EVERSION); } vi.channels = oggpack_read(opb, 8); vi.rate = oggpack_read(opb, 32); vi.bitrate_upper = (int)oggpack_read(opb, 32); vi.bitrate_nominal = (int)oggpack_read(opb, 32); vi.bitrate_lower = (int)oggpack_read(opb, 32); bs = (int)oggpack_read(opb, 4); if (bs < 0) { goto err_out; } ci.blocksizes[0] = 1 << bs; bs = (int)oggpack_read(opb, 4); if (bs < 0) { goto err_out; } ci.blocksizes[1] = 1 << bs; if (vi.rate < 1) { goto err_out; } if (vi.channels < 1) { goto err_out; } if (ci.blocksizes[0] < 64) { goto err_out; } if (ci.blocksizes[1] < ci.blocksizes[0]) { goto err_out; } if (ci.blocksizes[1] > 8192) { goto err_out; } if (oggpack_read(opb, 1) != 1) { goto err_out; /* EOP check */ } return(0); err_out: vorbis_info_clear(vi); return(OV_EBADHEADER); }