override internal Object unpack(Info vi, NVorbis.Ogg.BBuffer opb) { int count = 0, maxclass = -1, rangebits; InfoFloor1 info = new InfoFloor1(); /* read partitions */ info.Partitions = opb.Read(5); /* only 0 to 31 legal */ for (int j = 0; j < info.Partitions; j++) { info.Partitionclass[j] = opb.Read(4); /* only 0 to 15 legal */ if (maxclass < info.Partitionclass[j]) { maxclass = info.Partitionclass[j]; } } /* read partition classes */ for (int j = 0; j < maxclass + 1; j++) { info.class_dim[j] = opb.Read(3) + 1; /* 1 to 8 */ info.class_subs[j] = opb.Read(2); /* 0,1,2,3 bits */ if (info.class_subs[j] < 0) { info.free(); return(null); } if (info.class_subs[j] != 0) { info.class_book[j] = opb.Read(8); } if (info.class_book[j] < 0 || info.class_book[j] >= vi.Books) { info.free(); return(null); } for (int k = 0; k < (1 << info.class_subs[j]); k++) { info.class_subbook[j][k] = opb.Read(8) - 1; if (info.class_subbook[j][k] < -1 || info.class_subbook[j][k] >= vi.Books) { info.free(); return(null); } } } /* read the post list */ info.mult = opb.Read(2) + 1; /* only 1,2,3,4 legal now */ rangebits = opb.Read(4); for (int j = 0, k = 0; j < info.Partitions; j++) { count += info.class_dim[info.Partitionclass[j]]; for (; k < count; k++) { int t = info.postlist[k + 2] = opb.Read(rangebits); if (t < 0 || t >= (1 << rangebits)) { info.free(); return(null); } } } info.postlist[0] = 0; info.postlist[1] = 1 << rangebits; return(info); }
internal override Object unpack(Info vi, NVorbis.Ogg.BBuffer opb) { int count = 0, maxclass = -1, rangebits; InfoFloor1 info = new InfoFloor1(); /* read partitions */ info.Partitions = opb.Read(5); /* only 0 to 31 legal */ for (int j = 0; j < info.Partitions; j++) { info.Partitionclass[j] = opb.Read(4); /* only 0 to 15 legal */ if (maxclass < info.Partitionclass[j]) maxclass = info.Partitionclass[j]; } /* read partition classes */ for (int j = 0; j < maxclass + 1; j++) { info.class_dim[j] = opb.Read(3) + 1; /* 1 to 8 */ info.class_subs[j] = opb.Read(2); /* 0,1,2,3 bits */ if (info.class_subs[j] < 0) { info.free(); return (null); } if (info.class_subs[j] != 0) { info.class_book[j] = opb.Read(8); } if (info.class_book[j] < 0 || info.class_book[j] >= vi.Books) { info.free(); return (null); } for (int k = 0; k < (1 << info.class_subs[j]); k++) { info.class_subbook[j][k] = opb.Read(8) - 1; if (info.class_subbook[j][k] < -1 || info.class_subbook[j][k] >= vi.Books) { info.free(); return (null); } } } /* read the post list */ info.mult = opb.Read(2) + 1; /* only 1,2,3,4 legal now */ rangebits = opb.Read(4); for (int j = 0, k = 0; j < info.Partitions; j++) { count += info.class_dim[info.Partitionclass[j]]; for (; k < count; k++) { int t = info.postlist[k + 2] = opb.Read(rangebits); if (t < 0 || t >= (1 << rangebits)) { info.free(); return (null); } } } info.postlist[0] = 0; info.postlist[1] = 1 << rangebits; return (info); }