Exemplo n.º 1
0
        private static void RunFTransformTest()
        {
            // arrange
            byte[] src =
            {
                154, 154, 151, 151, 149, 148, 151, 157, 163, 163, 154, 132, 102,  98, 104, 108, 107, 104, 104, 103,
                101, 106, 123, 119, 170, 171, 172, 171, 168, 175, 171, 173, 151, 151, 149, 150, 147, 147, 146, 159,
                164, 165, 154, 129,  92,  90, 101, 105, 104, 103, 104, 101, 100, 105, 123, 117, 172, 172, 172, 168,
                170, 177, 170, 175, 151, 149, 150, 150, 147, 147, 156, 161, 161, 161, 151, 126,  93,  90, 102, 107,
                104, 103, 104, 101, 104, 104, 122, 117, 172, 172, 170, 168, 170, 177, 172, 175, 150, 149, 152, 151,
                148, 151, 160, 159, 157, 157, 148, 133,  96,  90, 103, 107, 104, 104, 101, 100, 102, 102, 121, 117,
                170, 170, 169, 171, 171, 179, 173, 175
            };
            byte[] reference =
            {
                128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
                129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
                128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
                129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
                129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
                128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
                129, 129, 129, 129, 129, 129, 129, 129
            };
            short[] actualOutput   = new short[16];
            short[] expectedOutput = { 182, 4, 1, 1, 6, 7, -1, -4, 5, 0, -2, 1, 2, 1, 1, 1 };

            // act
            Vp8Encoding.FTransform(src, reference, actualOutput, new int[16]);

            // assert
            Assert.True(expectedOutput.SequenceEqual(actualOutput));
        }
