[PATCH 1/2] amstream: Add stubbed implementation of DirectDrawStreamSample. (try 4)

Christian Costa titan.costa at gmail.com
Thu Apr 26 00:58:05 CDT 2012


Try 4: Now in mediastream.c.
Try 3: Put sample stuff in stream_sample.c
Try 2: Fix QueryInterface.
---
 dlls/amstream/mediastream.c    |  155 +++++++++++++++++++++++++++++++++++++++-
 dlls/amstream/tests/amstream.c |    4 +
 2 files changed, 155 insertions(+), 4 deletions(-)

diff --git a/dlls/amstream/mediastream.c b/dlls/amstream/mediastream.c
index afebdcd..896d316 100644
--- a/dlls/amstream/mediastream.c
+++ b/dlls/amstream/mediastream.c
@@ -32,6 +32,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
 
+static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawStreamSample **ddraw_stream_sample);
+
 typedef struct {
     IDirectDrawMediaStream IDirectDrawMediaStream_iface;
     LONG ref;
@@ -194,9 +196,9 @@ static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaSt
         IDirectDrawSurface *pSurface, const RECT *pRect, DWORD dwFlags,
         IDirectDrawStreamSample **ppSample)
 {
-    FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface, pSurface, pRect, dwFlags, ppSample);
+    TRACE("(%p)->(%p,%p,%x,%p)\n", iface, pSurface, pRect, dwFlags, ppSample);
 
-    return E_NOTIMPL;
+    return ddrawstreamsample_create(iface, ppSample);
 }
 
 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream *iface,
@@ -454,3 +456,152 @@ HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_
 
     return S_OK;
 }
+
+typedef struct {
+    IDirectDrawStreamSample IDirectDrawStreamSample_iface;
+    LONG ref;
+    IMediaStream *parent;
+} IDirectDrawStreamSampleImpl;
+
+static inline IDirectDrawStreamSampleImpl *impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample *iface)
+{
+    return CONTAINING_RECORD(iface, IDirectDrawStreamSampleImpl, IDirectDrawStreamSample_iface);
+}
+
+/*** IUnknown methods ***/
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_QueryInterface(IDirectDrawStreamSample *iface,
+        REFIID riid, void **ret_iface)
+{
+    TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
+
+    if (IsEqualGUID(riid, &IID_IUnknown) ||
+        IsEqualGUID(riid, &IID_IStreamSample) ||
+        IsEqualGUID(riid, &IID_IDirectDrawStreamSample))
+    {
+        IDirectDrawStreamSample_AddRef(iface);
+        *ret_iface = iface;
+        return S_OK;
+    }
+
+    *ret_iface = NULL;
+
+    ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI IDirectDrawStreamSampleImpl_AddRef(IDirectDrawStreamSample *iface)
+{
+    IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p)->(): new ref = %u\n", iface, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI IDirectDrawStreamSampleImpl_Release(IDirectDrawStreamSample *iface)
+{
+    IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p)->(): new ref = %u\n", iface, ref);
+
+    if (!ref)
+        HeapFree(GetProcessHeap(), 0, This);
+
+    return ref;
+}
+
+/*** IStreamSample methods ***/
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetMediaStream(IDirectDrawStreamSample *iface, IMediaStream **media_stream)
+{
+    FIXME("(%p)->(%p): stub\n", iface, media_stream);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSampleTimes(IDirectDrawStreamSample *iface, STREAM_TIME *start_time,
+                                                                 STREAM_TIME *end_time, STREAM_TIME *current_time)
+{
+    FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetSampleTimes(IDirectDrawStreamSample *iface, const STREAM_TIME *start_time,
+                                                                 const STREAM_TIME *end_time)
+{
+    FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_Update(IDirectDrawStreamSample *iface, DWORD flags, HANDLE event,
+                                                         PAPCFUNC func_APC, DWORD APC_data)
+{
+    FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
+{
+    FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
+
+    return E_NOTIMPL;
+}
+
+/*** IDirectDrawStreamSample methods ***/
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSurface(IDirectDrawStreamSample *iface, IDirectDrawSurface **ddraw_surface,
+                                                             RECT *rect)
+{
+    FIXME("(%p)->(%p,%p): stub\n", iface, ddraw_surface, rect);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetRect(IDirectDrawStreamSample *iface, const RECT *rect)
+{
+    FIXME("(%p)->(%p): stub\n", iface, rect);
+
+    return E_NOTIMPL;
+}
+
+static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl =
+{
+    /*** IUnknown methods ***/
+    IDirectDrawStreamSampleImpl_QueryInterface,
+    IDirectDrawStreamSampleImpl_AddRef,
+    IDirectDrawStreamSampleImpl_Release,
+    /*** IStreamSample methods ***/
+    IDirectDrawStreamSampleImpl_GetMediaStream,
+    IDirectDrawStreamSampleImpl_GetSampleTimes,
+    IDirectDrawStreamSampleImpl_SetSampleTimes,
+    IDirectDrawStreamSampleImpl_Update,
+    IDirectDrawStreamSampleImpl_CompletionStatus,
+    /*** IDirectDrawStreamSample methods ***/
+    IDirectDrawStreamSampleImpl_GetSurface,
+    IDirectDrawStreamSampleImpl_SetRect
+};
+
+static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawStreamSample **ddraw_stream_sample)
+{
+    IDirectDrawStreamSampleImpl *object;
+
+    TRACE("(%p)\n", ddraw_stream_sample);
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawStreamSampleImpl));
+    if (!object)
+    {
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
+
+    object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
+    object->ref = 1;
+    object->parent = (IMediaStream*)parent;
+
+    *ddraw_stream_sample = (IDirectDrawStreamSample*)&object->IDirectDrawStreamSample_iface;
+
+    return S_OK;
+}
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index 14c3e42..6d4b601 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -151,7 +151,7 @@ static void test_renderfile(void)
     if (FAILED(hr)) goto error;
 
     hr = IDirectDrawMediaStream_CreateSample(pddstream, NULL, NULL, 0, &pddsample);
-    todo_wine ok(hr==S_OK, "IDirectDrawMediaStream_CreateSample returned: %x\n", hr);
+    ok(hr == S_OK, "IDirectDrawMediaStream_CreateSample returned: %x\n", hr);
 
 error:
     if (pddsample)
@@ -249,7 +249,7 @@ static void test_media_streams(void)
         if (SUCCEEDED(hr))
         {
             hr = IDirectDrawMediaStream_CreateSample(ddraw_stream, NULL, NULL, 0, &ddraw_sample);
-            todo_wine ok(hr==S_OK, "IDirectDrawMediaStream_CreateSample returned: %x\n", hr);
+            ok(hr == S_OK, "IDirectDrawMediaStream_CreateSample returned: %x\n", hr);
         }
 
         if (ddraw_sample)




More information about the wine-patches mailing list