From: Yuxuan Shui <yshui@codeweavers.com> --- dlls/mfreadwrite/tests/mfplat.c | 153 ++++++++++++++++++++++++++ dlls/mfreadwrite/tests/resource.rc | 4 + dlls/mfreadwrite/tests/test_align.mp4 | Bin 0 -> 2991 bytes 3 files changed, 157 insertions(+) create mode 100644 dlls/mfreadwrite/tests/test_align.mp4 diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 95e940e2449..82ade919670 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -2045,6 +2045,158 @@ static void test_interfaces(void) IMFStreamDescriptor_Release(audio_streams[i]); } +static void test_source_reader_stride(void) +{ + IMFAttributes *attributes; + IMFMediaType *mediatype; + IMFSourceReader *reader; + IMFByteStream *stream; + UINT32 compressed; + UINT64 framesize; + UINT32 stride; + GUID subtype; + HRESULT hr; + + if (!pMFCreateMFByteStreamOnStream) + { + win_skip("MFCreateMFByteStreamOnStream() not found\n"); + return; + } + + winetest_push_context("%s", "test_align.mp4"); + + /* test_align.mp4 is a video of solid red, so it has predictable YUV values: + * Y = 0x51, U = 0x5A, V = 0xF0 + * + * we can then use these values to check if all planes are at the expected offset. */ + stream = get_resource_stream("test_align.mp4"); + /* Create the source reader with video processing enabled. This allows + * outputting RGB formats. */ + MFCreateAttributes(&attributes, 1); + hr = IMFAttributes_SetUINT32(attributes, &MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING, TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = MFCreateSourceReaderFromByteStream(stream, attributes, &reader); + if (FAILED(hr)) + { + skip("MFCreateSourceReaderFromByteStream() failed, is G-Streamer missing?\n"); + IMFByteStream_Release(stream); + IMFAttributes_Release(attributes); + winetest_pop_context(); + return; + } + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + IMFAttributes_Release(attributes); + + hr = IMFSourceReader_SetStreamSelection(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* Current media type. */ + hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &mediatype); + hr = IMFMediaType_GetGUID(mediatype, &MF_MT_SUBTYPE, &subtype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(IsEqualGUID(&subtype, &MFVideoFormat_H264), "Got subtype %s.\n", debugstr_guid(&subtype)); + + hr = IMFMediaType_GetUINT64(mediatype, &MF_MT_FRAME_SIZE, &framesize); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(framesize == ((UINT64)162 << 32 | 120), "Got frame size %ux%u.\n", + (unsigned int)(framesize >> 32), (unsigned int)framesize); + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_DEFAULT_STRIDE, &stride); + todo_wine ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + IMFMediaType_Release(mediatype); + + winetest_push_context("NV12"); + + hr = MFCreateMediaType(&mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(mediatype, &MF_MT_SUBTYPE, &MFVideoFormat_NV12); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaType_Release(mediatype); + + hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetGUID(mediatype, &MF_MT_SUBTYPE, &subtype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&subtype, &MFVideoFormat_NV12), "Got subtype %s.\n", debugstr_guid(&subtype)); + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_DEFAULT_STRIDE, &stride); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(stride == 162, "Got stride %u.\n", stride); + compressed = 0; + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_COMPRESSED, &compressed); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!compressed, "Unexpected compressed\n"); + IMFMediaType_Release(mediatype); + + winetest_pop_context(); + + winetest_push_context("YV12"); + + hr = MFCreateMediaType(&mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(mediatype, &MF_MT_SUBTYPE, &MFVideoFormat_YV12); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaType_Release(mediatype); + + hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetGUID(mediatype, &MF_MT_SUBTYPE, &subtype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&subtype, &MFVideoFormat_YV12), "Got subtype %s.\n", debugstr_guid(&subtype)); + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_DEFAULT_STRIDE, &stride); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(stride == 162, "Got stride %u.\n", stride); + compressed = 0; + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_COMPRESSED, &compressed); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!compressed, "Unexpected compressed\n"); + IMFMediaType_Release(mediatype); + + winetest_pop_context(); + + winetest_push_context("I420"); + + hr = MFCreateMediaType(&mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(mediatype, &MF_MT_SUBTYPE, &MFVideoFormat_I420); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaType_Release(mediatype); + + hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &mediatype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetGUID(mediatype, &MF_MT_SUBTYPE, &subtype); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&subtype, &MFVideoFormat_I420), "Got subtype %s.\n", debugstr_guid(&subtype)); + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_DEFAULT_STRIDE, &stride); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(stride == 162, "Got stride %u.\n", stride); + compressed = 0; + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_COMPRESSED, &compressed); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!compressed, "Unexpected compressed\n"); + IMFMediaType_Release(mediatype); + + winetest_pop_context(); + + IMFSourceReader_Release(reader); + IMFByteStream_Release(stream); + + winetest_pop_context(); +} + static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_advanced) { static const struct attribute_desc h264_stream_type_desc[] = @@ -3901,6 +4053,7 @@ START_TEST(mfplat) test_interfaces(); test_source_reader("test.wav", false); test_source_reader("test.mp4", true); + test_source_reader_stride(); test_source_reader_from_media_source(); test_source_reader_transforms(FALSE, FALSE); test_source_reader_transforms(TRUE, FALSE); diff --git a/dlls/mfreadwrite/tests/resource.rc b/dlls/mfreadwrite/tests/resource.rc index 5a737b1ad85..9b2e459794a 100644 --- a/dlls/mfreadwrite/tests/resource.rc +++ b/dlls/mfreadwrite/tests/resource.rc @@ -25,3 +25,7 @@ test.wav RCDATA test.wav /* ffmpeg -f lavfi -i smptebars -f lavfi -i "sine=frequency=1000" -t 1.0 -r 25 -f mp4 -vcodec h264 -vf scale=160x120 -acodec aac test.mp4 */ /* @makedep: test.mp4 */ test.mp4 RCDATA test.mp4 + +/* ffmpeg -f lavfi -i color=c=red:s=162x120:d=1 -t 1.0 -r 25 -f mp4 -vcodec h264 -an test_align.mp4 */ +/* @makedep: test_align.mp4 */ +test_align.mp4 RCDATA test_align.mp4 diff --git a/dlls/mfreadwrite/tests/test_align.mp4 b/dlls/mfreadwrite/tests/test_align.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fc19f39ca55361d9fcc1458eef4ac4a4d79c4e88 GIT binary patch literal 2991 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 literal 0 HcmV?d00001 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10654