public ResidueTemplate( ResidueType residueType, ResidueLimitType limitType, int grouping, ResidueEntry residue, IStaticCodeBook bookAux, IStaticCodeBook booxAuxManaged, IStaticBookBlock booksBase, IStaticBookBlock booksBaseManaged) { ResidueType = residueType; LimitType = limitType; Residue = residue; BookAux = bookAux; BookAuxManaged = booxAuxManaged; BooksBase = booksBase; BooksBaseManaged = booksBaseManaged; Grouping = grouping; }
private static void FillBooks( CodecSetup codecSetup, ResidueEntry r, IStaticCodeBook bookAux, IStaticBookBlock bookBlock) { for (var i = 0; i < r.Partitions; i++) { for (var k = 0; k < 4; k++) { if ((i < bookBlock.Books.Length) && (k < bookBlock.Books[i].Length) && (bookBlock.Books[i][k] != null)) { r.SecondStages[i] |= 1 << k; } } } r.GroupBook = GetOrAddBook(codecSetup, bookAux); var booklist = 0; for (var i = 0; i < r.Partitions; i++) { for (var k = 0; k < 4; k++) { if ((i < bookBlock.Books.Length) && (k < bookBlock.Books[i].Length)) { var sourceBook = bookBlock.Books[i][k]; if (sourceBook != null) { var bookid = GetOrAddBook(codecSetup, sourceBook); r.BookList[booklist++] = bookid; } } } } }
public ResidueLookup(ResidueEntry residue, CodeBook[] fullBooks) { _residue = residue; _phraseBook = fullBooks[residue.GroupBook]; var acc = 0; var maxstage = 0; _partitionBooks = new CodeBook[residue.Partitions][]; for (var j = 0; j < _partitionBooks.Length; j++) { var stages = Encoding.Log(residue.SecondStages[j]); if (stages == 0) { continue; } if (stages > maxstage) { maxstage = stages; } _partitionBooks[j] = new CodeBook[stages]; for (var k = 0; k < stages; k++) { if ((residue.SecondStages[j] & (1 << k)) != 0) { _partitionBooks[j][k] = fullBooks[residue.BookList[acc++]]; } } } _stages = maxstage; }
private static void PackResidue(EncodeBuffer buffer, ResidueEntry residue) { buffer.Write((uint)residue.Begin, 24); buffer.Write((uint)residue.End, 24); buffer.Write((uint)(residue.Grouping - 1), 24); // residue vectors to group and code with a partitioned book buffer.Write((uint)(residue.Partitions - 1), 6); // possible partition choices buffer.Write((uint)residue.GroupBook, 8); // group huffman book var acc = 0; // secondstages is a bitmask; as encoding progresses pass by pass, a // bitmask of one indicates this partition class has bits to write this pass for (var j = 0; j < residue.Partitions; j++) { if (Encoding.Log(residue.SecondStages[j]) > 3) { // yes, this is a minor hack due to not thinking ahead buffer.Write((uint)residue.SecondStages[j], 3); buffer.Write(1, 1); buffer.Write((uint)residue.SecondStages[j] >> 3, 5); } else { buffer.Write((uint)residue.SecondStages[j], 4); // trailing zero } acc += Count(residue.SecondStages[j]); } for (var j = 0; j < acc; j++) { buffer.Write((uint)residue.BookList[j], 8); } }