示例#1
0
        private void OnSampleRequested(MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args)
        {
            if (args.Request.StreamDescriptor is VideoStreamDescriptor)
            {
                var deferral = args.Request.GetDeferral();
                nextSampleReady.WaitOne();

                if (nextSample != null)
                {
                    args.Request.Sample =
                        MediaStreamSample.CreateFromDirect3D11Surface(nextSample.Surface,
                                                                      nextSample.Timestamp - encodingStart);
                    // Manually forcing the surface to be disposed helps with memory consumption
                    // As this is the only consumer, this is safe
                    nextSample.Surface.Dispose();
                }
                else
                {
                    args.Request.Sample = null;
                }

                sampleProcessed.Set();
                deferral.Complete();
            }
        }
        public void Generate(MediaStreamSourceSampleRequest request)
        {
            lock ( m_lock )
            {
                if (m_state != State.Started)
                {
                    request.Sample = null;
                    return;
                }

                if (m_frameAvailable)
                {
                    Debug.Assert(m_currentFrame is not null);

                    m_frameAvailable = false;
                    request.Sample   = MediaStreamSample.CreateFromDirect3D11Surface(m_currentFrame.Surface, m_currentFrame.SystemRelativeTime);
                }
                else
                {
                    m_currentFrame?.Dispose();
                    m_currentFrame = null;

                    m_sampleRequest           = request;
                    m_sampleRequestCompletion = request.GetDeferral();
                }
            }
        }
示例#3
0
        private void OnMediaStreamSourceSampleRequested(MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args)
        {
            if (_isRecording && !_closed)
            {
                try
                {
                    using (var frame = _frameGenerator.WaitForNewFrame())
                    {
                        if (frame == null)
                        {
                            args.Request.Sample = null;
                            DisposeInternal();
                            return;
                        }

                        if (_isPreviewing)
                        {
                            lock (_previewLock)
                            {
                                _preview.PresentSurface(frame.Surface);
                            }
                        }

                        var timeStamp = frame.SystemRelativeTime;
                        var sample    = MediaStreamSample.CreateFromDirect3D11Surface(frame.Surface, timeStamp);
                        args.Request.Sample = sample;
                    }
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.Message);
                    Debug.WriteLine(e.StackTrace);
                    Debug.WriteLine(e);
                    args.Request.Sample = null;
                    DisposeInternal();
                }
            }
            else
            {
                args.Request.Sample = null;
                DisposeInternal();
            }
        }
        private async void OnMediaStreamSourceSampleRequested(MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args)
        {
            if (_isRecording && !_closed)
            {
                try
                {
                    using (var frame = WaitForNewFrame())
                    {
                        if (frame == null)
                        {
                            args.Request.Sample = null;
                            //Dispose();
                            return;
                        }

                        var timeStamp = frame.SystemRelativeTime;

                        var sample = MediaStreamSample.CreateFromDirect3D11Surface(frame.Surface, timeStamp);

                        args.Request.Sample = sample;
                    }
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.Message);
                    Debug.WriteLine(e.StackTrace);
                    Debug.WriteLine(e);
                    args.Request.Sample = null;
                    Stop();
                    Cleanup();
                }
            }
            else
            {
                args.Request.Sample = null;
                Stop();
                Cleanup();
            }
        }
