[vlc-devel] [PATCH 3/3] direct3d9: use point interpolation rather than none

Steve Lhomme robux4 at videolabs.io
Wed Mar 22 16:50:51 CET 2017


We could use linear interpolation but in software decoding the decoder pool is
not initialized with black so we would interpolate with uninitialized (green)
lines/colons.
---
 modules/video_output/win32/direct3d9.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index ae0c693..16b0678 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -127,6 +127,9 @@ struct vout_display_sys_t
     D3DPRESENT_PARAMETERS   d3dpp;
     bool                    use_d3d9ex;
 
+    D3DTEXTUREFILTERTYPE    minFilter;
+    D3DTEXTUREFILTERTYPE    magFilter;
+
     // scene objects
     LPDIRECT3DTEXTURE9      d3dtex;
     LPDIRECT3DVERTEXBUFFER9 d3dvtc;
@@ -1294,19 +1297,27 @@ static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt)
     IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
 
     // Set linear filtering quality
-    if (sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR) {
+    /* we can't use linear interpolation in software decoding, the pictures
+     * are not initialized to black */
+    if ( is_d3d9_opaque(vd->source.i_chroma) &&
+         sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR ) {
         //msg_Dbg(vd, "Using D3DTEXF_LINEAR for minification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+        sys->minFilter = D3DTEXF_LINEAR;
     } else {
         //msg_Dbg(vd, "Using D3DTEXF_POINT for minification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
+        sys->minFilter = D3DTEXF_POINT;
     }
-    if (sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) {
+    if ( is_d3d9_opaque(vd->source.i_chroma) &&
+         sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR ) {
         //msg_Dbg(vd, "Using D3DTEXF_LINEAR for magnification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+        sys->magFilter = D3DTEXF_LINEAR;
     } else {
         //msg_Dbg(vd, "Using D3DTEXF_POINT for magnification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+        sys->magFilter = D3DTEXF_POINT;
     }
 
     // set maximum ambient light
@@ -1658,7 +1669,14 @@ static int Direct3D9ImportPicture(vout_display_t *vd,
 
     /* Copy picture surface into texture surface
      * color space conversion happen here */
-    hr = IDirect3DDevice9_StretchRect(sys->d3ddev, source, &vd->sys->sys.rect_src_clipped, destination, NULL, D3DTEXF_NONE );
+    D3DTEXTUREFILTERTYPE filterType;
+    if (sys->sys.rect_src_clipped.right < sys->sys.rect_dest_clipped.right)
+        filterType = sys->magFilter;
+    else if (sys->sys.rect_src_clipped.right > sys->sys.rect_dest_clipped.right)
+        filterType = sys->minFilter;
+    else
+        filterType = D3DTEXF_NONE;
+    hr = IDirect3DDevice9_StretchRect(sys->d3ddev, source, &sys->sys.rect_src_clipped, destination, NULL, filterType );
     IDirect3DSurface9_Release(destination);
     if (FAILED(hr)) {
         msg_Dbg(vd, "Failed IDirect3DDevice9_StretchRect: source 0x%p 0x%0lx",
-- 
2.10.1.windows.1



More information about the vlc-devel mailing list