<div dir="ltr"><div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 31 Jul 2020, 18:03 Jeff Smith, <<a href="mailto:whydoubt@gmail.com" target="_blank">whydoubt@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Jeff Smith <<a href="mailto:whydoubt@gmail.com" rel="noreferrer" target="_blank">whydoubt@gmail.com</a>><br>
---<br>
 dlls/dxva2/Makefile.in       |   3 +-<br>
 dlls/dxva2/dxva2.spec        |   1 +<br>
 dlls/dxva2/dxvahd.c          | 465 ++++++++++++++++++++++++++++++++++<br>
 dlls/dxva2/tests/Makefile.in |   3 +-<br>
 dlls/dxva2/tests/dxvahd.c    | 293 ++++++++++++++++++++++<br>
 include/Makefile.in          |   1 +<br>
 include/dxvahd.idl           | 473 +++++++++++++++++++++++++++++++++++<br>
 7 files changed, 1237 insertions(+), 2 deletions(-)<br>
 create mode 100644 dlls/dxva2/dxvahd.c<br>
 create mode 100644 dlls/dxva2/tests/dxvahd.c<br>
 create mode 100644 include/dxvahd.idl<br>
<br>
diff --git a/dlls/dxva2/Makefile.in b/dlls/dxva2/Makefile.in<br>
index e3fc2fd6c3a..0248c7f20b0 100644<br>
--- a/dlls/dxva2/Makefile.in<br>
+++ b/dlls/dxva2/Makefile.in<br>
@@ -5,4 +5,5 @@ IMPORTLIB = dxva2<br>
 EXTRADLLFLAGS = -mno-cygwin<br>
<br>
 C_SRCS = \<br>
-       main.c<br>
+       main.c \<br>
+       dxvahd.c<br>
diff --git a/dlls/dxva2/dxva2.spec b/dlls/dxva2/dxva2.spec<br>
index 024a972697d..ea7a98718b0 100644<br>
--- a/dlls/dxva2/dxva2.spec<br>
+++ b/dlls/dxva2/dxva2.spec<br>
@@ -1,6 +1,7 @@<br>
 @ stdcall CapabilitiesRequestAndCapabilitiesReply(ptr ptr long)<br>
 @ stdcall DXVA2CreateDirect3DDeviceManager9(ptr ptr)<br>
 @ stdcall DXVA2CreateVideoService(ptr ptr ptr)<br>
+@ stdcall DXVAHD_CreateDevice(ptr ptr long ptr ptr)<br>
 @ stdcall DegaussMonitor(ptr)<br>
 @ stdcall DestroyPhysicalMonitor(ptr)<br>
 @ stdcall DestroyPhysicalMonitors(long ptr)<br>
