using DirectShowLib; using System; using System.Runtime.InteropServices; namespace DualScreenDemo.Services { public class MediaServicePrimary : Video { IGraphBuilder graphBuilder; IBaseFilter lavSplitter; IBaseFilter lavVideoDecoder; public IBaseFilter videoRenderer; IMediaControl mediaControl; IBaseFilter sourceFilter; private IVideoWindow videoWindow; public MediaServicePrimary() { } public int Run() => (mediaControl != null) ? mediaControl.Run() : 0; public int Stop() => (mediaControl != null)? mediaControl.Stop() : 0; public int Pause() => (mediaControl != null) ? mediaControl.Pause() : 0; public void VideoPlayerForm_FormClosing() { if (videoWindow != null) { videoWindow.put_Visible(OABool.False); videoWindow.put_Owner(IntPtr.Zero); Marshal.ReleaseComObject(videoWindow); videoWindow = null; } } public void StopAndReleaseResources() { if (mediaControl != null) { mediaControl.Stop(); SafeRelease(ref mediaControl); } SafeRelease(ref videoRenderer); SafeRelease(ref sourceFilter); SafeRelease(ref lavVideoDecoder); SafeRelease(ref lavSplitter); SafeRelease(ref graphBuilder); } public void RenderMediaFile(string filePath, nint Handle, int Width, int Height) { if (videoWindow != null) videoWindow.put_Visible(OABool.False); StopAndReleaseResources(); int hr; graphBuilder = (IGraphBuilder)new FilterGraph(); if (graphBuilder == null) throw new Exception("Failed to create FilterGraph for primary monitor."); graphBuilder.AddSourceFilter(filePath, "Source", out sourceFilter); try { lavSplitter = AddFilterByClsid(graphBuilder, "LAV Splitter", Clsid.LAVSplitter); lavVideoDecoder = AddFilterByClsid(graphBuilder, "LAV Video Decoder", Clsid.LAVVideoDecoder); videoRenderer = AddFilterByClsid(graphBuilder, "Primary Video Renderer", Clsid.VideoRenderer); hr = graphBuilder.AddFilter(videoRenderer, "Primary Video Renderer"); DsError.ThrowExceptionForHR(hr); mediaControl = (IMediaControl)graphBuilder; hr = ConnectFilters(graphBuilder, sourceFilter, "Output", lavSplitter, "Input"); DsError.ThrowExceptionForHR(hr); hr = ConnectFilters(graphBuilder, lavSplitter, "Video", lavVideoDecoder, "Input"); DsError.ThrowExceptionForHR(hr); hr = ConnectFilters(graphBuilder, lavVideoDecoder, "Output", videoRenderer, "VMR Input0"); DsError.ThrowExceptionForHR(hr); videoWindow = videoRenderer as IVideoWindow; if (videoWindow != null) { videoWindow.put_Owner(Handle); videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren); videoWindow.SetWindowPosition(0, 0, Width, Height); videoWindow.put_Visible(OABool.True); } mediaControl.Run(); } catch (Exception ex) { Console.WriteLine("Error initializing graph builder for primary monitor: " + ex.Message); } } } }