This is the refactoring of the tests in !7160. I submit a new seperate MR because I want to get the tests upstreamed first, otherwise making changes to tests patches needs rebasing the implementation patches. So plz review the tests MR first.
-- v2: mfreadwrite/tests: Test sample processing for writer. mfreadwrite/tests: Test AddStream and SetInputMediaType for writer.
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 90 ++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 41 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index b6981479a1b..9e89d680ca4 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1560,46 +1560,33 @@ done:
static void test_sink_writer_create(void) { - IMFSinkWriter *writer; - HRESULT hr; - - hr = MFCreateSinkWriterFromURL(NULL, NULL, NULL, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - - writer = (void *)0xdeadbeef; - hr = MFCreateSinkWriterFromURL(NULL, NULL, NULL, &writer); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - ok(!writer, "Unexpected pointer %p.\n", writer); - - hr = MFCreateSinkWriterFromMediaSink(NULL, NULL, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - - writer = (void *)0xdeadbeef; - hr = MFCreateSinkWriterFromMediaSink(NULL, NULL, &writer); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - ok(!writer, "Unexpected pointer %p.\n", writer); -} - -static void test_sink_writer_mp4(void) -{ - WCHAR tmp_file[MAX_PATH]; + WCHAR temp_path[MAX_PATH], temp_file[MAX_PATH]; IMFSinkWriter *writer; IMFByteStream *stream; IMFAttributes *attr; - IMFMediaSink *sink; HRESULT hr;
- GetTempPathW(ARRAY_SIZE(tmp_file), tmp_file); - wcscat(tmp_file, L"tmp.mp4"); + GetTempPathW(ARRAY_SIZE(temp_path), temp_path); + GetTempFileNameW(temp_path, L"mf", 0, temp_file); + wcscat(temp_file, L".mp4");
hr = MFCreateAttributes(&attr, 1); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFAttributes_SetGUID(attr, &MF_TRANSCODE_CONTAINERTYPE, &MFTranscodeContainerType_MPEG4); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFCreateTempFile(MF_ACCESSMODE_READWRITE, MF_OPENMODE_DELETE_IF_EXIST, MF_FILEFLAGS_NONE, &stream); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- /* Test MFCreateSinkWriterFromURL. */ + /* MFCreateSinkWriterFromURL. */ + hr = MFCreateSinkWriterFromURL(NULL, NULL, NULL, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + writer = (void *)0xdeadbeef; + hr = MFCreateSinkWriterFromURL(NULL, NULL, NULL, &writer); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(!writer, "Unexpected pointer %p.\n", writer); + writer = (void *)0xdeadbeef; hr = MFCreateSinkWriterFromURL(NULL, NULL, attr, &writer); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); @@ -1612,25 +1599,48 @@ static void test_sink_writer_mp4(void)
hr = MFCreateSinkWriterFromURL(NULL, stream, attr, &writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - IMFSinkWriter_Release(writer); + IMFSinkWriter_Release(writer);
- hr = MFCreateSinkWriterFromURL(tmp_file, NULL, NULL, &writer); + hr = MFCreateSinkWriterFromURL(temp_file, NULL, NULL, &writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - IMFSinkWriter_Release(writer); + IMFSinkWriter_Release(writer);
- hr = MFCreateSinkWriterFromURL(tmp_file, NULL, attr, &writer); + hr = MFCreateSinkWriterFromURL(temp_file, NULL, attr, &writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - IMFSinkWriter_Release(writer); + IMFSinkWriter_Release(writer);
- hr = MFCreateSinkWriterFromURL(tmp_file, stream, NULL, &writer); + hr = MFCreateSinkWriterFromURL(temp_file, stream, NULL, &writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - IMFSinkWriter_Release(writer); + IMFSinkWriter_Release(writer); + + hr = MFCreateSinkWriterFromURL(temp_file, stream, attr, &writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFSinkWriter_Release(writer); + + /* MFCreateSinkWriterFromMediaSink. */ + hr = MFCreateSinkWriterFromMediaSink(NULL, NULL, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + writer = (void *)0xdeadbeef; + hr = MFCreateSinkWriterFromMediaSink(NULL, NULL, &writer); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(!writer, "Unexpected pointer %p.\n", writer); + + IMFByteStream_Release(stream); + IMFAttributes_Release(attr); +} + +static void test_sink_writer_mp4(void) +{ + WCHAR tmp_file[MAX_PATH]; + IMFSinkWriter *writer; + IMFMediaSink *sink; + HRESULT hr;
- hr = MFCreateSinkWriterFromURL(tmp_file, stream, attr, &writer); + GetTempPathW(ARRAY_SIZE(tmp_file), tmp_file); + wcscat(tmp_file, L"tmp.mp4"); + + hr = MFCreateSinkWriterFromURL(tmp_file, NULL, NULL, &writer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
/* Test GetServiceForStream. */ @@ -1644,8 +1654,6 @@ static void test_sink_writer_mp4(void)
DeleteFileW(tmp_file); IMFSinkWriter_Release(writer); - IMFByteStream_Release(stream); - IMFAttributes_Release(attr); }
static void test_interfaces(void)
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 114 +++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 10 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 9e89d680ca4..8c3fc101cc0 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1630,30 +1630,124 @@ static void test_sink_writer_create(void) IMFAttributes_Release(attr); }
-static void test_sink_writer_mp4(void) +static void test_sink_writer_get_object(void) { - WCHAR tmp_file[MAX_PATH]; + static const struct attribute_desc video_stream_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_H264), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + ATTR_UINT32(MF_MT_AVG_BITRATE, 193540), + ATTR_UINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive), + {0}, + }; + static const struct attribute_desc video_input_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + {0}, + }; + WCHAR temp_path[MAX_PATH], temp_file[MAX_PATH]; + IMFMediaType *stream_type, *input_type; + IMFSinkWriterEx *writer_ex = NULL; + IMFTransform *transform; IMFSinkWriter *writer; IMFMediaSink *sink; + DWORD index; HRESULT hr; + GUID guid; + + GetTempPathW(ARRAY_SIZE(temp_path), temp_path); + GetTempFileNameW(temp_path, L"mf", 0, temp_file); + wcscat(temp_file, L".mp4"); + hr = MFCreateSinkWriterFromURL(temp_file, NULL, NULL, &writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- GetTempPathW(ARRAY_SIZE(tmp_file), tmp_file); - wcscat(tmp_file, L"tmp.mp4"); + hr = IMFSinkWriter_QueryInterface(writer, &IID_IMFSinkWriterEx, (void **)&writer_ex); + todo_wine + ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr);
- hr = MFCreateSinkWriterFromURL(tmp_file, NULL, NULL, &writer); + hr = MFCreateMediaType(&stream_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(stream_type, video_stream_type_desc, -1); + hr = IMFSinkWriter_AddStream(writer, stream_type, &index); + ok(hr == S_OK, "AddStream returned %#lx.\n", hr); + IMFMediaType_Release(stream_type);
- /* Test GetServiceForStream. */ + /* Get transform before SetInputMediaType. */ + transform = (void *)0xdeadbeef; + hr = IMFSinkWriter_GetServiceForStream(writer, 0, &GUID_NULL, &IID_IMFTransform, (void **)&transform); + todo_wine + ok(hr == MF_E_UNSUPPORTED_SERVICE, "GetServiceForStream returned %#lx.\n", hr); + ok(!transform, "Unexpected transform %p.\n", transform); + + if (writer_ex) + { + transform = (void *)0xdeadbeef; + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 0, &guid, &transform); + ok(hr == MF_E_INVALIDINDEX, "GetTransformForStream returned %#lx.\n", hr); + ok(!transform, "Unexpected transform %p.\n", transform); + } + + hr = MFCreateMediaType(&input_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(input_type, video_input_type_desc, -1); + hr = IMFSinkWriter_SetInputMediaType(writer, 0, input_type, NULL); + todo_wine + ok(hr == S_OK, "SetInputMediaType returned %#lx.\n", hr); + IMFMediaType_Release(input_type); + + /* Get transform after SetInputMediaType. */ + hr = IMFSinkWriter_GetServiceForStream(writer, 0, &GUID_NULL, &IID_IMFTransform, (void **)&transform); + todo_wine + ok(hr == S_OK, "GetServiceForStream returned %#lx.\n", hr); + if (hr == S_OK) + IMFTransform_Release(transform); + + if (writer_ex) + { + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 0, &guid, &transform); + ok(hr == S_OK, "GetTransformForStream returned %#lx.\n", hr); + ok(IsEqualGUID(&guid, &MFT_CATEGORY_VIDEO_PROCESSOR), "Unexpected guid %s.\n", debugstr_guid(&guid)); + IMFTransform_Release(transform); + + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 1, &guid, &transform); + ok(hr == S_OK, "GetTransformForStream returned %#lx.\n", hr); + ok(IsEqualGUID(&guid, &MFT_CATEGORY_VIDEO_ENCODER), "Unexpected guid %s.\n", debugstr_guid(&guid)); + IMFTransform_Release(transform); + + transform = (void *)0xdeadbeef; + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 2, &guid, &transform); + ok(hr == MF_E_INVALIDINDEX, "GetTransformForStream returned %#lx.\n", hr); + ok(!transform, "Unexpected transform %p.\n", transform); + } + + /* Get media sink before BeginWriting. */ sink = (void *)0xdeadbeef; hr = IMFSinkWriter_GetServiceForStream(writer, MF_SINK_WRITER_MEDIASINK, &GUID_NULL, &IID_IMFMediaSink, (void **)&sink); todo_wine - ok(hr == MF_E_UNSUPPORTED_SERVICE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_UNSUPPORTED_SERVICE, "GetServiceForStream returned %#lx.\n", hr); todo_wine - ok(!sink, "Unexpected pointer %p.\n", sink); + ok(!sink, "Unexpected sink %p.\n", sink); + + hr = IMFSinkWriter_BeginWriting(writer); + todo_wine + ok(hr == S_OK, "BeginWriting returned %#lx.\n", hr); + + /* Get media sink after BeginWriting. */ + hr = IMFSinkWriter_GetServiceForStream(writer, MF_SINK_WRITER_MEDIASINK, + &GUID_NULL, &IID_IMFMediaSink, (void **)&sink); + ok(hr == S_OK, "GetServiceForStream returned %#lx.\n", hr); + IMFMediaSink_Release(sink);
- DeleteFileW(tmp_file); + if (writer_ex) + IMFSinkWriterEx_Release(writer_ex); IMFSinkWriter_Release(writer); + DeleteFileW(temp_file); }
static void test_interfaces(void) @@ -3562,7 +3656,7 @@ START_TEST(mfplat) test_source_reader_transforms_d3d11(); test_reader_d3d9(); test_sink_writer_create(); - test_sink_writer_mp4(); + test_sink_writer_get_object();
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 82 +++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 8c3fc101cc0..1098feb9d0e 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1750,6 +1750,87 @@ static void test_sink_writer_get_object(void) DeleteFileW(temp_file); }
+static void test_sink_writer_add_stream(void) +{ + static const struct attribute_desc video_stream_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_H264), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + ATTR_UINT32(MF_MT_AVG_BITRATE, 193540), + ATTR_UINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive), + {0}, + }; + static const struct attribute_desc video_input_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + {0}, + }; + WCHAR temp_path[MAX_PATH], temp_file[MAX_PATH]; + IMFMediaType *stream_type, *input_type; + IMFSinkWriter *writer; + DWORD index; + HRESULT hr; + + GetTempPathW(ARRAY_SIZE(temp_path), temp_path); + GetTempFileNameW(temp_path, L"mf", 0, temp_file); + wcscat(temp_file, L".mp4"); + hr = MFCreateSinkWriterFromURL(temp_file, NULL, NULL, &writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* Test AddStream. */ + hr = MFCreateMediaType(&stream_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(stream_type, video_stream_type_desc, -1); + + hr = IMFSinkWriter_AddStream(writer, NULL, NULL); + ok(hr == E_INVALIDARG, "AddStream returned %#lx.\n", hr); + + hr = IMFSinkWriter_AddStream(writer, stream_type, NULL); + ok(hr == E_POINTER, "AddStream returned %#lx.\n", hr); + + index = 0xdeadbeef; + hr = IMFSinkWriter_AddStream(writer, NULL, &index); + ok(hr == E_INVALIDARG, "AddStream returned %#lx.\n", hr); + ok(index == 0xdeadbeef, "Unexpected index %lu.\n", index); + + hr = IMFSinkWriter_AddStream(writer, stream_type, &index); + ok(hr == S_OK, "AddStream returned %#lx.\n", hr); + ok(index == 0, "Unexpected index %lu.\n", index); + + IMFMediaType_Release(stream_type); + + /* Test SetInputMediaType. */ + hr = MFCreateMediaType(&input_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(input_type, video_input_type_desc, -1); + + hr = IMFSinkWriter_SetInputMediaType(writer, 0xdeadbeef, NULL, NULL); + todo_wine + ok(hr == E_INVALIDARG, "SetInputMediaType returned %#lx.\n", hr); + + hr = IMFSinkWriter_SetInputMediaType(writer, 0, NULL, NULL); + todo_wine + ok(hr == E_INVALIDARG, "SetInputMediaType returned %#lx.\n", hr); + + hr = IMFSinkWriter_SetInputMediaType(writer, 0xdeadbeef, input_type, NULL); + todo_wine + ok(hr == MF_E_INVALIDSTREAMNUMBER, "SetInputMediaType returned %#lx.\n", hr); + + hr = IMFSinkWriter_SetInputMediaType(writer, 0, input_type, NULL); + todo_wine + ok(hr == S_OK, "SetInputMediaType returned %#lx.\n", hr); + + IMFMediaType_Release(input_type); + + IMFSinkWriter_Release(writer); + DeleteFileW(temp_file); +} + static void test_interfaces(void) { static const struct attribute_desc audio_stream_type_desc[] = @@ -3657,6 +3738,7 @@ START_TEST(mfplat) test_reader_d3d9(); test_sink_writer_create(); test_sink_writer_get_object(); + test_sink_writer_add_stream();
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 134 ++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 1098feb9d0e..317df72028b 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -162,6 +162,37 @@ static void init_attributes_(const char *file, int line, IMFAttributes *attribut } }
+static IMFSample *create_sample(const BYTE *data, DWORD size) +{ + IMFMediaBuffer *media_buffer; + IMFSample *sample; + BYTE *buffer; + DWORD length; + HRESULT hr; + ULONG ret; + + hr = MFCreateSample(&sample); + ok(hr == S_OK, "MFCreateSample returned %#lx\n", hr); + hr = MFCreateMemoryBuffer(size, &media_buffer); + ok(hr == S_OK, "MFCreateMemoryBuffer returned %#lx\n", hr); + + hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &length); + ok(hr == S_OK, "Lock returned %#lx\n", hr); + ok(length == 0, "Unexpected length %lu\n", length); + memcpy(buffer, data, size); + hr = IMFMediaBuffer_Unlock(media_buffer); + ok(hr == S_OK, "Unlock returned %#lx\n", hr); + + hr = IMFMediaBuffer_SetCurrentLength(media_buffer, size); + ok(hr == S_OK, "SetCurrentLength returned %#lx\n", hr); + hr = IMFSample_AddBuffer(sample, media_buffer); + ok(hr == S_OK, "AddBuffer returned %#lx\n", hr); + ret = IMFMediaBuffer_Release(media_buffer); + ok(ret == 1, "Release returned %lu\n", ret); + + return sample; +} + static ULONG get_refcount(void *iface) { IUnknown *unknown = iface; @@ -1831,6 +1862,108 @@ static void test_sink_writer_add_stream(void) DeleteFileW(temp_file); }
+ +static void test_sink_writer_sample_process(void) +{ + static const struct attribute_desc video_stream_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_H264), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + ATTR_UINT32(MF_MT_AVG_BITRATE, 193540), + ATTR_UINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive), + {0}, + }; + static const struct attribute_desc video_input_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + {0}, + }; + WCHAR temp_path[MAX_PATH], temp_file[MAX_PATH]; + IMFMediaType *stream_type, *input_type; + DWORD rgb32_data[96 * 96], i, index; + LARGE_INTEGER file_size; + IMFSinkWriter *writer; + HANDLE file; + HRESULT hr; + BOOL ret; + + GetTempPathW(ARRAY_SIZE(temp_path), temp_path); + GetTempFileNameW(temp_path, L"mf", 0, temp_file); + wcscat(temp_file, L".mp4"); + hr = MFCreateSinkWriterFromURL(temp_file, NULL, NULL, &writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* BeginWriting fails before adding stream. */ + hr = IMFSinkWriter_BeginWriting(writer); + ok(hr == MF_E_INVALIDREQUEST, "BeginWriting returned %#lx.\n", hr); + + hr = MFCreateMediaType(&stream_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(stream_type, video_stream_type_desc, -1); + hr = IMFSinkWriter_AddStream(writer, stream_type, &index); + ok(hr == S_OK, "AddStream returned %#lx.\n", hr); + IMFMediaType_Release(stream_type); + + hr = MFCreateMediaType(&input_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(input_type, video_input_type_desc, -1); + hr = IMFSinkWriter_SetInputMediaType(writer, 0, input_type, NULL); + todo_wine + ok(hr == S_OK, "SetInputMediaType returned %#lx.\n", hr); + IMFMediaType_Release(input_type); + + /* BeginWriting after adding stream. */ + hr = IMFSinkWriter_BeginWriting(writer); + todo_wine + ok(hr == S_OK, "BeginWriting returned %#lx.\n", hr); + hr = IMFSinkWriter_BeginWriting(writer); + todo_wine + ok(hr == MF_E_INVALIDREQUEST, "BeginWriting returned %#lx.\n", hr); + + /* WriteSample. */ + for (i = 0; i < ARRAY_SIZE(rgb32_data); ++i) + rgb32_data[i] = 0x0000ff00; + for (i = 0; i < 30; ++i) + { + IMFSample *sample = create_sample((const BYTE *)rgb32_data, sizeof(rgb32_data)); + hr = IMFSample_SetSampleTime(sample, 333333 * i); + ok(hr == S_OK, "SetSampleTime returned %#lx.\n", hr); + hr = IMFSample_SetSampleDuration(sample, 333333); + ok(hr == S_OK, "SetSampleDuration returned %#lx.\n", hr); + hr = IMFSinkWriter_WriteSample(writer, 0, sample); + todo_wine + ok(hr == S_OK, "WriteSample returned %#lx.\n", hr); + IMFSample_Release(sample); + } + + /* Finalize. */ + hr = IMFSinkWriter_Finalize(writer); + todo_wine + ok(hr == S_OK, "Finalize returned %#lx.\n", hr); + hr = IMFSinkWriter_Finalize(writer); + todo_wine + ok(hr == MF_E_INVALIDREQUEST, "Finalize returned %#lx.\n", hr); + + /* Check the output file. */ + file = CreateFileW(temp_file, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + todo_wine + ok(file != INVALID_HANDLE_VALUE, "CreateFileW failed.\n"); + ret = GetFileSizeEx(file, &file_size); + todo_wine + ok(ret, "GetFileSizeEx failed.\n"); + todo_wine + ok(file_size.QuadPart > 0x400, "Unexpected file size %I64x.\n", file_size.QuadPart); + + CloseHandle(file); + IMFSinkWriter_Release(writer); + DeleteFileW(temp_file); +} + static void test_interfaces(void) { static const struct attribute_desc audio_stream_type_desc[] = @@ -3739,6 +3872,7 @@ START_TEST(mfplat) test_sink_writer_create(); test_sink_writer_get_object(); test_sink_writer_add_stream(); + test_sink_writer_sample_process();
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
Nikolay Sivov (@nsivov) commented about dlls/mfreadwrite/tests/mfplat.c:
static void test_sink_writer_create(void) {
WCHAR temp_path[MAX_PATH], temp_file[MAX_PATH]; IMFSinkWriter *writer;
IMFByteStream *stream;
IMFAttributes *attr; HRESULT hr;
GetTempPathW(ARRAY_SIZE(temp_path), temp_path);
GetTempFileNameW(temp_path, L"mf", 0, temp_file);
wcscat(temp_file, L".mp4");
This is not used anywhere.
On Mon Feb 24 13:48:08 2025 +0000, Nikolay Sivov wrote:
This is not used anywhere.
Ah, sorry, it is used actually.
@nsivov Can you approve this if it looks good to you?
This merge request was approved by Nikolay Sivov.