From: Zebediah Figura zfigura@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 176 +++++++++++++++++++++++++---- dlls/mfreadwrite/tests/resource.rc | 5 + dlls/mfreadwrite/tests/test.mp4 | Bin 0 -> 13078 bytes 3 files changed, 162 insertions(+), 19 deletions(-) create mode 100644 dlls/mfreadwrite/tests/test.mp4
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index b28a2bf775b..83091b59380 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -17,6 +17,7 @@ */
#include <stdarg.h> +#include <stdbool.h> #include <string.h>
#define COBJMACROS @@ -668,7 +669,7 @@ static struct async_callback *create_async_callback(void) return callback; }
-static void test_source_reader(void) +static void test_source_reader(const char *filename, bool video) { IMFMediaType *mediatype, *mediatype2; DWORD stream_flags, actual_index; @@ -689,17 +690,29 @@ static void test_source_reader(void) return; }
- stream = get_resource_stream("test.wav"); + winetest_push_context("%s", filename);
- hr = MFCreateSourceReaderFromByteStream(stream, NULL, &reader); + stream = get_resource_stream(filename); + + /* 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); + /* Access underlying media source object. */ hr = IMFSourceReader_GetServiceForStream(reader, MF_SOURCE_READER_MEDIASOURCE, &GUID_NULL, &IID_IMFMediaSource, (void **)&source); @@ -707,8 +720,17 @@ static void test_source_reader(void) IMFMediaSource_Release(source);
/* Stream selection. */ + selected = FALSE; hr = IMFSourceReader_GetStreamSelection(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &selected); - ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + if (video) + { + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(selected, "Unexpected selection.\n"); + } + else + { + ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + }
hr = IMFSourceReader_GetStreamSelection(reader, 100, &selected); ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); @@ -724,7 +746,7 @@ static void test_source_reader(void) ok(selected, "Unexpected selection.\n");
hr = IMFSourceReader_SetStreamSelection(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, TRUE); - ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + ok(hr == (video ? S_OK : MF_E_INVALIDSTREAMNUMBER), "Unexpected hr %#lx.\n", hr);
hr = IMFSourceReader_SetStreamSelection(reader, 100, TRUE); ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); @@ -747,7 +769,19 @@ static void test_source_reader(void)
/* Native media type. */ hr = IMFSourceReader_GetNativeMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &mediatype); - ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + if (video) + { + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFSourceReader_GetNativeMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &mediatype2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(mediatype != mediatype2, "Unexpected media type instance.\n"); + IMFMediaType_Release(mediatype2); + IMFMediaType_Release(mediatype); + } + else + { + ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + }
hr = IMFSourceReader_GetNativeMediaType(reader, 100, 0, &mediatype); ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); @@ -769,7 +803,85 @@ static void test_source_reader(void)
/* Current media type. */ hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &mediatype); - ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + if (video) + { + GUID subtype; + UINT32 stride; + UINT64 framesize; + + 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); + 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)160 << 32 | 120), "Got frame size %ux%u.\n", + (unsigned int)(framesize >> 32), (unsigned int)framesize); + + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_DEFAULT_STRIDE, &stride); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + IMFMediaType_Release(mediatype); + + /* Set the type to a YUV format. */ + + 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); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(stride == 160, "Got stride %u.\n", stride); + + IMFMediaType_Release(mediatype); + + /* Set the type to an RGB format. */ + + 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_RGB32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediatype); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaType_Release(mediatype); + + if (hr == S_OK) + { + 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_RGB32), "Got subtype %s.\n", debugstr_guid(&subtype)); + + hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_DEFAULT_STRIDE, &stride); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(stride == 160 * 4, "Got stride %u.\n", stride); + + IMFMediaType_Release(mediatype); + } + } + else + { + ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + }
hr = IMFSourceReader_GetCurrentMediaType(reader, 100, &mediatype); ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); @@ -787,7 +899,7 @@ static void test_source_reader(void) hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, &actual_index, &stream_flags, ×tamp, &sample); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!actual_index, "Unexpected stream index %lu.\n", actual_index); + todo_wine_if (video) ok(!actual_index, "Unexpected stream index %lu.\n", actual_index); ok(!(stream_flags & ~MF_SOURCE_READERF_ENDOFSTREAM), "Unexpected stream flags %#lx.\n", stream_flags);
if (stream_flags & MF_SOURCE_READERF_ENDOFSTREAM) @@ -799,16 +911,39 @@ static void test_source_reader(void) IMFSample_Release(sample); }
- /* There is no video stream. */ hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &actual_index, &stream_flags, ×tamp, &sample); - ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); - ok(actual_index == MF_SOURCE_READER_FIRST_VIDEO_STREAM, "Unexpected stream index %lu.\n", actual_index); - ok(stream_flags == MF_SOURCE_READERF_ERROR, "Unexpected stream flags %#lx.\n", stream_flags); + if (video) + { + for (;;) + { + hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, + 0, &actual_index, &stream_flags, ×tamp, &sample); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(actual_index == 1, "Unexpected stream index %lu.\n", actual_index); + ok(!(stream_flags & ~MF_SOURCE_READERF_ENDOFSTREAM), "Unexpected stream flags %#lx.\n", stream_flags);
- hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, NULL, &stream_flags, ×tamp, - &sample); - ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + if (stream_flags & MF_SOURCE_READERF_ENDOFSTREAM) + { + ok(!sample, "Unexpected sample object.\n"); + break; + } + + IMFSample_Release(sample); + } + } + else + { + hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, + 0, &actual_index, &stream_flags, ×tamp, &sample); + ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + ok(actual_index == MF_SOURCE_READER_FIRST_VIDEO_STREAM, "Unexpected stream index %lu.\n", actual_index); + ok(stream_flags == MF_SOURCE_READERF_ERROR, "Unexpected stream flags %#lx.\n", stream_flags); + + hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, + 0, NULL, &stream_flags, ×tamp, &sample); + ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + }
hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, NULL, NULL, ×tamp, &sample); ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); @@ -816,7 +951,7 @@ static void test_source_reader(void) hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, MF_SOURCE_READER_CONTROLF_DRAIN, &actual_index, &stream_flags, ×tamp, &sample); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(actual_index == 0, "Unexpected stream index %lu\n", actual_index); + todo_wine_if (video) ok(actual_index == 0, "Unexpected stream index %lu.\n", actual_index); ok(stream_flags == MF_SOURCE_READERF_ENDOFSTREAM, "Unexpected stream flags %#lx.\n", stream_flags); ok(!sample, "Unexpected sample object.\n");
@@ -837,7 +972,7 @@ static void test_source_reader(void) hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, MF_SOURCE_READER_CONTROLF_DRAIN, &actual_index, &stream_flags, NULL, &sample); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!actual_index, "Unexpected stream index %lu\n", actual_index); + todo_wine_if (video) ok(!actual_index, "Unexpected stream index %lu.\n", actual_index); ok(stream_flags == MF_SOURCE_READERF_ENDOFSTREAM, "Unexpected stream flags %#lx.\n", stream_flags); ok(!sample, "Unexpected sample object.\n");
@@ -850,7 +985,7 @@ static void test_source_reader(void)
/* Flush. */ hr = IMFSourceReader_Flush(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM); - ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); + ok(hr == (video ? S_OK : MF_E_INVALIDSTREAMNUMBER), "Unexpected hr %#lx.\n", hr);
hr = IMFSourceReader_Flush(reader, 100); ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr); @@ -886,6 +1021,8 @@ static void test_source_reader(void) IMFSourceReader_Release(reader);
IMFByteStream_Release(stream); + + winetest_pop_context(); }
static void test_source_reader_from_media_source(void) @@ -1307,7 +1444,8 @@ START_TEST(mfplat) init_functions();
test_factory(); - test_source_reader(); + test_source_reader("test.wav", false); + test_source_reader("test.mp4", true); test_source_reader_from_media_source(); test_reader_d3d9(); test_sink_writer(); diff --git a/dlls/mfreadwrite/tests/resource.rc b/dlls/mfreadwrite/tests/resource.rc index f54212a8c8f..5a737b1ad85 100644 --- a/dlls/mfreadwrite/tests/resource.rc +++ b/dlls/mfreadwrite/tests/resource.rc @@ -18,5 +18,10 @@
#include "windef.h"
+/* ffmpeg -f lavfi -i "sine=frequency=600" -t 0.1 -ar 44100 -f wav -acodec pcm_u8 test.wav */ /* @makedep: test.wav */ 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 diff --git a/dlls/mfreadwrite/tests/test.mp4 b/dlls/mfreadwrite/tests/test.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c7f9e27bde2ca43bbc2df733e0e278fa0a1946d7 GIT binary patch literal 13078 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 W|5@;j;2XwYnzjX(rp1mgP5&R+kwq~8
literal 0 HcmV?d00001