示例#5
0
        private void OnMediaStreamSourceSampleRequested(MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args)
        {
            if (_isRecording)
            {
                using (var frame = GetNextFrame())
                    using (var lockSession = _multiThread.Lock())
                        using (var sourceTexture = Direct3D11Texture2D.CreateFromDirect3DSurface(frame.Surface))
                            using (var surface = _device.CreateTexture2D(new Direct3D11Texture2DDescription()
                            {
                                Base = sourceTexture.Description2D.Base,
                                MipLevels = sourceTexture.Description2D.MipLevels,
                                ArraySize = sourceTexture.Description2D.ArraySize,
                                Usage = Direct3DUsage.Default,
                                BindFlags = Direct3DBindings.ShaderResource,
                                CpuAccessFlags = 0,
                                MiscFlags = 0
                            }))
                            {
                                var timeStamp = frame.SystemRelativeTime;
                                _deviceContext.CopyResource(surface, frame.Surface);

                                try
                                {
                                    var sample = MediaStreamSample.CreateFromDirect3D11Surface(surface, timeStamp);
                                    args.Request.Sample = sample;
                                }
                                catch (Exception e)
                                {
                                    System.Diagnostics.Debug.WriteLine(e);
                                    args.Request.Sample = null;
                                }
                            }
            }
            else
            {
                args.Request.Sample = null;
            }
        }
        private void OnFrameArrived(Direct3D11CaptureFramePool sender, object args)
        {
            lock ( m_lock )
            {
                var frame = sender.TryGetNextFrame();

                if (m_state != State.Started)
                {
                    frame?.Dispose();
                    return;
                }

                if (m_startRequest is not null)
                {
                    m_startRequest.SetActualStartPosition(frame.SystemRelativeTime);
                    m_startRequestCompletion !.Complete();

                    m_startRequest           = null;
                    m_startRequestCompletion = null;
                }

                if (m_sampleRequest is not null)
                {
                    m_frameAvailable       = false;
                    m_sampleRequest.Sample = MediaStreamSample.CreateFromDirect3D11Surface(frame.Surface, frame.SystemRelativeTime);
                    m_sampleRequestCompletion !.Complete();

                    m_sampleRequest           = null;
                    m_sampleRequestCompletion = null;
                }
                else
                {
                    m_frameAvailable = true;
                }

                m_currentFrame = frame;
            }
        }
        /// <summary>
        /// //Encoding a Win2D surface (CanvasRenderTarget) as a video frame
        /// </summary>
        private async void OnMSSSampleRequested(MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args)
        {
            if (parent != null)
            {
                parent.StartWritingOutput("OnSampleRequested " + frameCounter.ToString(), 0);
            }


            if (unpackList == null)
            {
                if (parent != null)
                {
                    parent.StartWritingOutput("Unpack List Null Error!", 1);
                }

                //this will stop the encoding
                args.Request.Sample = null;
                return;
            }


            int len = unpackList.Count;

            if (frameCounter >= len)
            {
                if (parent != null)
                {
                    parent.StartWritingOutput("Encoding Completed.", 1);
                }

                //this will stop the encoding
                args.Request.Sample = null;
                return;
            }

            if ((frameCounter < 0) || (0 == len))
            {
                if (parent != null)
                {
                    parent.StartWritingOutput("Invalid Frame", 1);
                }

                //this will stop the encoding
                args.Request.Sample = null;
                return;
            }


            //need deferral because CanvasBitmap.LoadAsync takes some time to complete ?
            var deferral = args.Request.GetDeferral();

            ///
            UnpackItem unpackItem = unpackList[frameCounter];

            Windows.Storage.Streams.Buffer buffer = unpackItem.compressedBuffer;

            InMemoryRandomAccessStream inMemoryRandomAccessStream = null;

            using (inMemoryRandomAccessStream = new InMemoryRandomAccessStream())
            {
                await inMemoryRandomAccessStream.WriteAsync(buffer);

                await inMemoryRandomAccessStream.FlushAsync();

                inMemoryRandomAccessStream.Seek(0);


                CanvasBitmap tempBitmap = null;
                try
                {
                    tempBitmap = await CanvasBitmap.LoadAsync(CanvasDevice.GetSharedDevice(), inMemoryRandomAccessStream);
                }
                catch (Exception e)
                {
                    if (parent != null)
                    {
                        parent.StartWritingOutput("CBM Error : " + e.Message, 1);
                    }
                }


                if (tempBitmap != null)
                {
                    CanvasRenderTarget canvasRenderTarget = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), tempBitmap.SizeInPixels.Width, tempBitmap.SizeInPixels.Height, tempBitmap.Dpi);
                    using (CanvasDrawingSession session = canvasRenderTarget.CreateDrawingSession())
                    {
                        session.Clear(Colors.Black);
                        //session.DrawEllipse(new System.Numerics.Vector2(120 + frameCounter * 2, 100), 30, 20, Colors.White);
                        session.DrawImage(tempBitmap);
                    }

                    TimeSpan timeLapsed = unpackItem.frameTime;
                    Timestamp += timeLapsed;

                    //set sample after defferal ? nope ....stop at 1st frame...
                    MediaStreamSample sample = MediaStreamSample.CreateFromDirect3D11Surface(canvasRenderTarget, Timestamp);
                    args.Request.Sample = sample;

                    deferral.Complete();
                }
                else
                {
                    args.Request.Sample = null;
                    deferral.Complete();
                }

                frameCounter++;
            }
        }