using System; namespace ScreenConnect; public abstract class ScreenCodec : BufferStream { private byte[][] workingBuffers; private long outputCount; public event EventHandler NeedsBufferCycled; protected ScreenCodec() { workingBuffers = new byte[10][]; } public unsafe long Process(IBitmapData bitmapData) { bitmapData.AssertArgumentNonNull("bitmapData"); bitmapData.PixelModel.CanBlockCopyBgr32.AssertTrue(); long num = outputCount; Process((byte*)(void*)bitmapData.Scan0, bitmapData.Width, bitmapData.Height, bitmapData.Stride); return outputCount - num; } protected unsafe abstract void Process(byte* data, int width, int height, int stride); protected byte[] GetWorkingBuffer(int requiredSizeNotIncludingOverreach, int bufferIndex = 0) { int num = requiredSizeNotIncludingOverreach + 8; if (workingBuffers[bufferIndex] == null || workingBuffers[bufferIndex].Length < num) { workingBuffers[bufferIndex] = new byte[num]; } return workingBuffers[bufferIndex]; } protected override void OnNeedsBufferCycled() { outputCount += base.BufferCompletedCount; this.RaiseEvent(NeedsBufferCycled, EventArgs.Empty); } }