public void Close() { logger.Debug("D3D9RendererSink::Close()"); if (presentationClock != null) { presentationClock.Dispose(); presentationClock = null; } if (videoRenderer != null) { videoRenderer.Close(); videoRenderer = null; } if (decoder != null) { decoder.Close(); decoder = null; } }
public void Setup(VideoEncoderSettings settings, IntPtr hwnd) { logger.Debug("D3D9RendererSink::Setup()"); this.hWnd = hwnd; this.EncoderSettings = settings; var avgTimePerFrame = MfTool.FrameRateToAverageTimePerFrame(EncoderSettings.FrameRate); this.EncoderSettings.AverageTimePerFrame = avgTimePerFrame; MediaFactory.CreatePresentationClock(out presentationClock); PresentationTimeSource timeSource = null; try { MediaFactory.CreateSystemTimeSource(out timeSource); presentationClock.TimeSource = timeSource; } finally { timeSource?.Dispose(); } videoRenderer = new MfVideoRenderer(); //TODO: нужно настраивать когда декодер пришлет свой формат videoRenderer.Setup(new VideoRendererArgs { hWnd = hWnd, FourCC = new SharpDX.Multimedia.FourCC("NV12"), //FourCC = 0x59565955, //"UYVY", Resolution = settings.Resolution, // //Resolution = new System.Drawing.Size(1920, 1088), FrameRate = settings.FrameRate, //new Tuple<int, int>(settings.FrameRate, 1), }); videoRenderer.RendererStarted += VideoRenderer_RendererStarted; videoRenderer.RendererStopped += VideoRenderer_RendererStopped; videoRenderer.SetPresentationClock(presentationClock); videoRenderer.Resize(new System.Drawing.Rectangle(0, 0, 100, 100)); SharpDX.MediaFoundation.DirectX.Direct3DDeviceManager d3dManager = null; if (EncoderSettings.UseHardware) { d3dManager = videoRenderer.D3DDeviceManager; } decoder = new MfH264Dxva2Decoder(d3dManager); var inputArgs = new MfVideoArgs { Width = EncoderSettings.Resolution.Width, Height = EncoderSettings.Resolution.Height, FrameRate = MfTool.PackToLong(EncoderSettings.FrameRate), LowLatency = EncoderSettings.LowLatency, }; decoder.Setup(inputArgs); }