예제 #1
0
        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);
            }
        }
예제 #2
0
        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));
        }