diff --git a/Makefile b/Makefile
index 622a878..5411712 100644
--- a/Makefile
+++ b/Makefile
@@ -13,6 +13,7 @@ FILES = src/IDirect3D/IDirect3D.c \
src/IDirectDraw/IDirectDrawPalette.c \
src/IDirectDraw/IDirectDrawClipper.c \
src/IDirectDraw/IDirectDrawSurface.c \
+ src/IAMMediaStream/IAMMediaStream.c \
src/dd.c \
src/ddpalette.c \
src/ddsurface.c \
diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj
index 88502e4..71c51a1 100644
--- a/cnc-ddraw.vcxproj
+++ b/cnc-ddraw.vcxproj
@@ -36,6 +36,7 @@
+
@@ -63,6 +64,7 @@
+
diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters
index 6dacdad..151ad93 100644
--- a/cnc-ddraw.vcxproj.filters
+++ b/cnc-ddraw.vcxproj.filters
@@ -22,6 +22,9 @@
{e6c62066-0a71-4531-ad9a-eb428abc6f44}
+
+ {b6d5d0fc-844e-4068-8a1e-1b0386f359fc}
+
@@ -138,6 +141,9 @@
Source Files\IDirect3D
+
+ Source Files\IAMMediaStream
+
@@ -230,6 +236,9 @@
Header Files
+
+ Header Files
+
diff --git a/inc/IAMMediaStream.h b/inc/IAMMediaStream.h
new file mode 100644
index 0000000..28ab588
--- /dev/null
+++ b/inc/IAMMediaStream.h
@@ -0,0 +1,46 @@
+#ifndef IAMMEDIASTREAM_H
+#define IAMMEDIASTREAM_H
+
+#define WIN32_LEAN_AND_MEAN
+#include
+
+
+DEFINE_GUID(IID_IMediaStream, 0xb502d1bd, 0x9a57, 0x11d0, 0x8f, 0xde, 0x00, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);
+DEFINE_GUID(IID_IAMMediaStream, 0xbebe595d, 0x9a6f, 0x11d0, 0x8f, 0xde, 0x00, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);
+
+extern struct IAMMediaStreamImplVtbl g_ms_vtbl;
+
+struct IAMMediaStreamImpl;
+struct IAMMediaStreamImplVtbl;
+
+typedef struct IAMMediaStreamImpl
+{
+ struct IAMMediaStreamImplVtbl* lpVtbl;
+
+ ULONG ref;
+
+} IAMMediaStreamImpl;
+
+typedef struct IAMMediaStreamImplVtbl IAMMediaStreamImplVtbl;
+
+struct IAMMediaStreamImplVtbl
+{
+ HRESULT(__stdcall* QueryInterface) (IAMMediaStreamImpl*, const IID* const riid, LPVOID* ppvObj);
+ ULONG(__stdcall* AddRef) (IAMMediaStreamImpl*);
+ ULONG(__stdcall* Release) (IAMMediaStreamImpl*);
+ // IMediaStream
+ HRESULT(__stdcall* GetMultiMediaStream)(IAMMediaStreamImpl* This, int a);
+ HRESULT(__stdcall* GetInformation)(IAMMediaStreamImpl* This, int a, int b);
+ HRESULT(__stdcall* SetSameFormat)(IAMMediaStreamImpl* This, int a, int b);
+ HRESULT(__stdcall* AllocateSample)(IAMMediaStreamImpl* This, int a, int b);
+ HRESULT(__stdcall* CreateSharedSample)(IAMMediaStreamImpl* This, int a, int b, int c);
+ HRESULT(__stdcall* SendEndOfStream)(IAMMediaStreamImpl* This, int a);
+ // IAMMediaStream
+ HRESULT(__stdcall* Initialize)(IAMMediaStreamImpl* This, int a, int b, int c, int d);
+ HRESULT(__stdcall* SetState)(IAMMediaStreamImpl* This, int a);
+ HRESULT(__stdcall* JoinAMMultiMediaStream)(IAMMediaStreamImpl* This, int a);
+ HRESULT(__stdcall* JoinFilter)(IAMMediaStreamImpl* This, int a);
+ HRESULT(__stdcall* JoinFilterGraph)(IAMMediaStreamImpl* This, int a);
+};
+
+#endif
diff --git a/src/IAMMediaStream/IAMMediaStream.c b/src/IAMMediaStream/IAMMediaStream.c
new file mode 100644
index 0000000..d16d225
--- /dev/null
+++ b/src/IAMMediaStream/IAMMediaStream.c
@@ -0,0 +1,145 @@
+#include "IAMMediaStream.h"
+#include "debug.h"
+
+HRESULT __stdcall IAMMediaStream__QueryInterface(IAMMediaStreamImpl* This, REFIID riid, void** obj)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+ULONG __stdcall IAMMediaStream__AddRef(IAMMediaStreamImpl* This)
+{
+ dprintf("-> %s(This=%p)\n", __FUNCTION__, This);
+ ULONG ret = ++This->ref;
+ dprintf("<- %s(This ref=%u)\n", __FUNCTION__, ret);
+ return ret;
+}
+
+ULONG __stdcall IAMMediaStream__Release(IAMMediaStreamImpl* This)
+{
+ dprintf("-> %s(This=%p)\n", __FUNCTION__, This);
+
+ ULONG ret = --This->ref;
+
+ if (This->ref == 0)
+ {
+ dprintf(" Released (%p)\n", This);
+
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ dprintf("<- %s(This ref=%u)\n", __FUNCTION__, ret);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__GetMultiMediaStream(IAMMediaStreamImpl* This, int a)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__GetInformation(IAMMediaStreamImpl* This, int a, int b)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__SetSameFormat(IAMMediaStreamImpl* This, int a, int b)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__AllocateSample(IAMMediaStreamImpl* This, int a, int b)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__CreateSharedSample(IAMMediaStreamImpl* This, int a, int b, int c)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__SendEndOfStream(IAMMediaStreamImpl* This, int a)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+// IAMMediaStream
+HRESULT WINAPI IAMMediaStream__Initialize(IAMMediaStreamImpl* This, int a, int b, int c, int d)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__SetState(IAMMediaStreamImpl* This, int a)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__JoinAMMultiMediaStream(IAMMediaStreamImpl* This, int a)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__JoinFilter(IAMMediaStreamImpl* This, int a)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+HRESULT WINAPI IAMMediaStream__JoinFilterGraph(IAMMediaStreamImpl* This, int a)
+{
+ dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
+ HRESULT ret = E_FAIL;
+ dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
+ return ret;
+}
+
+struct IAMMediaStreamImplVtbl g_ms_vtbl =
+{
+ /* IUnknown */
+ IAMMediaStream__QueryInterface,
+ IAMMediaStream__AddRef,
+ IAMMediaStream__Release,
+ /* IMediaStream */
+ IAMMediaStream__GetMultiMediaStream,
+ IAMMediaStream__GetInformation,
+ IAMMediaStream__SetSameFormat,
+ IAMMediaStream__AllocateSample,
+ IAMMediaStream__CreateSharedSample,
+ IAMMediaStream__SendEndOfStream,
+ /* IAMMediaStream */
+ IAMMediaStream__Initialize,
+ IAMMediaStream__SetState,
+ IAMMediaStream__JoinAMMultiMediaStream,
+ IAMMediaStream__JoinFilter,
+ IAMMediaStream__JoinFilterGraph,
+};
diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c
index 32753d4..c161082 100644
--- a/src/IDirectDraw/IDirectDraw.c
+++ b/src/IDirectDraw/IDirectDraw.c
@@ -1,6 +1,7 @@
#include
#include "IDirectDraw.h"
#include "IDirect3D.h"
+#include "IAMMediaStream.h"
#include "dd.h"
#include "ddclipper.h"
#include "ddpalette.h"
@@ -95,12 +96,25 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
ret = S_OK;
}
- else
+ else if (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid))
{
- dprintf(" GUID = %08X\n", ((GUID*)riid)->Data1);
+ IAMMediaStreamImpl* ms = (IAMMediaStreamImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMediaStreamImpl));
+
+ dprintf(" GUID = %08X (IID_IXXMediaStream)\n", ((GUID*)riid)->Data1);
+
+ ms->lpVtbl = &g_ms_vtbl;
+ ms->lpVtbl->AddRef(ms);
+
+ *obj = ms;
ret = S_OK;
}
+ else
+ {
+ dprintf("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
+
+ ret = E_FAIL;
+ }
}
dprintf("<- %s\n", __FUNCTION__);