Пример #1
0
        public int FastMbAnalyze(int quality)
        {
            // Empirical cut-off value, should be around 16 (~=block size). We use the
            // [8-17] range and favor intra4 at high quality, intra16 for low quality.
            int         q          = quality;
            int         kThreshold = 8 + ((17 - 8) * q / 100);
            int         k;
            Span <uint> dc = stackalloc uint[16];
            uint        m;
            uint        m2;

            for (k = 0; k < 16; k += 4)
            {
                LossyUtils.Mean16x4(this.YuvIn.AsSpan(YOffEnc + (k * WebpConstants.Bps)), dc.Slice(k, 4));
            }

            for (m = 0, m2 = 0, k = 0; k < 16; k++)
            {
                m  += dc[k];
                m2 += dc[k] * dc[k];
            }

            if (kThreshold * m2 < m * m)
            {
                this.SetIntra16Mode(0);   // DC16
            }
            else
            {
                byte[] modes = new byte[16];  // DC4
                this.SetIntra4Mode(modes);
            }

            return(0);
        }
Пример #2
0
        private static void RunMean16x4Test()
        {
            // arrange
            byte[] input =
            {
                154, 145, 102, 115, 127, 129, 126, 125, 126, 120, 133, 152, 157, 153, 119,  94, 104, 116, 111, 113,
                113, 109, 105, 124, 173, 175, 177, 170, 175, 172, 166, 164, 151, 141,  99, 114, 125, 126, 135, 150,
                133, 115, 127, 149, 141, 168, 100,  54, 110, 117, 115, 116, 119, 115, 117, 130, 174, 174, 174, 157,
                146, 171, 166, 158, 117, 140,  96, 111, 119, 119, 136, 171, 188, 134, 121, 126, 136, 119,  59,  77,
                109, 115, 113, 120, 120, 117, 128, 115, 174, 173, 173, 161, 152, 148, 153, 162, 105, 140,  96, 114,
                115, 122, 141, 173, 190, 190, 142, 106, 151,  78,  66, 141, 110, 117, 123, 136, 118, 124, 127, 114,
                173, 175, 166, 155, 155, 159, 159, 158
            };
            uint[] dc         = new uint[4];
            uint[] expectedDc = { 1940, 2139, 2252, 1813 };

            // act
            LossyUtils.Mean16x4(input, dc);

            // assert
            Assert.True(dc.SequenceEqual(expectedDc));
        }