[vlc-devel] [PATCH 22/23] dxva2_deinterlace: init the IDirect3DDevice9 from the video context

Steve Lhomme robux4 at ycbcr.xyz
Thu Nov 7 10:31:37 CET 2019


---
 modules/hw/d3d9/dxva2_deinterlace.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/modules/hw/d3d9/dxva2_deinterlace.c b/modules/hw/d3d9/dxva2_deinterlace.c
index 2564752818e..7d8fa2daeb0 100644
--- a/modules/hw/d3d9/dxva2_deinterlace.c
+++ b/modules/hw/d3d9/dxva2_deinterlace.c
@@ -350,6 +350,9 @@ int D3D9OpenDeinterlace(vlc_object_t *obj)
     if (filter->fmt_in.video.i_chroma != VLC_CODEC_D3D9_OPAQUE
      && filter->fmt_in.video.i_chroma != VLC_CODEC_D3D9_OPAQUE_10B)
         return VLC_EGENERIC;
+    if ( filter->vctx_in == NULL ||
+         vlc_video_context_GetType(filter->vctx_in) == VLC_VIDEO_CONTEXT_DXVA2 )
+        return VLC_EGENERIC;
     if (!video_format_IsSimilar(&filter->fmt_in.video, &filter->fmt_out.video))
         return VLC_EGENERIC;
 
@@ -367,14 +370,19 @@ int D3D9OpenDeinterlace(vlc_object_t *obj)
     if (!hdecoder_dll)
         goto error;
 
-    D3DSURFACE_DESC dstDesc;
-    D3D9_FilterHoldInstance( filter, &sys->d3d_dev, &dstDesc );
-    if (!sys->d3d_dev.dev)
+    d3d9_video_context_t *vtcx_sys = GetD3D9ContextPrivate( filter->vctx_in );
+    if (!vtcx_sys)
     {
         msg_Dbg(filter, "Filter without a context");
         goto error;
     }
 
+    if (FAILED(D3D9_CreateDeviceExternal( vtcx_sys->dev, &sys->hd3d, &sys->d3d_dev )))
+    {
+        msg_Dbg(filter, "Failed to use the given video context");
+        goto error;
+    }
+
     HRESULT (WINAPI *CreateVideoService)(IDirect3DDevice9 *,
                                          REFIID riid,
                                          void **ppService);
@@ -389,9 +397,9 @@ int D3D9OpenDeinterlace(vlc_object_t *obj)
 
     DXVA2_VideoDesc dsc;
     ZeroMemory(&dsc, sizeof(dsc));
-    dsc.SampleWidth     = dstDesc.Width;
-    dsc.SampleHeight    = dstDesc.Height;
-    dsc.Format          = dstDesc.Format;
+    dsc.SampleWidth     = filter->fmt_out.video.i_width;
+    dsc.SampleHeight    = filter->fmt_out.video.i_height;
+    dsc.Format = vtcx_sys->format;
     if (filter->fmt_in.video.i_frame_rate && filter->fmt_in.video.i_frame_rate_base) {
         dsc.InputSampleFreq.Numerator   = filter->fmt_in.video.i_frame_rate;
         dsc.InputSampleFreq.Denominator = filter->fmt_in.video.i_frame_rate_base;
@@ -524,6 +532,7 @@ int D3D9OpenDeinterlace(vlc_object_t *obj)
     IDirectXVideoProcessorService_Release(processor);
 
     filter->fmt_out.video   = out_fmt;
+    filter->vctx_out        = filter->vctx_in;
     filter->pf_video_filter = Deinterlace;
     filter->pf_flush        = Flush;
     filter->p_sys = sys;
@@ -536,7 +545,7 @@ error:
         IDirectXVideoProcessor_Release( sys->processor );
     if (processor)
         IDirectXVideoProcessorService_Release(processor);
-    D3D9_FilterReleaseInstance( &sys->d3d_dev );
+    D3D9_ReleaseDevice( &sys->d3d_dev );
     if (hdecoder_dll)
         FreeLibrary(hdecoder_dll);
     D3D9_Destroy( &sys->hd3d );
@@ -552,7 +561,7 @@ void D3D9CloseDeinterlace(vlc_object_t *obj)
 
     IDirect3DSurface9_Release( sys->hw_surface );
     IDirectXVideoProcessor_Release( sys->processor );
-    D3D9_FilterReleaseInstance( &sys->d3d_dev );
+    D3D9_ReleaseDevice( &sys->d3d_dev );
     FreeLibrary( sys->hdecoder_dll );
     D3D9_Destroy( &sys->hd3d );
 
-- 
2.17.1



More information about the vlc-devel mailing list