protected virtual void DisposeDirectXResources() { DwFactory.Dispose(); RenderTarget.Dispose(); RenderTargetView.Dispose(); D2DFactory.Dispose(); SwapChain.Dispose(); D3DDeviceContext.Dispose(); D3DDevice.Dispose(); }
protected override void OnCreatedDevice(D3DDevice d3dDevice, D3DDeviceContext d3dContext) { renderDevice = d3dDevice; renderDeviceContext = d3dContext; mediaShaderInput = new D3DInputLayout(d3dDevice, mediaShaderInputDesc, mediaShaderVertexBytecode); mediaShaderVertex = new D3DVertexShader(d3dDevice, mediaShaderVertexBytecode); mediaShaderPixel = new D3DPixelShader(d3dDevice, mediaPixelShaderBytecode); mediaConstantBuffer = D3DBuffer.Create(d3dDevice, D3DBind.ConstantBuffer, D3DUsage.Default, D3DAccess.None, typeof(MediaConstantBuffer)); mediaVertexBuffer = D3DBuffer.Create(d3dDevice, D3DBind.VertexBuffer, D3DUsage.Dynamic, D3DAccess.Write, mediaVertices); mediaFrameTextureSampler = new D3DSamplerState(d3dDevice, D3DTextureAddressing.Clamp, D3DTextureAddressing.Clamp, D3DTextureFiltering.Anisotropic, 16); mediaFrameRasterizing = new D3DRasterizerState(d3dDevice, D3DFill.Solid, D3DCull.Back, true); mediaFrameBlending = new D3DBlendState(d3dDevice); var pathVariable = Environment.GetEnvironmentVariable("PATH"); Environment.SetEnvironmentVariable("PATH", $"{System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)}\\FFmpeg\\;{pathVariable}"); ffmpegEngine = new FFmpegEngine(HandleMediaEvent); // rtsp_transport tcp // thread_queue_size 1024 // buffer_size 31250000 // max_delay 5000000 // reorder_queue_size 1000 ffmpegEngine.SetSourceOption("hw", "true"); ffmpegEngine.SetSourceOption("rtsp_transport", "tcp"); ffmpegEngine.SetSourceOption("stimeout", "2000000"); // TCP I/O timeout [us] //ffmpegEngine.SetSource("rtsp://*****:*****@192.168.1.64:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_1"); ffmpegEngine.SetSource("rtsp://*****:*****@192.168.1.66:554/onvif-media/media.amp"); ffmpegEngine.Play(); }
protected override void OnDraw(D3DDeviceContext d3dContext) { if (ffmpegEngine.HasFrame(out double framePts, out double frameDur)) { ffmpegEngine.TransferFrame(mediaFrameTexture); //Console.WriteLine($"{mediaFrameShouldEnd:F3}"); //Console.WriteLine($"{framePts:F3} {frameDur:F3} {framePts + frameDur:F3}"); /*if (mediaFrameShouldEnd == 0 || framePts - mediaFrameShouldEnd <= 0.002) * { * ffmpegEngine.TransferFrame(mediaFrameTexture); * * if (framePts != 0) * { * mediaFrameShouldEnd = framePts + frameDur; * } * else * { * mediaFrameShouldEnd += frameDur; * } * }*/ } // input-assembler d3dContext.IASetInputLayout(mediaShaderInput); d3dContext.IASetVertexBuffer(mediaVertexBuffer); d3dContext.IASetPrimitiveTopology(PrimitiveTopology.Triangles); // vertex shader d3dContext.VSSetShader(mediaShaderVertex); d3dContext.VSSetConstantBuffer(mediaConstantBuffer); // pixel shader d3dContext.PSSetShader(mediaShaderPixel); d3dContext.PSSetSampler(mediaFrameTextureSampler); d3dContext.PSSetResources(mediaFrameTextureYView, mediaFrameTextureUVView); // rasterizer - viewport and scissor is set by Wnd3DElement d3dContext.RSSetState(mediaFrameRasterizing); // output-merger d3dContext.OMSetBlendState(mediaFrameBlending); d3dContext.OMSetRenderTarget(mediaRenderTargetView, mediaDepthStencilView); // issue draw commands d3dContext.ClearDepth(mediaDepthStencilView); d3dContext.Draw(mediaVertices.Length); }