[PATCH 2/5] amstream/tests: Add some tests for IAMMultiMediaStream::Initialize().
Zebediah Figura
z.figura12 at gmail.com
Thu Aug 29 21:53:29 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/amstream/tests/amstream.c | 356 ++++++++++++++++++++++++++++++++-
1 file changed, 355 insertions(+), 1 deletion(-)
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index 289e936e18d..02f11bc84af 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -22,7 +22,7 @@
#include "wine/test.h"
#include "initguid.h"
-#include "uuids.h"
+#include "dshow.h"
#include "amstream.h"
#include "vfwmsgs.h"
#include "mmreg.h"
@@ -1294,6 +1294,359 @@ static void test_pin_info(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static IUnknown *graph_inner_unk;
+static IFilterGraph2 *graph_inner;
+static LONG graph_refcount = 1;
+static unsigned int got_add_filter;
+static IBaseFilter *graph_filter;
+static WCHAR graph_filter_name[128];
+
+static HRESULT WINAPI graph_QueryInterface(IFilterGraph2 *iface, REFIID iid, void **out)
+{
+ if (winetest_debug > 1) trace("QueryInterface(%s)\n", wine_dbgstr_guid(iid));
+ if (IsEqualGUID(iid, &IID_IFilterGraph2)
+ || IsEqualGUID(iid, &IID_IGraphBuilder)
+ || IsEqualGUID(iid, &IID_IFilterGraph)
+ || IsEqualGUID(iid, &IID_IUnknown))
+ {
+ *out = iface;
+ IFilterGraph2_AddRef(iface);
+ return S_OK;
+ }
+ else if (IsEqualGUID(iid, &IID_IMediaSeeking)
+ || IsEqualGUID(iid, &IID_IMediaControl)
+ || IsEqualGUID(iid, &IID_IMediaEventEx))
+ {
+ return IUnknown_QueryInterface(graph_inner_unk, iid, out);
+ }
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI graph_AddRef(IFilterGraph2 *iface)
+{
+ return InterlockedIncrement(&graph_refcount);
+}
+
+static ULONG WINAPI graph_Release(IFilterGraph2 *iface)
+{
+ return InterlockedDecrement(&graph_refcount);
+}
+
+static HRESULT WINAPI graph_AddFilter(IFilterGraph2 *iface, IBaseFilter *filter, const WCHAR *name)
+{
+ if (winetest_debug > 1) trace("AddFilter(%p, %s)\n", filter, wine_dbgstr_w(name));
+ ++got_add_filter;
+ graph_filter = filter;
+ if (name)
+ wcscpy(graph_filter_name, name);
+ else
+ graph_filter_name[0] = 0;
+ return IFilterGraph2_AddFilter(graph_inner, filter, name);
+}
+
+static HRESULT WINAPI graph_RemoveFilter(IFilterGraph2 *iface, IBaseFilter *filter)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_EnumFilters(IFilterGraph2 *iface, IEnumFilters **enumfilters)
+{
+ if (winetest_debug > 1) trace("EnumFilters()\n");
+ return IFilterGraph2_EnumFilters(graph_inner, enumfilters);
+}
+
+static HRESULT WINAPI graph_FindFilterByName(IFilterGraph2 *iface, const WCHAR *name, IBaseFilter **filter)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_ConnectDirect(IFilterGraph2 *iface, IPin *source, IPin *sink, const AM_MEDIA_TYPE *mt)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_Reconnect(IFilterGraph2 *iface, IPin *pin)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_Disconnect(IFilterGraph2 *iface, IPin *pin)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_SetDefaultSyncSource(IFilterGraph2 *iface)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_Connect(IFilterGraph2 *iface, IPin *source, IPin *sink)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_Render(IFilterGraph2 *iface, IPin *source)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_RenderFile(IFilterGraph2 *iface, const WCHAR *filename, const WCHAR *playlist)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_AddSourceFilter(IFilterGraph2 *iface,
+ const WCHAR *filename, const WCHAR *filter_name, IBaseFilter **filter)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_SetLogFile(IFilterGraph2 *iface, DWORD_PTR file)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_Abort(IFilterGraph2 *iface)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_ShouldOperationContinue(IFilterGraph2 *iface)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_AddSourceFilterForMoniker(IFilterGraph2 *iface,
+ IMoniker *moniker, IBindCtx *bind_ctx, const WCHAR *filter_name, IBaseFilter **filter)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_ReconnectEx(IFilterGraph2 *iface, IPin *pin, const AM_MEDIA_TYPE *mt)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI graph_RenderEx(IFilterGraph2 *iface, IPin *pin, DWORD flags, DWORD *context)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static const IFilterGraph2Vtbl graph_vtbl =
+{
+ graph_QueryInterface,
+ graph_AddRef,
+ graph_Release,
+ graph_AddFilter,
+ graph_RemoveFilter,
+ graph_EnumFilters,
+ graph_FindFilterByName,
+ graph_ConnectDirect,
+ graph_Reconnect,
+ graph_Disconnect,
+ graph_SetDefaultSyncSource,
+ graph_Connect,
+ graph_Render,
+ graph_RenderFile,
+ graph_AddSourceFilter,
+ graph_SetLogFile,
+ graph_Abort,
+ graph_ShouldOperationContinue,
+ graph_AddSourceFilterForMoniker,
+ graph_ReconnectEx,
+ graph_RenderEx,
+};
+
+static void test_initialize(void)
+{
+ static const WCHAR expectW[] = {'M','e','d','i','a','S','t','r','e','a','m','F','i','l','t','e','r',0};
+
+ IAMMultiMediaStream *mmstream = create_ammultimediastream();
+ IFilterGraph2 graph = {&graph_vtbl};
+ IMediaStreamFilter *filter;
+ IGraphBuilder *ret_graph;
+ IMediaStream *stream;
+ STREAM_TYPE type;
+ HRESULT hr;
+ ULONG ref;
+
+ ret_graph = (IGraphBuilder *)0xdeadbeef;
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &ret_graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(!ret_graph, "Got unexpected graph %p.\n", ret_graph);
+
+ hr = IAMMultiMediaStream_GetFilter(mmstream, &filter);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(!!filter, "Expected a non-NULL filter.");
+ IMediaStreamFilter_Release(filter);
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_WRITE, 0, NULL);
+ todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_TRANSFORM, 0, NULL);
+ todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ ret_graph = (IGraphBuilder *)0xdeadbeef;
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &ret_graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(!ret_graph, "Got unexpected graph %p.\n", ret_graph);
+
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ type = 0xdeadbeef;
+ hr = IMediaStream_GetInformation(stream, NULL, &type);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(type == STREAMTYPE_READ, "Got type %u.\n", type);
+ IMediaStream_Release(stream);
+
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ mmstream = create_ammultimediastream();
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_WRITE, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_WRITE, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL);
+ todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_TRANSFORM, 0, NULL);
+ todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ ret_graph = (IGraphBuilder *)0xdeadbeef;
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &ret_graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(!ret_graph, "Got unexpected graph %p.\n", ret_graph);
+
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ type = 0xdeadbeef;
+ hr = IMediaStream_GetInformation(stream, NULL, &type);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(type == STREAMTYPE_WRITE, "Got type %u.\n", type);
+ IMediaStream_Release(stream);
+
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ mmstream = create_ammultimediastream();
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_TRANSFORM, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_TRANSFORM, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL);
+ todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_WRITE, 0, NULL);
+ todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ ret_graph = (IGraphBuilder *)0xdeadbeef;
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &ret_graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(!ret_graph, "Got unexpected graph %p.\n", ret_graph);
+
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ type = 0xdeadbeef;
+ hr = IMediaStream_GetInformation(stream, NULL, &type);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(type == STREAMTYPE_TRANSFORM, "Got type %u.\n", type);
+ IMediaStream_Release(stream);
+
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ mmstream = create_ammultimediastream();
+
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, &stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ type = 0xdeadbeef;
+ hr = IMediaStream_GetInformation(stream, NULL, &type);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(type == STREAMTYPE_READ, "Got type %u.\n", type);
+
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_TRANSFORM, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ type = 0xdeadbeef;
+ hr = IMediaStream_GetInformation(stream, NULL, &type);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(type == STREAMTYPE_READ, "Got type %u.\n", type);
+
+ IMediaStream_Release(stream);
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ /* Test with a custom filter graph. */
+
+ mmstream = create_ammultimediastream();
+
+ CoCreateInstance(&CLSID_FilterGraph, (IUnknown *)&graph, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (void **)&graph_inner_unk);
+ IUnknown_QueryInterface(graph_inner_unk, &IID_IFilterGraph2, (void **)&graph_inner);
+
+ ret_graph = (IGraphBuilder *)0xdeadbeef;
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &ret_graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(!ret_graph, "Got unexpected graph %p.\n", ret_graph);
+
+ hr = IAMMultiMediaStream_GetFilter(mmstream, &filter);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(!!filter, "Expected a non-NULL filter.");
+
+ got_add_filter = 0;
+ hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, (IGraphBuilder *)&graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(got_add_filter == 1, "Got %d calls to IGraphBuilder::AddFilter().\n", got_add_filter);
+ ok(graph_filter == (IBaseFilter *)filter, "Got filter %p.\n", filter);
+ ok(!wcscmp(graph_filter_name, expectW), "Got unexpected name %s.\n", wine_dbgstr_w(graph_filter_name));
+
+ hr = IAMMultiMediaStream_GetFilterGraph(mmstream, &ret_graph);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(ret_graph == (IGraphBuilder *)&graph, "Got unexpected graph %p.\n", ret_graph);
+ IGraphBuilder_Release(ret_graph);
+
+ got_add_filter = 0;
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryAudio, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(!got_add_filter, "Got %d calls to IGraphBuilder::AddFilter().\n", got_add_filter);
+
+ got_add_filter = 0;
+ hr = IAMMultiMediaStream_AddMediaStream(mmstream, NULL, &MSPID_PrimaryVideo, 0, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(!got_add_filter, "Got %d calls to IGraphBuilder::AddFilter().\n", got_add_filter);
+
+ IMediaStreamFilter_Release(filter);
+ ref = IAMMultiMediaStream_Release(mmstream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ IFilterGraph2_Release(graph_inner);
+ ok(graph_refcount == 1, "Got outstanding refcount %d.\n", graph_refcount);
+ IUnknown_Release(graph_inner_unk);
+}
+
static void test_IDirectDrawStreamSample(void)
{
DDSURFACEDESC desc = { sizeof(desc) };
@@ -1670,6 +2023,7 @@ START_TEST(amstream)
test_enum_pins();
test_find_pin();
test_pin_info();
+ test_initialize();
test_IDirectDrawStreamSample();
file = CreateFileW(filenameW, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
--
2.22.0
More information about the wine-devel
mailing list