Alessandro Pignotti : qedit: Implement IMediaSeeking and IMediaPosition in sample grabber.

Alexandre Julliard julliard at winehq.org
Tue Mar 5 12:59:17 CST 2013


Module: wine
Branch: master
Commit: ae771fee02d70469756f8bb08033ee1c93291a82
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ae771fee02d70469756f8bb08033ee1c93291a82

Author: Alessandro Pignotti <a.pignotti at sssup.it>
Date:   Tue Feb 26 14:09:42 2013 +0100

qedit: Implement IMediaSeeking and IMediaPosition in sample grabber.

---

 dlls/qedit/samplegrabber.c |   23 ++++++++++++++++++++---
 1 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index c748c98..d2523a8 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -369,7 +369,9 @@ typedef struct _SG_Impl {
     IBaseFilter IBaseFilter_iface;
     ISampleGrabber ISampleGrabber_iface;
     IMemInputPin IMemInputPin_iface;
-    /* TODO: IMediaPosition, IMediaSeeking, IQualityControl */
+    /* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */
+    IUnknown* seekthru_unk;
+    /* TODO: IQualityControl */
     IUnknown *outer_unk;
     LONG ref;
     CRITICAL_SECTION critSect;
@@ -433,6 +435,8 @@ static void SampleGrabber_cleanup(SG_Impl *This)
         CoTaskMemFree(This->mtype.pbFormat);
     if (This->bufferData)
         CoTaskMemFree(This->bufferData);
+    if(This->seekthru_unk)
+        IUnknown_Release(This->seekthru_unk);
     This->critSect.DebugInfo->Spare[0] = 0;
     DeleteCriticalSection(&This->critSect);
 }
@@ -455,9 +459,9 @@ static HRESULT WINAPI SampleGrabber_QueryInterface(IUnknown *iface, REFIID riid,
     else if (IsEqualIID(riid, &IID_IMemInputPin))
         *ppv = &This->IMemInputPin_iface;
     else if (IsEqualIID(riid, &IID_IMediaPosition))
-        FIXME("IMediaPosition not implemented\n");
+        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
     else if (IsEqualIID(riid, &IID_IMediaSeeking))
-        FIXME("IMediaSeeking not implemented\n");
+        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
     else if (IsEqualIID(riid, &IID_IQualityControl))
         FIXME("IQualityControl not implemented\n");
     else
@@ -1048,6 +1052,10 @@ SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppv)
         *ppv = iface;
     else if (IsEqualIID(riid, &IID_IMemInputPin))
         *ppv = &This->sg->IMemInputPin_iface;
+    else if (IsEqualIID(riid, &IID_IMediaSeeking))
+        return IUnknown_QueryInterface(&This->sg->IUnknown_inner, riid, ppv);
+    else if (IsEqualIID(riid, &IID_IMediaPosition))
+        return IUnknown_QueryInterface(&This->sg->IUnknown_inner, riid, ppv);
     else {
         WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
         return E_NOINTERFACE;
@@ -1467,6 +1475,8 @@ static const IPinVtbl IPin_Out_VTable =
 HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
 {
     SG_Impl* obj = NULL;
+    ISeekingPassThru *passthru;
+    HRESULT hr;
 
     TRACE("(%p,%p)\n", ppv, pUnkOuter);
 
@@ -1514,6 +1524,13 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
     else
         obj->outer_unk = &obj->IUnknown_inner;
 
+    hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)obj, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&obj->seekthru_unk);
+    if(hr)
+        return hr;
+    IUnknown_QueryInterface(obj->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
+    ISeekingPassThru_Init(passthru, FALSE, &obj->pin_in.IPin_iface);
+    ISeekingPassThru_Release(passthru);
+
     *ppv = &obj->IUnknown_inner;
     return S_OK;
 }




More information about the wine-cvs mailing list