예제 #1
0
 protected virtual void DisposeDirectXResources()
 {
     DwFactory.Dispose();
     RenderTarget.Dispose();
     RenderTargetView.Dispose();
     D2DFactory.Dispose();
     SwapChain.Dispose();
     D3DDeviceContext.Dispose();
     D3DDevice.Dispose();
 }
예제 #2
0
        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();
        }
예제 #3
0
        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);
        }