public VideoPlayer(NodeContext nodeContext) { renderDrawContextHandle = nodeContext.GetGameProvider() .Bind(g => RenderContext.GetShared(g.Services).GetThreadContext()) .GetHandle() ?? throw new ServiceNotFoundException(typeof(IResourceProvider <Game>)); colorSpaceConverter = new ColorSpaceConverter(renderDrawContextHandle.Resource); // Initialize MediaFoundation MediaManagerService.Initialize(); using var mediaEngineAttributes = new MediaEngineAttributes() { // _SRGB doesn't work :/ Getting invalid argument exception later in TransferVideoFrame AudioCategory = SharpDX.Multimedia.AudioStreamCategory.GameMedia, AudioEndpointRole = SharpDX.Multimedia.AudioEndpointRole.Multimedia, VideoOutputFormat = (int)SharpDX.DXGI.Format.B8G8R8A8_UNorm }; var graphicsDevice = renderDrawContextHandle.Resource.GraphicsDevice; var device = SharpDXInterop.GetNativeDevice(graphicsDevice) as Device; if (device != null) { // Add multi thread protection on device (MF is multi-threaded) using var deviceMultithread = device.QueryInterface <DeviceMultithread>(); deviceMultithread.SetMultithreadProtected(true); // Reset device using var manager = new DXGIDeviceManager(); manager.ResetDevice(device); mediaEngineAttributes.DxgiManager = manager; } using var classFactory = new MediaEngineClassFactory(); engine = new MediaEngine(classFactory, mediaEngineAttributes); engine.PlaybackEvent += Engine_PlaybackEvent; }
static IResourceHandle <RenderDrawContext> GetRenderDrawContextHandle(NodeContext nodeContext) { return(nodeContext.GetGameProvider()? .Bind(g => RenderContext.GetShared(g.Services).GetThreadContext()) .GetHandle()); }