[PATCH 11/32] quartz: Implement MediaSeekingPassThru

Maarten Lankhorst m.b.lankhorst at gmail.com
Sat May 22 07:04:38 CDT 2010


---
 dlls/quartz/control.c |  230 +++++++++++++++++++++++++++++++-----------------
 1 files changed, 148 insertions(+), 82 deletions(-)

diff --git a/dlls/quartz/control.c b/dlls/quartz/control.c
index f7c94a7..a7727d9 100644
--- a/dlls/quartz/control.c
+++ b/dlls/quartz/control.c
@@ -710,190 +710,256 @@ static ULONG WINAPI MediaSeekingPassThru_Release(IMediaSeeking *iface)
     return SeekOuter_Release(This);
 }
 
+static HRESULT get_connected(PassThruImpl *This, IMediaSeeking **seek) {
+    HRESULT hr;
+    IPin *pin;
+    *seek = NULL;
+    hr = IPin_ConnectedTo(This->pin, &pin);
+    if (FAILED(hr))
+        return hr;
+    hr = IPin_QueryInterface(pin, &IID_IMediaSeeking, (void**)seek);
+    IPin_Release(pin);
+    if (FAILED(hr))
+        hr = E_NOTIMPL;
+    return hr;
+}
+
 static HRESULT WINAPI MediaSeekingPassThru_GetCapabilities(IMediaSeeking * iface, DWORD * pCapabilities)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p)\n", iface, This, pCapabilities);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetCapabilities(seek, pCapabilities);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_CheckCapabilities(IMediaSeeking * iface, DWORD * pCapabilities)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p)\n", iface, This, pCapabilities);
-
-    if (!pCapabilities)
-        return E_POINTER;
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_CheckCapabilities(seek, pCapabilities);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_IsFormatSupported(IMediaSeeking * iface, const GUID * pFormat)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%s)\n", iface, This, qzdebugstr_guid(pFormat));
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_IsFormatSupported(seek, pFormat);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_QueryPreferredFormat(IMediaSeeking * iface, GUID * pFormat)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p)\n", iface, This, pFormat);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_QueryPreferredFormat(seek, pFormat);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_GetTimeFormat(IMediaSeeking * iface, GUID * pFormat)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p)\n", iface, This, pFormat);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetTimeFormat(seek, pFormat);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_IsUsingTimeFormat(IMediaSeeking * iface, const GUID * pFormat)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%s)\n", iface, This, qzdebugstr_guid(pFormat));
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_IsUsingTimeFormat(seek, pFormat);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
-
 static HRESULT WINAPI MediaSeekingPassThru_SetTimeFormat(IMediaSeeking * iface, const GUID * pFormat)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%s)\n", iface, This, qzdebugstr_guid(pFormat));
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_SetTimeFormat(seek, pFormat);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
-
 static HRESULT WINAPI MediaSeekingPassThru_GetDuration(IMediaSeeking * iface, LONGLONG * pDuration)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-    PIN_INFO info;
+    IMediaSeeking *seek;
     HRESULT hr;
-
     TRACE("(%p/%p)->(%p)\n", iface, This, pDuration);
-
-    IPin_QueryPinInfo(This->pin, &info);
-
-    hr = ForwardCmdSeek(NULL, info.pFilter, fwd_getduration, pDuration);
-    IBaseFilter_Release(info.pFilter);
-
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetDuration(seek, pDuration);
+        IMediaSeeking_Release(seek);
+    }
     return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_GetStopPosition(IMediaSeeking * iface, LONGLONG * pStop)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p)\n", iface, This, pStop);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetStopPosition(seek, pStop);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
-/* FIXME: Make use of the info the filter should expose */
 static HRESULT WINAPI MediaSeekingPassThru_GetCurrentPosition(IMediaSeeking * iface, LONGLONG * pCurrent)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p)\n", iface, This, pCurrent);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetCurrentPosition(seek, pCurrent);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_ConvertTimeFormat(IMediaSeeking * iface, LONGLONG * pTarget, const GUID * pTargetFormat, LONGLONG Source, const GUID * pSourceFormat)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p,%s,%x%08x,%s)\n", iface, This, pTarget, debugstr_guid(pTargetFormat), (DWORD)(Source>>32), (DWORD)Source, debugstr_guid(pSourceFormat));
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_ConvertTimeFormat(seek, pTarget, pTargetFormat, Source, pSourceFormat);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_SetPositions(IMediaSeeking * iface, LONGLONG * pCurrent, DWORD dwCurrentFlags, LONGLONG * pStop, DWORD dwStopFlags)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-    struct pos_args args;
-    PIN_INFO info;
+    IMediaSeeking *seek;
     HRESULT hr;
-
-    TRACE("(%p/%p)->(%p, %p)\n", iface, This, pCurrent, pStop);
-    args.current = pCurrent;
-    args.stop = pStop;
-    args.curflags = dwCurrentFlags;
-    args.stopflags = dwStopFlags;
-
-    IPin_QueryPinInfo(This->pin, &info);
-
-    hr = ForwardCmdSeek(NULL, info.pFilter, fwd_setposition, &args);
-    IBaseFilter_Release(info.pFilter);
+    TRACE("(%p/%p)->(%p,%x,%p,%x)\n", iface, This, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_SetPositions(seek, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+        IMediaSeeking_Release(seek);
+    }
     return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_GetPositions(IMediaSeeking * iface, LONGLONG * pCurrent, LONGLONG * pStop)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p, %p)\n", iface, This, pCurrent, pStop);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetPositions(seek, pCurrent, pStop);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_GetAvailable(IMediaSeeking * iface, LONGLONG * pEarliest, LONGLONG * pLatest)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p,%p)\n", iface, This, pEarliest, pLatest);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetAvailable(seek, pEarliest, pLatest);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_SetRate(IMediaSeeking * iface, double dRate)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%e)\n", iface, This, dRate);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_SetRate(seek, dRate);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_GetRate(IMediaSeeking * iface, double * dRate)
 {
     ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
-
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p/%p)->(%p)\n", iface, This, dRate);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetRate(seek, dRate);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MediaSeekingPassThru_GetPreroll(IMediaSeeking * iface, LONGLONG * pPreroll)
 {
+    ICOM_THIS_MULTI(PassThruImpl, IMediaSeeking_vtbl, iface);
+    IMediaSeeking *seek;
+    HRESULT hr;
     TRACE("(%p)\n", pPreroll);
-
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    hr = get_connected(This, &seek);
+    if (SUCCEEDED(hr)) {
+        hr = IMediaSeeking_GetPreroll(seek, pPreroll);
+        IMediaSeeking_Release(seek);
+    }
+    return hr;
 }
 
 static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl =
-- 
1.7.0.4


--------------050002000307040403030904--



More information about the wine-patches mailing list