[PATCH 2/2] mf/tests: Add some tests for video processor MFT.
Nikolay Sivov
nsivov at codeweavers.com
Mon Jun 3 05:11:34 CDT 2019
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mf/tests/mf.c | 155 ++++++++++++++++++++++++++++++++++++++++
include/mfapi.h | 2 +
include/mferror.h | 28 ++++++++
include/mfidl.idl | 2 +
include/mftransform.idl | 7 +-
5 files changed, 193 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index cb2db22d93..cc85221dc0 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -30,6 +30,8 @@
#include "ole2.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
+DEFINE_GUID(MFVideoFormat_P208, 0x38303250, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
+DEFINE_GUID(MFVideoFormat_ABGR32, 0x00000020, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
#undef INITGUID
#include <guiddef.h>
@@ -2021,6 +2023,158 @@ todo_wine
ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
}
+static BOOL is_supported_video_type(const GUID *guid)
+{
+ return IsEqualGUID(guid, &MFVideoFormat_L8)
+ || IsEqualGUID(guid, &MFVideoFormat_L16)
+ || IsEqualGUID(guid, &MFVideoFormat_D16)
+ || IsEqualGUID(guid, &MFVideoFormat_IYUV)
+ || IsEqualGUID(guid, &MFVideoFormat_YV12)
+ || IsEqualGUID(guid, &MFVideoFormat_NV12)
+ || IsEqualGUID(guid, &MFVideoFormat_420O)
+ || IsEqualGUID(guid, &MFVideoFormat_P010)
+ || IsEqualGUID(guid, &MFVideoFormat_P016)
+ || IsEqualGUID(guid, &MFVideoFormat_UYVY)
+ || IsEqualGUID(guid, &MFVideoFormat_YUY2)
+ || IsEqualGUID(guid, &MFVideoFormat_P208)
+ || IsEqualGUID(guid, &MFVideoFormat_NV11)
+ || IsEqualGUID(guid, &MFVideoFormat_AYUV)
+ || IsEqualGUID(guid, &MFVideoFormat_ARGB32)
+ || IsEqualGUID(guid, &MFVideoFormat_RGB32)
+ || IsEqualGUID(guid, &MFVideoFormat_A2R10G10B10)
+ || IsEqualGUID(guid, &MFVideoFormat_A16B16G16R16F)
+ || IsEqualGUID(guid, &MFVideoFormat_RGB24)
+ || IsEqualGUID(guid, &MFVideoFormat_I420)
+ || IsEqualGUID(guid, &MFVideoFormat_YVYU)
+ || IsEqualGUID(guid, &MFVideoFormat_RGB555)
+ || IsEqualGUID(guid, &MFVideoFormat_RGB565)
+ || IsEqualGUID(guid, &MFVideoFormat_RGB8)
+ || IsEqualGUID(guid, &MFVideoFormat_Y216)
+ || IsEqualGUID(guid, &MFVideoFormat_v410)
+ || IsEqualGUID(guid, &MFVideoFormat_Y41P)
+ || IsEqualGUID(guid, &MFVideoFormat_Y41T)
+ || IsEqualGUID(guid, &MFVideoFormat_Y42T)
+ || IsEqualGUID(guid, &MFVideoFormat_ABGR32);
+}
+
+static void test_video_processor(void)
+{
+ DWORD input_count, output_count, input_id, output_id, flags;
+ DWORD input_min, input_max, output_min, output_max, i, count;
+ IMFAttributes *attributes, *attributes2;
+ IMFMediaType *media_type;
+ IMFTransform *transform;
+ HRESULT hr;
+ GUID guid;
+
+ hr = CoInitialize(NULL);
+ ok(hr == S_OK, "Failed to initialize, hr %#x.\n", hr);
+
+ hr = CoCreateInstance(&CLSID_VideoProcessorMFT, NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform,
+ (void **)&transform);
+todo_wine
+ ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG), "Failed to create video processor transform, hr %#x.\n", hr);
+
+ if (FAILED(hr))
+ goto failed;
+
+ /* Transform global attributes. */
+ hr = IMFTransform_GetAttributes(transform, &attributes);
+ ok(hr == S_OK, "Failed to get attributes, hr %#x.\n", hr);
+ hr = IMFTransform_GetAttributes(transform, &attributes2);
+ ok(hr == S_OK, "Failed to get attributes, hr %#x.\n", hr);
+ ok(attributes == attributes2, "Unexpected instance.\n");
+ IMFAttributes_Release(attributes);
+ IMFAttributes_Release(attributes2);
+
+ hr = IMFTransform_GetStreamLimits(transform, &input_min, &input_max, &output_min, &output_max);
+ ok(hr == S_OK, "Failed to get stream limits, hr %#x.\n", hr);
+ ok(input_min == input_max && input_min == 1 && output_min == output_max && output_min == 1,
+ "Unexpected stream limits.\n");
+
+ hr = IMFTransform_GetStreamCount(transform, &input_count, &output_count);
+ ok(hr == S_OK, "Failed to get stream count, hr %#x.\n", hr);
+ ok(input_count == 1 && output_count == 1, "Unexpected stream count %u, %u.\n", input_count, output_count);
+
+ hr = IMFTransform_GetStreamIDs(transform, 1, &input_id, 1, &output_id);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ input_id = 100;
+ hr = IMFTransform_AddInputStreams(transform, 1, &input_id);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_DeleteInputStream(transform, 0);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetInputStatus(transform, 0, &flags);
+ ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetInputStreamAttributes(transform, 0, &attributes);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetOutputStatus(transform, &flags);
+ ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetOutputStreamAttributes(transform, 0, &attributes);
+ ok(hr == S_OK, "Failed to get output attributes, hr %#x.\n", hr);
+ hr = IMFTransform_GetOutputStreamAttributes(transform, 0, &attributes2);
+ ok(hr == S_OK, "Failed to get output attributes, hr %#x.\n", hr);
+ ok(attributes == attributes2, "Unexpected instance.\n");
+ IMFAttributes_Release(attributes);
+ IMFAttributes_Release(attributes2);
+
+ for (i = 0;;++i)
+ {
+ hr = IMFTransform_GetInputAvailableType(transform, 0, i, &media_type);
+ if (hr == MF_E_NO_MORE_TYPES)
+ break;
+ ok(hr == S_OK, "Failed to get supported input type, hr %#x.\n", hr);
+
+ hr = IMFMediaType_GetMajorType(media_type, &guid);
+ ok(hr == S_OK, "Failed to get major type, hr %#x.\n", hr);
+ ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type.\n");
+
+ IMFMediaType_Release(media_type);
+ }
+
+ hr = IMFTransform_GetOutputAvailableType(transform, 0, 0, &media_type);
+ ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type);
+ ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetInputCurrentType(transform, 1, &media_type);
+ ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetOutputCurrentType(transform, 0, &media_type);
+ ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_GetOutputCurrentType(transform, 1, &media_type);
+ ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#x.\n", hr);
+
+ /* Configure stream types. */
+ for (i = 0;;++i)
+ {
+ if (FAILED(hr = IMFTransform_GetInputAvailableType(transform, 0, i, &media_type)))
+ break;
+
+ hr = IMFMediaType_GetCount(media_type, &count);
+ ok(hr == S_OK, "Failed to get attributes count, hr %#x.\n", hr);
+ ok(count == 2, "Unexpected count %u.\n", count);
+
+ hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid);
+ ok(hr == S_OK, "Failed to get subtype, hr %#x.\n", hr);
+ ok(is_supported_video_type(&guid), "Unexpected media type %s.\n", wine_dbgstr_guid(&guid));
+
+ IMFMediaType_Release(media_type);
+ }
+
+ IMFTransform_Release(transform);
+
+failed:
+ CoUninitialize();
+}
+
START_TEST(mf)
{
test_topology();
@@ -2031,4 +2185,5 @@ START_TEST(mf)
test_MFShutdownObject();
test_presentation_clock();
test_sample_grabber();
+ test_video_processor();
}
diff --git a/include/mfapi.h b/include/mfapi.h
index f3ca3d9444..3809a95142 100644
--- a/include/mfapi.h
+++ b/include/mfapi.h
@@ -44,8 +44,10 @@ extern "C" {
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
#endif
+#ifndef DEFINE_MEDIATYPE_GUID
#define DEFINE_MEDIATYPE_GUID(name, format) \
DEFINE_GUID(name, format, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
+#endif
#ifndef DIRECT3D_VERSION
#define LOCAL_D3DFMT_DEFINES 1
diff --git a/include/mferror.h b/include/mferror.h
index 4d3a530734..ba4d365a79 100644
--- a/include/mferror.h
+++ b/include/mferror.h
@@ -121,6 +121,34 @@
#define MF_E_TOPO_MISSING_SOURCE _HRESULT_TYPEDEF_(0xc00d521a)
#define MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED _HRESULT_TYPEDEF_(0xc00d521b)
+#define MF_E_TRANSFORM_TYPE_NOT_SET _HRESULT_TYPEDEF_(0xc00d6d60)
+#define MF_E_TRANSFORM_STREAM_CHANGE _HRESULT_TYPEDEF_(0xc00d6d61)
+#define MF_E_TRANSFORM_INPUT_REMAINING _HRESULT_TYPEDEF_(0xc00d6d62)
+#define MF_E_TRANSFORM_PROFILE_MISSING _HRESULT_TYPEDEF_(0xc00d6d63)
+#define MF_E_TRANSFORM_PROFILE_INVALID_OR_CORRUPT _HRESULT_TYPEDEF_(0xc00d6d64)
+#define MF_E_TRANSFORM_PROFILE_TRUNCATED _HRESULT_TYPEDEF_(0xc00d6d65)
+#define MF_E_TRANSFORM_PROPERTY_PID_NOT_RECOGNIZED _HRESULT_TYPEDEF_(0xc00d6d66)
+#define MF_E_TRANSFORM_PROPERTY_VARIANT_TYPE_WRONG _HRESULT_TYPEDEF_(0xc00d6d67)
+#define MF_E_TRANSFORM_PROPERTY_NOT_WRITEABLE _HRESULT_TYPEDEF_(0xc00d6d68)
+#define MF_E_TRANSFORM_PROPERTY_ARRAY_VALUE_WRONG_NUM_DIM _HRESULT_TYPEDEF_(0xc00d6d69)
+#define MF_E_TRANSFORM_PROPERTY_VALUE_SIZE_WRONG _HRESULT_TYPEDEF_(0xc00d6d6a)
+#define MF_E_TRANSFORM_PROPERTY_VALUE_OUT_OF_RANGE _HRESULT_TYPEDEF_(0xc00d6d6b)
+#define MF_E_TRANSFORM_PROPERTY_VALUE_INCOMPATIBLE _HRESULT_TYPEDEF_(0xc00d6d6c)
+#define MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_OUTPUT_MEDIATYPE _HRESULT_TYPEDEF_(0xc00d6d6d)
+#define MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_INPUT_MEDIATYPE _HRESULT_TYPEDEF_(0xc00d6d6e)
+#define MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION _HRESULT_TYPEDEF_(0xc00d6d6f)
+#define MF_E_TRANSFORM_CONFLICTS_WITH_OTHER_CURRENTLY_ENABLED_FEATURES _HRESULT_TYPEDEF_(0xc00d6d70)
+#define MF_E_TRANSFORM_NEED_MORE_INPUT _HRESULT_TYPEDEF_(0xc00d6d72)
+#define MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_SPKR_CONFIG _HRESULT_TYPEDEF_(0xc00d6d73)
+#define MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING _HRESULT_TYPEDEF_(0xc00d6d74)
+#define MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT _HRESULT_TYPEDEF_(0x000d6d75)
+#define MF_E_UNSUPPORTED_D3D_TYPE _HRESULT_TYPEDEF_(0xc00d6d76)
+#define MF_E_TRANSFORM_ASYNC_LOCKED _HRESULT_TYPEDEF_(0xc00d6d77)
+#define MF_E_TRANSFORM_CANNOT_INITIALIZE_ACM_DRIVER _HRESULT_TYPEDEF_(0xc00d6d78)
+#define MF_E_TRANSFORM_STREAM_INVALID_RESOLUTION _HRESULT_TYPEDEF_(0xc00d6d79)
+#define MF_E_TRANSFORM_ASYNC_MFT_NOT_SUPPORTED _HRESULT_TYPEDEF_(0xc00d6d7a)
+#define MF_E_TRANSFORM_EXATTRIBUTE_NOT_SUPPORTED _HRESULT_TYPEDEF_(0xc00d6d7c)
+
#define MF_E_CLOCK_NO_TIME_SOURCE _HRESULT_TYPEDEF_(0xc00d9c41)
#define MF_E_CLOCK_STATE_ALREADY_SET _HRESULT_TYPEDEF_(0xc00d9c42)
diff --git a/include/mfidl.idl b/include/mfidl.idl
index 93e20a6978..4968bf9aa7 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -823,3 +823,5 @@ cpp_quote("EXTERN_GUID(MF_RATE_CONTROL_SERVICE, 0x866fa297, 0xb802, 0x4bf8, 0x9d
cpp_quote("EXTERN_GUID(MF_SAMPLEGRABBERSINK_SAMPLE_TIME_OFFSET, 0x62e3d776, 0x8100, 0x4e03, 0xa6, 0xe8, 0xbd, 0x38, 0x57, 0xac, 0x9c, 0x47);")
cpp_quote("EXTERN_GUID(MF_SAMPLEGRABBERSINK_IGNORE_CLOCK, 0x0efda2c0, 0x2b69, 0x4e2e, 0xab, 0x8d, 0x46, 0xdc, 0xbf, 0xf7, 0xd2, 0x5d);")
+
+cpp_quote("EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);")
diff --git a/include/mftransform.idl b/include/mftransform.idl
index 14f74a3eb9..4321d002be 100644
--- a/include/mftransform.idl
+++ b/include/mftransform.idl
@@ -42,7 +42,7 @@ typedef struct _MFT_OUTPUT_DATA_BUFFER
IMFCollection *pEvents;
} MFT_OUTPUT_DATA_BUFFER, *PMFT_OUTPUT_DATA_BUFFER;
-typedef enum _MFT_MESSAGE_TYPE
+typedef [v1_enum] enum _MFT_MESSAGE_TYPE
{
MFT_MESSAGE_COMMAND_FLUSH = 0x00000000,
MFT_MESSAGE_COMMAND_DRAIN = 0x00000001,
@@ -56,6 +56,11 @@ typedef enum _MFT_MESSAGE_TYPE
MFT_MESSAGE_COMMAND_MARKER = 0x20000000
} MFT_MESSAGE_TYPE;
+enum _MFT_SET_TYPE_FLAGS
+{
+ MFT_SET_TYPE_TEST_ONLY = 0x00000001,
+};
+
[
object,
uuid(bf94c121-5b05-4e6f-8000-ba598961414d)
--
2.20.1
More information about the wine-devel
mailing list