From 026037ab699faef6683dcec40cf0835dbe034691 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Wed, 14 Mar 2012 14:45:34 -0500 Subject: [PATCH] strmbase: Move the MediaSeekingPassThru functions from quartz into strmbase. --- dlls/quartz/Makefile.in | 1 - dlls/quartz/avisplit.c | 1 - dlls/quartz/control_private.h | 28 ----------- dlls/quartz/dsoundrender.c | 9 ++-- dlls/quartz/main.c | 5 ++ dlls/quartz/mpegsplit.c | 1 - dlls/quartz/nullrenderer.c | 7 +-- dlls/quartz/quartz_private.h | 1 - dlls/quartz/videorenderer.c | 8 +-- dlls/quartz/waveparser.c | 1 - dlls/strmbase/Makefile.in | 1 + dlls/{quartz/control.c => strmbase/pospass.c} | 49 ++++++++++++++----- include/wine/strmbase.h | 8 +++ 13 files changed, 57 insertions(+), 63 deletions(-) delete mode 100644 dlls/quartz/control_private.h rename dlls/{quartz/control.c => strmbase/pospass.c} (92%) diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in index 5827d65fa36..56a7cf920ac 100644 --- a/dlls/quartz/Makefile.in +++ b/dlls/quartz/Makefile.in @@ -7,7 +7,6 @@ C_SRCS = \ acmwrapper.c \ avidec.c \ avisplit.c \ - control.c \ dsoundrender.c \ enumfilters.c \ enummedia.c \ diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index e539d6443b6..3a50de542cb 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -30,7 +30,6 @@ */ #include "quartz_private.h" -#include "control_private.h" #include "pin.h" #include "uuids.h" diff --git a/dlls/quartz/control_private.h b/dlls/quartz/control_private.h deleted file mode 100644 index 016a675c908..00000000000 --- a/dlls/quartz/control_private.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Filter Seeking and Control Interfaces - * - * Copyright 2003 Robert Shearman - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef QUARTZ_CONTROL_H -#define QUARTZ_CONTROL_H - -void MediaSeekingPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start); -void MediaSeekingPassThru_ResetMediaTime(IUnknown *iface); -void MediaSeekingPassThru_EOS(IUnknown *iface); - -#endif /*QUARTZ_CONTROL_H*/ diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index f172d87d962..5e7dcc6c11a 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -21,7 +21,6 @@ #include "config.h" #include "quartz_private.h" -#include "control_private.h" #include "pin.h" #include "uuids.h" @@ -538,19 +537,17 @@ HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv) if (SUCCEEDED(hr)) { - ISeekingPassThru *passthru; pDSoundRender->state_change = CreateEventW(NULL, TRUE, TRUE, NULL); pDSoundRender->blocked = CreateEventW(NULL, TRUE, TRUE, NULL); - hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)pDSoundRender, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pDSoundRender->seekthru_unk); + + hr = CreatePosPassThru((IUnknown*)pDSoundRender, TRUE, (IPin*)pDSoundRender->pInputPin, &pDSoundRender->seekthru_unk); + if (!pDSoundRender->state_change || !pDSoundRender->blocked || FAILED(hr)) { IUnknown_Release((IUnknown *)pDSoundRender); return HRESULT_FROM_WIN32(GetLastError()); } - IUnknown_QueryInterface(pDSoundRender->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru); - ISeekingPassThru_Init(passthru, TRUE, (IPin*)pDSoundRender->pInputPin); - ISeekingPassThru_Release(passthru); QualityControlImpl_init(&pDSoundRender->qcimpl, (IPin*)pDSoundRender->pInputPin, (IBaseFilter*)pDSoundRender); pDSoundRender->qcimpl.lpVtbl = &DSoundRender_QualityControl_Vtbl; *ppv = pDSoundRender; diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c index fd8cb281932..4fec30d1c15 100644 --- a/dlls/quartz/main.c +++ b/dlls/quartz/main.c @@ -39,6 +39,11 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) return QUARTZ_DllMain( hInstDLL, fdwReason, lpv ); } +HRESULT SeekingPassThru_create(IUnknown *pUnkOuter, LPVOID *ppObj) +{ + return PosPassThru_Construct(pUnkOuter,ppObj); /* from strmbase */ +} + /****************************************************************************** * DirectShow ClassFactory */ diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c index 68348a35356..acb72edb3e4 100644 --- a/dlls/quartz/mpegsplit.c +++ b/dlls/quartz/mpegsplit.c @@ -25,7 +25,6 @@ #include #include "quartz_private.h" -#include "control_private.h" #include "pin.h" #include "uuids.h" diff --git a/dlls/quartz/nullrenderer.c b/dlls/quartz/nullrenderer.c index f4486c44c71..b99624aded7 100644 --- a/dlls/quartz/nullrenderer.c +++ b/dlls/quartz/nullrenderer.c @@ -24,7 +24,6 @@ #define NONAMELESSSTRUCT #define NONAMELESSUNION #include "quartz_private.h" -#include "control_private.h" #include "pin.h" #include "uuids.h" @@ -148,15 +147,11 @@ HRESULT NullRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv) if (SUCCEEDED(hr)) { - ISeekingPassThru *passthru; - hr = CoCreateInstance(&CLSID_SeekingPassThru, pUnkOuter ? pUnkOuter : (IUnknown*)&pNullRenderer->IInner_vtbl, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pNullRenderer->seekthru_unk); + hr = CreatePosPassThru(pUnkOuter ? pUnkOuter : (IUnknown*)&pNullRenderer->IInner_vtbl, TRUE, (IPin*)pNullRenderer->pInputPin, &pNullRenderer->seekthru_unk); if (FAILED(hr)) { IUnknown_Release((IUnknown*)pNullRenderer); return hr; } - IUnknown_QueryInterface(pNullRenderer->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru); - ISeekingPassThru_Init(passthru, TRUE, (IPin*)pNullRenderer->pInputPin); - ISeekingPassThru_Release(passthru); *ppv = pNullRenderer; } else diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index fde1475541e..a19c87542cc 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -56,7 +56,6 @@ HRESULT VideoRendererDefault_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC HRESULT QUARTZ_CreateSystemClock(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN; HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN; HRESULT WAVEParser_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN; -HRESULT SeekingPassThru_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; HRESULT EnumMonikerImpl_Create(IMoniker ** ppMoniker, ULONG nMonikerCount, IEnumMoniker ** ppEnum) DECLSPEC_HIDDEN; diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index cf6fc2a57f7..c064f800a88 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -23,7 +23,6 @@ #define NONAMELESSSTRUCT #define NONAMELESSUNION #include "quartz_private.h" -#include "control_private.h" #include "pin.h" #include "uuids.h" @@ -545,7 +544,6 @@ HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv) HRESULT hr; PIN_INFO piInput; VideoRendererImpl * pVideoRenderer; - ISeekingPassThru *passthru; TRACE("(%p, %p)\n", pUnkOuter, ppv); @@ -580,14 +578,12 @@ HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv) if (SUCCEEDED(hr)) { - hr = CoCreateInstance(&CLSID_SeekingPassThru, pUnkOuter ? pUnkOuter : (IUnknown*)&pVideoRenderer->IInner_vtbl, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pVideoRenderer->seekthru_unk); + hr = CreatePosPassThru(pUnkOuter ? pUnkOuter : (IUnknown*)&pVideoRenderer->IInner_vtbl, TRUE, (IPin*)pVideoRenderer->pInputPin, &pVideoRenderer->seekthru_unk); + if (FAILED(hr)) { IPin_Release((IPin*)pVideoRenderer->pInputPin); goto fail; } - IUnknown_QueryInterface(pVideoRenderer->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru); - ISeekingPassThru_Init(passthru, TRUE, (IPin*)pVideoRenderer->pInputPin); - ISeekingPassThru_Release(passthru); pVideoRenderer->sample_held = NULL; *ppv = pVideoRenderer; } diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c index 0ac6384a479..a1b58e53a92 100644 --- a/dlls/quartz/waveparser.c +++ b/dlls/quartz/waveparser.c @@ -19,7 +19,6 @@ */ #include "quartz_private.h" -#include "control_private.h" #include "pin.h" #include "uuids.h" diff --git a/dlls/strmbase/Makefile.in b/dlls/strmbase/Makefile.in index 5757ddd0fe9..07ac5a00b67 100644 --- a/dlls/strmbase/Makefile.in +++ b/dlls/strmbase/Makefile.in @@ -7,6 +7,7 @@ C_SRCS = \ mediatype.c \ outputqueue.c \ pin.c \ + pospass.c \ qualitycontrol.c \ seeking.c \ transform.c diff --git a/dlls/quartz/control.c b/dlls/strmbase/pospass.c similarity index 92% rename from dlls/quartz/control.c rename to dlls/strmbase/pospass.c index 9ff4c83bf96..cba4b282b61 100644 --- a/dlls/quartz/control.c +++ b/dlls/strmbase/pospass.c @@ -2,6 +2,7 @@ * Filter Seeking and Control Interfaces * * Copyright 2003 Robert Shearman + * Copyright 2012 Aric Stewart, CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,15 +20,19 @@ */ /* FIXME: critical sections */ -#include "quartz_private.h" -#include "control_private.h" +#define COBJMACROS +#include "dshow.h" #include "uuids.h" + #include "wine/debug.h" +#include "wine/strmbase.h" #include -WINE_DEFAULT_DEBUG_CHANNEL(quartz); +WINE_DEFAULT_DEBUG_CHANNEL(strmbase); + +#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl; @@ -200,13 +205,27 @@ static const ISeekingPassThruVtbl ISeekingPassThru_Vtbl = SeekingPassThru_Init }; -HRESULT SeekingPassThru_create(IUnknown *pUnkOuter, LPVOID *ppObj) +HRESULT WINAPI CreatePosPassThru(IUnknown* pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru) +{ + HRESULT hr; + ISeekingPassThru *passthru; + + hr = CoCreateInstance(&CLSID_SeekingPassThru, pUnkOuter, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)ppPassThru); + + IUnknown_QueryInterface(*ppPassThru, &IID_ISeekingPassThru, (void**)&passthru); + hr = ISeekingPassThru_Init(passthru, bRenderer, pPin); + ISeekingPassThru_Release(passthru); + + return hr; +} + +HRESULT WINAPI PosPassThru_Construct(IUnknown *pUnkOuter, LPVOID *ppPassThru) { PassThruImpl *fimpl; - TRACE("(%p,%p)\n", pUnkOuter, ppObj); + TRACE("(%p,%p)\n", pUnkOuter, ppPassThru); - *ppObj = fimpl = CoTaskMemAlloc(sizeof(*fimpl)); + *ppPassThru = fimpl = CoTaskMemAlloc(sizeof(*fimpl)); if (!fimpl) return E_OUTOFMEMORY; @@ -302,7 +321,7 @@ static HRESULT WINAPI MediaSeekingPassThru_IsFormatSupported(IMediaSeeking * ifa ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface); IMediaSeeking *seek; HRESULT hr; - TRACE("(%p/%p)->(%s)\n", iface, This, qzdebugstr_guid(pFormat)); + TRACE("(%p/%p)->(%s)\n", iface, This, debugstr_guid(pFormat)); hr = get_connected(This, &seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_IsFormatSupported(seek, pFormat); @@ -350,7 +369,7 @@ static HRESULT WINAPI MediaSeekingPassThru_IsUsingTimeFormat(IMediaSeeking * ifa ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface); IMediaSeeking *seek; HRESULT hr; - TRACE("(%p/%p)->(%s)\n", iface, This, qzdebugstr_guid(pFormat)); + TRACE("(%p/%p)->(%s)\n", iface, This, debugstr_guid(pFormat)); hr = get_connected(This, &seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_IsUsingTimeFormat(seek, pFormat); @@ -366,7 +385,7 @@ static HRESULT WINAPI MediaSeekingPassThru_SetTimeFormat(IMediaSeeking * iface, ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface); IMediaSeeking *seek; HRESULT hr; - TRACE("(%p/%p)->(%s)\n", iface, This, qzdebugstr_guid(pFormat)); + TRACE("(%p/%p)->(%s)\n", iface, This, debugstr_guid(pFormat)); hr = get_connected(This, &seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_SetTimeFormat(seek, pFormat); @@ -548,22 +567,27 @@ static HRESULT WINAPI MediaSeekingPassThru_GetPreroll(IMediaSeeking * iface, LON return hr; } -void MediaSeekingPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start) { +HRESULT WINAPI MediaSeekingPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start) +{ ICOM_THIS_MULTI(PassThruImpl, IInner_vtbl, iface); EnterCriticalSection(&This->time_cs); This->time_earliest = start; This->timevalid = 1; LeaveCriticalSection(&This->time_cs); + return S_OK; } -void MediaSeekingPassThru_ResetMediaTime(IUnknown *iface) { +HRESULT WINAPI MediaSeekingPassThru_ResetMediaTime(IUnknown *iface) +{ ICOM_THIS_MULTI(PassThruImpl, IInner_vtbl, iface); EnterCriticalSection(&This->time_cs); This->timevalid = 0; LeaveCriticalSection(&This->time_cs); + return S_OK; } -void MediaSeekingPassThru_EOS(IUnknown *iface) { +HRESULT WINAPI MediaSeekingPassThru_EOS(IUnknown *iface) +{ ICOM_THIS_MULTI(PassThruImpl, IInner_vtbl, iface); REFERENCE_TIME time; HRESULT hr; @@ -575,6 +599,7 @@ void MediaSeekingPassThru_EOS(IUnknown *iface) { } else This->timevalid = 0; LeaveCriticalSection(&This->time_cs); + return hr; } static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl = diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 6370530566d..b2319d28ab6 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -320,6 +320,14 @@ HRESULT WINAPI SourceSeekingImpl_SetRate(IMediaSeeking * iface, double dRate); HRESULT WINAPI SourceSeekingImpl_GetRate(IMediaSeeking * iface, double * dRate); HRESULT WINAPI SourceSeekingImpl_GetPreroll(IMediaSeeking * iface, LONGLONG * pPreroll); +/* PosPassThru */ +HRESULT WINAPI MediaSeekingPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start); +HRESULT WINAPI MediaSeekingPassThru_ResetMediaTime(IUnknown *iface); +HRESULT WINAPI MediaSeekingPassThru_EOS(IUnknown *iface); + +HRESULT WINAPI CreatePosPassThru(IUnknown* pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru); +HRESULT WINAPI PosPassThru_Construct(IUnknown* pUnkOuter, LPVOID *ppPassThru); + /* Filter Registration */ typedef REGPINTYPES AMOVIESETUP_MEDIATYPE;