[PATCH 1/4] amstream/tests: Test that streams call IMediaStreamFilter::EndOfStream.
Anton Baskanov
baskanov at gmail.com
Wed Apr 14 02:18:45 CDT 2021
Signed-off-by: Anton Baskanov <baskanov at gmail.com>
---
dlls/amstream/tests/amstream.c | 233 ++++++++++++++++++++++++++++++++-
1 file changed, 230 insertions(+), 3 deletions(-)
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index 9cefec12442..2f7854606f4 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -1313,6 +1313,208 @@ static const IMediaSeekingVtbl testsource_seeking_vtbl =
testsource_seeking_GetPreroll,
};
+struct testmediastreamfilter
+{
+ IMediaStreamFilter IMediaStreamFilter_iface;
+ LONG refcount;
+ unsigned int got_end_of_stream;
+};
+
+static inline struct testmediastreamfilter *impl_from_IMediaStreamFilter(IMediaStreamFilter *iface)
+{
+ return CONTAINING_RECORD(iface, struct testmediastreamfilter, IMediaStreamFilter_iface);
+}
+
+static HRESULT WINAPI testmediastreamfilter_QueryInterface(IMediaStreamFilter *iface, REFIID iid, void **out)
+{
+ if (IsEqualGUID(iid, &IID_IUnknown)
+ || IsEqualGUID(iid, &IID_IPersist)
+ || IsEqualGUID(iid, &IID_IMediaFilter)
+ || IsEqualGUID(iid, &IID_IBaseFilter)
+ || IsEqualGUID(iid, &IID_IMediaStreamFilter))
+ {
+ IMediaStreamFilter_AddRef(iface);
+ *out = iface;
+ return S_OK;
+ }
+
+ ok(0, "Unexpected interface %s.\n", wine_dbgstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI testmediastreamfilter_AddRef(IMediaStreamFilter *iface)
+{
+ struct testmediastreamfilter *filter = impl_from_IMediaStreamFilter(iface);
+ return InterlockedIncrement(&filter->refcount);
+}
+
+static ULONG WINAPI testmediastreamfilter_Release(IMediaStreamFilter *iface)
+{
+ struct testmediastreamfilter *filter = impl_from_IMediaStreamFilter(iface);
+ return InterlockedDecrement(&filter->refcount);
+}
+
+static HRESULT WINAPI testmediastreamfilter_GetClassID(IMediaStreamFilter *iface, CLSID *clsid)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_Stop(IMediaStreamFilter *iface)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_Pause(IMediaStreamFilter *iface)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_Run(IMediaStreamFilter *iface, REFERENCE_TIME start)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_GetState(IMediaStreamFilter *iface, DWORD timeout, FILTER_STATE *state)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_SetSyncSource(IMediaStreamFilter *iface, IReferenceClock *clock)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_GetSyncSource(IMediaStreamFilter *iface, IReferenceClock **clock)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_EnumPins(IMediaStreamFilter *iface, IEnumPins **enum_pins)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_FindPin(IMediaStreamFilter *iface, const WCHAR *id, IPin **pin)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_QueryFilterInfo(IMediaStreamFilter *iface, FILTER_INFO *pInfo)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_JoinFilterGraph(IMediaStreamFilter *iface, IFilterGraph *graph, const WCHAR *name)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_QueryVendorInfo(IMediaStreamFilter *iface, WCHAR **vendor_info)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_AddMediaStream(IMediaStreamFilter *iface, IAMMediaStream *stream)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_GetMediaStream(IMediaStreamFilter *iface, const MSPID *purpose_id, IMediaStream **stream)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_EnumMediaStreams(IMediaStreamFilter *iface, LONG index, IMediaStream **stream)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_SupportSeeking(IMediaStreamFilter *iface, BOOL renderer)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_ReferenceTimeToStreamTime(IMediaStreamFilter *iface, REFERENCE_TIME *time)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_GetCurrentStreamTime(IMediaStreamFilter *iface, REFERENCE_TIME *time)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_WaitUntil(IMediaStreamFilter *iface, REFERENCE_TIME time)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_Flush(IMediaStreamFilter *iface, BOOL cancel_eos)
+{
+ ok(0, "Unexpected call.\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testmediastreamfilter_EndOfStream(IMediaStreamFilter *iface)
+{
+ struct testmediastreamfilter *filter = impl_from_IMediaStreamFilter(iface);
+ ++filter->got_end_of_stream;
+ return S_OK;
+}
+
+static IMediaStreamFilterVtbl testmediastreamfilter_vtbl =
+{
+ testmediastreamfilter_QueryInterface,
+ testmediastreamfilter_AddRef,
+ testmediastreamfilter_Release,
+ testmediastreamfilter_GetClassID,
+ testmediastreamfilter_Stop,
+ testmediastreamfilter_Pause,
+ testmediastreamfilter_Run,
+ testmediastreamfilter_GetState,
+ testmediastreamfilter_SetSyncSource,
+ testmediastreamfilter_GetSyncSource,
+ testmediastreamfilter_EnumPins,
+ testmediastreamfilter_FindPin,
+ testmediastreamfilter_QueryFilterInfo,
+ testmediastreamfilter_JoinFilterGraph,
+ testmediastreamfilter_QueryVendorInfo,
+ testmediastreamfilter_AddMediaStream,
+ testmediastreamfilter_GetMediaStream,
+ testmediastreamfilter_EnumMediaStreams,
+ testmediastreamfilter_SupportSeeking,
+ testmediastreamfilter_ReferenceTimeToStreamTime,
+ testmediastreamfilter_GetCurrentStreamTime,
+ testmediastreamfilter_WaitUntil,
+ testmediastreamfilter_Flush,
+ testmediastreamfilter_EndOfStream,
+};
+
+static void testmediastreamfilter_init(struct testmediastreamfilter *filter)
+{
+ memset(filter, 0, sizeof(*filter));
+ filter->IMediaStreamFilter_iface.lpVtbl = &testmediastreamfilter_vtbl;
+}
+
#define check_get_stream(a,b,c,d) check_get_stream_(__LINE__,a,b,c,d)
static void check_get_stream_(int line, IAMMultiMediaStream *mmstream,
IMediaStreamFilter *filter, const GUID *mspid, IMediaStream *expect)
@@ -6065,9 +6267,11 @@ static void test_ammediastream_set_state(void)
check_ammediastream_set_state(&MSPID_PrimaryVideo);
}
-static void check_ammediastream_end_of_stream(const MSPID *id, const AM_MEDIA_TYPE *mt)
+static void check_ammediastream_end_of_stream(const CLSID *clsid, const MSPID *id, const AM_MEDIA_TYPE *mt)
{
IAMMultiMediaStream *mmstream = create_ammultimediastream();
+ struct testmediastreamfilter filter;
+ IAMMediaStream *am_stream;
struct testfilter source;
IGraphBuilder *graph;
IMediaStream *stream;
@@ -6122,12 +6326,35 @@ static void check_ammediastream_end_of_stream(const MSPID *id, const AM_MEDIA_TY
IPin_Release(pin);
ref = IMediaStream_Release(stream);
ok(!ref, "Got outstanding refcount %d.\n", ref);
+
+ testmediastreamfilter_init(&filter);
+
+ hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IAMMediaStream, (void **)&am_stream);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMediaStream_QueryInterface(am_stream, &IID_IPin, (void **)&pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IAMMediaStream_JoinFilter(am_stream, &filter.IMediaStreamFilter_iface);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ filter.got_end_of_stream = 0;
+
+ hr = IPin_EndOfStream(pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(filter.got_end_of_stream == 1, "Got %d calls to IMediaStreamFilter::EndOfStream().\n", filter.got_end_of_stream);
+
+ hr = IPin_EndOfStream(pin);
+ ok(hr == E_FAIL, "Got hr %#x.\n", hr);
+ todo_wine ok(filter.got_end_of_stream == 1, "Got %d calls to IMediaStreamFilter::EndOfStream().\n", filter.got_end_of_stream);
+
+ IPin_Release(pin);
+ ref = IAMMediaStream_Release(am_stream);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
}
static void test_ammediastream_end_of_stream(void)
{
- check_ammediastream_end_of_stream(&MSPID_PrimaryAudio, &audio_mt);
- check_ammediastream_end_of_stream(&MSPID_PrimaryVideo, &rgb32_mt);
+ check_ammediastream_end_of_stream(&CLSID_AMAudioStream, &MSPID_PrimaryAudio, &audio_mt);
+ check_ammediastream_end_of_stream(&CLSID_AMDirectDrawStream, &MSPID_PrimaryVideo, &rgb32_mt);
}
void test_mediastreamfilter_get_state(void)
--
2.25.1
More information about the wine-devel
mailing list