From: Santino Mazza smazza@codeweavers.com
--- dlls/amstream/ddrawstream.c | 76 ++++++++++++++++++++++++++++++++++ dlls/amstream/tests/amstream.c | 1 + 2 files changed, 77 insertions(+)
diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c index dc77cb87813..e6ffc0ef69e 100644 --- a/dlls/amstream/ddrawstream.c +++ b/dlls/amstream/ddrawstream.c @@ -41,6 +41,7 @@ struct ddraw_stream IAMMediaStream IAMMediaStream_iface; IDirectDrawMediaStream IDirectDrawMediaStream_iface; IMemInputPin IMemInputPin_iface; + IMemAllocator IMemAllocator_iface; IPin IPin_iface; LONG ref; LONG sample_refs; @@ -201,6 +202,12 @@ static HRESULT WINAPI ddraw_IAMMediaStream_QueryInterface(IAMMediaStream *iface, *ret_iface = &This->IMemInputPin_iface; return S_OK; } + else if (IsEqualGUID(riid, &IID_IMemAllocator)) + { + IAMMediaStream_AddRef(iface); + *ret_iface = &This->IMemAllocator_iface; + return S_OK; + }
ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface); return E_NOINTERFACE; @@ -1274,6 +1281,74 @@ static const IPinVtbl ddraw_sink_vtbl = ddraw_sink_NewSegment, };
+static inline struct ddraw_stream *impl_from_IMemAllocator(IMemAllocator *iface) +{ + return CONTAINING_RECORD(iface, struct ddraw_stream, IMemAllocator_iface); +} + +static HRESULT WINAPI ddraw_mem_allocator_QueryInterface(IMemAllocator *iface, REFIID iid, void **out) +{ + struct ddraw_stream *stream = impl_from_IMemAllocator(iface); + return IAMMediaStream_QueryInterface(&stream->IAMMediaStream_iface, iid, out); +} + +static ULONG WINAPI ddraw_mem_allocator_AddRef(IMemAllocator *iface) +{ + struct ddraw_stream *stream = impl_from_IMemAllocator(iface); + return IAMMediaStream_AddRef(&stream->IAMMediaStream_iface); +} + +static ULONG WINAPI ddraw_mem_allocator_Release(IMemAllocator *iface) +{ + struct ddraw_stream *stream = impl_from_IMemAllocator(iface); + return IAMMediaStream_Release(&stream->IAMMediaStream_iface); +} + +static HRESULT WINAPI ddraw_mem_allocator_SetProperties(IMemAllocator *iface, ALLOCATOR_PROPERTIES *request, ALLOCATOR_PROPERTIES *actual) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ddraw_mem_allocator_GetProperties(IMemAllocator *iface,ALLOCATOR_PROPERTIES *props) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ddraw_mem_allocator_Commit(IMemAllocator *iface) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ddraw_mem_allocator_Decommit(IMemAllocator *iface) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ddraw_mem_allocator_GetBuffer(IMemAllocator *iface, IMediaSample **buf, + REFERENCE_TIME *start_time, REFERENCE_TIME *end_time, + DWORD flags) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ddraw_mem_allocator_ReleaseBuffer(IMemAllocator *iface,IMediaSample *buf) +{ + return E_NOTIMPL; +} + +static const IMemAllocatorVtbl ddraw_mem_allocator_vtbl = +{ + ddraw_mem_allocator_QueryInterface, + ddraw_mem_allocator_AddRef, + ddraw_mem_allocator_Release, + ddraw_mem_allocator_SetProperties, + ddraw_mem_allocator_GetProperties, + ddraw_mem_allocator_Commit, + ddraw_mem_allocator_Decommit, + ddraw_mem_allocator_GetBuffer, + ddraw_mem_allocator_ReleaseBuffer +}; + static inline struct ddraw_stream *impl_from_IMemInputPin(IMemInputPin *iface) { return CONTAINING_RECORD(iface, struct ddraw_stream, IMemInputPin_iface); @@ -1484,6 +1559,7 @@ HRESULT ddraw_stream_create(IUnknown *outer, void **out) object->IDirectDrawMediaStream_iface.lpVtbl = &ddraw_IDirectDrawMediaStream_Vtbl; object->IMemInputPin_iface.lpVtbl = &ddraw_meminput_vtbl; object->IPin_iface.lpVtbl = &ddraw_sink_vtbl; + object->IMemAllocator_iface.lpVtbl = &ddraw_mem_allocator_vtbl; object->ref = 1;
object->format.width = 100; diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index b796dbd64f8..759c4b75fda 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -397,6 +397,7 @@ static void test_interfaces(void) check_interface(stream, &IID_IDirectDrawMediaStream, TRUE); check_interface(stream, &IID_IMediaStream, TRUE); check_interface(stream, &IID_IMemInputPin, TRUE); + check_interface(stream, &IID_IMemAllocator, TRUE); check_interface(stream, &IID_IPin, TRUE); check_interface(stream, &IID_IUnknown, TRUE);