[QCAP] DLL setup function implementation, patch 2, trying as inline
Rolf Kalbermatter
rolf.kalbermatter at citeng.com
Fri May 6 15:32:44 CDT 2005
Changelog
- dlls/qcap/qcap_main.c
dlls/qcap/capturegraph.c
Implement ICaptureGraphBuilder and IcaptureGraphBuilder2 based on
Maarten Lankhorst's patch
Rolf Kalbermatter
Index: Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/qcap/Makefile.in,v
--- dlls/qcap/Makefile.old.in 2005-05-06 22:08:01.000000000 +0200
+++ dlls/qcap/Makefile.in 2005-05-06 19:54:21.000000000 +0200
@@ -6,7 +6,8 @@
IMPORTS = ole32 oleaut32 user32 advapi32 kernel32
EXTRALIBS = -lstrmiids -luuid $(LIBUNICODE)
-C_SRCS = dllsetup.c \
+C_SRCS = capturegraph.c \
+ dllsetup.c \
qcap_main.c
RC_SRCS = version.rc
Index: qcap_main.c
===================================================================
RCS file: /home/wine/wine/dlls/qcap/qcap_main.c,v
--- dlls/qcap/qcap_main.old.c 2005-05-06 22:10:28.000000000 +0200
+++ dlls/qcap/qcap_main.c 2005-05-06 20:13:11.000000000 +0200
@@ -120,7 +120,7 @@
&CLSID_FileWriter,
QCAP_createFileWriter,
NULL
- },{
+ },*/{
wCaptGraphBuilder,
&CLSID_CaptureGraphBuilder,
QCAP_createCaptureGraphBuilder2,
@@ -130,7 +130,7 @@
&CLSID_CaptureGraphBuilder2,
QCAP_createCaptureGraphBuilder2,
NULL
- },{
+ }/*,{
wInfPinTeeFilter,
&CLSID_InfinitePinTeeFilter,
QCAP_createInfinitePinTeeFilter,
Index: capturegraph.c
===================================================================
RCS file: /home/wine/wine/dlls/qcap/capturegraph.c,v
--- /dev/null 2003-03-14 14:07:09.000000000 +0100
+++ dlls/qcap/capturegraph.c 2005-05-06 21:52:11.000000000 +0200
@@ -0,0 +1,486 @@
+/* Capture Graph Builder, Minimal edition
+ *
+ * Copyright 2005 Maarten Lankhorst
+ * Copyright 2005 Rolf Kalbermatter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+#include "config.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#define COBJMACROS
+#define NONAMELESSSTRUCT
+#define NONAMELESSUNION
+
+#include "windef.h"
+#include "winbase.h"
+#include "winerror.h"
+#include "objbase.h"
+#include "uuids.h"
+
+#include "evcode.h"
+#include "strmif.h"
+#include "control.h"
+//#include "amvideo.h"
+//#include "mmreg.h"
+//#include "vfwmsgs.h"
+//#include "dshow.h"
+//#include "ddraw.h"
+#include "qcap_main.h"
+
+#include "wine/unicode.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(quartz);
+
+static const WCHAR wcsInputPinName[] = {'i','n','p','u','t','
','p','i','n',0};
+
+/**********************************************************************
*
+* ICaptureGraphBuilder & ICaptureGraphBuilder2 implementation
+*/
+typedef struct CaptureGraphImpl
+{
+ const ICaptureGraphBuilder2Vtbl * lpVtbl2;
+ const ICaptureGraphBuilderVtbl * lpVtbl;
+ DWORD ref;
+ IGraphBuilder *mygraph;
+
+ CRITICAL_SECTION csFilter;
+} CaptureGraphImpl;
+
+static const ICaptureGraphBuilderVtbl builder_Vtbl;
+static const ICaptureGraphBuilder2Vtbl builder2_Vtbl;
+
+#define _ICaptureGraphBuilder_Offset
((int)(&(((CaptureGraphImpl*)0)->lpVtbl)))
+#define _ICOM_THIS_From_ICaptureGraphBuilder(class, name) class* This =
(class*)(((char*)name)-_ICaptureGraphBuilder_Offset)
+
+#define _ICaptureGraphBuilder2_Offset
((int)(&(((CaptureGraphImpl*)0)->lpVtbl2)))
+#define _ICOM_THIS_From_ICaptureGraphBuilder2(class, name) class* This
= (class*)(((char*)name)-_ICaptureGraphBuilder2_Offset)
+
+/*
+ converts This to an interface pointer
+*/
+#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl2)
+#define _ICaptureGraphBuilder_(This)
(ICaptureGraphBuilder*)&(This->lpVtbl)
+#define _ICaptureGraphBuilder2_(This)
(ICaptureGraphBuilder2*)&(This->lpVtbl2)
+
+
+IUnknown * CALLBACK QCAP_createCaptureGraphBuilder2(IUnknown
*pUnkOuter,
+ HRESULT *phr)
+{
+ CaptureGraphImpl * pCapture = NULL;
+
+ TRACE("(%p, %p)\n", pUnkOuter, phr);
+
+ *phr = CLASS_E_NOAGGREGATION;
+ if (pUnkOuter)
+ {
+ return NULL;
+ }
+ *phr = E_OUTOFMEMORY;
+
+ pCapture = CoTaskMemAlloc(sizeof(CaptureGraphImpl));
+ if (pCapture)
+ {
+ pCapture->lpVtbl2 = &builder2_Vtbl;
+ pCapture->lpVtbl = &builder_Vtbl;
+ pCapture->ref = 1;
+ pCapture->mygraph = NULL;
+ InitializeCriticalSection(&pCapture->csFilter);
+ *phr = S_OK;
+ }
+ return (IUnknown *)pCapture;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_QueryInterface(ICaptureGraphBuilder2 * iface,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid),
ppv);
+
+ *ppv = NULL;
+ if (IsEqualIID(riid, &IID_IUnknown))
+ *ppv = _IUnknown_(This);
+ else if (IsEqualIID(riid, &IID_ICaptureGraphBuilder))
+ *ppv = _ICaptureGraphBuilder_(This);
+ else if (IsEqualIID(riid, &IID_ICaptureGraphBuilder2))
+ *ppv = _ICaptureGraphBuilder2_(This);
+
+ if (*ppv)
+ {
+ IUnknown_AddRef((IUnknown *)(*ppv));
+ TRACE ("-- Interface = %p\n", *ppv);
+ return S_OK;
+ }
+
+ TRACE ("-- Interface: E_NOINTERFACE\n");
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI
+fnCaptureGraphBuilder2_AddRef(ICaptureGraphBuilder2 * iface)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+ DWORD ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, ref - 1);
+ return ref;
+}
+
+static ULONG WINAPI
+fnCaptureGraphBuilder2_Release(ICaptureGraphBuilder2 * iface)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+ DWORD ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p/%p)->() Release from %ld\n", This, iface, ref + 1);
+
+ if (!ref)
+ {
+ FIXME("Release IGraphFilter or w/e\n");
+ DeleteCriticalSection(&This->csFilter);
+ This->lpVtbl = NULL;
+ This->lpVtbl2 = NULL;
+ if (This->mygraph != NULL)
+ IGraphBuilder_Release((IGraphBuilder *)This->mygraph);
+ CoTaskMemFree(This);
+ return 0;
+ }
+ else
+ return ref;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_SetFilterGraph(ICaptureGraphBuilder2 * iface,
+ IGraphBuilder *pfg)
+{
+/* The graph builder will automatically create a filter graph if you
don't call
+ this method. If you call this method after the graph builder has
created its
+ own filter graph, the call will fail. */
+ IMediaEvent *pmev;
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ TRACE("(%p/%p)->(%p)\n", This, iface, pfg);
+
+ if (!This->mygraph)
+ return E_UNEXPECTED;
+
+ if (!pfg)
+ return E_POINTER;
+
+ This->mygraph = pfg;
+ IGraphBuilder_AddRef((IGraphBuilder *)This->mygraph);
+ if (SUCCEEDED(IUnknown_QueryInterface(This->mygraph,
+ &IID_IMediaEvent, (LPVOID
*)&pmev)))
+ {
+ IMediaEvent_CancelDefaultHandling(pmev, EC_REPAINT);
+ IMediaEvent_Release(pmev);
+ }
+ return S_OK;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_GetFilterGraph(ICaptureGraphBuilder2 * iface,
+ IGraphBuilder **pfg)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ TRACE("(%p/%p)->(%p)\n", This, iface, pfg);
+
+ if (!pfg)
+ return E_POINTER;
+
+ *pfg = This->mygraph;
+ if (!This->mygraph)
+ {
+ TRACE("(%p) Getting NULL filtergraph\n", iface);
+ return E_UNEXPECTED;
+ }
+
+ IGraphBuilder_AddRef((IGraphBuilder *)This->mygraph);
+
+ TRACE("(%p) return filtergraph %p\n", iface, *pfg);
+ return S_OK;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_SetOutputFileName(ICaptureGraphBuilder2 * iface,
+ const GUID *pType,
+ LPCOLESTR lpstrFile,
+ IBaseFilter **ppf,
+ IFileSinkFilter **ppSink)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ FIXME("(%p/%p)->(%s, %s, %p, %p) Stub!\n", This, iface,
+ debugstr_guid(pType), debugstr_w(lpstrFile), ppf, ppSink);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_FindInterface(ICaptureGraphBuilder2 * iface,
+ const GUID *pCategory,
+ const GUID *pType,
+ IBaseFilter *pf,
+ REFIID riid,
+ void **ppint)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ FIXME("(%p/%p)->(%s, %s, %p, %s, %p) - workaround stub!\n", This,
iface,
+ debugstr_guid(pCategory), debugstr_guid(pType),
+ pf, debugstr_guid(riid), ppint);
+
+ return IBaseFilter_QueryInterface(pf, riid, ppint);
+ /* Looks for the specified interface on the filter, upstream and
+ * downstream from the filter, and, optionally, only on the output
+ * pin of the given category.
+ */
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface,
+ const GUID *pCategory,
+ const GUID *pType,
+ IUnknown *pSource,
+ IBaseFilter *pfCompressor,
+ IBaseFilter *pfRenderer)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ FIXME("(%p/%p)->(%s, %s, %p, %p, %p) Stub!\n", This, iface,
+ debugstr_guid(pCategory), debugstr_guid(pType),
+ pSource, pfCompressor, pfRenderer);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_ControlStream(ICaptureGraphBuilder2 * iface,
+ const GUID *pCategory,
+ const GUID *pType,
+ IBaseFilter *pFilter,
+ REFERENCE_TIME *pstart,
+ REFERENCE_TIME *pstop,
+ WORD wStartCookie,
+ WORD wStopCookie)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ FIXME("(%p/%p)->(%s, %s, %p, %p, %p, %i, %i) Stub!\n", This, iface,
+ debugstr_guid(pCategory), debugstr_guid(pType),
+ pFilter, pstart, pstop, wStartCookie, wStopCookie);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_AllocCapFile(ICaptureGraphBuilder2 * iface,
+ LPCOLESTR lpwstr,
+ DWORDLONG dwlSize)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ FIXME("(%p/%p)->(%s, %lld) Stub!\n", This, iface,
+ debugstr_w(lpwstr), dwlSize);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_CopyCaptureFile(ICaptureGraphBuilder2 * iface,
+ LPOLESTR lpwstrOld,
+ LPOLESTR lpwstrNew,
+ int fAllowEscAbort,
+ IAMCopyCaptureFileProgress
*pCallback)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ FIXME("(%p/%p)->(%s, %s, %i, %p) Stub!\n", This, iface,
+ debugstr_w(lpwstrOld), debugstr_w(lpwstrNew),
+ fAllowEscAbort, pCallback);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder2_FindPin(ICaptureGraphBuilder2 * iface,
+ IUnknown *pSource,
+ PIN_DIRECTION pindir,
+ const GUID *pCategory,
+ const GUID *pType,
+ BOOL fUnconnected,
+ int num,
+ IPin **ppPin)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
+
+ FIXME("(%p/%p)->(%p, %x, %s, %s, %d, %i, %p) Stub!\n", This, iface,
+ pSource, pindir, debugstr_guid(pCategory),
debugstr_guid(pType),
+ fUnconnected, num, ppPin);
+
+ return E_NOTIMPL;
+}
+
+static const ICaptureGraphBuilder2Vtbl builder2_Vtbl =
+{
+ fnCaptureGraphBuilder2_QueryInterface,
+ fnCaptureGraphBuilder2_AddRef,
+ fnCaptureGraphBuilder2_Release,
+ fnCaptureGraphBuilder2_SetFilterGraph,
+ fnCaptureGraphBuilder2_GetFilterGraph,
+ fnCaptureGraphBuilder2_SetOutputFileName,
+ fnCaptureGraphBuilder2_FindInterface,
+ fnCaptureGraphBuilder2_RenderStream,
+ fnCaptureGraphBuilder2_ControlStream,
+ fnCaptureGraphBuilder2_AllocCapFile,
+ fnCaptureGraphBuilder2_CopyCaptureFile,
+ fnCaptureGraphBuilder2_FindPin
+};
+
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_QueryInterface(ICaptureGraphBuilder * iface,
+ REFIID riid, LPVOID * ppv)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return IUnknown_QueryInterface(_ICaptureGraphBuilder2_(This), riid,
ppv);
+}
+
+static ULONG WINAPI
+fnCaptureGraphBuilder_AddRef(ICaptureGraphBuilder * iface)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return IUnknown_AddRef(_ICaptureGraphBuilder2_(This));
+}
+
+static ULONG WINAPI
+fnCaptureGraphBuilder_Release(ICaptureGraphBuilder * iface)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return IUnknown_Release(_ICaptureGraphBuilder2_(This));
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_SetFiltergraph(ICaptureGraphBuilder * iface,
+ IGraphBuilder *pfg)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_SetFiltergraph(_ICaptureGraphBuilder2_(This),
pfg);
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_GetFiltergraph(ICaptureGraphBuilder * iface,
+ IGraphBuilder **pfg)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_GetFiltergraph(_ICaptureGraphBuilder2_(This),
pfg);
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_SetOutputFileName(ICaptureGraphBuilder * iface,
+ const GUID *pType, LPCOLESTR
lpstrFile,
+ IBaseFilter **ppf,
IFileSinkFilter **ppSink)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_SetOutputFileName(_ICaptureGraphBuilder2_(This),
+ pType, lpstrFile,
ppf, ppSink);
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_FindInterface(ICaptureGraphBuilder * iface,
+ const GUID *pCategory, IBaseFilter
*pf,
+ REFIID riid, void **ppint)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_FindInterface(_ICaptureGraphBuilder2_(This),
+ pCategory, NULL, pf,
riid, ppint);
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_RenderStream(ICaptureGraphBuilder * iface,
+ const GUID *pCategory, IUnknown
*pSource,
+ IBaseFilter *pfCompressor,
IBaseFilter *pfRenderer)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_RenderStream(_ICaptureGraphBuilder2_(This),
+ pCategory, NULL, pSource,
+ pfCompressor,
pfRenderer);
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_ControlStream(ICaptureGraphBuilder * iface,
+ const GUID *pCategory, IBaseFilter
*pFilter,
+ REFERENCE_TIME *pstart,
REFERENCE_TIME *pstop,
+ WORD wStartCookie, WORD
wStopCookie)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_ControlStream(_ICaptureGraphBuilder2_(This),
+ pCategory, NULL,
pFilter, pstart,
+ pstop, wStartCookie,
wStopCookie);
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_AllocCapFile(ICaptureGraphBuilder * iface,
+ LPCOLESTR lpstr, DWORDLONG dwlSize)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_AllocCapFile(_ICaptureGraphBuilder2_(This),
+ lpstr, dwlSize);
+}
+
+static HRESULT WINAPI
+fnCaptureGraphBuilder_CopyCaptureFile(ICaptureGraphBuilder * iface,
+ LPOLESTR lpwstrOld, LPOLESTR
lpwstrNew,
+ int fAllowEscAbort,
+ IAMCopyCaptureFileProgress
*pCallback)
+{
+ _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
+
+ return
ICaptureGraphBuilder2_CopyCaptureFile(_ICaptureGraphBuilder2_(This),
+ lpwstrOld, lpwstrNew,
+ fAllowEscAbort,
pCallback);
+}
+
+static const ICaptureGraphBuilderVtbl builder_Vtbl =
+{
+ fnCaptureGraphBuilder_QueryInterface,
+ fnCaptureGraphBuilder_AddRef,
+ fnCaptureGraphBuilder_Release,
+ fnCaptureGraphBuilder_SetFiltergraph,
+ fnCaptureGraphBuilder_GetFiltergraph,
+ fnCaptureGraphBuilder_SetOutputFileName,
+ fnCaptureGraphBuilder_FindInterface,
+ fnCaptureGraphBuilder_RenderStream,
+ fnCaptureGraphBuilder_ControlStream,
+ fnCaptureGraphBuilder_AllocCapFile,
+ fnCaptureGraphBuilder_CopyCaptureFile
+};
More information about the wine-patches
mailing list