public unsafe void CodeImage(IntPtr scan0, PixelFormat pixelFormat) { var scan0Pointer = scan0.ToPointer(); var result = _x264Net.EncodeFrame(scan0Pointer).Cast <X264Nal>().ToArray(); if (!result.Any()) { return; } var length = result.Sum(x => x.Length); var buffer = _transmitter.AllocateBuffer(length); try { var position = 0; fixed(byte *dataPointer = buffer.Array) { foreach (var x264Nal in result) { NativeMethods.memcpy(dataPointer + buffer.Offset + position, x264Nal.Pointer, (UIntPtr)x264Nal.Length); position += x264Nal.Length; } } _transmitter.SendFrame(buffer); } finally { _transmitter.ReleaseSendBuffer(buffer); } }
public unsafe void CodeImage(IntPtr scan0, PixelFormat pixelFormat) { //var bmpData = _sourceImage.LockBits(new Rectangle(Point.Empty, _sourceImage.Size), ImageLockMode.WriteOnly, pixelFormat); //memcpy(bmpData.Scan0, scan0, (UIntPtr)(bmpData.Stride * bmpData.Height)); //_sourceImage.UnlockBits(bmpData); //var sw1 = Stopwatch.StartNew(); //var bmp = ResizeImage(_sourceImage, 1280, 720); //var e = sw1.ElapsedMilliseconds; //using (bmp) //{ // var lockBits = bmp.LockBits(new Rectangle(Point.Empty, bmp.Size), ImageLockMode.ReadOnly, pixelFormat); // try // { var pointer = scan0.ToPointer(); var result = _x264Net.EncodeFrame(pointer).Cast <X264Nal>().ToArray(); var length = result.Sum(x => x.Length); var data = ArrayPool <byte> .Shared.Rent(length + 6); try { var position = 0; fixed(byte *dataPointer = data) { foreach (var x264Nal in result) { memcpy(dataPointer + position + 6, x264Nal.Pointer, (UIntPtr)x264Nal.Length); position += x264Nal.Length; } } SetImage(data, length).ContinueWith(task => ArrayPool <byte> .Shared.Return(data)); //_fileStream.Write(data, 0, length); } finally { } //} //finally //{ // bmp.UnlockBits(lockBits); //} //} //_fileStream.Write(result, 0, result.Length); //new x264net.X264Frame { } //var bitmap = new Bitmap(_screenInfo.Width, _screenInfo.Height, pixelFormat); //var lockBits =bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), ImageLockMode.WriteOnly, pixelFormat); //try //{ // memcpy(lockBits.Scan0, scan0, new UIntPtr((uint) (lockBits.Height * 4 * lockBits.Width))); //} //finally //{ // bitmap.UnlockBits(lockBits); //} //Task.Run(() => SetImage.Invoke(bitmap)); }