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(); } } }
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(); } }
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++; } }