1
0
mirror of https://github.com/wine-mirror/wine synced 2024-07-08 20:06:18 +00:00

winegstreamer: Add MFMPEG4SinkClassFactory.

This commit is contained in:
Ziqing Hui 2023-07-05 10:34:18 +08:00 committed by Alexandre Julliard
parent f98f36123a
commit b3edb269ec
4 changed files with 31 additions and 34 deletions

View File

@ -6938,58 +6938,39 @@ static void test_mpeg4_media_sink(void)
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = MFCreateMPEG4MediaSink(NULL, NULL, NULL, NULL);
todo_wine
ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
sink = (void *)0xdeadbeef;
hr = MFCreateMPEG4MediaSink(NULL, NULL, NULL, &sink);
todo_wine
ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
ok(sink == (void *)0xdeadbeef, "Unexpected pointer %p.\n", sink);
sink = NULL;
hr = MFCreateMPEG4MediaSink(bytestream_empty, NULL, NULL, &sink_empty);
todo_wine
ok(hr == S_OK || broken(hr == E_INVALIDARG), "Unexpected hr %#lx.\n", hr);
hr = MFCreateMPEG4MediaSink(bytestream_audio, NULL, audio_type, &sink_audio);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = MFCreateMPEG4MediaSink(bytestream_video, video_type, NULL, &sink_video);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = MFCreateMPEG4MediaSink(bytestream, video_type, audio_type, &sink);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
if (!sink)
{
if (sink_video)
IMFMediaSink_Release(sink_video);
if (sink_audio)
IMFMediaSink_Release(sink_audio);
if (sink_empty)
IMFMediaSink_Release(sink_empty);
IMFByteStream_Release(bytestream);
IMFByteStream_Release(bytestream_empty);
IMFByteStream_Release(bytestream_video);
IMFByteStream_Release(bytestream_audio);
IMFMediaType_Release(video_type);
IMFMediaType_Release(audio_type);
return;
}
/* Test sink. */
flags = 0xdeadbeef;
hr = IMFMediaSink_GetCharacteristics(sink, &flags);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
todo_wine
ok(flags == MEDIASINK_RATELESS || broken(flags == (MEDIASINK_RATELESS | MEDIASINK_FIXED_STREAMS)),
"Unexpected flags %#lx.\n", flags);
check_interface(sink, &IID_IMFMediaEventGenerator, TRUE);
check_interface(sink, &IID_IMFFinalizableMediaSink, TRUE);
check_interface(sink, &IID_IMFClockStateSink, TRUE);
todo_wine
check_interface(sink, &IID_IMFGetService, TRUE);
/* Test sink stream count. */
@ -7104,8 +7085,11 @@ static void test_mpeg4_media_sink(void)
hr = MFCreatePresentationClock(&clock);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaSink_SetPresentationClock(sink, NULL);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
todo_wine
hr = IMFMediaSink_SetPresentationClock(sink, clock);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
IMFPresentationClock_Release(clock);
@ -7124,13 +7108,18 @@ static void test_mpeg4_media_sink(void)
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaTypeHandler_GetMajorType(type_handler, NULL);
todo_wine
ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaTypeHandler_GetMajorType(type_handler, &guid);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
todo_wine
ok(IsEqualGUID(&guid, &MFMediaType_Audio), "Unexpected major type.\n");
hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, &count);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
todo_wine
ok(count == 1, "Unexpected count %lu.\n", count);
hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, &media_type);
@ -7140,8 +7129,10 @@ static void test_mpeg4_media_sink(void)
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, NULL);
todo_wine
ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
IMFMediaType_Release(media_type);
@ -7160,19 +7151,25 @@ static void test_mpeg4_media_sink(void)
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaTypeHandler_GetMajorType(type_handler, NULL);
todo_wine
ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaTypeHandler_GetMajorType(type_handler, &guid);
todo_wine
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
IMFStreamSink_Release(stream_sink);
hr = IMFMediaSink_AddStreamSink(sink, 0, audio_type, &stream_sink);
todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaSink_GetStreamSinkByIndex(sink, 0, &stream_sink);
todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaSink_GetStreamSinkById(sink, 0, &stream_sink);
todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaSink_GetCharacteristics(sink, &flags);
todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
IMFMediaTypeHandler_Release(type_handler);

View File

@ -1468,44 +1468,35 @@ static void test_sink_writer_mp4(void)
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)
{
IMFByteStream_Release(stream);
IMFAttributes_Release(attr);
return;
}
/* Test GetServiceForStream. */
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);
DeleteFileW(tmp_file);

View File

@ -649,6 +649,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out)
factory = &color_convert_cf;
else if (IsEqualGUID(clsid, &CLSID_MFMP3SinkClassFactory))
factory = &sink_class_factory_cf;
else if (IsEqualGUID(clsid, &CLSID_MFMPEG4SinkClassFactory))
factory = &sink_class_factory_cf;
else
{
FIXME("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(clsid));

View File

@ -117,3 +117,10 @@ coclass CColorConvertDMO {}
uuid(11275a82-5e5a-47fd-a01c-3683c12fb196)
]
coclass MFMP3SinkClassFactory {}
[
helpstring("MF MPEG4 Sink Class Factory"),
threading(both),
uuid(a22c4fc7-6e91-4e1d-89e9-53b2667b72ba)
]
coclass MFMPEG4SinkClassFactory {}