using System; namespace ScreenConnect; public class YuvEncoder : YuvCodecBase { public YuvEncoder(int streamCount, Func coderCreatorFunc) : base(streamCount, coderCreatorFunc) { } protected unsafe override void Process(byte* data, int width, int height, int stride, int lumaSize, int chromaSize, int yuvSize, byte* yuvPointer) { byte* ptr = yuvPointer + lumaSize; byte* ptr2 = ptr + chromaSize; byte* ptr3 = yuvPointer; byte* ptr4 = ptr; byte* ptr5 = ptr2; byte* ptr6 = data; for (int i = 0; i < height; i++) { byte* ptr7 = ptr6; for (int j = 0; j < width; j++) { byte b = *(ptr7++); byte b2 = *(ptr7++); byte b3 = *(ptr7++); ptr7++; *(ptr3++) = (byte)(1225 * b3 + 2404 * b2 + 467 * b + 2048 >> 12); *(ptr4++) = (byte)((-691 * b3 - 1357 * b2 + 2048 * b >> 12) + 128); *(ptr5++) = (byte)((2048 * b3 - 1715 * b2 - 333 * b >> 12) + 128); } ptr6 += stride; } switch (base.StreamCount) { case 1: WriteThroughCoder(base.Coders[0], yuvPointer, yuvSize, null, null); break; case 2: WriteThroughCoder(base.Coders[0], yuvPointer, lumaSize, null, null); WriteThroughCoder(base.Coders[1], ptr, chromaSize * 2, null, null); break; case 3: WriteThroughCoder(base.Coders[0], yuvPointer, lumaSize, null, null); WriteThroughCoder(base.Coders[1], ptr, chromaSize, null, null); WriteThroughCoder(base.Coders[2], ptr2, chromaSize, null, null); break; default: throw new ArgumentOutOfRangeException(); } Flush(); } }