using System; using System.Collections.Generic; using System.Linq; namespace ScreenConnect; public static class CoderExtensions { public static IList> Process(this IMultiCallCoder coder, ArraySegment inputData, CoderFlushType flushType, int outputBufferSize = 2048) { List> list = new List>(4); CursorBuffer inputBuffer = CursorBuffer.From(inputData); CursorBuffer outputBuffer; do { outputBuffer = CursorBuffer.From(new byte[outputBufferSize]); if (coder.Process(ref inputBuffer, ref outputBuffer, flushType) != CoderProcessResult.Success) { break; } list.Add(outputBuffer.GetCompletedSegment()); } while (!IsCoderFinishedProcessingInput(inputBuffer.RemainingCount, outputBuffer.RemainingCount)); return list; } public unsafe static CoderProcessResult Process(this IMultiCallCoder coder, ArraySegment inputData, ArraySegment outputData, CoderFlushType flushType, out int inputTaken, out int outputProduced) { fixed (byte* array = inputData.Array) { fixed (byte* array2 = outputData.Array) { return coder.Process(array + inputData.Offset, inputData.Count, array2 + outputData.Offset, outputData.Count, flushType, out inputTaken, out outputProduced); } } } public static CoderProcessResult Process(this IMultiCallCoder coder, ref CursorBuffer inputBuffer, ref CursorBuffer outputBuffer, CoderFlushType flushType) { CoderProcessResult result = coder.Process(inputBuffer.GetRemainingSegment(), outputBuffer.GetRemainingSegment(), flushType, out var inputTaken, out var outputProduced); CursorBuffer.Advance(ref inputBuffer, inputTaken); CursorBuffer.Advance(ref outputBuffer, outputProduced); return result; } public static bool IsCoderFinishedProcessingInput(int inputRemainingBytes, int outputRemainingBytes) { if (inputRemainingBytes == 0) { return outputRemainingBytes > 0; } return false; } public static void AssertResult(CoderProcessResult actualResult, params CoderProcessResult[] allowedResults) { if (!Enumerable.Contains(allowedResults, actualResult)) { throw new InvalidOperationException("Bad result from coder: " + actualResult); } } }