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