Exemplo n.º 1
0
        public CompressedFrame Compress(UncompressedFrame frame)
        {
            int auxiliaryBufferSize = frame.Info.UncompressedSize * 3 / 2;
            int resultBufferSize = HeaderSize + auxiliaryBufferSize;

            var resultBuffer = byteArrayPool.Extract(resultBufferSize);
            int resultSize;

            var partInfoBuffer = partInfoArrayPool.Extract();
            var auxiliaryBuffer = byteArrayPool.Extract(auxiliaryBufferSize);
            var partSizesBuffer = byteArrayPool.Extract(PartCount * sizeof(int));
            fixed (byte* source = frame.DataPooled.Item)
            fixed (byte* auxiliary = auxiliaryBuffer.Item)
            fixed (byte* partSizes = partSizesBuffer.Item)
            fixed (byte* result = resultBuffer.Item)
            {
                if (frame.Info.OriginalWidth == 1280 && frame.Info.OriginalHeight == 720)
                {
                    cc++;
                }
                if (frame.Info.OriginalWidth == 1280 && frame.Info.OriginalHeight == 720 && cc > 20)
                {
                    cc = 0;
                }

                WriteFrameInfo(frame, result);
                var partInfos = partInfoBuffer.Item;
                FillPartInfosForCompression(partInfos, frame.Info, source, auxiliary, result);
                var compressedPartSizesTable = (int*)partSizes;
                for (int i = 0; i < PartCount; i++)
                //Parallel.For(0, PartCount, i =>
                    CompressPart(i, partInfos, compressedPartSizesTable);//);
                var partOffsetsTable = (int*)(result + CompressedFrameInfo.Size);
                FillPartOffsetsTable(partOffsetsTable, compressedPartSizesTable);
                PackCompressedParts(partInfos, result, partOffsetsTable, compressedPartSizesTable);
                resultSize = HeaderSize + partOffsetsTable[LastPartIndex] + compressedPartSizesTable[LastPartIndex];
            }
            partSizesBuffer.Release();
            auxiliaryBuffer.Release();
            partInfoBuffer.Release();

            return new CompressedFrame(resultBuffer, resultSize);
        }
Exemplo n.º 2
0
 private static void WriteFrameInfo(UncompressedFrame frame, byte* result)
 {
     var frameInfo = (CompressedFrameInfo*)result;
     frameInfo->OriginalWidth = frame.Info.OriginalWidth;
     frameInfo->OriginalHeight = frame.Info.OriginalHeight;
     frameInfo->Type = frame.Info.Type;
     frameInfo->MostDetailedMip = frame.Info.MostDetailedMip;
     frameInfo->ColorDiffThreshold = frame.Info.ColorDiffThreshold;
     frameInfo->Timestamp = frame.Info.Timestamp;
     frameInfo->MouseX = (short)frame.Info.MouseX;
     frameInfo->MouseY = (short)frame.Info.MouseY;
 }
Exemplo n.º 3
0
        private unsafe void DoTest(int width, int height, Func<int, uint> getPixel)
        {
            var frameInfo = new FrameInfo(FrameType.Relative, 123456.789f, 0, 0, width, height, 0, 0);
            var uncompressedSizeInPixels = frameInfo.UncompressedSize / 4;
            var pixels = Enumerable.Range(0, uncompressedSizeInPixels).Select(getPixel).ToArray();
            FillAlpha(pixels);

            var frame = new UncompressedFrame(frameInfo, byteArrayPool.Extract(uncompressedSizeInPixels * 4));
            fixed (byte* frameData = frame.DataPooled.Item)
            {
                var frameDataUint = (uint*)frameData;
                for (int i = 0; i < uncompressedSizeInPixels; i++)
                    frameDataUint[i] = pixels[i];
            }
            var compressedFrame = codec.Compress(frame);
            Console.WriteLine(compressedFrame.CompressedSize);
            var decompressedFrame = codec.Decompress(compressedFrame);
            Assert.That(decompressedFrame.Info.AlignedWidth, Is.EqualTo(frame.Info.AlignedWidth));
            Assert.That(decompressedFrame.Info.AlignedHeight, Is.EqualTo(frame.Info.AlignedHeight));
            Assert.That(decompressedFrame.Info.Timestamp, Is.EqualTo(frame.Info.Timestamp));

            var resultPixels = new uint[uncompressedSizeInPixels];
            fixed (byte* resultData = decompressedFrame.DataPooled.Item)
            {
                var resultDataUint = (uint*)resultData;
                for (int i = 0; i < uncompressedSizeInPixels; i++)
                    resultPixels[i] = resultDataUint[i] & 0x00FFFFFF;
            }

            EraseAlpha(pixels);
            Assert.That(resultPixels, Is.EqualTo(pixels));
        }