コード例 #1
0
 public Result CreateVideoDecoder(VideoDecoderDescription description, VideoDecoderConfig config, out ID3D11VideoDecoder decoder)
 {
     return(CreateVideoDecoder(ref description, ref config, out decoder));
 }
コード例 #2
0
        private void CreateHarwareAccelerationContext(GraphicsDevice graphicsDevice, AVCodecContext *pAVCodecContext, AVCodec *pCodec)
        {
            var videoDevice  = graphicsDevice?.NativeDevice?.QueryInterface <VideoDevice1>();
            var videoContext = graphicsDevice?.NativeDeviceContext?.QueryInterface <VideoContext1>();

            if (videoDevice == null || videoContext == null)
            {
                return;
            }

            foreach (var profile in FindVideoFormatCompatibleProfiles(videoDevice, *pCodec))
            {
                // Create and configure the video decoder
                var videoDecoderDescription = new VideoDecoderDescription
                {
                    Guid         = profile,
                    SampleWidth  = pAVCodecContext->width,
                    SampleHeight = pAVCodecContext->height,
                    OutputFormat = DecoderOuputFormat,
                };

                videoDevice.GetVideoDecoderConfigCount(ref videoDecoderDescription, out var configCount);
                for (var i = 0; i < configCount; ++i)
                {
                    // get and check the decoder configuration for the profile
                    videoDevice.GetVideoDecoderConfig(ref videoDecoderDescription, i, out var decoderConfig);
                    //if (check to performe on the config)
                    //    continue;

                    // create the decoder from the configuration
                    videoDevice.CreateVideoDecoder(ref videoDecoderDescription, ref decoderConfig, out videoHardwareDecoder);

                    // create the decoder output view
                    var videoDecoderOutputViewDescription = new VideoDecoderOutputViewDescription
                    {
                        DecodeProfile = profile,
                        Dimension     = VdovDimension.Texture2D,
                        Texture2D     = new Texture2DVdov {
                            ArraySlice = 0,
                        },
                    };
                    DecoderOutputTexture = Texture.New2D(graphicsDevice, pAVCodecContext->width, pAVCodecContext->height, (PixelFormat)DecoderOuputFormat, TextureFlags.RenderTarget | TextureFlags.ShaderResource);
                    videoDevice.CreateVideoDecoderOutputView(DecoderOutputTexture.NativeResource, ref videoDecoderOutputViewDescription, out videoHardwareDecoderView);

                    // Create and fill the hardware context
                    var contextd3d11 = ffmpeg.av_d3d11va_alloc_context();

                    var iVideoContext = new ID3D11VideoContext {
                        lpVtbl = (ID3D11VideoContextVtbl *)videoContext.NativePointer
                    };
                    videoContextHandle          = new PinnedObject <ID3D11VideoContext>(iVideoContext);
                    contextd3d11->video_context = (ID3D11VideoContext *)videoContextHandle.Pointer;

                    var iVideoDecoder = new ID3D11VideoDecoder {
                        lpVtbl = (ID3D11VideoDecoderVtbl *)videoHardwareDecoder.NativePointer
                    };
                    videoDecoderHandle    = new PinnedObject <ID3D11VideoDecoder>(iVideoDecoder);
                    contextd3d11->decoder = (ID3D11VideoDecoder *)videoDecoderHandle.Pointer;

                    decoderConfigHandle = new PinnedObject <D3D11_VIDEO_DECODER_CONFIG>(decoderConfig.ToFFmpegDecoderConfig());
                    contextd3d11->cfg   = (D3D11_VIDEO_DECODER_CONFIG *)decoderConfigHandle.Pointer;

                    var iVideoOutputView = new ID3D11VideoDecoderOutputView {
                        lpVtbl = (ID3D11VideoDecoderOutputViewVtbl *)videoHardwareDecoderView.NativePointer
                    };
                    decoderOuputViewsHandle     = new PinnedObject <ID3D11VideoDecoderOutputView>(iVideoOutputView, true);
                    contextd3d11->surface       = (ID3D11VideoDecoderOutputView **)decoderOuputViewsHandle.Pointer;
                    contextd3d11->surface_count = 1;

                    pAVCodecContext->hwaccel_context = contextd3d11;
                }
            }
        }