Esempio n. 1
0
 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;
 }
Esempio n. 2
0
    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;
                    }
                }
            }
        }
    }
Esempio n. 3
0
    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;
    }
Esempio n. 4
0
        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);
            }
        }