The tests shows that, for sink writer created by MFCreateSinkWriterFromURL, we are not able to grab the media sink object immediately after the creation, unless the media sink object can be created without setting media type(MP3, ASF).
-- v4: mfreadwrite/tests: Test GetService for MP4 sink writer.
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 61 +++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 41b2a033a59..116910e66c1 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1415,11 +1415,27 @@ done: DestroyWindow(window); }
-static void test_sink_writer(void) +static void test_sink_writer_create(void) { + WCHAR tmp_file[MAX_PATH]; IMFSinkWriter *writer; + IMFByteStream *stream; + IMFAttributes *attr; HRESULT hr;
+ /* Get temp file name. */ + GetTempPathW(ARRAY_SIZE(tmp_file), tmp_file); + wcscat(tmp_file, L"tmp.mp4"); + + /* Create attribute and byte stream. */ + 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. */ hr = MFCreateSinkWriterFromURL(NULL, NULL, NULL, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
@@ -1428,6 +1444,47 @@ static void test_sink_writer(void) 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); + ok(!writer, "Unexpected pointer %p.\n", writer); + + writer = (void *)0xdeadbeef; + hr = MFCreateSinkWriterFromURL(NULL, stream, NULL, &writer); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(!writer, "Unexpected pointer %p.\n", writer); + + hr = MFCreateSinkWriterFromURL(NULL, stream, attr, &writer); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + IMFSinkWriter_Release(writer); + + hr = MFCreateSinkWriterFromURL(tmp_file, NULL, NULL, &writer); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + IMFSinkWriter_Release(writer); + + hr = MFCreateSinkWriterFromURL(tmp_file, NULL, attr, &writer); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + IMFSinkWriter_Release(writer); + + hr = MFCreateSinkWriterFromURL(tmp_file, stream, NULL, &writer); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + IMFSinkWriter_Release(writer); + + hr = MFCreateSinkWriterFromURL(tmp_file, stream, attr, &writer); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + IMFSinkWriter_Release(writer); + + /* Test MFCreateSinkWriterFromMediaSink. */ hr = MFCreateSinkWriterFromMediaSink(NULL, NULL, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
@@ -1451,7 +1508,7 @@ START_TEST(mfplat) test_source_reader("test.mp4", true); test_source_reader_from_media_source(); test_reader_d3d9(); - test_sink_writer(); + test_sink_writer_create();
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 116910e66c1..372b0927922 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1494,6 +1494,34 @@ static void test_sink_writer_create(void) ok(!writer, "Unexpected pointer %p.\n", writer); }
+static void test_sink_writer_mp4(void) +{ + WCHAR tmp_file[MAX_PATH]; + IMFSinkWriter *writer; + IMFMediaSink *sink; + HRESULT hr; + + /* Create writer. */ + GetTempPathW(ARRAY_SIZE(tmp_file), tmp_file); + wcscat(tmp_file, L"tmp.mp4"); + hr = MFCreateSinkWriterFromURL(tmp_file, NULL, NULL, &writer); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr != S_OK) + return; + + /* Test GetService. */ + 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); + todo_wine + ok(!sink, "Unexpected pointer %p.\n", sink); + + IMFSinkWriter_Release(writer); +} + START_TEST(mfplat) { HRESULT hr; @@ -1509,6 +1537,7 @@ START_TEST(mfplat) test_source_reader_from_media_source(); test_reader_d3d9(); test_sink_writer_create(); + test_sink_writer_mp4();
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
Nikolay Sivov (@nsivov) commented about dlls/mfreadwrite/tests/mfplat.c:
- todo_wine
- ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- if (hr != S_OK)
return;
- /* Test GetService. */
- 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);
- todo_wine
- ok(!sink, "Unexpected pointer %p.\n", sink);
- IMFSinkWriter_Release(writer);
+}
Later todos are not doing anything, right? Because writer is not created at all. You can remove the comments, they do not add anything. Does it create a tmp.mp4 file on Windows? If it does we need some clean up.