From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 116 +++++++++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 2 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 87fdd917697..9c056754fac 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -82,14 +82,44 @@ static IDirect3DDevice9 *create_d3d9_device(IDirect3D9 *d3d9, HWND focus_window) }
static HRESULT (WINAPI *pMFCreateMFByteStreamOnStream)(IStream *stream, IMFByteStream **bytestream); +static HRESULT (WINAPI *pMFCreate3GPMediaSink)(IMFByteStream *bytestream, + IMFMediaType *video_type, IMFMediaType *audio_type, IMFMediaSink **sink); +static HRESULT (WINAPI *pMFCreateADTSMediaSink)(IMFByteStream *bytestream, + IMFMediaType *media_type, IMFMediaSink **sink); +static HRESULT (WINAPI *pMFCreateASFMediaSink)(IMFByteStream *bytestream, IMFMediaSink **sink); +static HRESULT (WINAPI *pMFCreateAVIMediaSink)(IMFByteStream *bytestream, + IMFMediaType *video_type, IMFMediaType *audio_type, IMFMediaSink **sink); +static HRESULT (WINAPI *pMFCreateFMPEG4MediaSink)(IMFByteStream *bytestream, + IMFMediaType *video_type, IMFMediaType *audio_type, IMFMediaSink **sink); +static HRESULT (WINAPI *pMFCreateMP3MediaSink)(IMFByteStream *bytestream, IMFMediaSink **sink); +static HRESULT (WINAPI *pMFCreateMPEG4MediaSink)(IMFByteStream *bytestream, + IMFMediaType *video_type, IMFMediaType *audio_type, IMFMediaSink **sink); +static HRESULT (WINAPI *pMFCreateWAVEMediaSink)(IMFByteStream *bytestream, + IMFMediaType *media_type, IMFMediaSink **sink);
static void init_functions(void) { - HMODULE mod = GetModuleHandleA("mfplat.dll"); + HMODULE mfplat = GetModuleHandleA("mfplat.dll"); + HMODULE mfsrcsnk = LoadLibraryA("mfsrcsnk.dll"); + HMODULE mf = LoadLibraryA("mf.dll");
-#define X(f) if (!(p##f = (void*)GetProcAddress(mod, #f))) return; +#define X(f) p##f = (void*)GetProcAddress(mfplat, #f) X(MFCreateMFByteStreamOnStream); #undef X + +#define X(f) p##f = (void*)GetProcAddress(mfsrcsnk, #f) + X(MFCreateAVIMediaSink); + X(MFCreateWAVEMediaSink); +#undef X + +#define X(f) p##f = (void*)GetProcAddress(mf, #f) + X(MFCreate3GPMediaSink); + X(MFCreateADTSMediaSink); + X(MFCreateASFMediaSink); + X(MFCreateFMPEG4MediaSink); + X(MFCreateMP3MediaSink); + X(MFCreateMPEG4MediaSink); +#undef X }
enum source_state @@ -1491,6 +1521,87 @@ static void test_sink_writer_create(void) winetest_pop_context(); }
+static void test_sink_writer_get_service(void) +{ + IMFSinkWriter *writer; + IMFByteStream *stream; + IMFAttributes *attr; + unsigned int i; + HRESULT hr; + + const struct container_type + { + const GUID *type; + void *create_sink; + BOOL todo; + } container_types[] = + { + {&MFTranscodeContainerType_3GP, pMFCreate3GPMediaSink, TRUE}, + {&MFTranscodeContainerType_ADTS, pMFCreateADTSMediaSink, TRUE}, + {&MFTranscodeContainerType_ASF, pMFCreateASFMediaSink, TRUE}, + {&MFTranscodeContainerType_AVI, pMFCreateAVIMediaSink, TRUE}, + {&MFTranscodeContainerType_FMPEG4, pMFCreateFMPEG4MediaSink, TRUE}, + {&MFTranscodeContainerType_MP3, pMFCreateMP3MediaSink, TRUE}, + {&MFTranscodeContainerType_MPEG4, pMFCreateMPEG4MediaSink, TRUE}, + {&MFTranscodeContainerType_WAVE, pMFCreateWAVEMediaSink, TRUE}, + }; + + hr = MFCreateAttributes(&attr, 1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + for (i = 0; i < ARRAY_SIZE(container_types); ++i) + { + const GUID *type = container_types[i].type; + BOOL todo = container_types[i].todo; + IMFMediaSink *sink = NULL; + + winetest_push_context("Test %u", i); + + if (!container_types[i].create_sink) + { + todo_wine_if(IsEqualGUID(type, &MFTranscodeContainerType_AVI)) + win_skip("Unsupported container type.\n"); + winetest_pop_context(); + continue; + } + + hr = IMFAttributes_SetGUID(attr, &MF_TRANSCODE_CONTAINERTYPE, type); + 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); + + hr = MFCreateSinkWriterFromURL(NULL, stream, attr, &writer); + todo_wine_if(todo) + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr != S_OK) + { + IMFByteStream_Release(stream); + winetest_pop_context(); + continue; + } + + hr = IMFSinkWriter_GetServiceForStream(writer, MF_SINK_WRITER_MEDIASINK, + &GUID_NULL, &IID_IMFMediaSink, (void **)&sink); + if (IsEqualGUID(type, &MFTranscodeContainerType_ASF) + || IsEqualGUID(type, &MFTranscodeContainerType_MP3)) + { + ok(hr == S_OK, "Unexpected hr %#lx,\n", hr); + IMFMediaSink_Release(sink); + } + else + { + ok(hr == MF_E_UNSUPPORTED_SERVICE, "Unexpected hr %#lx.\n", hr); + } + + IMFSinkWriter_Release(writer); + IMFByteStream_Release(stream); + + winetest_pop_context(); + } + + IMFAttributes_Release(attr); +} + START_TEST(mfplat) { HRESULT hr; @@ -1506,6 +1617,7 @@ START_TEST(mfplat) test_source_reader_from_media_source(); test_reader_d3d9(); test_sink_writer_create(); + test_sink_writer_get_service();
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);