<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>