diff --git a/dlls/dxva2/dxvahd.c b/dlls/dxva2/dxvahd.c<br>
new file mode 100644<br>
index 00000000000..7c197b9a2f8<br>
--- /dev/null<br>
+++ b/dlls/dxva2/dxvahd.c<br>
@@ -0,0 +1,465 @@<br>
+#define COBJMACROS<br>
+<br>
+#include "d3d9.h"<br>
+#include "initguid.h"<br>
+#include "dxvahd.h"<br>
+<br>
+#include "wine/debug.h"<br>
+#include "wine/heap.h"<br>
+<br>
+WINE_DEFAULT_DEBUG_CHANNEL(dxva2);<br>
+<br>
+<br>
+static const D3DFORMAT output_formats[] = {<br>
+    D3DFMT_R8G8B8<br>
+};<br>
+<br>
+static const D3DFORMAT input_formats[] = {<br>
+    MAKEFOURCC('N','V','1','2')<br>
+};<br>
+<br>
+static const DXVAHD_VPCAPS video_processors[] = {<br>
+    {{0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, 0, 0, 0, 0, 0}<br>
+};<br>
+<br>
+static const DXVAHD_VPDEVCAPS dev_caps = {<br>
+    DXVAHD_DEVICE_TYPE_HARDWARE,<br>
+    0,  /* DeviceCaps */<br>
+    0,  /* FeatureCaps */<br>
+    0,  /* FilterCaps */<br>
+    0,  /* InputFormatCaps */<br>
+    D3DPOOL_DEFAULT,<br>
+    ARRAY_SIZE(output_formats),<br>
+    ARRAY_SIZE(input_formats),<br>
+    ARRAY_SIZE(video_processors),<br>
+    1,  /* MaxInputStreams */<br>
+    1   /* MaxStreamStates */<br>
+};<br>
+<br>
+<br>
+struct dxvahd_device<br>
+{<br>
+    IDXVAHD_Device IDXVAHD_Device_iface;<br>
+    LONG refcount;<br>
+    IDirect3DDevice9Ex *d3d_device;<br>
+};<br>
+<br>
+struct dxvahd_vp<br>
+{<br>
+    IDXVAHD_VideoProcessor IDXVAHD_VideoProcessor_iface;<br>
+    LONG refcount;<br>
+    GUID guid;<br>
+};<br>
+<br>
+<br>
+/********************************************<br>
+ * Utility functions<br>
+ */<br>
+<br>
+static struct dxvahd_device *impl_from_IDXVAHD_Device(IDXVAHD_Device *iface)<br>
+{<br>
+    return CONTAINING_RECORD(iface, struct dxvahd_device, IDXVAHD_Device_iface);<br>
+}<br>
+<br>
+static struct dxvahd_vp *impl_from_IDXVAHD_VideoProcessor(IDXVAHD_VideoProcessor *iface)<br>
+{<br>
+    return CONTAINING_RECORD(iface, struct dxvahd_vp, IDXVAHD_VideoProcessor_iface);<br>
+}<br>
+<br>
+static const char *debug_dxvahd_bltstate(DXVAHD_BLT_STATE blt_state)<br>
+{<br>
+    switch (blt_state)<br>
+    {<br>
+#define STATE_TO_STR(e) case e: return #e<br>
+        STATE_TO_STR(DXVAHD_BLT_STATE_TARGET_RECT);<br>
+        STATE_TO_STR(DXVAHD_BLT_STATE_BACKGROUND_COLOR);<br>
+        STATE_TO_STR(DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE);<br>
+        STATE_TO_STR(DXVAHD_BLT_STATE_ALPHA_FILL);<br>
+        STATE_TO_STR(DXVAHD_BLT_STATE_CONSTRICTION);<br>
+        STATE_TO_STR(DXVAHD_BLT_STATE_PRIVATE);<br>
+#undef STATE_TO_STR<br>
+        default:<br>
+            FIXME("Unrecognized blt state %#x.\n", blt_state);<br>
+            return "unrecognized";<br>
+    }<br>
+}<br>
+<br>
+static const char *debug_dxvahd_streamstate(DXVAHD_STREAM_STATE stream_state)<br>
+{<br>
+    switch (stream_state)<br>
+    {<br>
+#define STATE_TO_STR(e) case e: return #e<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_D3DFORMAT);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FRAME_FORMAT);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_OUTPUT_RATE);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_SOURCE_RECT);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_DESTINATION_RECT);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_ALPHA);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_PALETTE);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_LUMA_KEY);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_ASPECT_RATIO);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FILTER_BRIGHTNESS);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FILTER_CONTRAST);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FILTER_HUE);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FILTER_SATURATION);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FILTER_NOISE_REDUCTION);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FILTER_EDGE_ENHANCEMENT);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_FILTER_ANAMORPHIC_SCALING);<br>
+        STATE_TO_STR(DXVAHD_STREAM_STATE_PRIVATE);<br>
+#undef STATE_TO_STR<br>
+        default:<br>
+            FIXME("Unrecognized stream state %#x.\n", stream_state);<br>
+            return "unrecognized";<br>
+    }<br>
+}<br>
+<br>
+static const char *debug_dxvahd_surface_type(DXVAHD_SURFACE_TYPE surface_type)<br>
+{<br>
+    switch (surface_type)<br>
+    {<br>
+#define SURFACE_TYPE_TO_STR(e) case e: return #e<br>
+        SURFACE_TYPE_TO_STR(DXVAHD_SURFACE_TYPE_VIDEO_INPUT);<br>
+        SURFACE_TYPE_TO_STR(DXVAHD_SURFACE_TYPE_VIDEO_INPUT_PRIVATE);<br>
+        SURFACE_TYPE_TO_STR(DXVAHD_SURFACE_TYPE_VIDEO_OUTPUT);<br>
+#undef SURFACE_TYPE_TO_STR<br>
+        default:<br>
+            FIXME("Unrecognized surface type %#x.\n", surface_type);<br>
+            return "unrecognized";<br>
+    }<br>
+}<br>
+<br>
+static const char *debug_dxvahd_filter(DXVAHD_FILTER filter)<br>
+{<br>
+    switch (filter)<br>
+    {<br>
+#define FILTER_TO_STR(e) case e: return #e<br>
+        FILTER_TO_STR(DXVAHD_FILTER_BRIGHTNESS);<br>
+        FILTER_TO_STR(DXVAHD_FILTER_CONTRAST);<br>
+        FILTER_TO_STR(DXVAHD_FILTER_HUE);<br>
+        FILTER_TO_STR(DXVAHD_FILTER_SATURATION);<br>
+        FILTER_TO_STR(DXVAHD_FILTER_NOISE_REDUCTION);<br>
+        FILTER_TO_STR(DXVAHD_FILTER_EDGE_ENHANCEMENT);<br>
+        FILTER_TO_STR(DXVAHD_FILTER_ANAMORPHIC_SCALING);<br>
+#undef FILTER_TO_STR<br>
+        default:<br>
+            FIXME("Unrecognized surface type %#x.\n", filter);<br>
+            return "unrecognized";<br>
+    }<br>
+}<br>
+<br>
+static const char *debug_dxvahd_device_usage(DXVAHD_DEVICE_USAGE usage)<br>
+{<br>
+    switch (usage)<br>
+    {<br>
+#define USAGE_TO_STR(e) case e: return #e<br>
+        USAGE_TO_STR(DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL);<br>
+        USAGE_TO_STR(DXVAHD_DEVICE_USAGE_OPTIMAL_SPEED);<br>
+        USAGE_TO_STR(DXVAHD_DEVICE_USAGE_OPTIMAL_QUALITY);<br>
+#undef USAGE_TO_STR<br>
+        default:<br>
+            FIXME("Unrecognized device usage %#x.\n", usage);<br>
+            return "unrecognized";<br>
+    }<br>
+}<br>
+<br>
+<br>
+/********************************************<br>
+ * IDXVAHD_VideoProcessor functions<br>
+ */<br>
+<br>
+static HRESULT WINAPI dxvahd_vp_QueryInterface(IDXVAHD_VideoProcessor *iface, REFIID riid, void **obj)<br>
+{<br>
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);<br>
+<br>
+    WARN("Unsupported interface %s.\n", debugstr_guid(riid));<br>
+    *obj = NULL;<br>
+    return E_NOINTERFACE;<br>
+}<br>
+<br>
+static ULONG WINAPI dxvahd_vp_AddRef(IDXVAHD_VideoProcessor *iface)<br>
+{<br>
+    struct dxvahd_vp *processor = impl_from_IDXVAHD_VideoProcessor(iface);<br>
+    ULONG refcount = InterlockedIncrement(&processor->refcount);<br>
+<br>
+    TRACE("%p, refcount %u.\n", iface, refcount);<br>
+<br>
+    return refcount;<br>
+}<br>
+<br>
+static ULONG WINAPI dxvahd_vp_Release(IDXVAHD_VideoProcessor *iface)<br>
+{<br>
+    struct dxvahd_vp *processor = impl_from_IDXVAHD_VideoProcessor(iface);<br>
+    ULONG refcount = InterlockedDecrement(&processor->refcount);<br>
+<br>
+    TRACE("%p, refcount %u.\n", iface, refcount);<br>
+<br>
+    if (!refcount)<br>
+    {<br>
+        heap_free(processor);<br>
+    }<br>
+<br>
+    return refcount;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_vp_SetVideoProcessBltState(IDXVAHD_VideoProcessor *iface,<br>
+        DXVAHD_BLT_STATE State, UINT DataSize, const void *pData)<br>
+{<br>
+    FIXME("%p, %s, %u, %p.\n", iface, debug_dxvahd_bltstate(State), DataSize, pData);<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_vp_GetVideoProcessBltState(IDXVAHD_VideoProcessor *iface,<br>
+        DXVAHD_BLT_STATE State, UINT DataSize, void *pData)<br>
+{<br>
+    FIXME("%p, %s, %u, %p.\n", iface, debug_dxvahd_bltstate(State), DataSize, pData);<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_vp_SetVideoProcessStreamState(IDXVAHD_VideoProcessor *iface,<br>
+        UINT StreamNumber, DXVAHD_STREAM_STATE State, UINT DataSize, const void *pData)<br>
+{<br>
+    FIXME("%p, %u, %s, %u, %p.\n", iface, StreamNumber, debug_dxvahd_streamstate(State), DataSize, pData);<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_vp_GetVideoProcessStreamState(IDXVAHD_VideoProcessor *iface,<br>
+        UINT StreamNumber, DXVAHD_STREAM_STATE State, UINT DataSize, void *pData)<br>
+{<br>
+    FIXME("%p, %u, %s, %u, %p.\n", iface, StreamNumber, debug_dxvahd_streamstate(State), DataSize, pData);<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_vp_VideoProcessBltHD(IDXVAHD_VideoProcessor *iface,<br>
+        IDirect3DSurface9 *pOutputSurface, UINT OutputFrame, UINT StreamCount,<br>
+        const DXVAHD_STREAM_DATA *pStreams)<br>
+{<br>
+    UINT i;<br>
+<br>
+    FIXME("%p, %p, %u, %u, %p.\n", iface, pOutputSurface, OutputFrame, StreamCount, pStreams);<br>
+<br>
+    for (i = 0; i < StreamCount; i++)<br>
+    {<br>
+        TRACE("stream[%d]: %d %u %u %u %u %p %p %p\n", i, pStreams[i].Enable, pStreams[i].OutputIndex,<br>
+                pStreams[i].InputFrameOrField, pStreams[i].PastFrames, pStreams[i].FutureFrames,<br>
+                pStreams[i].ppPastSurfaces, pStreams[i].pInputSurface, pStreams[i].ppFutureSurfaces);<br>
+    }<br>
+<br>
+    return S_OK;<br>
+}<br>
+<br>
+static const IDXVAHD_VideoProcessorVtbl dxvahd_vp_vtbl =<br>
+{<br>
+    dxvahd_vp_QueryInterface,<br>
+    dxvahd_vp_AddRef,<br>
+    dxvahd_vp_Release,<br>
+    dxvahd_vp_SetVideoProcessBltState,<br>
+    dxvahd_vp_GetVideoProcessBltState,<br>
+    dxvahd_vp_SetVideoProcessStreamState,<br>
+    dxvahd_vp_GetVideoProcessStreamState,<br>
+    dxvahd_vp_VideoProcessBltHD,<br>
+};<br>
+<br>
+<br>
+/********************************************<br>
+ * IDXVAHD_Device functions<br>
+ */<br>
+<br>
+static HRESULT WINAPI dxvahd_device_QueryInterface(IDXVAHD_Device *iface, REFIID riid, void **obj)<br>
+{<br>
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);<br>
+<br>
+    WARN("Unsupported interface %s.\n", debugstr_guid(riid));<br>
+    *obj = NULL;<br>
+    return E_NOINTERFACE;<br>
+}<br>
+<br>
+static ULONG WINAPI dxvahd_device_AddRef(IDXVAHD_Device *iface)<br>
+{<br>
+    struct dxvahd_device *dev = impl_from_IDXVAHD_Device(iface);<br>
+    ULONG refcount = InterlockedIncrement(&dev->refcount);<br>
+<br>
+    TRACE("%p, refcount %u.\n", iface, refcount);<br>
+<br>
+    return refcount;<br>
+}<br>
+<br>
+static ULONG WINAPI dxvahd_device_Release(IDXVAHD_Device *iface)<br>
+{<br>
+    struct dxvahd_device *dev = impl_from_IDXVAHD_Device(iface);<br>
+    ULONG refcount = InterlockedDecrement(&dev->refcount);<br>
+<br>
+    TRACE("%p, refcount %u.\n", iface, refcount);<br>
+<br>
+    if (!refcount)<br>
+    {<br>
+        heap_free(dev);<br>
+    }<br>
+<br>
+    return refcount;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_CreateVideoSurface(IDXVAHD_Device *iface, UINT width, UINT height,<br>
+        D3DFORMAT format, D3DPOOL pool, DWORD usage, DXVAHD_SURFACE_TYPE type, UINT num_surfaces,<br>
+        IDirect3DSurface9 **ppSurface, HANDLE *pSharedHandle)<br>
+{<br>
+    struct dxvahd_device *dev = impl_from_IDXVAHD_Device(iface);<br>
+    UINT i;<br>
+<br>
+    FIXME("%p, %u, %u, %#x, %#x, %#x, %s, %u, %p, %p.\n", iface, width, height, format, pool, usage,<br>
+            debug_dxvahd_surface_type(type), num_surfaces, ppSurface, pSharedHandle);<br>
+<br>
+    if (pool != dev_caps.InputPool || num_surfaces < 1)<br>
+        return E_INVALIDARG;<br>
+<br>
+    // FIXME: Return error result (D3DERR_INVALIDCALL or E_INVALIDARG) on invalid format.<br>
+    //        The formats returned by GetVideoProcessor[Input|Output]Formats functions<br>
+    //        may not comprise the entire set of valid formats.<br>
+<br>
+    for (i = 0; i < num_surfaces; i++)<br>
+    {<br>
+        // TODO: Determine if CreateOffscreenPlainSurface is sufficient to the task,<br>
+        //       or if a separate implementation of IDirect3DSurface9 is warranted.<br>
+        IDirect3DDevice9Ex_CreateOffscreenPlainSurface(dev->d3d_device, width, height, format, pool,<br>
+                ppSurface + i, pSharedHandle);<br>
+        TRACE("Created surface %d: %p.\n", i, ppSurface[i]);<br>
+    }<br>
+<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_GetVideoProcessorDeviceCaps(IDXVAHD_Device *iface,<br>
+        DXVAHD_VPDEVCAPS *pCaps)<br>
+{<br>
+    FIXME("%p, %p.\n", iface, pCaps);<br>
+<br>
+    // TODO: use driver D3DDDICAPS_DXVAHD_GETVPDEVCAPS<br>
+<br>
+    memcpy(pCaps, &dev_caps, sizeof(dev_caps));<br>
+<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_GetVideoProcessorOutputFormats(IDXVAHD_Device *iface, UINT count,<br>
+        D3DFORMAT *pFormats)<br>
+{<br>
+    FIXME("%p, %u, %p.\n", iface, count, pFormats);<br>
+<br>
+    // TODO: use driver D3DDDICAPS_DXVAHD_GETVPOUTPUTFORMATS<br>
+<br>
+    if (count != dev_caps.OutputFormatCount)<br>
+        return E_INVALIDARG;<br>
+    memcpy(pFormats, output_formats, sizeof(output_formats));<br>
+<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_GetVideoProcessorInputFormats(IDXVAHD_Device *iface, UINT count,<br>
+        D3DFORMAT *pFormats)<br>
+{<br>
+    FIXME("%p, %u, %p.\n", iface, count, pFormats);<br>
+<br></blockquote></div></div><div dir="auto">Avoid C++ style comments.</div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // TODO: use driver D3DDDICAPS_DXVAHD_GETVPINPUTFORMATS<br>
+<br>
+    if (count != dev_caps.InputFormatCount)<br>
+        return E_INVALIDARG;<br>
+    memcpy(pFormats, input_formats, sizeof(input_formats));<br>
+    <br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_GetVideoProcessorCaps(IDXVAHD_Device *iface, UINT count,<br>
+        DXVAHD_VPCAPS *pCaps)<br>
+{<br>
+    FIXME("%p, %u, %p.\n", iface, count, pCaps);<br>
+<br></blockquote></div></div><div dir="auto"><span style="font-family:sans-serif">Avoid C++ style comments.</span><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // TODO: use driver D3DDDICAPS_DXVAHD_GETVPCAPS<br>
+<br>
+    if (count != dev_caps.VideoProcessorCount)<br>
+        return E_INVALIDARG;<br>
+    memcpy(pCaps, video_processors, sizeof(video_processors));<br>
+<br>
+    return S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_GetVideoProcessorCustomRates(IDXVAHD_Device *iface,<br>
+        const GUID *pVPGuid, UINT count, DXVAHD_CUSTOM_RATE_DATA *pRates)<br>
+{<br>
+    FIXME("%p, %s, %u, %p.\n", iface, debugstr_guid(pVPGuid), count, pRates);<br>
+<br></blockquote></div></div><div dir="auto"><span style="font-family:sans-serif">Avoid C++ style comments.</span><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // TODO: use driver D3DDDICAPS_DXVAHD_GETVPCUSTOMRATES<br>
+<br>
+    return (!!count) ? E_INVALIDARG : S_OK;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_GetVideoProcessorFilterRange(IDXVAHD_Device *iface,<br>
+        DXVAHD_FILTER filter, DXVAHD_FILTER_RANGE_DATA *pRange)<br>
+{<br>
+    FIXME("%p, %s, %p.\n", iface, debug_dxvahd_filter(filter), pRange);<br>
+<br></blockquote></div></div><div dir="auto"><span style="font-family:sans-serif">Avoid C++ style comments.</span><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // TODO: use driver D3DDDICAPS_DXVAHD_GETVPFILTERRANGE<br>
+<br>
+    return E_INVALIDARG;<br>
+}<br>
+<br>
+static HRESULT WINAPI dxvahd_device_CreateVideoProcessor(IDXVAHD_Device *iface, const GUID *pVPGuid,<br>
+        IDXVAHD_VideoProcessor **ppVideoProcessor)<br>
+{<br>
+    struct dxvahd_vp *object;<br>
+<br>
+    FIXME("%p, %s, %p.\n", iface, debugstr_guid(pVPGuid), ppVideoProcessor);<br>
+<br></blockquote></div></div><div dir="auto"><span style="font-family:sans-serif">Avoid C++ style comments.</span><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // TODO: use driver function CreateVideoProcessor<br>
+<br>
+    if (!(object = heap_alloc_zero(sizeof(*object))))<br>
+        return E_OUTOFMEMORY;<br>
+<br>
+    object->IDXVAHD_VideoProcessor_iface.lpVtbl = &dxvahd_vp_vtbl;<br>
+    object->refcount = 1;<br>
+    memcpy(&object->guid, pVPGuid, sizeof(*pVPGuid));<br>
+<br>
+    *ppVideoProcessor = &object->IDXVAHD_VideoProcessor_iface;<br>
+<br>
+    return S_OK;<br>
+}<br>
+<br>
+static const IDXVAHD_DeviceVtbl dxvahd_device_vtbl =<br>
+{<br>
+    dxvahd_device_QueryInterface,<br>
+    dxvahd_device_AddRef,<br>
+    dxvahd_device_Release,<br>
+    dxvahd_device_CreateVideoSurface,<br>
+    dxvahd_device_GetVideoProcessorDeviceCaps,<br>
+    dxvahd_device_GetVideoProcessorOutputFormats,<br>
+    dxvahd_device_GetVideoProcessorInputFormats,<br>
+    dxvahd_device_GetVideoProcessorCaps,<br>
+    dxvahd_device_GetVideoProcessorCustomRates,<br>
+    dxvahd_device_GetVideoProcessorFilterRange,<br>
+    dxvahd_device_CreateVideoProcessor,<br>
+};<br>
+<br>
+<br>
+HRESULT WINAPI DXVAHD_CreateDevice(IDirect3DDevice9Ex *d3d_device, const DXVAHD_CONTENT_DESC *desc,<br>
+        DXVAHD_DEVICE_USAGE usage, PDXVAHDSW_Plugin plugin, IDXVAHD_Device **device)<br>
+{<br>
+    struct dxvahd_device *object;<br>
+<br>
+    TRACE("%p, %p, %s, %p, %p.\n", d3d_device, desc, debug_dxvahd_device_usage(usage), plugin, device);<br>
+<br>
+    TRACE("Frame Format %d  Input %ux%u @%.2f  Output %ux%u @%.2f\n",<br>
+            desc->InputFrameFormat, desc->InputWidth, desc->InputHeight,<br>
+            (double)desc->InputFrameRate.Numerator / desc->InputFrameRate.Denominator,<br>
+            desc->OutputWidth, desc->OutputHeight,<br>
+            (double)desc->OutputFrameRate.Numerator / desc->OutputFrameRate.Denominator);<br>
+<br>
+    if (!(object = heap_alloc_zero(sizeof(*object))))<br>
+        return E_OUTOFMEMORY;<br>
+<br>
+    object->IDXVAHD_Device_iface.lpVtbl = &dxvahd_device_vtbl;<br>
+    object->refcount = 1;<br>
+    object->d3d_device = d3d_device;<br>
+<br>
+    *device = &object->IDXVAHD_Device_iface;<br>
+<br>
+    return S_OK;<br>
+}<br>
diff --git a/dlls/dxva2/tests/Makefile.in b/dlls/dxva2/tests/Makefile.in<br>
index c86c5ab42fc..b5d70cd94f7 100644<br>
--- a/dlls/dxva2/tests/Makefile.in<br>
+++ b/dlls/dxva2/tests/Makefile.in<br>
@@ -2,4 +2,5 @@ TESTDLL   = dxva2.dll<br>
 IMPORTS   = dxva2 user32 d3d9<br>
<br>
 C_SRCS = \<br>
-       dxva2.c<br>
+       dxva2.c \<br>
+       dxvahd.c<br>
diff --git a/dlls/dxva2/tests/dxvahd.c b/dlls/dxva2/tests/dxvahd.c<br>
new file mode 100644<br>
index 00000000000..e67350dfdb7<br>
--- /dev/null<br>
+++ b/dlls/dxva2/tests/dxvahd.c<br>
@@ -0,0 +1,293 @@<br>
+/*<br>
+ * Copyright 2020 Jeff Smith<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library; if not, write to the Free Software<br>
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA<br>
+ */<br>
+<br>
+#define COBJMACROS<br>
+#include "initguid.h"<br>
+#include "d3d9.h"<br>
+#include "dxvahd.h"<br>
+<br>
+#include "wine/test.h"<br>
+#include "wine/heap.h"<br>
+<br>
+IDirect3DDevice9Ex *d3d_device;<br>
+<br>
+static HWND create_window(void)<br>
+{<br>
+    RECT r = {0, 0, 640, 480};<br>
+<br>
+    AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW | WS_VISIBLE, FALSE);<br>
+<br>
+    return CreateWindowA("static", "d3d9_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,<br>
+            0, 0, r.right - r.left, r.bottom - r.top, NULL, NULL, NULL, NULL);<br>
+}<br>
+<br>
+static IDirect3DDevice9Ex *create_device(IDirect3D9Ex *d3d9, HWND focus_window)<br>
+{<br>
+    D3DPRESENT_PARAMETERS present_parameters = {0};<br>
+    IDirect3DDevice9Ex *device = NULL;<br>
+<br>
+    present_parameters.BackBufferWidth = 640;<br>
+    present_parameters.BackBufferHeight = 480;<br>
+    present_parameters.BackBufferFormat = D3DFMT_A8R8G8B8;<br>
+    present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;<br>
+    present_parameters.hDeviceWindow = focus_window;<br>
+    present_parameters.Windowed = TRUE;<br>
+    present_parameters.EnableAutoDepthStencil = TRUE;<br>
+    present_parameters.AutoDepthStencilFormat = D3DFMT_D24S8;<br>
+<br>
+    IDirect3D9Ex_CreateDeviceEx(d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, focus_window,<br>
+            D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, NULL, &device);<br>
+<br>
+    return device;<br>
+}<br>
+<br>
+static void init_desc(DXVAHD_CONTENT_DESC *desc)<br>
+{<br>
+    desc->InputFrameFormat = DXVAHD_FRAME_FORMAT_PROGRESSIVE;<br>
+    desc->InputFrameRate.Numerator = 30;<br>
+    desc->InputFrameRate.Denominator = 1;<br>
+    desc->InputWidth = 640;<br>
+    desc->InputHeight = 480;<br>
+    desc->OutputFrameRate.Numerator = 30;<br>
+    desc->OutputFrameRate.Denominator = 1;<br>
+    desc->OutputWidth = 640;<br>
+    desc->OutputHeight = 480;<br>
+}<br>
+<br>
+static void test_dxvahd_device(void)<br>
+{<br>
+    IDXVAHD_Device *device, *device2;<br>
+    IDirect3DSurface9 *surfaces[2];<br>
+    HRESULT hr;<br>
+    DXVAHD_CONTENT_DESC desc = {0};<br>
+    DXVAHD_VPDEVCAPS caps = {0};<br>
+    D3DFORMAT *input_formats;<br>
+    D3DFORMAT *output_formats;<br>
+    DXVAHD_VPCAPS *vp_caps;<br>
+    int i;<br>
+<br>
+    init_desc(&desc);<br>
+    hr = DXVAHD_CreateDevice(d3d_device, &desc, DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL, NULL, &device);<br>
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);<br>
+    ok(!!device, "Failed to create DXVA-HD device.\n");<br>
+<br>
+    hr = IDXVAHD_Device_QueryInterface(device, &IID_IDXVAHD_Device, (void **)&device2);<br>
+    ok(hr == E_NOINTERFACE, "IDXVAHD_Device::QueryInterface for IID_IDXVAHD_Device returned %08x, expected E_NOINTERFACE\n", hr);<br>
+    ok(device2 == NULL, "QueryInterface returned interface %p, expected NULL\n", device2);<br>
+<br>
+    hr = IDXVAHD_Device_QueryInterface(device, &IID_IUnknown, (void **)&device2);<br>
+    ok(hr == E_NOINTERFACE, "IDXVAHD_Device::QueryInterface for IID_IUnknown returned %08x, expected E_NOINTERFACE\n", hr);<br>
+    ok(device2 == NULL, "QueryInterface returned interface %p, expected NULL\n", device2);<br>
+<br>
+<br>
+    hr = IDXVAHD_Device_GetVideoProcessorDeviceCaps(device, &caps);<br>
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);<br>
+<br>
+    output_formats = heap_alloc_zero(caps.OutputFormatCount * sizeof(*output_formats));<br>
+    hr = IDXVAHD_Device_GetVideoProcessorOutputFormats(device, caps.OutputFormatCount, output_formats);<br>
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);<br>
+    hr = IDXVAHD_Device_GetVideoProcessorOutputFormats(device, caps.OutputFormatCount + 1, output_formats);<br>
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+    if (caps.OutputFormatCount >= 1)<br>
+    {<br>
+        hr = IDXVAHD_Device_GetVideoProcessorOutputFormats(device, caps.OutputFormatCount - 1, output_formats);<br>
+        ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+    }<br>
+<br>
+    input_formats = heap_alloc_zero(caps.InputFormatCount * sizeof(*input_formats));<br>
+    hr = IDXVAHD_Device_GetVideoProcessorInputFormats(device, caps.InputFormatCount, input_formats);<br>
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);<br>
+    hr = IDXVAHD_Device_GetVideoProcessorInputFormats(device, caps.InputFormatCount + 1, input_formats);<br>
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+    if (caps.InputFormatCount >= 1)<br>
+    {<br>
+        hr = IDXVAHD_Device_GetVideoProcessorInputFormats(device, caps.InputFormatCount - 1, input_formats);<br>
+        ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+    }<br>
+<br>
+    vp_caps = heap_alloc_zero(caps.VideoProcessorCount * sizeof(*vp_caps));<br>
+    hr = IDXVAHD_Device_GetVideoProcessorCaps(device, caps.VideoProcessorCount, vp_caps);<br>
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);<br>
+    hr = IDXVAHD_Device_GetVideoProcessorCaps(device, caps.VideoProcessorCount + 1, vp_caps);<br>
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+    if (caps.VideoProcessorCount >= 1)<br>
+    {<br>
+        hr = IDXVAHD_Device_GetVideoProcessorCaps(device, caps.VideoProcessorCount - 1, vp_caps);<br>
+        ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+    }<br>
+<br>
+<br>
+    /* CreateVideoSurface: Try each input format */<br>
+    for (i = 0; i < caps.InputFormatCount; i++)<br>
+    {<br>
+        hr = IDXVAHD_Device_CreateVideoSurface(device, 2, 2, input_formats[i], caps.InputPool, 0,<br>
+                DXVAHD_SURFACE_TYPE_VIDEO_INPUT, 1, surfaces, NULL);<br>
+        ok(hr == S_OK, "Unexpected hr %#x for input format %#x.\n", hr, input_formats[i]);<br>
+        IDirect3DSurface9_Release(surfaces[0]);<br>
+    }<br>
+<br>
+    /* NOTE: some video surface formats besides those returned by<br>
+     * GetVideoProcessor[Input|Output]Formats may be allowed by CreateVideoSurface. */<br>
+<br>
+    /* CreateVideoSurface: Invalid input format */<br>
+    hr = IDXVAHD_Device_CreateVideoSurface(device, 2, 2, 0xdeadbeef, caps.InputPool, 0,<br>
+            DXVAHD_SURFACE_TYPE_VIDEO_INPUT, 1, surfaces, NULL);<br>
+    todo_wine ok(hr == D3DERR_INVALIDCALL, "Unexpected hr %#x for input format %#x.\n", hr, 0xdeadbeef);<br>
+<br>
+    if (caps.InputFormatCount >= 1)<br>
+    {<br>
+        /* CreateVideoSurface: Request 0 surfaces */<br>
+        hr = IDXVAHD_Device_CreateVideoSurface(device, 2, 2, input_formats[0], caps.InputPool, 0,<br>
+                DXVAHD_SURFACE_TYPE_VIDEO_INPUT, 0, surfaces, NULL);<br>
+        ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+        /* CreateVideoSurface: Wrong pool */<br>
+        hr = IDXVAHD_Device_CreateVideoSurface(device, 2, 2, input_formats[0], caps.InputPool + 1, 0,<br>
+                DXVAHD_SURFACE_TYPE_VIDEO_INPUT, 1, surfaces, NULL);<br>
+        ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);<br>
+    }<br>
+<br>
+<br>
+    heap_free(output_formats);<br>
+    heap_free(input_formats);<br>
+    heap_free(vp_caps);<br>
+    IDXVAHD_Device_Release(device);<br>
+}<br>
+<br>
+static void test_dxvahd_processor(void)<br>
+{<br>
+    IDXVAHD_Device *device;<br>
+    DXVAHD_CONTENT_DESC desc = {0};<br>
+    DXVAHD_VPDEVCAPS caps = {0};<br>
+    D3DFORMAT *input_formats;<br>
+    DXVAHD_VPCAPS *vp_caps;<br>
+    IDXVAHD_VideoProcessor *processor;<br>
+    void *data = heap_alloc_zero(64);<br>
+    HRESULT hr;<br>
+    int i;<br>
+<br>
+    static struct {<br>
+        DXVAHD_BLT_STATE state;<br>
+        ULONG size;<br>
+    } test_blt[] = {<br>
+        {DXVAHD_BLT_STATE_TARGET_RECT, sizeof(DXVAHD_BLT_STATE_TARGET_RECT_DATA)},<br>
+        {DXVAHD_BLT_STATE_BACKGROUND_COLOR, sizeof(DXVAHD_BLT_STATE_BACKGROUND_COLOR_DATA)},<br>
+        {DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE, sizeof(DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE_DATA)},<br>
+        {DXVAHD_BLT_STATE_ALPHA_FILL, sizeof(DXVAHD_BLT_STATE_ALPHA_FILL_DATA)},<br>
+        {DXVAHD_BLT_STATE_CONSTRICTION, sizeof(DXVAHD_BLT_STATE_CONSTRICTION_DATA)},<br>
+    };<br>
+<br>
+    static struct {<br>
+        DXVAHD_STREAM_STATE state;<br>
+        ULONG size;<br>
+    } test_stream[] = {<br>
+        {DXVAHD_STREAM_STATE_D3DFORMAT, sizeof(DXVAHD_STREAM_STATE_D3DFORMAT_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FRAME_FORMAT, sizeof(DXVAHD_STREAM_STATE_FRAME_FORMAT_DATA)},<br>
+        {DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE, sizeof(DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE_DATA)},<br>
+        {DXVAHD_STREAM_STATE_OUTPUT_RATE, sizeof(DXVAHD_STREAM_STATE_OUTPUT_RATE_DATA)},<br>
+        {DXVAHD_STREAM_STATE_SOURCE_RECT, sizeof(DXVAHD_STREAM_STATE_SOURCE_RECT_DATA)},<br>
+        {DXVAHD_STREAM_STATE_DESTINATION_RECT, sizeof(DXVAHD_STREAM_STATE_DESTINATION_RECT_DATA)},<br>
+        {DXVAHD_STREAM_STATE_ALPHA, sizeof(DXVAHD_STREAM_STATE_ALPHA_DATA)},<br>
+        {DXVAHD_STREAM_STATE_PALETTE, sizeof(DXVAHD_STREAM_STATE_PALETTE_DATA)},<br>
+        {DXVAHD_STREAM_STATE_LUMA_KEY, sizeof(DXVAHD_STREAM_STATE_LUMA_KEY_DATA)},<br>
+        {DXVAHD_STREAM_STATE_ASPECT_RATIO, sizeof(DXVAHD_STREAM_STATE_ASPECT_RATIO_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FILTER_BRIGHTNESS, sizeof(DXVAHD_STREAM_STATE_FILTER_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FILTER_CONTRAST, sizeof(DXVAHD_STREAM_STATE_FILTER_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FILTER_HUE, sizeof(DXVAHD_STREAM_STATE_FILTER_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FILTER_SATURATION, sizeof(DXVAHD_STREAM_STATE_FILTER_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FILTER_NOISE_REDUCTION, sizeof(DXVAHD_STREAM_STATE_FILTER_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FILTER_EDGE_ENHANCEMENT, sizeof(DXVAHD_STREAM_STATE_FILTER_DATA)},<br>
+        {DXVAHD_STREAM_STATE_FILTER_ANAMORPHIC_SCALING, sizeof(DXVAHD_STREAM_STATE_FILTER_DATA)},<br>
+    };<br>
+<br>
+    init_desc(&desc);<br>
+    DXVAHD_CreateDevice(d3d_device, &desc, DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL, NULL, &device);<br>
+    IDXVAHD_Device_GetVideoProcessorDeviceCaps(device, &caps);<br>
+    input_formats = heap_alloc_zero(caps.InputFormatCount * sizeof(*input_formats));<br>
+    vp_caps = heap_alloc_zero(caps.VideoProcessorCount * sizeof(*vp_caps));<br>
+    IDXVAHD_Device_GetVideoProcessorCaps(device, caps.VideoProcessorCount, vp_caps);<br>
+<br>
+    hr = IDXVAHD_Device_CreateVideoProcessor(device, &vp_caps[0].VPGuid, &processor);<br>
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);<br>
+<br>
+    for (i = 0; i < ARRAY_SIZE(test_blt); i++)<br>
+    {<br>
+        hr = IDXVAHD_VideoProcessor_GetVideoProcessBltState(processor, test_blt[i].state, test_blt[i].size, data);<br>
+        ok(hr == S_OK, "Unexpected hr %#x for blt state %#x.\n", hr, test_blt[i].state);<br>
+        /* Pass wrong data size for state */<br>
+        hr = IDXVAHD_VideoProcessor_GetVideoProcessBltState(processor, test_blt[i].state, 64, data);<br>
+        todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#x for blt state %#x.\n", hr, test_blt[i].state);<br>
+    }<br>
+<br>
+    for (i = 0; i < ARRAY_SIZE(test_stream); i++)<br>
+    {<br>
+        hr = IDXVAHD_VideoProcessor_GetVideoProcessStreamState(processor, 0, test_stream[i].state, test_stream[i].size, data);<br>
+        ok(hr == S_OK, "Unexpected hr %#x for stream state %#x.\n", hr, test_stream[i].state);<br>
+        /* Pass wrong data size for state */<br>
+        hr = IDXVAHD_VideoProcessor_GetVideoProcessStreamState(processor, 0, test_stream[i].state, 64, data);<br>
+        todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#x for stream state %#x.\n", hr, test_stream[i].state);<br>
+    }<br>
+<br>
+    IDXVAHD_VideoProcessor_Release(processor);<br>
+<br>
+    heap_free(data);<br>
+    heap_free(input_formats);<br>
+    heap_free(vp_caps);<br>
+    IDXVAHD_Device_Release(device);<br>
+}<br>
+<br>
+START_TEST(dxvahd)<br>
+{<br>
+    IDXVAHD_Device *device = NULL;<br>
+    IDirect3D9Ex *d3d;<br>
+    HWND window;<br>
+    HRESULT hr;<br>
+    DXVAHD_CONTENT_DESC desc = {0};<br>
+<br>
+    hr = Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d);<br>
+    if (hr != S_OK)<br>
+    {<br>
+        skip("Failed to create a D3D object, skipping tests.\n");<br>
+        return;<br>
+    }<br>
+<br>
+    window = create_window();<br>
+<br>
+    if (!(d3d_device = create_device(d3d, window)))<br>
+    {<br>
+        skip("Failed to create a D3D device, skipping tests.\n");<br>
+        IDirect3D9_Release(d3d);<br>
+        DestroyWindow(window);<br>
+    }<br>
+<br>
+    init_desc(&desc);<br>
+    hr = DXVAHD_CreateDevice(d3d_device, &desc, DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL, NULL, &device);<br>
+    if (hr == E_NOINTERFACE)<br>
+    {<br>
+        skip("Device does not support DXVA-HD, skipping tests.\n");<br>
+        goto done;<br>
+    }<br>
+    IDXVAHD_Device_Release(device);<br>
+<br>
+    test_dxvahd_device();<br>
+    test_dxvahd_processor();<br>
+<br>
+done:<br>
+    IDirect3DDevice9_Release(d3d_device);<br>
+    IDirect3D9_Release(d3d);<br>
+    DestroyWindow(window);<br>
+}<br>
diff --git a/include/Makefile.in b/include/Makefile.in<br>
index 216adf0d7ae..f986ef42dd5 100644<br>
--- a/include/Makefile.in<br>
+++ b/include/Makefile.in<br>
@@ -268,6 +268,7 @@ SOURCES = \<br>
        dxgitype.idl \<br>
        dxva.h \<br>
        dxva2api.idl \<br>
+       dxvahd.idl \<br>
        dyngraph.idl \<br>
        endpointvolume.idl \<br>
        errorrep.h \<br>
diff --git a/include/dxvahd.idl b/include/dxvahd.idl<br>
new file mode 100644<br>
index 00000000000..b6ed6b3217c<br>
--- /dev/null<br>
+++ b/include/dxvahd.idl<br>
@@ -0,0 +1,473 @@<br>
+/*<br>
+ * Copyright 2020 Jeff Smith<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library; if not, write to the Free Software<br>
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA<br>
+ */<br>
+<br>
+import "unknwn.idl";<br>
+<br>
+cpp_quote("#if 0")<br>
+interface IDirect3DDevice9Ex;<br>
+interface IDirect3DSurface9;<br>
+<br>
+typedef DWORD D3DFORMAT;<br>
+typedef DWORD D3DPOOL;<br>
+typedef DWORD D3DCOLOR;<br>
+cpp_quote("#endif")<br>
+<br>
+<br>
+typedef enum _DXVAHD_FRAME_FORMAT<br>
+{<br>
+    DXVAHD_FRAME_FORMAT_PROGRESSIVE                   = 0,<br>
+    DXVAHD_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST    = 1,<br>
+    DXVAHD_FRAME_FORMAT_INTERLACED_BOTTOM_FIELD_FIRST = 2<br>
+} DXVAHD_FRAME_FORMAT;<br>
+<br>
+typedef enum _DXVAHD_DEVICE_USAGE<br>
+{<br>
+    DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL = 0,<br>
+    DXVAHD_DEVICE_USAGE_OPTIMAL_SPEED   = 1,<br>
+    DXVAHD_DEVICE_USAGE_OPTIMAL_QUALITY = 2<br>
+} DXVAHD_DEVICE_USAGE;<br>
+<br>
+typedef enum _DXVAHD_FILTER<br>
+{<br>
+    DXVAHD_FILTER_BRIGHTNESS         = 0,<br>
+    DXVAHD_FILTER_CONTRAST           = 1,<br>
+    DXVAHD_FILTER_HUE                = 2,<br>
+    DXVAHD_FILTER_SATURATION         = 3,<br>
+    DXVAHD_FILTER_NOISE_REDUCTION    = 4,<br>
+    DXVAHD_FILTER_EDGE_ENHANCEMENT   = 5,<br>
+    DXVAHD_FILTER_ANAMORPHIC_SCALING = 6<br>
+} DXVAHD_FILTER;<br>
+<br>
+typedef enum _DXVAHD_SURFACE_TYPE<br>
+{<br>
+    DXVAHD_SURFACE_TYPE_VIDEO_INPUT         = 0,<br>
+    DXVAHD_SURFACE_TYPE_VIDEO_INPUT_PRIVATE = 1,<br>
+    DXVAHD_SURFACE_TYPE_VIDEO_OUTPUT        = 2<br>
+} DXVAHD_SURFACE_TYPE;<br>
+<br>
+typedef enum _DXVAHD_BLT_STATE<br>
+{<br>
+    DXVAHD_BLT_STATE_TARGET_RECT        = 0,<br>
+    DXVAHD_BLT_STATE_BACKGROUND_COLOR   = 1,<br>
+    DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE = 2,<br>
+    DXVAHD_BLT_STATE_ALPHA_FILL         = 3,<br>
+    DXVAHD_BLT_STATE_CONSTRICTION       = 4,<br>
+    DXVAHD_BLT_STATE_PRIVATE            = 1000<br>
+} DXVAHD_BLT_STATE;<br>
+<br>
+typedef enum _DXVAHD_STREAM_STATE<br>
+{<br>
+    DXVAHD_STREAM_STATE_D3DFORMAT                 = 0,<br>
+    DXVAHD_STREAM_STATE_FRAME_FORMAT              = 1,<br>
+    DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE         = 2,<br>
+    DXVAHD_STREAM_STATE_OUTPUT_RATE               = 3,<br>
+    DXVAHD_STREAM_STATE_SOURCE_RECT               = 4,<br>
+    DXVAHD_STREAM_STATE_DESTINATION_RECT          = 5,<br>
+    DXVAHD_STREAM_STATE_ALPHA                     = 6,<br>
+    DXVAHD_STREAM_STATE_PALETTE                   = 7,<br>
+    DXVAHD_STREAM_STATE_LUMA_KEY                  = 8,<br>
+    DXVAHD_STREAM_STATE_ASPECT_RATIO              = 9,<br>
+    DXVAHD_STREAM_STATE_FILTER_BRIGHTNESS         = 100,<br>
+    DXVAHD_STREAM_STATE_FILTER_CONTRAST           = 101,<br>
+    DXVAHD_STREAM_STATE_FILTER_HUE                = 102,<br>
+    DXVAHD_STREAM_STATE_FILTER_SATURATION         = 103,<br>
+    DXVAHD_STREAM_STATE_FILTER_NOISE_REDUCTION    = 104,<br>
+    DXVAHD_STREAM_STATE_FILTER_EDGE_ENHANCEMENT   = 105,<br>
+    DXVAHD_STREAM_STATE_FILTER_ANAMORPHIC_SCALING = 106,<br>
+    DXVAHD_STREAM_STATE_PRIVATE                   = 1000<br>
+} DXVAHD_STREAM_STATE;<br>
+<br>
+typedef enum _DXVAHD_DEVICE_TYPE<br>
+{<br>
+    DXVAHD_DEVICE_TYPE_HARDWARE  = 0,<br>
+    DXVAHD_DEVICE_TYPE_SOFTWARE  = 1,<br>
+    DXVAHD_DEVICE_TYPE_REFERENCE = 2,<br>
+    DXVAHD_DEVICE_TYPE_OTHER     = 3<br>
+} DXVAHD_DEVICE_TYPE;<br>
+<br>
+typedef enum _DXVAHD_DEVICE_CAPS<br>
+{<br>
+    DXVAHD_DEVICE_CAPS_LINEAR_SPACE            = 0x01,<br>
+    DXVAHD_DEVICE_CAPS_xvYCC                   = 0x02,<br>
+    DXVAHD_DEVICE_CAPS_RGB_RANGE_CONVERSION    = 0x04,<br>
+    DXVAHD_DEVICE_CAPS_YCbCr_MATRIX_CONVERSION = 0x08<br></blockquote></div></div><div dir="auto"><span style="font-family:sans-serif">Avoid C++ style comments.</span><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // Based on DDI, Windows 8.1 should support:<br>
+    // ..._NOMINAL_RANGE = 0x10<br>
+<br>
+} DXVAHD_DEVICE_CAPS;<br>
+<br>
+typedef enum _DXVAHD_FEATURE_CAPS<br>
+{<br>
+    DXVAHD_FEATURE_CAPS_ALPHA_FILL    = 0x01,<br>
+    DXVAHD_FEATURE_CAPS_CONSTRICTION  = 0x02,<br>
+    DXVAHD_FEATURE_CAPS_LUMA_KEY      = 0x04,<br>
+    DXVAHD_FEATURE_CAPS_ALPHA_PALETTE = 0x08<br></blockquote></div></div><div dir="auto"><span style="font-family:sans-serif">Avoid C++ style comments.</span><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    // Based on DDI, Windows 8 should support:<br>
+    // ..._ROTATION = 0x10<br>
+} DXVAHD_FEATURE_CAPS;<br>
+<br>
+typedef enum _DXVAHD_FILTER_CAPS<br>
+{<br>
+    DXVAHD_FILTER_CAPS_BRIGHTNESS         = 0x01,<br>
+    DXVAHD_FILTER_CAPS_CONTRAST           = 0x02,<br>
+    DXVAHD_FILTER_CAPS_HUE                = 0x04,<br>
+    DXVAHD_FILTER_CAPS_SATURATION         = 0x08,<br>
+    DXVAHD_FILTER_CAPS_NOISE_REDUCTION    = 0x10,<br>
+    DXVAHD_FILTER_CAPS_EDGE_ENHANCEMENT   = 0x20,<br>
+    DXVAHD_FILTER_CAPS_ANAMORPHIC_SCALING = 0x40<br>
+} DXVAHD_FILTER_CAPS;<br>
+<br>
+typedef enum _DXVAHD_INPUT_FORMAT_CAPS<br>
+{<br>
+    DXVAHD_INPUT_FORMAT_CAPS_RGB_INTERLACED     = 0x01,<br>
+    DXVAHD_INPUT_FORMAT_CAPS_RGB_PROCAMP        = 0x02,<br>
+    DXVAHD_INPUT_FORMAT_CAPS_RGB_LUMA_KEY       = 0x04,<br>
+    DXVAHD_INPUT_FORMAT_CAPS_PALETTE_INTERLACED = 0x08<br>
+} DXVAHD_INPUT_FORMAT_CAPS;<br>
+<br>
+typedef enum _DXVAHD_ALPHA_FILL_MODE<br>
+{<br>
+    DXVAHD_ALPHA_FILL_MODE_OPAQUE        = 0,<br>
+    DXVAHD_ALPHA_FILL_MODE_BACKGROUND    = 1,<br>
+    DXVAHD_ALPHA_FILL_MODE_DESTINATION   = 2,<br>
+    DXVAHD_ALPHA_FILL_MODE_SOURCE_STREAM = 3<br>
+} DXVAHD_ALPHA_FILL_MODE;<br>
+<br>
+typedef enum _DXVAHD_OUTPUT_RATE<br>
+{<br>
+    DXVAHD_OUTPUT_RATE_NORMAL = 0,<br>
+    DXVAHD_OUTPUT_RATE_HALF   = 1,<br>
+    DXVAHD_OUTPUT_RATE_CUSTOM = 2<br>
+} DXVAHD_OUTPUT_RATE;<br>
+<br>
+<br>
+typedef struct _DXVAHD_RATIONAL<br>
+{<br>
+    UINT Numerator;<br>
+    UINT Denominator;<br>
+} DXVAHD_RATIONAL;<br>
+<br>
+typedef struct _DXVAHD_CONTENT_DESC<br>
+{<br>
+    DXVAHD_FRAME_FORMAT InputFrameFormat;<br>
+    DXVAHD_RATIONAL     InputFrameRate;<br>
+    UINT                InputWidth;<br>
+    UINT                InputHeight;<br>
+    DXVAHD_RATIONAL     OutputFrameRate;<br>
+    UINT                OutputWidth;<br>
+    UINT                OutputHeight;<br>
+} DXVAHD_CONTENT_DESC;<br>
+<br>
+typedef struct _DXVAHD_VPCAPS<br>
+{<br>
+    GUID VPGuid;<br>
+    UINT PastFrames;<br>
+    UINT FutureFrames;<br>
+    UINT ProcessorCaps;<br>
+    UINT ITelecineCaps;<br>
+    UINT CustomRateCount;<br>
+} DXVAHD_VPCAPS;<br>
+<br>
+typedef struct _DXVAHD_CUSTOM_RATE_DATA<br>
+{<br>
+    DXVAHD_RATIONAL CustomRate;<br>
+    UINT            OutputFrames;<br>
+    BOOL            InputInterlaced;<br>
+    UINT            InputFramesOrFields;<br>
+} DXVAHD_CUSTOM_RATE_DATA;<br>
+<br>
+typedef struct _DXVAHD_FILTER_RANGE_DATA<br>
+{<br>
+    INT   Minimum;<br>
+    INT   Maximum;<br>
+    INT   Default;<br>
+    FLOAT Multiplier;<br>
+} DXVAHD_FILTER_RANGE_DATA;<br>
+<br>
+typedef struct _DXVAHD_VPDEVCAPS<br>
+{<br>
+    DXVAHD_DEVICE_TYPE DeviceType;<br>
+    UINT               DeviceCaps;<br>
+    UINT               FeatureCaps;<br>
+    UINT               FilterCaps;<br>
+    UINT               InputFormatCaps;<br>
+    D3DPOOL            InputPool;<br>
+    UINT               OutputFormatCount;<br>
+    UINT               InputFormatCount;<br>
+    UINT               VideoProcessorCount;<br>
+    UINT               MaxInputStreams;<br>
+    UINT               MaxStreamStates;<br>
+} DXVAHD_VPDEVCAPS;<br>
+<br>
+typedef struct _DXVAHD_STREAM_DATA<br>
+{<br>
+    BOOL              Enable;<br>
+    UINT              OutputIndex;<br>
+    UINT              InputFrameOrField;<br>
+    UINT              PastFrames;<br>
+    UINT              FutureFrames;<br>
+    IDirect3DSurface9 **ppPastSurfaces;<br>
+    IDirect3DSurface9 *pInputSurface;<br>
+    IDirect3DSurface9 **ppFutureSurfaces;<br>
+} DXVAHD_STREAM_DATA;<br>
+<br>
+typedef struct _DXVAHD_BLT_STATE_TARGET_RECT_DATA<br>
+{<br>
+    BOOL Enable;<br>
+    RECT TargetRect;<br>
+} DXVAHD_BLT_STATE_TARGET_RECT_DATA;<br>
+<br>
+typedef struct _DXVAHD_COLOR_RGBA<br>
+{<br>
+    FLOAT R;<br>
+    FLOAT G;<br>
+    FLOAT B;<br>
+    FLOAT A;<br>
+} DXVAHD_COLOR_RGBA;<br>
+<br>
+typedef struct _DXVAHD_COLOR_YCbCrA<br>
+{<br>
+    FLOAT Y;<br>
+    FLOAT Cb;<br>
+    FLOAT Cr;<br>
+    FLOAT A;<br>
+} DXVAHD_COLOR_YCbCrA;<br>
+<br>
+typedef union _DXVAHD_COLOR<br>
+{<br>
+    DXVAHD_COLOR_RGBA   RGB;<br>
+    DXVAHD_COLOR_YCbCrA YCbCr;<br>
+} DXVAHD_COLOR;<br>
+<br>
+typedef struct _DXVAHD_BLT_STATE_BACKGROUND_COLOR_DATA<br>
+{<br>
+    BOOL         YCbCr;<br>
+    DXVAHD_COLOR BackgroundColor;<br>
+} DXVAHD_BLT_STATE_BACKGROUND_COLOR_DATA;<br>
+<br>
+typedef struct _DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE_DATA<br>
+{<br>
+    union<br>
+    {<br>
+        struct<br>
+        {<br>
+            UINT Usage : 1;<br>
+            UINT RGB_Range : 1;<br>
+            UINT YCbCr_Matrix : 1;<br>
+            UINT YCbCr_xvYCC : 1;<br>
+            UINT Reserved : 28;<br>
+        };<br>
+        UINT Value;<br>
+    };<br>
+} DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE_DATA;<br>
+<br>
+typedef struct _DXVAHD_BLT_STATE_ALPHA_FILL_DATA<br>
+{<br>
+    DXVAHD_ALPHA_FILL_MODE Mode;<br>
+    UINT                   StreamNumber;<br>
+} DXVAHD_BLT_STATE_ALPHA_FILL_DATA;<br>
+<br>
+typedef struct _DXVAHD_BLT_STATE_CONSTRICTION_DATA<br>
+{<br>
+    BOOL Enable;<br>
+    SIZE Size;<br>
+} DXVAHD_BLT_STATE_CONSTRICTION_DATA;<br>
+<br>
+typedef struct _DXVAHD_BLT_STATE_PRIVATE_DATA<br>
+{<br>
+    GUID Guid;<br>
+    UINT DataSize;<br>
+    void *pData;<br>
+} DXVAHD_BLT_STATE_PRIVATE_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_D3DFORMAT_DATA<br>
+{<br>
+  D3DFORMAT Format;<br>
+} DXVAHD_STREAM_STATE_D3DFORMAT_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_FRAME_FORMAT_DATA<br>
+{<br>
+  DXVAHD_FRAME_FORMAT FrameFormat;<br>
+} DXVAHD_STREAM_STATE_FRAME_FORMAT_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE_DATA<br>
+{<br>
+    union<br>
+    {<br>
+        struct<br>
+        {<br>
+            UINT Type : 1;<br>
+            UINT RGB_Range : 1;<br>
+            UINT YCbCr_Matrix : 1;<br>
+            UINT YCbCr_xvYCC : 1;<br>
+            UINT Reserved : 28;<br>
+        };<br>
+        UINT Value;<br>
+    };<br>
+} DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_OUTPUT_RATE_DATA<br>
+{<br>
+    BOOL               RepeatFrame;<br>
+    DXVAHD_OUTPUT_RATE OutputRate;<br>
+    DXVAHD_RATIONAL    CustomRate;<br>
+} DXVAHD_STREAM_STATE_OUTPUT_RATE_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_SOURCE_RECT_DATA<br>
+{<br>
+    BOOL Enable;<br>
+    RECT SourceRect;<br>
+} DXVAHD_STREAM_STATE_SOURCE_RECT_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_DESTINATION_RECT_DATA<br>
+{<br>
+    BOOL Enable;<br>
+    RECT DestinationRect;<br>
+} DXVAHD_STREAM_STATE_DESTINATION_RECT_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_ALPHA_DATA<br>
+{<br>
+    BOOL  Enable;<br>
+    FLOAT Alpha;<br>
+} DXVAHD_STREAM_STATE_ALPHA_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_PALETTE_DATA<br>
+{<br>
+    UINT     Count;<br>
+    D3DCOLOR *pEntries;<br>
+} DXVAHD_STREAM_STATE_PALETTE_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_LUMA_KEY_DATA<br>
+{<br>
+    BOOL  Enable;<br>
+    FLOAT Lower;<br>
+    FLOAT Upper;<br>
+} DXVAHD_STREAM_STATE_LUMA_KEY_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_ASPECT_RATIO_DATA<br>
+{<br>
+    BOOL            Enable;<br>
+    DXVAHD_RATIONAL SourceAspectRatio;<br>
+    DXVAHD_RATIONAL DestinationAspectRatio;<br>
+} DXVAHD_STREAM_STATE_ASPECT_RATIO_DATA;<br>
+<br>
+typedef struct _DXVAHD_STREAM_STATE_FILTER_DATA<br>
+{<br>
+    BOOL Enable;<br>
+    INT  Level;<br>
+} DXVAHD_STREAM_STATE_FILTER_DATA;<br>
+<br>
+<br></blockquote></div></div><div dir="auto"><span style="font-family:sans-serif"></span><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+// FIXME<br>
+typedef void* PDXVAHDSW_Plugin;<br>
+<br>
+<br>
+interface IDXVAHD_Device;<br>
+interface IDXVAHD_VideoProcessor;<br>
+<br>
+cpp_quote("HRESULT WINAPI DXVAHD_CreateDevice(IDirect3DDevice9Ex *d3d_device, const DXVAHD_CONTENT_DESC *desc, DXVAHD_DEVICE_USAGE usage, PDXVAHDSW_Plugin plugin, IDXVAHD_Device **device);")<br>
+<br>
+/*****************************************************************************<br>
+ * IDXVAHD_Device interface<br>
+ */<br>
+[<br>
+    object,<br>
+    uuid(95f12dfd-d77e-49be-815f-57d579634d6d),<br>
+    local<br>
+]<br>
+interface IDXVAHD_Device : IUnknown<br>
+{<br>
+    HRESULT CreateVideoSurface(<br>
+        [in] UINT width,<br>
+        [in] UINT height,<br>
+        [in] D3DFORMAT format,<br>
+        [in] D3DPOOL pool,<br>
+        [in] DWORD usage,<br>
+        [in] DXVAHD_SURFACE_TYPE type,<br>
+        [in] UINT num_surfaces,<br>
+        [out] IDirect3DSurface9 **ppSurface,<br>
+        [in, out] HANDLE *pSharedHandle);<br>
+<br>
+    HRESULT GetVideoProcessorDeviceCaps(<br>
+        [out] DXVAHD_VPDEVCAPS *pCaps);<br>
+<br>
+    HRESULT GetVideoProcessorOutputFormats(<br>
+        [in] UINT count,<br>
+        [out] D3DFORMAT *pFormats);<br>
+<br>
+    HRESULT GetVideoProcessorInputFormats(<br>
+        [in] UINT count,<br>
+        [out] D3DFORMAT *pFormats);<br>
+<br>
+    HRESULT GetVideoProcessorCaps(<br>
+        [in] UINT count,<br>
+        [out] DXVAHD_VPCAPS *pCaps);<br>
+<br>
+    HRESULT GetVideoProcessorCustomRates(<br>
+        [in] const GUID *pVPGuid,<br>
+        [in] UINT count,<br>
+        [out] DXVAHD_CUSTOM_RATE_DATA *pRates);<br>
+<br>
+    HRESULT GetVideoProcessorFilterRange(<br>
+        [in] DXVAHD_FILTER filter,<br>
+        [out] DXVAHD_FILTER_RANGE_DATA *pRange);<br>
+<br>
+    HRESULT CreateVideoProcessor(<br>
+        [in] const GUID *pVPGuid,<br>
+        [out] IDXVAHD_VideoProcessor **ppVideoProcessor);<br>
+}<br>
+<br>
+<br>
+/*****************************************************************************<br>
+ * IDXVAHD_VideoProcessor interface<br>
+ */<br>
+[<br>
+    object,<br>
+    uuid(95f4edf4-6e03-4cd7-be1b-3075d665aa52),<br>
+    local<br>
+]<br>
+interface IDXVAHD_VideoProcessor : IUnknown<br>
+{<br>
+    HRESULT SetVideoProcessBltState(<br>
+        [in] DXVAHD_BLT_STATE State,<br>
+        [in] UINT DataSize,<br>
+        [in] const void *pData);<br>
+<br>
+    HRESULT GetVideoProcessBltState(<br>
+        [in] DXVAHD_BLT_STATE State,<br>
+        [in] UINT DataSize,<br>
+        [out] void *pData);<br>
+<br>
+    HRESULT SetVideoProcessStreamState(<br>
+        [in] UINT StreamNumber,<br>
+        [in] DXVAHD_STREAM_STATE State,<br>
+        [in] UINT DataSize,<br>
+        [in] const void *pData);<br>
+<br>
+    HRESULT GetVideoProcessStreamState(<br>
+        [in] UINT StreamNumber,<br>
+        [in] DXVAHD_STREAM_STATE State,<br>
+        [in] UINT DataSize,<br>
+        [out] void *pData);<br>
+<br>
+    HRESULT VideoProcessBltHD(<br>
+        [in, out] IDirect3DSurface9 *pOutputSurface,<br>
+        [in] UINT OutputFrame,<br>
+        [in] UINT StreamCount,<br>
+        [in] const DXVAHD_STREAM_DATA *pStreams);<br>
+}<br>
-- <br>
2.23.0<br><br></blockquote><div>Also this needs splitting up.</div><div><br></div><div>Thanks,</div><div>Vijay </div></div></div></div>
</div>