public void ProcessFrame(ProcessVideoFrameContext context)
        {
            var inputDirect3DSurface = context.InputFrame.Direct3DSurface;

            float anyDpi = 96.0f;
            var   width  = context.OutputFrame.Direct3DSurface.Description.Width;
            var   height = context.OutputFrame.Direct3DSurface.Description.Height;

            // Part 1: Apply effect using Imaging SDK
            CanvasRenderTarget renderTarget = new CanvasRenderTarget(canvasDevice, (float)width, (float)height, anyDpi);

            if (inputDirect3DSurface != null && renderTarget != null)
            {
                if (m_direct3DSurfaceImageSource == null)
                {
                    m_direct3DSurfaceImageSource = new Direct3DSurfaceImageSource();
                }

                m_direct3DSurfaceImageSource.Direct3DSurface = inputDirect3DSurface;
                ((IImageConsumer)m_grayScaleEffect).Source   = m_direct3DSurfaceImageSource;

                if (m_direct3DSurfaceRenderer == null)
                {
                    m_direct3DSurfaceRenderer = new Direct3DSurfaceRenderer();
                }

                m_direct3DSurfaceRenderer.Direct3DSurface = renderTarget;
                m_direct3DSurfaceRenderer.Source          = m_grayScaleEffect;

                var task = m_direct3DSurfaceRenderer.RenderAsync().AsTask();
                task.Wait();

                m_direct3DSurfaceRenderer.Direct3DSurface    = null;
                m_direct3DSurfaceImageSource.Direct3DSurface = null;
            }

            // Part 2: Apply another effect using Win2D
            var size   = context.OutputFrame.Direct3DSurface.Description.Width * context.OutputFrame.Direct3DSurface.Description.Height;
            var colors = Enumerable.Repeat(Colors.Black, size).ToArray();

            var inputBitmap = CanvasBitmap.CreateFromColors(canvasDevice, colors, width, height, anyDpi);

            inputBitmap.CopyPixelsFromBitmap(renderTarget);

            using (CanvasRenderTarget output = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface))
                using (CanvasDrawingSession ds = output.CreateDrawingSession())
                {
                    TimeSpan time = context.InputFrame.RelativeTime.HasValue ? context.InputFrame.RelativeTime.Value : new TimeSpan();

                    float dispX = (float)Math.Cos(time.TotalSeconds) * 75f;
                    float dispY = (float)Math.Sin(time.TotalSeconds) * 75f;

                    ds.Clear(Colors.Black);

                    var dispMap = new DisplacementMapEffect()
                    {
                        Source         = inputBitmap,
                        XChannelSelect = EffectChannelSelect.Red,
                        YChannelSelect = EffectChannelSelect.Green,
                        Amount         = 100f,
                        Displacement   = new Transform2DEffect()
                        {
                            TransformMatrix = Matrix3x2.CreateTranslation(dispX, dispY),
                            Source          = new BorderEffect()
                            {
                                ExtendX = CanvasEdgeBehavior.Mirror,
                                ExtendY = CanvasEdgeBehavior.Mirror,
                                Source  = new TurbulenceEffect()
                                {
                                    Octaves = 3
                                }
                            }
                        }
                    };

                    ds.DrawImage(dispMap, -25f, -25f);
                }

            ((IDisposable)renderTarget).Dispose();
            ((IDisposable)inputBitmap).Dispose();
        }
        public void ProcessFrame(ProcessVideoFrameContext context)
        {
            var inputDirect3DSurface = context.InputFrame.Direct3DSurface;

            float anyDpi = 96.0f;
            var width = context.OutputFrame.Direct3DSurface.Description.Width;
            var height = context.OutputFrame.Direct3DSurface.Description.Height;

            // Part 1: Apply effect using Imaging SDK
            CanvasRenderTarget renderTarget = new CanvasRenderTarget(canvasDevice, (float)width, (float)height, anyDpi);

            if (inputDirect3DSurface != null && renderTarget != null)
            {
                if (m_direct3DSurfaceImageSource == null)
                {
                    m_direct3DSurfaceImageSource = new Direct3DSurfaceImageSource();
                }

                m_direct3DSurfaceImageSource.Direct3DSurface = inputDirect3DSurface;
                ((IImageConsumer)m_grayScaleEffect).Source = m_direct3DSurfaceImageSource;

                if (m_direct3DSurfaceRenderer == null)
                {
                    m_direct3DSurfaceRenderer = new Direct3DSurfaceRenderer();
                }

                m_direct3DSurfaceRenderer.Direct3DSurface = renderTarget;
                m_direct3DSurfaceRenderer.Source = m_grayScaleEffect;

                var task = m_direct3DSurfaceRenderer.RenderAsync().AsTask();
                task.Wait();

                m_direct3DSurfaceRenderer.Direct3DSurface = null;
                m_direct3DSurfaceImageSource.Direct3DSurface = null;
            }

            // Part 2: Apply another effect using Win2D
            var size = context.OutputFrame.Direct3DSurface.Description.Width * context.OutputFrame.Direct3DSurface.Description.Height;
            var colors = Enumerable.Repeat(Colors.Black, size).ToArray();

            var inputBitmap = CanvasBitmap.CreateFromColors(canvasDevice, colors, width, height, anyDpi);
            inputBitmap.CopyPixelsFromBitmap(renderTarget);

            using (CanvasRenderTarget output = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface))
            using (CanvasDrawingSession ds = output.CreateDrawingSession())
            {
                TimeSpan time = context.InputFrame.RelativeTime.HasValue ? context.InputFrame.RelativeTime.Value : new TimeSpan();

                float dispX = (float)Math.Cos(time.TotalSeconds) * 75f;
                float dispY = (float)Math.Sin(time.TotalSeconds) * 75f;

                ds.Clear(Colors.Black);

                var dispMap = new DisplacementMapEffect()
                {
                    Source = inputBitmap,
                    XChannelSelect = EffectChannelSelect.Red,
                    YChannelSelect = EffectChannelSelect.Green,
                    Amount = 100f,
                    Displacement = new Transform2DEffect()
                    {
                        TransformMatrix = Matrix3x2.CreateTranslation(dispX, dispY),
                        Source = new BorderEffect()
                        {
                            ExtendX = CanvasEdgeBehavior.Mirror,
                            ExtendY = CanvasEdgeBehavior.Mirror,
                            Source = new TurbulenceEffect()
                            {
                                Octaves = 3
                            }
                        }
                    }
                };

                ds.DrawImage(dispMap, -25f, -25f);
            }

            ((IDisposable)renderTarget).Dispose();
            ((IDisposable)inputBitmap).Dispose();            
        }