Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mfreadwrite/tests/mfplat.c | 66 ++++++++++++++------- dlls/mfreadwrite/tests/resource.rc | 3 + dlls/mfreadwrite/tests/test-40x36-i420.avi | Bin 0 -> 66320 bytes 3 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 dlls/mfreadwrite/tests/test-40x36-i420.avi
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index c24582c12b5..7715411f205 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1347,7 +1347,7 @@ struct video_format UINT32 stride; };
-static void test_video_media_type(const char *resource_name, IMFMediaType *media_type, struct video_format *expect, BOOL actual) +static void test_video_media_type(const char *resource_name, IMFMediaType *media_type, struct video_format *expect, BOOL native, BOOL actual) { UINT32 uint32_value, buffer_value_size, width = expect->width, height = expect->height; BOOL is_h264 = IsEqualGUID(&expect->subtype, &MFVideoFormat_H264); @@ -1356,7 +1356,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media GUID guid_value; HRESULT hr;
- if (actual) + if (actual && !native) { width = (width + 0xf) & ~0xf; height = (height + 0xf) & ~0xf; @@ -1399,7 +1399,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
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); + if (native) 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); @@ -1426,6 +1426,11 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media todo_wine ok(uint32_value == 1, "got MF_MT_SAMPLE_SIZE %u\n", uint32_value); } + else if (native && IsEqualGUID(&expect->subtype, &MFVideoFormat_I420)) + { + todo_wine + ok(uint32_value == width * height, "got MF_MT_SAMPLE_SIZE %u\n", uint32_value); + } else { todo_wine @@ -1439,7 +1444,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
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); + if (native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_AVG_BIT_ERROR_RATE, hr %#x\n", hr); else { todo_wine @@ -1450,10 +1455,14 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
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); + if (native && !is_h264) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_AVG_BITRATE, hr %#x\n", hr); + else + { + 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); @@ -1494,7 +1503,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media 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); + if (!actual || native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_GEOMETRIC_APERTURE, hr %#x\n", hr); else { todo_wine @@ -1515,8 +1524,17 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media 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); + if (native && IsEqualGUID(&expect->subtype, &MFVideoFormat_I420)) + { + todo_wine + ok(uint32_value == MFVideoInterlace_MixedInterlaceOrProgressive || + uint32_value == MFVideoInterlace_Progressive, "got MF_MT_INTERLACE_MODE %u\n", uint32_value); + } + else + { + 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); @@ -1524,7 +1542,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media buffer_value_size = 0xdeadbeef; memset(buffer_value, 0xcd, sizeof(buffer_value)); 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); + if (!actual || native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_MINIMUM_DISPLAY_APERTURE, hr %#x\n", hr); else { todo_wine @@ -1590,7 +1608,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media 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); + if (!actual || native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_PAN_SCAN_APERTURE, hr %#x\n", hr); else { todo_wine @@ -1622,7 +1640,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
uint32_value = 0xdeadbeef; hr = IMFMediaType_GetUINT32(media_type, &MF_MT_TRANSFER_FUNCTION, &uint32_value); - if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_TRANSFER_FUNCTION, hr %#x\n", hr); + if (!actual || native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_TRANSFER_FUNCTION, hr %#x\n", hr); else { todo_wine @@ -1640,7 +1658,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
uint32_value = 0xdeadbeef; hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_NOMINAL_RANGE, &uint32_value); - if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_NOMINAL_RANGE, hr %#x\n", hr); + if (!actual || native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_NOMINAL_RANGE, hr %#x\n", hr); else { todo_wine @@ -1651,7 +1669,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
uint32_value = 0xdeadbeef; hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_PRIMARIES, &uint32_value); - if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_PRIMARIES, hr %#x\n", hr); + if (!actual || native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_VIDEO_PRIMARIES, hr %#x\n", hr); else { todo_wine @@ -1667,7 +1685,7 @@ static void test_video_media_type(const char *resource_name, IMFMediaType *media
uint32_value = 0xdeadbeef; hr = IMFMediaType_GetUINT32(media_type, &MF_MT_YUV_MATRIX, &uint32_value); - if (!actual) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_YUV_MATRIX, hr %#x\n", hr); + if (!actual || native) ok(hr == MF_E_ATTRIBUTENOTFOUND, "got MF_MT_YUV_MATRIX, hr %#x\n", hr); else { todo_wine @@ -1704,6 +1722,9 @@ static void test_media_types(void) {.resource = "test-40x36-h264.mp4", .has_video = TRUE, .video_format = {.subtype = MFVideoFormat_H264, .width = 40, .height = 36} }, + {.resource = "test-40x36-i420.avi", .has_video = TRUE, .video_format = + {.subtype = MFVideoFormat_I420, .width = 40, .height = 36} + }, };
struct audio_format test_audio_formats[] = @@ -1827,7 +1848,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, FALSE); + test_video_media_type(tests[i].resource, media_type, &tests[i].video_format, TRUE, FALSE); IMFMediaType_Release(media_type); winetest_pop_context();
@@ -1846,13 +1867,15 @@ static void test_media_types(void) 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); + ok(hr == S_OK || hr == MF_E_TOPO_CODEC_NOT_FOUND, "Failed setting current media type %u, hr %#x.\n", j, hr); IMFMediaType_Release(media_type); + if (hr != S_OK) continue;
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], FALSE); + test_video_media_type(tests[i].resource, media_type, &test_video_formats[j], + IsEqualGUID(&tests[i].video_format.subtype, &test_video_formats[j].subtype), FALSE); winetest_pop_context(); IMFMediaType_Release(media_type);
@@ -1863,7 +1886,8 @@ 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("actual video %u", j); - test_video_media_type(tests[i].resource, media_type, &test_video_formats[j], TRUE); + test_video_media_type(tests[i].resource, media_type, &test_video_formats[j], + IsEqualGUID(&tests[i].video_format.subtype, &test_video_formats[j].subtype), TRUE);
IMFSourceReader_Release(reader); IMFByteStream_Release(stream); diff --git a/dlls/mfreadwrite/tests/resource.rc b/dlls/mfreadwrite/tests/resource.rc index 5ae9636d671..3f32c2abc30 100644 --- a/dlls/mfreadwrite/tests/resource.rc +++ b/dlls/mfreadwrite/tests/resource.rc @@ -26,3 +26,6 @@ test-48000.wav RCDATA test-48000.wav
/* @makedep: test-40x36-h264.mp4 */ test-40x36-h264.mp4 RCDATA test-40x36-h264.mp4 + +/* @makedep: test-40x36-i420.avi */ +test-40x36-i420.avi RCDATA test-40x36-i420.avi diff --git a/dlls/mfreadwrite/tests/test-40x36-i420.avi b/dlls/mfreadwrite/tests/test-40x36-i420.avi new file mode 100644 index 0000000000000000000000000000000000000000..fde02cb07c7fffe8c4fadcd69addbb066a67e86f GIT binary patch literal 66320 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 WqD`Gsv>z`j+V-CnZQk#z_Wu9`QWzTm
literal 0 HcmV?d00001