Exemplo n.º 2
0
        private static void RunTwoInverseTransformTest()
        {
            // arrange
            byte[] reference =
            {
                128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
                129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
                128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
                129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
                129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
                128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
                129, 129, 129, 129, 129, 129, 129, 129
            };
            short[] input    = { 1, 216, -48, 0, 96, -24, -48, 24, 0, -24, 24, 0, 0, 0, 0, 0, 38, -240, -72, -24, 0, -24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            byte[]  dst      = new byte[128];
            byte[]  expected =
            {
                161, 160, 149, 105,  78, 127, 156, 170,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0,     0,   0,   0, 160, 160, 133,  85,  81, 129, 155, 167,   0,   0,   0,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0,     0,   0,   0,   0,   0,   0, 156, 147, 109,  76,  85, 130, 153, 163,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0,     0,   0,   0,   0,   0,   0,   0,   0,   0, 152, 128,  87,  83,  88, 132, 152, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0,     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0
            };
            int[] scratch = new int[16];

            // act
            Vp8Encoding.ITransformTwo(reference, input, dst, scratch);

            // assert
            Assert.True(dst.SequenceEqual(expected));
        }
Exemplo n.º 3
0
        public static int ReconstructUv(Vp8EncIterator it, Vp8SegmentInfo dqm, Vp8ModeScore rd, Span <byte> yuvOut, int mode)
        {
            Span <byte>  reference = it.YuvP.AsSpan(Vp8Encoding.Vp8UvModeOffsets[mode]);
            Span <byte>  src       = it.YuvIn.AsSpan(Vp8EncIterator.UOffEnc);
            int          nz        = 0;
            int          n;
            Span <short> tmp     = it.Scratch2.AsSpan(0, 8 * 16);
            Span <int>   scratch = it.Scratch3.AsSpan(0, 16);

            for (n = 0; n < 8; n += 2)
            {
                Vp8Encoding.FTransform2(
                    src.Slice(WebpLookupTables.Vp8ScanUv[n]),
                    reference.Slice(WebpLookupTables.Vp8ScanUv[n]),
                    tmp.Slice(n * 16, 16),
                    tmp.Slice((n + 1) * 16, 16),
                    scratch);
            }

            CorrectDcValues(it, ref dqm.Uv, tmp, rd);

            for (n = 0; n < 8; n += 2)
            {
                nz |= Quantize2Blocks(tmp.Slice(n * 16, 32), rd.UvLevels.AsSpan(n * 16, 32), ref dqm.Uv) << n;
            }

            for (n = 0; n < 8; n += 2)
            {
                Vp8Encoding.ITransformTwo(reference.Slice(WebpLookupTables.Vp8ScanUv[n]), tmp.Slice(n * 16, 32), yuvOut.Slice(WebpLookupTables.Vp8ScanUv[n]), scratch);
            }

            return(nz << 16);
        }
Exemplo n.º 4
0
        public void CollectHistogram(Span <byte> reference, Span <byte> pred, int startBlock, int endBlock)
        {
            int j;

            this.distribution.AsSpan().Clear();
            for (j = startBlock; j < endBlock; j++)
            {
                Vp8Encoding.FTransform(reference.Slice(WebpLookupTables.Vp8DspScan[j]), pred.Slice(WebpLookupTables.Vp8DspScan[j]), this.output, this.scratch);

                // Convert coefficients to bin.
#if SUPPORTS_RUNTIME_INTRINSICS
                if (Avx2.IsSupported)
                {
                    // Load.
                    ref short        outputRef = ref MemoryMarshal.GetReference <short>(this.output);
                    Vector256 <byte> out0      = Unsafe.As <short, Vector256 <byte> >(ref outputRef);

                    // v = abs(out) >> 3
                    Vector256 <ushort> abs0 = Avx2.Abs(out0.AsInt16());
                    Vector256 <short>  v0   = Avx2.ShiftRightArithmetic(abs0.AsInt16(), 3);

                    // bin = min(v, MAX_COEFF_THRESH)
                    Vector256 <short> min0 = Avx2.Min(v0, MaxCoeffThreshVec);

                    // Store.
                    Unsafe.As <short, Vector256 <short> >(ref outputRef) = min0;

                    // Convert coefficients to bin.
                    for (int k = 0; k < 16; ++k)
                    {
                        ++this.distribution[this.output[k]];
                    }
                }
Exemplo n.º 5
0
        public void MakeChroma8Preds()
        {
            Span <byte> left = this.X != 0 ? this.UvLeft.AsSpan() : null;
            Span <byte> top  = this.Y != 0 ? this.UvTop.AsSpan(this.uvTopIdx) : null;

            Vp8Encoding.EncPredChroma8(this.YuvP, left, top);
        }
Exemplo n.º 6
0
        public void MakeLuma16Preds()
        {
            Span <byte> left = this.X != 0 ? this.YLeft.AsSpan() : null;
            Span <byte> top  = this.Y != 0 ? this.YTop.AsSpan(this.yTopIdx) : null;

            Vp8Encoding.EncPredLuma16(this.YuvP, left, top);
        }
Exemplo n.º 7
0
        public static int ReconstructIntra4(Vp8EncIterator it, Vp8SegmentInfo dqm, Span <short> levels, Span <byte> src, Span <byte> yuvOut, int mode)
        {
            Span <byte>  reference = it.YuvP.AsSpan(Vp8Encoding.Vp8I4ModeOffsets[mode]);
            Span <short> tmp       = it.Scratch2.AsSpan(0, 16);
            Span <int>   scratch   = it.Scratch3.AsSpan(0, 16);

            Vp8Encoding.FTransform(src, reference, tmp, scratch);
            int nz = QuantizeBlock(tmp, levels, ref dqm.Y1);

            Vp8Encoding.ITransformOne(reference, tmp, yuvOut, scratch);

            return(nz);
        }
Exemplo n.º 8
0
        public static int ReconstructIntra16(Vp8EncIterator it, Vp8SegmentInfo dqm, Vp8ModeScore rd, Span <byte> yuvOut, int mode)
        {
            Span <byte>  reference = it.YuvP.AsSpan(Vp8Encoding.Vp8I16ModeOffsets[mode]);
            Span <byte>  src       = it.YuvIn.AsSpan(Vp8EncIterator.YOffEnc);
            int          nz        = 0;
            int          n;
            Span <short> shortScratchSpan = it.Scratch2.AsSpan();
            Span <int>   scratch          = it.Scratch3.AsSpan(0, 16);

            shortScratchSpan.Clear();
            scratch.Clear();
            Span <short> dcTmp = shortScratchSpan.Slice(0, 16);
            Span <short> tmp   = shortScratchSpan.Slice(16, 16 * 16);

            for (n = 0; n < 16; n += 2)
            {
                Vp8Encoding.FTransform2(
                    src.Slice(WebpLookupTables.Vp8Scan[n]),
                    reference.Slice(WebpLookupTables.Vp8Scan[n]),
                    tmp.Slice(n * 16, 16),
                    tmp.Slice((n + 1) * 16, 16),
                    scratch);
            }

            Vp8Encoding.FTransformWht(tmp, dcTmp, scratch);
            nz |= QuantizeBlock(dcTmp, rd.YDcLevels, ref dqm.Y2) << 24;

            for (n = 0; n < 16; n += 2)
            {
                // Zero-out the first coeff, so that: a) nz is correct below, and
                // b) finding 'last' non-zero coeffs in SetResidualCoeffs() is simplified.
                tmp[n * 16] = tmp[(n + 1) * 16] = 0;
                nz         |= Quantize2Blocks(tmp.Slice(n * 16, 32), rd.YAcLevels.AsSpan(n * 16, 32), ref dqm.Y1) << n;
            }

            // Transform back.
            LossyUtils.TransformWht(dcTmp, tmp, scratch);
            for (n = 0; n < 16; n += 2)
            {
                Vp8Encoding.ITransformTwo(reference.Slice(WebpLookupTables.Vp8Scan[n]), tmp.Slice(n * 16, 32), yuvOut.Slice(WebpLookupTables.Vp8Scan[n]), scratch);
            }

            return(nz);
        }
Exemplo n.º 9
0
 public void MakeIntra4Preds() => Vp8Encoding.EncPredLuma4(this.YuvP, this.I4Boundary, this.I4BoundaryIdx, this.Scratch.AsSpan(0, 4));