public void Setup(string fileName, Direct3DDeviceManager devMan = null) { logger.Debug("VideoFileSource::Setup()"); // using (var sourceResolver = new SourceResolver()) { var unkObj = sourceResolver.CreateObjectFromURL(fileName, SourceResolverFlags.MediaSource); var guid = typeof(MediaSource).GUID; unkObj.QueryInterface(ref guid, out var pUnk); mediaSource = new MediaSource(pUnk); } using (var mediaAttributes = new MediaAttributes(IntPtr.Zero)) { MediaFactory.CreateAttributes(mediaAttributes, 5); //mediaAttributes.Set(SourceReaderAttributeKeys.EnableVideoProcessing, 1); if (devMan != null) { //mediaAttributes.Set(SourceReaderAttributeKeys.DisableDxva, 0); mediaAttributes.Set(SourceReaderAttributeKeys.D3DManager, devMan); } //mediaAttributes.Set(CodecApiPropertyKeys.AVLowLatencyMode, false); sourceReader = new SourceReader(mediaSource, mediaAttributes); } var charact = mediaSource.Characteristics; Console.WriteLine(MfTool.LogEnumFlags((MediaSourceCharacteristics)charact)); Console.WriteLine("------------------CurrentMediaType-------------------"); int videoStreamIndex = (int)SourceReaderIndex.FirstVideoStream; using (var currentMediaType = sourceReader.GetCurrentMediaType(videoStreamIndex)) { Console.WriteLine(MfTool.LogMediaType(currentMediaType)); var frameSize = currentMediaType.Get(MediaTypeAttributeKeys.FrameSize); var frameRate = currentMediaType.Get(MediaTypeAttributeKeys.FrameRate); OutputMediaType = new MediaType(); OutputMediaType.Set(MediaTypeAttributeKeys.MajorType, MediaTypeGuids.Video); OutputMediaType.Set(MediaTypeAttributeKeys.Subtype, VideoFormatGuids.NV12); // VideoFormatGuids.Yv12); OutputMediaType.Set(MediaTypeAttributeKeys.FrameSize, frameSize); OutputMediaType.Set(MediaTypeAttributeKeys.FrameRate, frameRate); OutputMediaType.Set(MediaTypeAttributeKeys.InterlaceMode, (int)VideoInterlaceMode.Progressive); OutputMediaType.Set(MediaTypeAttributeKeys.AllSamplesIndependent, 1); sourceReader.SetCurrentMediaType(videoStreamIndex, OutputMediaType); Console.WriteLine("------------------NEW MediaType-------------------"); Console.WriteLine(MfTool.LogMediaType(OutputMediaType)); } }
public MfH264Dxva2Decoder(Direct3DDeviceManager devMan) { this.d3dDeviceManager = devMan; }
public void Setup() { logger.Debug("D3DImageRenderer::Setup()"); if (state != RendererState.Closed) { throw new InvalidOperationException("Invalid capture state " + State); } var DestSize = new Size(1920, 1088); try { //System.Windows.Media.CompositionTarget.Rendering += CompositionTarget_Rendering; direct3D = new Direct3DEx(); var hWnd = MediaToolkit.NativeAPIs.User32.GetDesktopWindow(); var presentParams = new PresentParameters { //Windowed = true, //SwapEffect = SharpDX.Direct3D9.SwapEffect.Discard, //DeviceWindowHandle = IntPtr.Zero, //PresentationInterval = SharpDX.Direct3D9.PresentInterval.Default //BackBufferCount = 1, Windowed = true, MultiSampleType = MultisampleType.None, SwapEffect = SwapEffect.Discard, PresentFlags = PresentFlags.None, }; var flags = CreateFlags.HardwareVertexProcessing | CreateFlags.Multithreaded | CreateFlags.FpuPreserve; int adapterIndex = 0; device = new DeviceEx(direct3D, adapterIndex, SharpDX.Direct3D9.DeviceType.Hardware, hWnd, flags, presentParams); D3DDeviceManager = new Direct3DDeviceManager(); var token = D3DDeviceManager.CreationToken; D3DDeviceManager.ResetDevice(device, token); //using (var resource = sharedTexture.QueryInterface<SharpDX.DXGI.Resource>()) //{ // var handle = resource.SharedHandle; // if (handle == IntPtr.Zero) // { // throw new ArgumentNullException(nameof(handle)); // } // // D3DFMT_A8R8G8B8 или D3DFMT_X8R8G8B8 // // D3DUSAGE_RENDERTARGET // // D3DPOOL_DEFAULT // using (var texture3d9 = new SharpDX.Direct3D9.Texture(device, // descr.Width, descr.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default, // ref handle)) // { // surface = texture3d9.GetSurfaceLevel(0); // }; //} surface = Surface.CreateRenderTarget(device, DestSize.Width, DestSize.Height, Format.A8R8G8B8, MultisampleType.None, 0, true); waitEvent = new AutoResetEvent(false); dispatcher.Invoke(() => { VideoSource = new D3DImage(); VideoSource.Lock(); VideoSource.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.NativePointer); VideoSource.Unlock(); }, DispatcherPriority.Send); state = RendererState.Initialized; //timer.Enabled = true; //timer.Interval = 1000; //timer.Elapsed += Timer_Elapsed; } catch (Exception ex) { logger.Error(ex); CleanUp(); throw; } }