[PATCH 3/4] mfreadwrite/tests: Check media type attributes after reading a sample.
Rémi Bernon
rbernon at codeweavers.com
Thu Oct 28 09:01:16 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/mfreadwrite/tests/mfplat.c | 157 ++++++++++++++++++++++++++++----
1 file changed, 139 insertions(+), 18 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c
index 3f5e20f844b..c24582c12b5 100644
--- a/dlls/mfreadwrite/tests/mfplat.c
+++ b/dlls/mfreadwrite/tests/mfplat.c
@@ -1347,15 +1347,21 @@ struct video_format
UINT32 stride;
};
-static void test_video_media_type(const char *resource_name, IMFMediaType *media_type, struct video_format *expect)
+static void test_video_media_type(const char *resource_name, IMFMediaType *media_type, struct video_format *expect, BOOL actual)
{
UINT32 uint32_value, buffer_value_size, width = expect->width, height = expect->height;
BOOL is_h264 = IsEqualGUID(&expect->subtype, &MFVideoFormat_H264);
- BYTE buffer_value[512];
+ UINT32 buffer_value[64];
UINT64 uint64_value;
GUID guid_value;
HRESULT hr;
+ if (actual)
+ {
+ width = (width + 0xf) & ~0xf;
+ height = (height + 0xf) & ~0xf;
+ }
+
memset(&guid_value, 0xcd, sizeof(guid_value));
hr = IMFMediaType_GetGUID(media_type, &MF_MT_MAJOR_TYPE, &guid_value);
ok(hr == S_OK, "missing MF_MT_MAJOR_TYPE, hr %#x\n", hr);
@@ -1426,9 +1432,9 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
ok(uint32_value == width * height * 3 / 2, "got MF_MT_SAMPLE_SIZE %u\n", uint32_value);
}
- hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, buffer_value, sizeof(buffer_value), &buffer_value_size);
+ hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, (BYTE *)buffer_value, sizeof(buffer_value), &buffer_value_size);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_USER_DATA, hr %#x\n", hr);
- hr = IMFMediaType_GetBlob(media_type, &MF_MT_WRAPPED_TYPE, buffer_value, sizeof(buffer_value), &buffer_value_size);
+ hr = IMFMediaType_GetBlob(media_type, &MF_MT_WRAPPED_TYPE, (BYTE *)buffer_value, sizeof(buffer_value), &buffer_value_size);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_WRAPPED_TYPE, hr %#x\n", hr);
uint32_value = 0xdeadbeef;
@@ -1480,11 +1486,30 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
uint64_value = 0xdeadbeefdeadbeefull;
hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &uint64_value);
ok(hr == S_OK, "missing MF_MT_FRAME_SIZE, hr %#x\n", hr);
+ todo_wine_if(actual)
ok((uint64_value >> 32) == width, "got MF_MT_FRAME_SIZE %I64x\n", uint64_value);
+ todo_wine_if(actual)
ok((uint64_value & 0xffffffff) == height, "got MF_MT_FRAME_SIZE %I64x\n", uint64_value);
- hr = IMFMediaType_GetBlob(media_type, &MF_MT_GEOMETRIC_APERTURE, buffer_value, sizeof(buffer_value), &buffer_value_size);
- ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_GEOMETRIC_APERTURE, hr %#x\n", hr);
+ buffer_value_size = 0xdeadbeef;
+ memset(buffer_value, 0xcd, sizeof(buffer_value));
+ hr = IMFMediaType_GetBlob(media_type, &MF_MT_GEOMETRIC_APERTURE, (BYTE *)buffer_value, sizeof(buffer_value), &buffer_value_size);
+ if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_GEOMETRIC_APERTURE, hr %#x\n", hr);
+ else
+ {
+ todo_wine
+ ok(hr == S_OK, "missing MF_MT_GEOMETRIC_APERTURE, hr %#x\n", hr);
+ todo_wine
+ ok(buffer_value_size == 16, "got MF_MT_GEOMETRIC_APERTURE length %u\n", buffer_value_size);
+ todo_wine
+ ok(buffer_value[0] == 0, "got MF_MT_GEOMETRIC_APERTURE[0] %u\n", buffer_value[0]);
+ todo_wine
+ ok(buffer_value[1] == 0, "got MF_MT_GEOMETRIC_APERTURE[1] %u\n", buffer_value[1]);
+ todo_wine
+ ok(buffer_value[2] == expect->width, "got MF_MT_GEOMETRIC_APERTURE[2] %u\n", buffer_value[2]);
+ todo_wine
+ ok(buffer_value[3] == expect->height, "got MF_MT_GEOMETRIC_APERTURE[3] %u\n", buffer_value[3]);
+ }
uint32_value = 0xdeadbeef;
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_INTERLACE_MODE, &uint32_value);
@@ -1495,12 +1520,30 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MAX_KEYFRAME_SPACING, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MAX_KEYFRAME_SPACING, hr %#x\n", hr);
- hr = IMFMediaType_GetBlob(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, buffer_value, sizeof(buffer_value), &buffer_value_size);
- ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MINIMUM_DISPLAY_APERTURE, hr %#x\n", hr);
buffer_value_size = 0xdeadbeef;
memset(buffer_value, 0xcd, sizeof(buffer_value));
- hr = IMFMediaType_GetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, buffer_value, sizeof(buffer_value), &buffer_value_size);
+ hr = IMFMediaType_GetBlob(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, (BYTE *)buffer_value, sizeof(buffer_value), &buffer_value_size);
+ if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MINIMUM_DISPLAY_APERTURE, hr %#x\n", hr);
+ else
+ {
+ todo_wine
+ ok(hr == S_OK, "missing MF_MT_MINIMUM_DISPLAY_APERTURE, hr %#x\n", hr);
+ todo_wine
+ ok(buffer_value_size == 16, "got MF_MT_MINIMUM_DISPLAY_APERTURE length %u\n", buffer_value_size);
+ todo_wine
+ ok(buffer_value[0] == 0, "got MF_MT_MINIMUM_DISPLAY_APERTURE[0] %u\n", buffer_value[0]);
+ todo_wine
+ ok(buffer_value[1] == 0, "got MF_MT_MINIMUM_DISPLAY_APERTURE[1] %u\n", buffer_value[1]);
+ todo_wine
+ ok(buffer_value[2] == expect->width, "got MF_MT_MINIMUM_DISPLAY_APERTURE[2] %u\n", buffer_value[2]);
+ todo_wine
+ ok(buffer_value[3] == expect->height, "got MF_MT_MINIMUM_DISPLAY_APERTURE[3] %u\n", buffer_value[3]);
+ }
+
+ buffer_value_size = 0xdeadbeef;
+ memset(buffer_value, 0xcd, sizeof(buffer_value));
+ hr = IMFMediaType_GetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, (BYTE *)buffer_value, sizeof(buffer_value), &buffer_value_size);
if (!is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MPEG_SEQUENCE_HEADER, hr %#x\n", hr);
else
{
@@ -1541,10 +1584,29 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_ORIGINAL_4CC, hr %#x\n", hr);
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_PAD_CONTROL_FLAGS, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_PAD_CONTROL_FLAGS, hr %#x\n", hr);
- hr = IMFMediaType_GetBlob(media_type, &MF_MT_PALETTE, buffer_value, sizeof(buffer_value), &buffer_value_size);
+ hr = IMFMediaType_GetBlob(media_type, &MF_MT_PALETTE, (BYTE *)buffer_value, sizeof(buffer_value), &buffer_value_size);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_PALETTE, hr %#x\n", hr);
- hr = IMFMediaType_GetBlob(media_type, &MF_MT_PAN_SCAN_APERTURE, buffer_value, sizeof(buffer_value), &buffer_value_size);
- ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_PAN_SCAN_APERTURE, hr %#x\n", hr);
+
+ buffer_value_size = 0xdeadbeef;
+ memset(buffer_value, 0xcd, sizeof(buffer_value));
+ hr = IMFMediaType_GetBlob(media_type, &MF_MT_PAN_SCAN_APERTURE, (BYTE *)buffer_value, sizeof(buffer_value), &buffer_value_size);
+ if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_PAN_SCAN_APERTURE, hr %#x\n", hr);
+ else
+ {
+ todo_wine
+ ok(hr == S_OK, "missing MF_MT_PAN_SCAN_APERTURE, hr %#x\n", hr);
+ todo_wine
+ ok(buffer_value_size == 16, "got MF_MT_PAN_SCAN_APERTURE length %u\n", buffer_value_size);
+ todo_wine
+ ok(buffer_value[0] == 0, "got MF_MT_PAN_SCAN_APERTURE[0] %u\n", buffer_value[0]);
+ todo_wine
+ ok(buffer_value[1] == 0, "got MF_MT_PAN_SCAN_APERTURE[1] %u\n", buffer_value[1]);
+ todo_wine
+ ok(buffer_value[2] == expect->width, "got MF_MT_PAN_SCAN_APERTURE[2] %u\n", buffer_value[2]);
+ todo_wine
+ ok(buffer_value[3] == expect->height, "got MF_MT_PAN_SCAN_APERTURE[3] %u\n", buffer_value[3]);
+ }
+
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_PAN_SCAN_ENABLED, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_PAN_SCAN_ENABLED, hr %#x\n", hr);
@@ -1557,26 +1619,63 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SOURCE_CONTENT_HINT, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_SOURCE_CONTENT_HINT, hr %#x\n", hr);
+
+ uint32_value = 0xdeadbeef;
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_TRANSFER_FUNCTION, &uint32_value);
- ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_TRANSFER_FUNCTION, hr %#x\n", hr);
+ if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_TRANSFER_FUNCTION, hr %#x\n", hr);
+ else
+ {
+ todo_wine
+ ok(hr == S_OK, "missing MF_MT_TRANSFER_FUNCTION, hr %#x\n", hr);
+ todo_wine
+ ok(uint32_value == MFVideoTransFunc_709, "got MF_MT_TRANSFER_FUNCTION %u\n", uint32_value);
+ }
+
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_3D, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_3D, hr %#x\n", hr);
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_CHROMA_SITING, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_CHROMA_SITING, hr %#x\n", hr);
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_LIGHTING, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_LIGHTING, hr %#x\n", hr);
+
+ uint32_value = 0xdeadbeef;
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_NOMINAL_RANGE, &uint32_value);
- ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_NOMINAL_RANGE, hr %#x\n", hr);
+ if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_NOMINAL_RANGE, hr %#x\n", hr);
+ else
+ {
+ todo_wine
+ ok(hr == S_OK, "missing MF_MT_VIDEO_NOMINAL_RANGE, hr %#x\n", hr);
+ todo_wine
+ ok(uint32_value == MFNominalRange_Wide, "got MF_MT_VIDEO_NOMINAL_RANGE %u\n", uint32_value);
+ }
+
+ uint32_value = 0xdeadbeef;
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_PRIMARIES, &uint32_value);
- ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_PRIMARIES, hr %#x\n", hr);
+ if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_PRIMARIES, hr %#x\n", hr);
+ else
+ {
+ todo_wine
+ ok(hr == S_OK, "missing MF_MT_VIDEO_PRIMARIES, hr %#x\n", hr);
+ todo_wine
+ ok(uint32_value == MFVideoPrimaries_SMPTE170M, "got MF_MT_VIDEO_PRIMARIES %u\n", uint32_value);
+ }
uint32_value = 0xdeadbeef;
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_ROTATION, &uint32_value);
ok(hr == S_OK || hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_ROTATION, hr %#x\n", hr);
if (hr == S_OK) ok(uint32_value == 0, "got MF_MT_VIDEO_ROTATION %u\n", uint32_value);
+ uint32_value = 0xdeadbeef;
hr = IMFMediaType_GetUINT32(media_type, &MF_MT_YUV_MATRIX, &uint32_value);
- ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_YUV_MATRIX, hr %#x\n", hr);
+ if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_YUV_MATRIX, hr %#x\n", hr);
+ else
+ {
+ todo_wine
+ ok(hr == S_OK, "missing MF_MT_YUV_MATRIX, hr %#x\n", hr);
+ todo_wine
+ ok(uint32_value == MFVideoTransferMatrix_BT601, "got MF_MT_YUV_MATRIX %u\n", uint32_value);
+ }
+
hr = IMFMediaType_GetUINT32(media_type, &MF_XVP_CALLER_ALLOCATES_OUTPUT, &uint32_value);
ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_XVP_CALLER_ALLOCATES_OUTPUT, hr %#x\n", hr);
hr = IMFMediaType_GetUINT32(media_type, &MF_XVP_DISABLE_FRC, &uint32_value);
@@ -1624,6 +1723,8 @@ static void test_media_types(void)
IMFMediaType *media_type;
IMFSourceReader *reader;
IMFByteStream *stream;
+ IMFSample *sample;
+ DWORD flags;
HRESULT hr;
if (!pMFCreateMFByteStreamOnStream)
@@ -1696,6 +1797,17 @@ static void test_media_types(void)
winetest_pop_context();
IMFMediaType_Release(media_type);
+ hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, NULL, &flags, NULL, &sample);
+ ok(hr == S_OK, "Failed to read sample, hr %#x\n", hr);
+ IMFSample_Release(sample);
+
+ hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, &media_type);
+ ok(hr == S_OK, "Failed to get current mediatype, hr %#x.\n", hr);
+ winetest_push_context("actual audio %u", j);
+ test_audio_media_type(tests[i].resource, media_type, &test_audio_formats[j]);
+ winetest_pop_context();
+ IMFMediaType_Release(media_type);
+
IMFSourceReader_Release(reader);
IMFByteStream_Release(stream);
}
@@ -1715,7 +1827,7 @@ static void test_media_types(void)
hr = IMFSourceReader_GetNativeMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &media_type);
ok(hr == S_OK, "Failed to get native mediatype, hr %#x.\n", hr);
winetest_push_context("native video");
- test_video_media_type(tests[i].resource, media_type, &tests[i].video_format);
+ test_video_media_type(tests[i].resource, media_type, &tests[i].video_format, FALSE);
IMFMediaType_Release(media_type);
winetest_pop_context();
@@ -1740,10 +1852,19 @@ static void test_media_types(void)
hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &media_type);
ok(hr == S_OK, "Failed to get current mediatype, hr %#x.\n", hr);
winetest_push_context("current video %u", j);
- test_video_media_type(tests[i].resource, media_type, &test_video_formats[j]);
+ test_video_media_type(tests[i].resource, media_type, &test_video_formats[j], FALSE);
winetest_pop_context();
IMFMediaType_Release(media_type);
+ hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, NULL, &flags, NULL, &sample);
+ ok(hr == S_OK, "Failed to read sample, hr %#x\n", hr);
+ IMFSample_Release(sample);
+
+ hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &media_type);
+ ok(hr == S_OK, "Failed to get current mediatype, hr %#x.\n", hr);
+ winetest_push_context("actual video %u", j);
+ test_video_media_type(tests[i].resource, media_type, &test_video_formats[j], TRUE);
+
IMFSourceReader_Release(reader);
IMFByteStream_Release(stream);
}
--
2.33.0
More information about the wine-devel
mailing list