[PATCH 1/8] mfplat: Implement MFMapDXGIFormatToDX9Format().
Nikolay Sivov
nsivov at codeweavers.com
Tue Nov 3 06:56:02 CST 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplat/mediatype.c | 98 ++++++++++++++++++++++++++++++++++++++
dlls/mfplat/mfplat.spec | 1 +
dlls/mfplat/tests/mfplat.c | 73 ++++++++++++++++++++++++++++
include/mfapi.h | 2 +
4 files changed, 174 insertions(+)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c
index fcaef110038..f3895ca4d49 100644
--- a/dlls/mfplat/mediatype.c
+++ b/dlls/mfplat/mediatype.c
@@ -3211,3 +3211,101 @@ HRESULT WINAPI MFFrameRateToAverageTimePerFrame(UINT32 numerator, UINT32 denomin
return S_OK;
}
+
+/***********************************************************************
+ * MFMapDXGIFormatToDX9Format (mfplat.@)
+ */
+DWORD WINAPI MFMapDXGIFormatToDX9Format(DXGI_FORMAT dxgi_format)
+{
+ switch (dxgi_format)
+ {
+ case DXGI_FORMAT_R32G32B32A32_FLOAT:
+ return D3DFMT_A32B32G32R32F;
+ case DXGI_FORMAT_R16G16B16A16_FLOAT:
+ return D3DFMT_A16B16G16R16F;
+ case DXGI_FORMAT_R16G16B16A16_UNORM:
+ return D3DFMT_A16B16G16R16;
+ case DXGI_FORMAT_R16G16B16A16_SNORM:
+ return D3DFMT_Q16W16V16U16;
+ case DXGI_FORMAT_R32G32_FLOAT:
+ return D3DFMT_G32R32F;
+ case DXGI_FORMAT_R10G10B10A2_UNORM:
+ return D3DFMT_A2B10G10R10;
+ case DXGI_FORMAT_R8G8B8A8_SNORM:
+ return D3DFMT_Q8W8V8U8;
+ case DXGI_FORMAT_R16G16_FLOAT:
+ return D3DFMT_G16R16F;
+ case DXGI_FORMAT_R16G16_UNORM:
+ return D3DFMT_G16R16;
+ case DXGI_FORMAT_R16G16_SNORM:
+ return D3DFMT_V16U16;
+ case DXGI_FORMAT_D32_FLOAT:
+ return D3DFMT_D32F_LOCKABLE;
+ case DXGI_FORMAT_R32_FLOAT:
+ return D3DFMT_R32F;
+ case DXGI_FORMAT_D24_UNORM_S8_UINT:
+ return D3DFMT_D24S8;
+ case DXGI_FORMAT_R8G8_SNORM:
+ return D3DFMT_V8U8;
+ case DXGI_FORMAT_R16_FLOAT:
+ return D3DFMT_R16F;
+ case DXGI_FORMAT_D16_UNORM:
+ return D3DFMT_D16_LOCKABLE;
+ case DXGI_FORMAT_R16_UNORM:
+ return D3DFMT_L16;
+ case DXGI_FORMAT_R8_UNORM:
+ return D3DFMT_L8;
+ case DXGI_FORMAT_A8_UNORM:
+ return D3DFMT_A8;
+ case DXGI_FORMAT_BC1_UNORM:
+ case DXGI_FORMAT_BC1_UNORM_SRGB:
+ return D3DFMT_DXT1;
+ case DXGI_FORMAT_BC2_UNORM:
+ case DXGI_FORMAT_BC2_UNORM_SRGB:
+ return D3DFMT_DXT2;
+ case DXGI_FORMAT_BC3_UNORM:
+ case DXGI_FORMAT_BC3_UNORM_SRGB:
+ return D3DFMT_DXT4;
+ case DXGI_FORMAT_R8G8B8A8_UNORM:
+ return D3DFMT_A8B8G8R8;
+ case DXGI_FORMAT_B8G8R8A8_UNORM:
+ case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
+ case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+ return D3DFMT_A8R8G8B8;
+ case DXGI_FORMAT_B8G8R8X8_UNORM:
+ case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
+ return D3DFMT_X8R8G8B8;
+ case DXGI_FORMAT_AYUV:
+ return MAKEFOURCC('A','Y','U','V');
+ case DXGI_FORMAT_Y410:
+ return MAKEFOURCC('Y','4','1','0');
+ case DXGI_FORMAT_Y416:
+ return MAKEFOURCC('Y','4','1','6');
+ case DXGI_FORMAT_NV12:
+ return MAKEFOURCC('N','V','1','2');
+ case DXGI_FORMAT_P010:
+ return MAKEFOURCC('P','0','1','0');
+ case DXGI_FORMAT_P016:
+ return MAKEFOURCC('P','0','1','6');
+ case DXGI_FORMAT_420_OPAQUE:
+ return MAKEFOURCC('4','2','0','O');
+ case DXGI_FORMAT_YUY2:
+ return D3DFMT_YUY2;
+ case DXGI_FORMAT_Y210:
+ return MAKEFOURCC('Y','2','1','0');
+ case DXGI_FORMAT_Y216:
+ return MAKEFOURCC('Y','2','1','6');
+ case DXGI_FORMAT_NV11:
+ return MAKEFOURCC('N','V','1','1');
+ case DXGI_FORMAT_AI44:
+ return MAKEFOURCC('A','I','4','4');
+ case DXGI_FORMAT_IA44:
+ return MAKEFOURCC('I','A','4','4');
+ case DXGI_FORMAT_P8:
+ return D3DFMT_P8;
+ case DXGI_FORMAT_A8P8:
+ return D3DFMT_A8P8;
+ default:
+ return 0;
+ }
+}
diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec
index 36e009c2db9..8ef40dd20c8 100644
--- a/dlls/mfplat/mfplat.spec
+++ b/dlls/mfplat/mfplat.spec
@@ -131,6 +131,7 @@
@ stdcall MFJoinWorkQueue(long long ptr) rtworkq.RtwqJoinWorkQueue
@ stdcall MFLockPlatform() rtworkq.RtwqLockPlatform
@ stdcall MFLockWorkQueue(long) rtworkq.RtwqLockWorkQueue
+@ stdcall MFMapDXGIFormatToDX9Format(long)
@ stdcall MFPutWaitingWorkItem(long long ptr ptr) rtworkq.RtwqPutWaitingWorkItem
@ stdcall MFPutWorkItem(long ptr ptr)
@ stdcall MFPutWorkItem2(long long ptr ptr)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index a6c8a10f777..4f5cf268d2a 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -108,6 +108,7 @@ static HRESULT (WINAPI *pMFCreateMediaBufferFromMediaType)(IMFMediaType *media_t
DWORD min_alignment, IMFMediaBuffer **buffer);
static HRESULT (WINAPI *pMFCreateDXSurfaceBuffer)(REFIID riid, IUnknown *surface, BOOL bottom_up, IMFMediaBuffer **buffer);
static HRESULT (WINAPI *pMFCreateTrackedSample)(IMFTrackedSample **sample);
+static DWORD (WINAPI *pMFMapDXGIFormatToDX9Format)(DXGI_FORMAT dxgi_format);
static HWND create_window(void)
{
@@ -742,6 +743,7 @@ static void init_functions(void)
X(MFCreateTransformActivate);
X(MFGetPlaneSize);
X(MFGetStrideForBitmapInfoHeader);
+ X(MFMapDXGIFormatToDX9Format);
X(MFPutWaitingWorkItem);
X(MFRegisterLocalByteStreamHandler);
X(MFRegisterLocalSchemeHandler);
@@ -5911,6 +5913,76 @@ static void test_MFFrameRateToAverageTimePerFrame(void)
}
}
+static void test_MFMapDXGIFormatToDX9Format(void)
+{
+ static const struct format_pair
+ {
+ DXGI_FORMAT dxgi_format;
+ DWORD d3d9_format;
+ }
+ formats_map[] =
+ {
+ { DXGI_FORMAT_R32G32B32A32_FLOAT, D3DFMT_A32B32G32R32F },
+ { DXGI_FORMAT_R16G16B16A16_FLOAT, D3DFMT_A16B16G16R16F },
+ { DXGI_FORMAT_R16G16B16A16_UNORM, D3DFMT_A16B16G16R16 },
+ { DXGI_FORMAT_R16G16B16A16_SNORM, D3DFMT_Q16W16V16U16 },
+ { DXGI_FORMAT_R32G32_FLOAT, D3DFMT_G32R32F },
+ { DXGI_FORMAT_R10G10B10A2_UNORM, D3DFMT_A2B10G10R10 },
+ { DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, D3DFMT_A8R8G8B8 },
+ { DXGI_FORMAT_R8G8B8A8_SNORM, D3DFMT_Q8W8V8U8 },
+ { DXGI_FORMAT_R16G16_FLOAT, D3DFMT_G16R16F },
+ { DXGI_FORMAT_R16G16_UNORM, D3DFMT_G16R16 },
+ { DXGI_FORMAT_R16G16_SNORM, D3DFMT_V16U16 },
+ { DXGI_FORMAT_D32_FLOAT, D3DFMT_D32F_LOCKABLE },
+ { DXGI_FORMAT_R32_FLOAT, D3DFMT_R32F },
+ { DXGI_FORMAT_D24_UNORM_S8_UINT, D3DFMT_D24S8 },
+ { DXGI_FORMAT_R8G8_SNORM, D3DFMT_V8U8 },
+ { DXGI_FORMAT_R16_FLOAT, D3DFMT_R16F },
+ { DXGI_FORMAT_R16_UNORM, D3DFMT_L16 },
+ { DXGI_FORMAT_R8_UNORM, D3DFMT_L8 },
+ { DXGI_FORMAT_A8_UNORM, D3DFMT_A8 },
+ { DXGI_FORMAT_BC1_UNORM, D3DFMT_DXT1 },
+ { DXGI_FORMAT_BC1_UNORM_SRGB, D3DFMT_DXT1 },
+ { DXGI_FORMAT_BC2_UNORM, D3DFMT_DXT2 },
+ { DXGI_FORMAT_BC2_UNORM_SRGB, D3DFMT_DXT2 },
+ { DXGI_FORMAT_BC3_UNORM, D3DFMT_DXT4 },
+ { DXGI_FORMAT_BC3_UNORM_SRGB, D3DFMT_DXT4 },
+ { DXGI_FORMAT_B8G8R8A8_UNORM, D3DFMT_A8R8G8B8 },
+ { DXGI_FORMAT_B8G8R8X8_UNORM, D3DFMT_X8R8G8B8 },
+ { DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, D3DFMT_A8R8G8B8 },
+ { DXGI_FORMAT_B8G8R8X8_UNORM_SRGB, D3DFMT_X8R8G8B8 },
+ { DXGI_FORMAT_AYUV, MAKEFOURCC('A','Y','U','V') },
+ { DXGI_FORMAT_Y410, MAKEFOURCC('Y','4','1','0') },
+ { DXGI_FORMAT_Y416, MAKEFOURCC('Y','4','1','6') },
+ { DXGI_FORMAT_NV12, MAKEFOURCC('N','V','1','2') },
+ { DXGI_FORMAT_P010, MAKEFOURCC('P','0','1','0') },
+ { DXGI_FORMAT_P016, MAKEFOURCC('P','0','1','6') },
+ { DXGI_FORMAT_420_OPAQUE, MAKEFOURCC('4','2','0','O') },
+ { DXGI_FORMAT_YUY2, D3DFMT_YUY2 },
+ { DXGI_FORMAT_Y210, MAKEFOURCC('Y','2','1','0') },
+ { DXGI_FORMAT_Y216, MAKEFOURCC('Y','2','1','6') },
+ { DXGI_FORMAT_NV11, MAKEFOURCC('N','V','1','1') },
+ { DXGI_FORMAT_AI44, MAKEFOURCC('A','I','4','4') },
+ { DXGI_FORMAT_IA44, MAKEFOURCC('I','A','4','4') },
+ { DXGI_FORMAT_P8, D3DFMT_P8 },
+ { DXGI_FORMAT_A8P8, D3DFMT_A8P8 },
+ };
+ unsigned int i;
+ DWORD format;
+
+ if (!pMFMapDXGIFormatToDX9Format)
+ {
+ win_skip("MFMapDXGIFormatToDX9Format is not available.\n");
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(formats_map); ++i)
+ {
+ format = pMFMapDXGIFormatToDX9Format(formats_map[i].dxgi_format);
+ ok(format == formats_map[i].d3d9_format, "Unexpected d3d9 format %#x, dxgi format %#x.\n", format, formats_map[i].dxgi_format);
+ }
+}
+
START_TEST(mfplat)
{
char **argv;
@@ -5970,6 +6042,7 @@ START_TEST(mfplat)
test_MFCreateDXSurfaceBuffer();
test_MFCreateTrackedSample();
test_MFFrameRateToAverageTimePerFrame();
+ test_MFMapDXGIFormatToDX9Format();
CoUninitialize();
}
diff --git a/include/mfapi.h b/include/mfapi.h
index 8661b41fc4e..77875486e54 100644
--- a/include/mfapi.h
+++ b/include/mfapi.h
@@ -22,6 +22,7 @@
#include <mfobjects.h>
#include <mmreg.h>
#include <avrt.h>
+#include <dxgiformat.h>
#if defined(__cplusplus)
extern "C" {
@@ -549,6 +550,7 @@ HRESULT WINAPI MFInitAttributesFromBlob(IMFAttributes *attributes, const UINT8 *
HRESULT WINAPI MFInitMediaTypeFromWaveFormatEx(IMFMediaType *mediatype, const WAVEFORMATEX *format, UINT32 size);
HRESULT WINAPI MFInvokeCallback(IMFAsyncResult *result);
HRESULT WINAPI MFLockPlatform(void);
+DWORD WINAPI MFMapDXGIFormatToDX9Format(DXGI_FORMAT dxgi_format);
HRESULT WINAPI MFPutWaitingWorkItem(HANDLE event, LONG priority, IMFAsyncResult *result, MFWORKITEM_KEY *key);
HRESULT WINAPI MFPutWorkItem(DWORD queue, IMFAsyncCallback *callback, IUnknown *state);
HRESULT WINAPI MFPutWorkItem2(DWORD queue, LONG priority, IMFAsyncCallback *callback, IUnknown *state);
--
2.28.0
More information about the wine-devel
mailing list