Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mfreadwrite/tests/mfplat.c | 303 +++++++++++++++++++++ dlls/mfreadwrite/tests/resource.rc | 2 + dlls/mfreadwrite/tests/test-40x36-h264.mp4 | Bin 0 -> 11151 bytes 3 files changed, 305 insertions(+) create mode 100644 dlls/mfreadwrite/tests/test-40x36-h264.mp4
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 8c2aab6714d..3f5e20f844b 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -28,6 +28,7 @@
#include "initguid.h" #include "ole2.h" +#include "uuids.h"
DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
@@ -1338,11 +1339,257 @@ static void test_audio_media_type(const char *resource_name, IMFMediaType *media ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_ORIGINAL_WAVE_FORMAT_TAG, hr %#x\n", hr); }
+struct video_format +{ + GUID subtype; + UINT32 width; + UINT32 height; + UINT32 stride; +}; + +static void test_video_media_type(const char *resource_name, IMFMediaType *media_type, struct video_format *expect) +{ + UINT32 uint32_value, buffer_value_size, width = expect->width, height = expect->height; + BOOL is_h264 = IsEqualGUID(&expect->subtype, &MFVideoFormat_H264); + BYTE buffer_value[512]; + UINT64 uint64_value; + GUID guid_value; + HRESULT hr; + + 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); + ok(IsEqualGUID(&guid_value, &MFMediaType_Video), "got MF_MT_MAJOR_TYPE %s\n", debugstr_guid(&guid_value)); + + memset(&guid_value, 0xcd, sizeof(guid_value)); + hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid_value); + ok(hr == S_OK, "missing MF_MT_SUBTYPE, hr %#x\n", hr); + todo_wine_if(is_h264) + ok(IsEqualGUID(&guid_value, &expect->subtype), "got MF_MT_SUBTYPE %s\n", debugstr_guid(&guid_value)); + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, &uint32_value); + if (is_h264) + { + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_ALL_SAMPLES_INDEPENDENT, hr %#x\n", hr); + } + else + { + ok(hr == S_OK, "missing MF_MT_ALL_SAMPLES_INDEPENDENT, hr %#x\n", hr); + ok(uint32_value == 1, "got MF_MT_ALL_SAMPLES_INDEPENDENT %u\n", uint32_value); + } + + memset(&guid_value, 0xcd, sizeof(guid_value)); + hr = IMFMediaType_GetGUID(media_type, &MF_MT_AM_FORMAT_TYPE, &guid_value); + if (!is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_AM_FORMAT_TYPE, hr %#x\n", hr); + else + { + todo_wine + ok(hr == S_OK, "missing MF_MT_AM_FORMAT_TYPE, hr %#x\n", hr); + todo_wine + ok(IsEqualGUID(&guid_value, &FORMAT_MPEG2Video), "got MF_MT_AM_FORMAT_TYPE %s\n", debugstr_guid(&guid_value)); + } + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_COMPRESSED, &uint32_value); + if (is_h264) todo_wine ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_COMPRESSED, hr %#x\n", hr); + else + { + ok(hr == S_OK, "missing MF_MT_COMPRESSED, hr %#x\n", hr); + ok(uint32_value == 0, "got MF_MT_COMPRESSED %u\n", uint32_value); + } + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, &uint32_value); + if (is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_FIXED_SIZE_SAMPLES, hr %#x\n", hr); + else + { + todo_wine + ok(hr == S_OK, "missing MF_MT_FIXED_SIZE_SAMPLES, hr %#x\n", hr); + todo_wine + ok(uint32_value == 1, "got MF_MT_FIXED_SIZE_SAMPLES %u\n", uint32_value); + } + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &uint32_value); + todo_wine + ok(hr == S_OK, "missing MF_MT_SAMPLE_SIZE, hr %#x\n", hr); + if (is_h264) + { + todo_wine + ok(uint32_value == 1, "got MF_MT_SAMPLE_SIZE %u\n", uint32_value); + } + else + { + todo_wine + 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); + 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); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_WRAPPED_TYPE, hr %#x\n", hr); + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BIT_ERROR_RATE, &uint32_value); + if (is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_AVG_BIT_ERROR_RATE, hr %#x\n", hr); + else + { + todo_wine + ok(hr == S_OK, "missing MF_MT_AVG_BIT_ERROR_RATE, hr %#x\n", hr); + todo_wine + ok(uint32_value == 0, "got MF_MT_AVG_BIT_ERROR_RATE %u\n", uint32_value); + } + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BITRATE, &uint32_value); + todo_wine + ok(hr == S_OK, "missing MF_MT_AVG_BITRATE, hr %#x\n", hr); + todo_wine + ok(uint32_value == 78904, "got MF_MT_AVG_BITRATE %u\n", uint32_value); + + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_CUSTOM_VIDEO_PRIMARIES, &uint32_value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_CUSTOM_VIDEO_PRIMARIES, hr %#x\n", hr); + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, &uint32_value); + if (is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_DEFAULT_STRIDE, hr %#x\n", hr); + else + { + todo_wine + ok(hr == S_OK, "missing MF_MT_DEFAULT_STRIDE, hr %#x\n", hr); + todo_wine + ok(uint32_value == width, "got MF_MT_DEFAULT_STRIDE %u\n", uint32_value); + } + + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_DRM_FLAGS, &uint32_value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_DRM_FLAGS, hr %#x\n", hr); + + uint64_value = 0xdeadbeefdeadbeefull; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_RATE, &uint64_value); + ok(hr == S_OK, "missing MF_MT_FRAME_RATE, hr %#x\n", hr); + ok((uint64_value >> 32) == 30, "got MF_MT_FRAME_RATE %I64x\n", uint64_value); + ok((uint64_value & 0xffffffff) == 1, "got MF_MT_FRAME_RATE %I64x\n", uint64_value); + + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_RATE_RANGE_MAX, &uint64_value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_FRAME_RATE_RANGE_MAX, hr %#x\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_RATE_RANGE_MIN, &uint64_value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_FRAME_RATE_RANGE_MIN, hr %#x\n", hr); + + 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); + ok((uint64_value >> 32) == width, "got MF_MT_FRAME_SIZE %I64x\n", uint64_value); + 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); + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_INTERLACE_MODE, &uint32_value); + todo_wine + ok(hr == S_OK, "missing MF_MT_INTERLACE_MODE, hr %#x\n", hr); + todo_wine + ok(uint32_value == MFVideoInterlace_MixedInterlaceOrProgressive, "got MF_MT_INTERLACE_MODE %u\n", uint32_value); + + 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); + if (!is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MPEG_SEQUENCE_HEADER, hr %#x\n", hr); + else + { + todo_wine + ok(hr == S_OK, "missing MF_MT_MPEG_SEQUENCE_HEADER, hr %#x\n", hr); + todo_wine + ok(buffer_value_size == 39, "got MF_MT_MPEG_SEQUENCE_HEADER length %u\n", buffer_value_size); + } + + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG_START_TIME_CODE, &uint32_value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MPEG_START_TIME_CODE, hr %#x\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG2_FLAGS, &uint32_value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MPEG2_FLAGS, hr %#x\n", hr); + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG2_LEVEL, &uint32_value); + if (!is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MPEG2_LEVEL, hr %#x\n", hr); + else + { + todo_wine + ok(hr == S_OK, "missing MF_MT_MPEG2_LEVEL, hr %#x\n", hr); + todo_wine + ok(uint32_value == 20, "got MF_MT_MPEG2_LEVEL %u\n", uint32_value); + } + + uint32_value = 0xdeadbeef; + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG2_PROFILE, &uint32_value); + if (!is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MPEG2_PROFILE, hr %#x\n", hr); + else + { + todo_wine + ok(hr == S_OK, "missing MF_MT_MPEG2_PROFILE, hr %#x\n", hr); + todo_wine + ok(uint32_value == 100, "got MF_MT_MPEG2_PROFILE %u\n", uint32_value); + } + + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_ORIGINAL_4CC, &uint32_value); + 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); + 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); + 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); + + uint64_value = 0xdeadbeefdeadbeefull; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &uint64_value); + todo_wine + ok(hr == S_OK, "missing MF_MT_PIXEL_ASPECT_RATIO, hr %#x\n", hr); + todo_wine + ok(uint64_value == 0x100000001ull, "got MF_MT_PIXEL_ASPECT_RATIO %I64x\n", uint64_value); + + 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); + 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); + 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); + 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); + 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); + + 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); + + 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); + 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); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_XVP_DISABLE_FRC, hr %#x\n", hr); +} + struct test_media_types_params { const char *resource; BOOL has_audio; struct audio_format audio_format; + BOOL has_video; + struct video_format video_format; };
static void test_media_types(void) @@ -1355,6 +1602,9 @@ static void test_media_types(void) {.resource = "test-48000.wav", .has_audio = TRUE, .audio_format = {.subtype = MFAudioFormat_PCM, .bits = 16, .rate = 48000} }, + {.resource = "test-40x36-h264.mp4", .has_video = TRUE, .video_format = + {.subtype = MFVideoFormat_H264, .width = 40, .height = 36} + }, };
struct audio_format test_audio_formats[] = @@ -1364,6 +1614,11 @@ static void test_media_types(void) {.subtype = MFAudioFormat_PCM, .bits = 8, .rate = 48000}, {.subtype = MFAudioFormat_Float, .bits = 32, .rate = 48000}, }; + struct video_format test_video_formats[] = + { + {.subtype = MFVideoFormat_NV12, .width = 40, .height = 36}, + {.subtype = MFVideoFormat_I420, .width = 40, .height = 36}, + };
int i, j, old_mute_threshold; IMFMediaType *media_type; @@ -1445,6 +1700,54 @@ static void test_media_types(void) IMFByteStream_Release(stream); }
+ for (j = 0; tests[i].has_video && j < ARRAY_SIZE(test_video_formats); ++j) + { + stream = get_resource_stream(tests[i].resource); + if (FAILED(hr = MFCreateSourceReaderFromByteStream(stream, NULL, &reader))) + { + todo_wine + win_skip("MFCreateSourceReaderFromByteStream() failed\n"); + IMFByteStream_Release(stream); + continue; + } + ok(hr == S_OK, "Failed to create source reader, hr %#x.\n", hr); + + 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); + IMFMediaType_Release(media_type); + winetest_pop_context(); + + hr = IMFSourceReader_GetNativeMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 1, &media_type); + todo_wine + ok(hr == MF_E_NO_MORE_TYPES, "Expected only one native mediatype, hr %#x.\n", hr); + if (hr == S_OK) IMFMediaType_Release(media_type); + + hr = IMFSourceReader_SetStreamSelection(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, TRUE); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = MFCreateMediaType(&media_type); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); + hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); + hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &test_video_formats[j].subtype); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, media_type); + ok(hr == S_OK, "Failed setting current media type %u, hr %#x.\n", j, hr); + IMFMediaType_Release(media_type); + + 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]); + winetest_pop_context(); + IMFMediaType_Release(media_type); + + IMFSourceReader_Release(reader); + IMFByteStream_Release(stream); + } + winetest_pop_context(); }
diff --git a/dlls/mfreadwrite/tests/resource.rc b/dlls/mfreadwrite/tests/resource.rc index 5b3269fef1d..5ae9636d671 100644 --- a/dlls/mfreadwrite/tests/resource.rc +++ b/dlls/mfreadwrite/tests/resource.rc @@ -24,3 +24,5 @@ test.wav RCDATA test.wav /* @makedep: test-48000.wav */ test-48000.wav RCDATA test-48000.wav
+/* @makedep: test-40x36-h264.mp4 */ +test-40x36-h264.mp4 RCDATA test-40x36-h264.mp4 diff --git a/dlls/mfreadwrite/tests/test-40x36-h264.mp4 b/dlls/mfreadwrite/tests/test-40x36-h264.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..3b3771a7c67322ed99721a026b9f17d8c7829856 GIT binary patch literal 11151 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
literal 0 HcmV?d00001