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); }
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; }
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)); }