* Sync with Wine 1.7.1.
CORE-7469

svn path=/trunk/; revision=60605
This commit is contained in:
Amine Khaldi 2013-10-11 13:12:40 +00:00
parent fa4306dffc
commit e007f33d9a
10 changed files with 427 additions and 591 deletions

View file

@ -1,35 +1,17 @@
add_definitions(-D__WINESRC__)
remove_definitions(-D_WIN32_WINNT=0x502)
add_definitions(-D_WIN32_WINNT=0x600)
include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine)
spec2def(qedit.dll qedit.spec)
add_library(qedit SHARED
list(APPEND SOURCE
main.c
mediadet.c
regsvr.c
samplegrabber.c
${CMAKE_CURRENT_BINARY_DIR}/qedit.def)
set_module_type(qedit win32dll UNICODE)
target_link_libraries(qedit
strmiids
uuid
wine)
add_importlibs(qedit
msvcrt
advapi32
ole32
oleaut32
kernel32
ntdll)
add_library(qedit SHARED ${SOURCE} qedit.rc)
set_module_type(qedit win32dll)
target_link_libraries(qedit strmiids uuid wine)
add_importlibs(qedit ole32 oleaut32 msvcrt kernel32 ntdll)
add_pch(qedit qedit_private.h)
add_dependencies(qedit dxsdk)
add_cd_file(TARGET qedit DESTINATION reactos/system32 FOR all)

View file

@ -18,18 +18,20 @@
*/
#include "qedit_private.h"
#include <rpcproxy.h>
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(qedit);
static HINSTANCE instance;
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
{
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
instance = hInstDLL;
DisableThreadLibraryCalls(hInstDLL);
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
@ -38,12 +40,16 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
* DirectShow ClassFactory
*/
typedef struct {
IClassFactory ITF_IClassFactory;
IClassFactory IClassFactory_iface;
LONG ref;
HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
} IClassFactoryImpl;
static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
{
return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
}
struct object_creation_info
{
const CLSID *clsid;
@ -56,34 +62,30 @@ static const struct object_creation_info object_creation[] =
{ &CLSID_SampleGrabber, SampleGrabber_create },
};
static HRESULT WINAPI
DSCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
static HRESULT WINAPI DSCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
if (IsEqualGUID(riid, &IID_IUnknown)
|| IsEqualGUID(riid, &IID_IClassFactory))
{
IClassFactory_AddRef(iface);
*ppobj = This;
*ppobj = iface;
return S_OK;
}
*ppobj = NULL;
WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
WARN("(%p)->(%s,%p), not found\n", iface, debugstr_guid(riid), ppobj);
return E_NOINTERFACE;
}
static ULONG WINAPI DSCF_AddRef(LPCLASSFACTORY iface)
static ULONG WINAPI DSCF_AddRef(IClassFactory *iface)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
IClassFactoryImpl *This = impl_from_IClassFactory(iface);
return InterlockedIncrement(&This->ref);
}
static ULONG WINAPI DSCF_Release(LPCLASSFACTORY iface)
static ULONG WINAPI DSCF_Release(IClassFactory *iface)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
IClassFactoryImpl *This = impl_from_IClassFactory(iface);
ULONG ref = InterlockedDecrement(&This->ref);
if (ref == 0)
@ -92,15 +94,19 @@ static ULONG WINAPI DSCF_Release(LPCLASSFACTORY iface)
return ref;
}
static HRESULT WINAPI DSCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
static HRESULT WINAPI DSCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid,
void **ppobj)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
IClassFactoryImpl *This = impl_from_IClassFactory(iface);
HRESULT hres;
LPUNKNOWN punk;
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
*ppobj = NULL;
if (pOuter && !IsEqualGUID(&IID_IUnknown, riid))
return E_INVALIDARG;
hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
if (SUCCEEDED(hres)) {
hres = IUnknown_QueryInterface(punk, riid, ppobj);
@ -109,9 +115,9 @@ static HRESULT WINAPI DSCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter
return hres;
}
static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
static HRESULT WINAPI DSCF_LockServer(IClassFactory *iface, BOOL dolock)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
IClassFactoryImpl *This = impl_from_IClassFactory(iface);
FIXME("(%p)->(%d),stub!\n",This,dolock);
return S_OK;
}
@ -131,7 +137,7 @@ static const IClassFactoryVtbl DSCF_Vtbl =
*/
HRESULT WINAPI DllCanUnloadNow(void)
{
return S_OK;
return S_FALSE;
}
/*******************************************************************************
@ -175,11 +181,27 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
factory = CoTaskMemAlloc(sizeof(*factory));
if (factory == NULL) return E_OUTOFMEMORY;
factory->ITF_IClassFactory.lpVtbl = &DSCF_Vtbl;
factory->IClassFactory_iface.lpVtbl = &DSCF_Vtbl;
factory->ref = 1;
factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
*ppv = &(factory->ITF_IClassFactory);
*ppv = &factory->IClassFactory_iface;
return S_OK;
}
/***********************************************************************
* DllRegisterServer (QEDIT.@)
*/
HRESULT WINAPI DllRegisterServer(void)
{
return __wine_register_resources( instance );
}
/***********************************************************************
* DllUnregisterServer (QEDIT.@)
*/
HRESULT WINAPI DllUnregisterServer(void)
{
return __wine_unregister_resources( instance );
}

View file

@ -33,8 +33,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(qedit);
typedef struct MediaDetImpl {
const IMediaDetVtbl *MediaDet_Vtbl;
LONG refCount;
IUnknown IUnknown_inner;
IMediaDet IMediaDet_iface;
IUnknown *outer_unk;
LONG ref;
IGraphBuilder *graph;
IBaseFilter *source;
IBaseFilter *splitter;
@ -43,6 +45,16 @@ typedef struct MediaDetImpl {
IPin *cur_pin;
} MediaDetImpl;
static inline MediaDetImpl *impl_from_IUnknown(IUnknown *iface)
{
return CONTAINING_RECORD(iface, MediaDetImpl, IUnknown_inner);
}
static inline MediaDetImpl *impl_from_IMediaDet(IMediaDet *iface)
{
return CONTAINING_RECORD(iface, MediaDetImpl, IMediaDet_iface);
}
static void MD_cleanup(MediaDetImpl *This)
{
if (This->cur_pin) IPin_Release(This->cur_pin);
@ -57,64 +69,98 @@ static void MD_cleanup(MediaDetImpl *This)
This->cur_stream = 0;
}
static ULONG WINAPI MediaDet_AddRef(IMediaDet* iface)
/* MediaDet inner IUnknown */
static HRESULT WINAPI MediaDet_inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p)->() AddRef from %d\n", This, refCount - 1);
return refCount;
MediaDetImpl *This = impl_from_IUnknown(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown))
*ppv = &This->IUnknown_inner;
else if (IsEqualIID(riid, &IID_IMediaDet))
*ppv = &This->IMediaDet_iface;
else
WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
if (!*ppv)
return E_NOINTERFACE;
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
static ULONG WINAPI MediaDet_Release(IMediaDet* iface)
static ULONG WINAPI MediaDet_inner_AddRef(IUnknown *iface)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
MediaDetImpl *This = impl_from_IUnknown(iface);
ULONG ref = InterlockedIncrement(&This->ref);
if (refCount == 0)
TRACE("(%p) new ref = %u\n", This, ref);
return ref;
}
static ULONG WINAPI MediaDet_inner_Release(IUnknown *iface)
{
MediaDetImpl *This = impl_from_IUnknown(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) new ref = %u\n", This, ref);
if (ref == 0)
{
MD_cleanup(This);
CoTaskMemFree(This);
return 0;
}
return refCount;
return ref;
}
static HRESULT WINAPI MediaDet_QueryInterface(IMediaDet* iface, REFIID riid,
void **ppvObject)
static const IUnknownVtbl mediadet_vtbl =
{
MediaDetImpl *This = (MediaDetImpl *)iface;
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
MediaDet_inner_QueryInterface,
MediaDet_inner_AddRef,
MediaDet_inner_Release,
};
if (IsEqualIID(riid, &IID_IUnknown) ||
IsEqualIID(riid, &IID_IMediaDet)) {
MediaDet_AddRef(iface);
*ppvObject = This;
return S_OK;
}
*ppvObject = NULL;
WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
return E_NOINTERFACE;
/* IMediaDet implementation */
static HRESULT WINAPI MediaDet_QueryInterface(IMediaDet *iface, REFIID riid, void **ppv)
{
MediaDetImpl *This = impl_from_IMediaDet(iface);
return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
static ULONG WINAPI MediaDet_AddRef(IMediaDet *iface)
{
MediaDetImpl *This = impl_from_IMediaDet(iface);
return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI MediaDet_Release(IMediaDet *iface)
{
MediaDetImpl *This = impl_from_IMediaDet(iface);
return IUnknown_Release(This->outer_unk);
}
static HRESULT WINAPI MediaDet_get_Filter(IMediaDet* iface, IUnknown **pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%p): not implemented!\n", This, pVal);
return E_NOTIMPL;
}
static HRESULT WINAPI MediaDet_put_Filter(IMediaDet* iface, IUnknown *newVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%p): not implemented!\n", This, newVal);
return E_NOTIMPL;
}
static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, LONG *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
IEnumPins *pins;
IPin *pin;
HRESULT hr;
@ -158,7 +204,7 @@ static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, LONG *pVal)
static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, LONG *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
TRACE("(%p)\n", This);
if (!pVal)
@ -211,7 +257,7 @@ static HRESULT SetCurPin(MediaDetImpl *This, LONG strm)
static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, LONG newVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
HRESULT hr;
TRACE("(%p)->(%d)\n", This, newVal);
@ -237,28 +283,28 @@ static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, LONG newVal)
static HRESULT WINAPI MediaDet_get_StreamType(IMediaDet* iface, GUID *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
FIXME("(%p)->(%p): not implemented!\n", This, debugstr_guid(pVal));
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%s): not implemented!\n", This, debugstr_guid(pVal));
return E_NOTIMPL;
}
static HRESULT WINAPI MediaDet_get_StreamTypeB(IMediaDet* iface, BSTR *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%p): not implemented!\n", This, pVal);
return E_NOTIMPL;
}
static HRESULT WINAPI MediaDet_get_StreamLength(IMediaDet* iface, double *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p): stub!\n", This);
return VFW_E_INVALIDMEDIATYPE;
}
static HRESULT WINAPI MediaDet_get_Filename(IMediaDet* iface, BSTR *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
IFileSourceFilter *file;
LPOLESTR name;
HRESULT hr;
@ -378,52 +424,56 @@ static HRESULT GetSplitter(MediaDetImpl *This)
if (FAILED(hr))
return hr;
hr = IEnumMoniker_Next(filters, 1, &mon, NULL);
IEnumMoniker_Release(filters);
if (hr != S_OK) /* No matches, what do we do? */
return E_NOINTERFACE;
hr = GetFilterInfo(mon, &clsid, &var);
IMoniker_Release(mon);
if (FAILED(hr))
return hr;
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
&IID_IBaseFilter, (void **) &splitter);
if (FAILED(hr))
hr = E_NOINTERFACE;
while (IEnumMoniker_Next(filters, 1, &mon, NULL) == S_OK)
{
hr = GetFilterInfo(mon, &clsid, &var);
IMoniker_Release(mon);
if (FAILED(hr))
continue;
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
&IID_IBaseFilter, (void **) &splitter);
if (FAILED(hr))
{
VariantClear(&var);
continue;
}
hr = IGraphBuilder_AddFilter(This->graph, splitter,
V_UNION(&var, bstrVal));
VariantClear(&var);
return hr;
}
This->splitter = splitter;
if (FAILED(hr))
goto retry;
hr = IGraphBuilder_AddFilter(This->graph, splitter,
V_UNION(&var, bstrVal));
VariantClear(&var);
if (FAILED(hr))
{
IBaseFilter_Release(splitter);
return hr;
}
This->splitter = splitter;
hr = IBaseFilter_EnumPins(This->source, &pins);
if (FAILED(hr))
goto retry;
IEnumPins_Next(pins, 1, &source_pin, NULL);
IEnumPins_Release(pins);
hr = IBaseFilter_EnumPins(This->source, &pins);
if (FAILED(hr))
return hr;
IEnumPins_Next(pins, 1, &source_pin, NULL);
IEnumPins_Release(pins);
hr = IBaseFilter_EnumPins(splitter, &pins);
if (FAILED(hr))
{
IPin_Release(source_pin);
goto retry;
}
IEnumPins_Next(pins, 1, &splitter_pin, NULL);
IEnumPins_Release(pins);
hr = IBaseFilter_EnumPins(splitter, &pins);
if (FAILED(hr))
{
hr = IPin_Connect(source_pin, splitter_pin, NULL);
IPin_Release(source_pin);
return hr;
}
IEnumPins_Next(pins, 1, &splitter_pin, NULL);
IEnumPins_Release(pins);
IPin_Release(splitter_pin);
if (SUCCEEDED(hr))
break;
hr = IPin_Connect(source_pin, splitter_pin, NULL);
IPin_Release(source_pin);
IPin_Release(splitter_pin);
retry:
IBaseFilter_Release(splitter);
This->splitter = NULL;
}
IEnumMoniker_Release(filters);
if (FAILED(hr))
return hr;
@ -433,7 +483,7 @@ static HRESULT GetSplitter(MediaDetImpl *This)
static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal)
{
static const WCHAR reader[] = {'R','e','a','d','e','r',0};
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
IGraphBuilder *gb;
IBaseFilter *bf;
HRESULT hr;
@ -472,7 +522,7 @@ static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet* iface,
LONG *pBufferSize, char *pBuffer,
LONG Width, LONG Height)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%f %p %p %d %d): not implemented!\n", This, StreamTime, pBufferSize, pBuffer,
Width, Height);
return E_NOTIMPL;
@ -482,7 +532,7 @@ static HRESULT WINAPI MediaDet_WriteBitmapBits(IMediaDet* iface,
double StreamTime, LONG Width,
LONG Height, BSTR Filename)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%f %d %d %p): not implemented!\n", This, StreamTime, Width, Height, Filename);
return E_NOTIMPL;
}
@ -490,7 +540,7 @@ static HRESULT WINAPI MediaDet_WriteBitmapBits(IMediaDet* iface,
static HRESULT WINAPI MediaDet_get_StreamMediaType(IMediaDet* iface,
AM_MEDIA_TYPE *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
IEnumMediaTypes *types;
AM_MEDIA_TYPE *pmt;
HRESULT hr;
@ -524,14 +574,14 @@ static HRESULT WINAPI MediaDet_get_StreamMediaType(IMediaDet* iface,
static HRESULT WINAPI MediaDet_GetSampleGrabber(IMediaDet* iface,
ISampleGrabber **ppVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%p): not implemented!\n", This, ppVal);
return E_NOTIMPL;
}
static HRESULT WINAPI MediaDet_get_FrameRate(IMediaDet* iface, double *pVal)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
AM_MEDIA_TYPE mt;
VIDEOINFOHEADER *vh;
HRESULT hr;
@ -561,7 +611,7 @@ static HRESULT WINAPI MediaDet_get_FrameRate(IMediaDet* iface, double *pVal)
static HRESULT WINAPI MediaDet_EnterBitmapGrabMode(IMediaDet* iface,
double SeekTime)
{
MediaDetImpl *This = (MediaDetImpl *)iface;
MediaDetImpl *This = impl_from_IMediaDet(iface);
FIXME("(%p)->(%f): not implemented!\n", This, SeekTime);
return E_NOTIMPL;
}
@ -594,9 +644,6 @@ HRESULT MediaDet_create(IUnknown * pUnkOuter, LPVOID * ppv) {
TRACE("(%p,%p)\n", ppv, pUnkOuter);
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
obj = CoTaskMemAlloc(sizeof(MediaDetImpl));
if (NULL == obj) {
*ppv = NULL;
@ -604,8 +651,9 @@ HRESULT MediaDet_create(IUnknown * pUnkOuter, LPVOID * ppv) {
}
ZeroMemory(obj, sizeof(MediaDetImpl));
obj->refCount = 1;
obj->MediaDet_Vtbl = &IMediaDet_VTable;
obj->ref = 1;
obj->IUnknown_inner.lpVtbl = &mediadet_vtbl;
obj->IMediaDet_iface.lpVtbl = &IMediaDet_VTable;
obj->graph = NULL;
obj->source = NULL;
obj->splitter = NULL;
@ -614,5 +662,11 @@ HRESULT MediaDet_create(IUnknown * pUnkOuter, LPVOID * ppv) {
obj->cur_stream = 0;
*ppv = obj;
if (pUnkOuter)
obj->outer_unk = pUnkOuter;
else
obj->outer_unk = &obj->IUnknown_inner;
*ppv = &obj->IUnknown_inner;
return S_OK;
}

View file

@ -0,0 +1 @@
1 WINE_REGISTRY qedit_classes.rgs

View file

@ -0,0 +1,32 @@
/*
* COM Classes for qedit
*
* Copyright 2010 Alexandre Julliard
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
[
threading(both),
uuid(65bd0711-24d2-4ff7-9324-ed2e5d3abafa)
]
coclass MediaDet { interface IMediaDet; }
[
helpstring("Sample Grabber"),
threading(both),
uuid(c1f400a0-3f08-11d3-9f0b-006008039e37)
]
coclass SampleGrabber { interface ISampleGrabber; }

View file

@ -0,0 +1,17 @@
HKCR
{
NoRemove Interface
{
}
NoRemove CLSID
{
'{65BD0711-24D2-4FF7-9324-ED2E5D3ABAFA}' = s 'MediaDet'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
'{C1F400A0-3F08-11D3-9F0B-006008039E37}' = s 'Sample Grabber'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
}
}

View file

@ -2,9 +2,6 @@
*
* Copyright 2008 Google (Lei Zhang)
*
* This file contains the (internal) driver registration functions,
* driver enumeration APIs and DirectDraw creation functions.
*
* 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
@ -43,7 +40,7 @@
#define __WINE_DDRAW_H /* ROS HACK */
#include <qedit.h>
HRESULT MediaDet_create(IUnknown *pUnkOuter, LPVOID *ppObj);
HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppObj);
HRESULT MediaDet_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
#endif /* __QEDIT_PRIVATE_INCLUDED__ */

View file

@ -1,330 +0,0 @@
/*
* self-registerable dll functions for qedit.dll
*
* Copyright (C) 2008 Google (Lei Zhang)
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "qedit_private.h"
//#include "winreg.h"
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(qedit);
struct regsvr_coclass
{
CLSID const *clsid; /* NULL for end of list */
LPCSTR name; /* can be NULL to omit */
LPCSTR ips; /* can be NULL to omit */
LPCSTR ips32; /* can be NULL to omit */
LPCSTR ips32_tmodel; /* can be NULL to omit */
LPCSTR progid; /* can be NULL to omit */
LPCSTR viprogid; /* can be NULL to omit */
LPCSTR progid_extra; /* can be NULL to omit */
};
static HRESULT register_coclasses(struct regsvr_coclass const *list);
static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
/***********************************************************************
* static string constants
*/
static WCHAR const clsid_keyname[6] = {
'C', 'L', 'S', 'I', 'D', 0 };
static WCHAR const curver_keyname[7] = {
'C', 'u', 'r', 'V', 'e', 'r', 0 };
static WCHAR const ips_keyname[13] = {
'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', 0 };
static WCHAR const ips32_keyname[15] = {
'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', '3', '2', 0 };
static WCHAR const progid_keyname[7] = {
'P', 'r', 'o', 'g', 'I', 'D', 0 };
static WCHAR const viprogid_keyname[25] = {
'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p',
'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D',
0 };
static char const tmodel_valuename[] = "ThreadingModel";
/***********************************************************************
* static helper functions
*/
static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
WCHAR const *value);
static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
char const *value);
static LONG register_progid(WCHAR const *clsid,
char const *progid, char const *curver_progid,
char const *name, char const *extra);
/***********************************************************************
* register_coclasses
*/
static HRESULT register_coclasses(struct regsvr_coclass const *list)
{
LONG res = ERROR_SUCCESS;
HKEY coclass_key;
res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
if (res != ERROR_SUCCESS) goto error_return;
for (; res == ERROR_SUCCESS && list->clsid; ++list) {
WCHAR buf[39];
HKEY clsid_key;
StringFromGUID2(list->clsid, buf, 39);
res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
if (list->name) {
res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
(CONST BYTE*)(list->name),
strlen(list->name) + 1);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
}
if (list->ips) {
res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
}
if (list->ips32) {
HKEY ips32_key;
res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL,
&ips32_key, NULL);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
(CONST BYTE*)list->ips32,
lstrlenA(list->ips32) + 1);
if (res == ERROR_SUCCESS && list->ips32_tmodel)
res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
(CONST BYTE*)list->ips32_tmodel,
strlen(list->ips32_tmodel) + 1);
RegCloseKey(ips32_key);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
}
if (list->progid) {
res = register_key_defvalueA(clsid_key, progid_keyname,
list->progid);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
res = register_progid(buf, list->progid, NULL,
list->name, list->progid_extra);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
}
if (list->viprogid) {
res = register_key_defvalueA(clsid_key, viprogid_keyname,
list->viprogid);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
res = register_progid(buf, list->viprogid, list->progid,
list->name, list->progid_extra);
if (res != ERROR_SUCCESS) goto error_close_clsid_key;
}
error_close_clsid_key:
RegCloseKey(clsid_key);
}
error_close_coclass_key:
RegCloseKey(coclass_key);
error_return:
return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
}
/***********************************************************************
* unregister_coclasses
*/
static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
{
LONG res = ERROR_SUCCESS;
HKEY coclass_key;
res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
KEY_READ | KEY_WRITE, &coclass_key);
if (res == ERROR_FILE_NOT_FOUND) return S_OK;
if (res != ERROR_SUCCESS) goto error_return;
for (; res == ERROR_SUCCESS && list->clsid; ++list) {
WCHAR buf[39];
StringFromGUID2(list->clsid, buf, 39);
res = RegDeleteTreeW(coclass_key, buf);
if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
if (list->progid) {
res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
}
if (list->viprogid) {
res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid);
if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
}
}
error_close_coclass_key:
RegCloseKey(coclass_key);
error_return:
return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
}
/***********************************************************************
* regsvr_key_defvalueW
*/
static LONG register_key_defvalueW(
HKEY base,
WCHAR const *name,
WCHAR const *value)
{
LONG res;
HKEY key;
res = RegCreateKeyExW(base, name, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL, &key, NULL);
if (res != ERROR_SUCCESS) return res;
res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
(lstrlenW(value) + 1) * sizeof(WCHAR));
RegCloseKey(key);
return res;
}
/***********************************************************************
* regsvr_key_defvalueA
*/
static LONG register_key_defvalueA(
HKEY base,
WCHAR const *name,
char const *value)
{
LONG res;
HKEY key;
res = RegCreateKeyExW(base, name, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL, &key, NULL);
if (res != ERROR_SUCCESS) return res;
res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
lstrlenA(value) + 1);
RegCloseKey(key);
return res;
}
/***********************************************************************
* regsvr_progid
*/
static LONG register_progid(
WCHAR const *clsid,
char const *progid,
char const *curver_progid,
char const *name,
char const *extra)
{
LONG res;
HKEY progid_key;
res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0,
NULL, 0, KEY_READ | KEY_WRITE, NULL,
&progid_key, NULL);
if (res != ERROR_SUCCESS) return res;
if (name) {
res = RegSetValueExA(progid_key, NULL, 0, REG_SZ,
(CONST BYTE*)name, strlen(name) + 1);
if (res != ERROR_SUCCESS) goto error_close_progid_key;
}
if (clsid) {
res = register_key_defvalueW(progid_key, clsid_keyname, clsid);
if (res != ERROR_SUCCESS) goto error_close_progid_key;
}
if (curver_progid) {
res = register_key_defvalueA(progid_key, curver_keyname,
curver_progid);
if (res != ERROR_SUCCESS) goto error_close_progid_key;
}
if (extra) {
HKEY extra_key;
res = RegCreateKeyExA(progid_key, extra, 0,
NULL, 0, KEY_READ | KEY_WRITE, NULL,
&extra_key, NULL);
if (res == ERROR_SUCCESS)
RegCloseKey(extra_key);
}
error_close_progid_key:
RegCloseKey(progid_key);
return res;
}
/***********************************************************************
* coclass list
*/
static struct regsvr_coclass const coclass_list[] = {
{ &CLSID_MediaDet,
"MediaDet",
NULL,
"qedit.dll",
"Both"
},
{ &CLSID_SampleGrabber,
"Sample Grabber",
NULL,
"qedit.dll",
"Both"
},
{ NULL } /* list terminator */
};
/***********************************************************************
* DllRegisterServer (QEDIT.@)
*/
HRESULT WINAPI DllRegisterServer(void)
{
HRESULT hr;
TRACE("\n");
hr = register_coclasses(coclass_list);
return hr;
}
/***********************************************************************
* DllUnregisterServer (QEDIT.@)
*/
HRESULT WINAPI DllUnregisterServer(void)
{
HRESULT hr;
TRACE("\n");
hr = unregister_coclasses(coclass_list);
return hr;
}

View file

@ -32,12 +32,12 @@
WINE_DEFAULT_DEBUG_CHANNEL(qedit);
static WCHAR const vendor_name[] = { 'W', 'i', 'n', 'e', 0 };
static WCHAR const pin_in_name[] = { 'I', 'n', 0 };
static WCHAR const pin_out_name[] = { 'O', 'u', 't', 0 };
static const WCHAR vendor_name[] = { 'W', 'i', 'n', 'e', 0 };
static const WCHAR pin_in_name[] = { 'I', 'n', 0 };
static const WCHAR pin_out_name[] = { 'O', 'u', 't', 0 };
IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount);
IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype);
static IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount);
static IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype);
/* Fixed pins enumerator, holds filter referenced */
typedef struct _PE_Impl {
@ -88,7 +88,7 @@ Fixed_IEnumPins_QueryInterface(IEnumPins *iface, REFIID riid, void **ppvObject)
if (IsEqualIID(riid, &IID_IUnknown) ||
IsEqualIID(riid, &IID_IEnumPins)) {
Fixed_IEnumPins_AddRef(iface);
*ppvObject = &(This->pins);
*ppvObject = This->pins;
return S_OK;
}
*ppvObject = NULL;
@ -171,7 +171,7 @@ static const IEnumPinsVtbl IEnumPins_VTable =
Fixed_IEnumPins_Clone,
};
IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount)
static IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount)
{
ULONG len = sizeof(PE_Impl) + (pinCount * sizeof(IPin *));
PE_Impl *obj = CoTaskMemAlloc(len);
@ -324,7 +324,7 @@ static const IEnumMediaTypesVtbl IEnumMediaTypes_VTable =
Single_IEnumMediaTypes_Clone,
};
IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype)
static IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype)
{
ME_Impl *obj = CoTaskMemAlloc(sizeof(ME_Impl));
if (obj) {
@ -351,20 +351,29 @@ IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype)
/* Sample Grabber pin implementation */
typedef struct _SG_Pin {
const IPinVtbl* lpVtbl;
IPin IPin_iface;
PIN_DIRECTION dir;
WCHAR const *name;
struct _SG_Impl *sg;
IPin *pair;
} SG_Pin;
static inline SG_Pin *impl_from_IPin(IPin *iface)
{
return CONTAINING_RECORD(iface, SG_Pin, IPin_iface);
}
/* Sample Grabber filter implementation */
typedef struct _SG_Impl {
const IBaseFilterVtbl* IBaseFilter_Vtbl;
const ISampleGrabberVtbl* ISampleGrabber_Vtbl;
const IMemInputPinVtbl* IMemInputPin_Vtbl;
/* TODO: IMediaPosition, IMediaSeeking, IQualityControl */
LONG refCount;
IUnknown IUnknown_inner;
IBaseFilter IBaseFilter_iface;
ISampleGrabber ISampleGrabber_iface;
IMemInputPin IMemInputPin_iface;
/* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */
IUnknown* seekthru_unk;
/* TODO: IQualityControl */
IUnknown *outer_unk;
LONG ref;
CRITICAL_SECTION critSect;
FILTER_INFO info;
FILTER_STATE state;
@ -387,20 +396,24 @@ enum {
OneShot_Past,
};
/* Get the SampleGrabber implementation This pointer from various interface pointers */
static inline SG_Impl *impl_from_IUnknown(IUnknown *iface)
{
return CONTAINING_RECORD(iface, SG_Impl, IUnknown_inner);
}
static inline SG_Impl *impl_from_IBaseFilter(IBaseFilter *iface)
{
return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IBaseFilter_Vtbl));
return CONTAINING_RECORD(iface, SG_Impl, IBaseFilter_iface);
}
static inline SG_Impl *impl_from_ISampleGrabber(ISampleGrabber *iface)
{
return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, ISampleGrabber_Vtbl));
return CONTAINING_RECORD(iface, SG_Impl, ISampleGrabber_iface);
}
static inline SG_Impl *impl_from_IMemInputPin(IMemInputPin *iface)
{
return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IMemInputPin_Vtbl));
return CONTAINING_RECORD(iface, SG_Impl, IMemInputPin_iface);
}
@ -422,65 +435,77 @@ 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);
}
/* Common helper AddRef called from all interfaces */
static ULONG SampleGrabber_addref(SG_Impl *This)
/* SampleGrabber inner IUnknown */
static HRESULT WINAPI SampleGrabber_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p) new ref = %u\n", This, refCount);
return refCount;
SG_Impl *This = impl_from_IUnknown(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown))
*ppv = &This->IUnknown_inner;
else if (IsEqualIID(riid, &IID_IPersist) || IsEqualIID(riid, &IID_IMediaFilter) ||
IsEqualIID(riid, &IID_IBaseFilter))
*ppv = &This->IBaseFilter_iface;
else if (IsEqualIID(riid, &IID_ISampleGrabber))
*ppv = &This->ISampleGrabber_iface;
else if (IsEqualIID(riid, &IID_IMemInputPin))
*ppv = &This->IMemInputPin_iface;
else if (IsEqualIID(riid, &IID_IMediaPosition))
return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
else if (IsEqualIID(riid, &IID_IMediaSeeking))
return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
else if (IsEqualIID(riid, &IID_IQualityControl))
FIXME("IQualityControl not implemented\n");
else
WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
if (!*ppv)
return E_NOINTERFACE;
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
/* Common helper Release called from all interfaces */
static ULONG SampleGrabber_release(SG_Impl *This)
static ULONG WINAPI SampleGrabber_AddRef(IUnknown *iface)
{
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p) new ref = %u\n", This, refCount);
if (refCount == 0)
SG_Impl *This = impl_from_IUnknown(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) new ref = %u\n", This, ref);
return ref;
}
static ULONG WINAPI SampleGrabber_Release(IUnknown *iface)
{
SG_Impl *This = impl_from_IUnknown(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) new ref = %u\n", This, ref);
if (ref == 0)
{
SampleGrabber_cleanup(This);
CoTaskMemFree(This);
return 0;
}
return refCount;
return ref;
}
/* Common helper QueryInterface called from all interfaces */
static HRESULT SampleGrabber_query(SG_Impl *This, REFIID riid, void **ppvObject)
static const IUnknownVtbl samplegrabber_vtbl =
{
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
if (IsEqualIID(riid, &IID_IUnknown) ||
IsEqualIID(riid, &IID_IPersist) ||
IsEqualIID(riid, &IID_IMediaFilter) ||
IsEqualIID(riid, &IID_IBaseFilter)) {
SampleGrabber_addref(This);
*ppvObject = &(This->IBaseFilter_Vtbl);
return S_OK;
}
else if (IsEqualIID(riid, &IID_ISampleGrabber)) {
SampleGrabber_addref(This);
*ppvObject = &(This->ISampleGrabber_Vtbl);
return S_OK;
}
else if (IsEqualIID(riid, &IID_IMemInputPin)) {
SampleGrabber_addref(This);
*ppvObject = &(This->IMemInputPin_Vtbl);
return S_OK;
}
else if (IsEqualIID(riid, &IID_IMediaPosition))
FIXME("IMediaPosition not implemented\n");
else if (IsEqualIID(riid, &IID_IMediaSeeking))
FIXME("IMediaSeeking not implemented\n");
else if (IsEqualIID(riid, &IID_IQualityControl))
FIXME("IQualityControl not implemented\n");
*ppvObject = NULL;
WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
return E_NOINTERFACE;
}
SampleGrabber_QueryInterface,
SampleGrabber_AddRef,
SampleGrabber_Release,
};
/* Helper that buffers data and/or calls installed sample callbacks */
static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
@ -546,23 +571,26 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
/* IUnknown */
static HRESULT WINAPI
SampleGrabber_IBaseFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppvObject)
SampleGrabber_IBaseFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv)
{
return SampleGrabber_query(impl_from_IBaseFilter(iface), riid, ppvObject);
SG_Impl *This = impl_from_IBaseFilter(iface);
return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_IBaseFilter_AddRef(IBaseFilter *iface)
{
return SampleGrabber_addref(impl_from_IBaseFilter(iface));
SG_Impl *This = impl_from_IBaseFilter(iface);
return IUnknown_AddRef(This->outer_unk);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_IBaseFilter_Release(IBaseFilter *iface)
{
return SampleGrabber_release(impl_from_IBaseFilter(iface));
SG_Impl *This = impl_from_IBaseFilter(iface);
return IUnknown_Release(This->outer_unk);
}
/* IPersist */
@ -658,8 +686,8 @@ SampleGrabber_IBaseFilter_EnumPins(IBaseFilter *iface, IEnumPins **pins)
TRACE("(%p)->(%p)\n", This, pins);
if (!pins)
return E_POINTER;
pin[0] = (IPin*)&This->pin_in.lpVtbl;
pin[1] = (IPin*)&This->pin_out.lpVtbl;
pin[0] = &This->pin_in.IPin_iface;
pin[1] = &This->pin_out.IPin_iface;
*pins = pinsenum_create(iface, pin, 2);
return *pins ? S_OK : E_OUTOFMEMORY;
}
@ -674,14 +702,14 @@ SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin)
return E_POINTER;
if (!lstrcmpiW(id,pin_in_name))
{
SampleGrabber_addref(This);
*pin = (IPin*)&(This->pin_in.lpVtbl);
*pin = &This->pin_in.IPin_iface;
IPin_AddRef(*pin);
return S_OK;
}
else if (!lstrcmpiW(id,pin_out_name))
{
SampleGrabber_addref(This);
*pin = (IPin*)&(This->pin_out.lpVtbl);
*pin = &This->pin_out.IPin_iface;
IPin_AddRef(*pin);
return S_OK;
}
*pin = NULL;
@ -732,23 +760,26 @@ SampleGrabber_IBaseFilter_QueryVendorInfo(IBaseFilter *iface, LPWSTR *vendor)
/* IUnknown */
static HRESULT WINAPI
SampleGrabber_ISampleGrabber_QueryInterface(ISampleGrabber *iface, REFIID riid, void **ppvObject)
SampleGrabber_ISampleGrabber_QueryInterface(ISampleGrabber *iface, REFIID riid, void **ppv)
{
return SampleGrabber_query(impl_from_ISampleGrabber(iface), riid, ppvObject);
SG_Impl *This = impl_from_ISampleGrabber(iface);
return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_ISampleGrabber_AddRef(ISampleGrabber *iface)
{
return SampleGrabber_addref(impl_from_ISampleGrabber(iface));
SG_Impl *This = impl_from_ISampleGrabber(iface);
return IUnknown_AddRef(This->outer_unk);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_ISampleGrabber_Release(ISampleGrabber *iface)
{
return SampleGrabber_release(impl_from_ISampleGrabber(iface));
SG_Impl *This = impl_from_ISampleGrabber(iface);
return IUnknown_Release(This->outer_unk);
}
/* ISampleGrabber */
@ -879,23 +910,26 @@ SampleGrabber_ISampleGrabber_SetCallback(ISampleGrabber *iface, ISampleGrabberCB
/* IUnknown */
static HRESULT WINAPI
SampleGrabber_IMemInputPin_QueryInterface(IMemInputPin *iface, REFIID riid, void **ppvObject)
SampleGrabber_IMemInputPin_QueryInterface(IMemInputPin *iface, REFIID riid, void **ppv)
{
return SampleGrabber_query(impl_from_IMemInputPin(iface), riid, ppvObject);
SG_Impl *This = impl_from_IMemInputPin(iface);
return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_IMemInputPin_AddRef(IMemInputPin *iface)
{
return SampleGrabber_addref(impl_from_IMemInputPin(iface));
SG_Impl *This = impl_from_IMemInputPin(iface);
return IUnknown_AddRef(This->outer_unk);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_IMemInputPin_Release(IMemInputPin *iface)
{
return SampleGrabber_release(impl_from_IMemInputPin(iface));
SG_Impl *This = impl_from_IMemInputPin(iface);
return IUnknown_Release(This->outer_unk);
}
/* IMemInputPin */
@ -994,37 +1028,41 @@ SampleGrabber_IMemInputPin_ReceiveCanBlock(IMemInputPin *iface)
static ULONG WINAPI
SampleGrabber_IPin_AddRef(IPin *iface)
{
return SampleGrabber_addref(((SG_Pin *)iface)->sg);
SG_Pin *This = impl_from_IPin(iface);
return ISampleGrabber_AddRef(&This->sg->ISampleGrabber_iface);
}
/* IUnknown */
static ULONG WINAPI
SampleGrabber_IPin_Release(IPin *iface)
{
return SampleGrabber_release(((SG_Pin *)iface)->sg);
SG_Pin *This = impl_from_IPin(iface);
return ISampleGrabber_Release(&This->sg->ISampleGrabber_iface);
}
/* IUnknown */
static HRESULT WINAPI
SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppvObject)
SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppv)
{
SG_Pin *This = (SG_Pin *)iface;
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
if (IsEqualIID(riid, &IID_IUnknown) ||
IsEqualIID(riid, &IID_IPin)) {
SampleGrabber_addref(This->sg);
*ppvObject = This;
return S_OK;
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IPin))
*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;
}
else if (IsEqualIID(riid, &IID_IMemInputPin)) {
SampleGrabber_addref(This->sg);
*ppvObject = &(This->sg->IMemInputPin_Vtbl);
return S_OK;
}
*ppvObject = NULL;
WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
return E_NOINTERFACE;
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
/* IPin - input pin */
@ -1039,8 +1077,9 @@ SampleGrabber_In_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *
static HRESULT WINAPI
SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *type)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
HRESULT hr;
TRACE("(%p)->(%p, %p)\n", This, receiver, type);
if (!receiver)
return E_POINTER;
@ -1070,7 +1109,7 @@ SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE
!IsEqualGUID(&type->formattype, &GUID_NULL) &&
!type->pbFormat)
return VFW_E_TYPE_NOT_ACCEPTED;
hr = IPin_ReceiveConnection(receiver,(IPin*)&This->lpVtbl,type);
hr = IPin_ReceiveConnection(receiver, &This->IPin_iface, type);
if (FAILED(hr))
return hr;
This->pair = receiver;
@ -1087,7 +1126,8 @@ SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE
static HRESULT WINAPI
SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *type)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%p, %p)\n", This, connector, type);
if (!connector)
return E_POINTER;
@ -1142,7 +1182,8 @@ SampleGrabber_Out_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_
static HRESULT WINAPI
SampleGrabber_In_IPin_Disconnect(IPin *iface)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->() pair = %p\n", This, This->pair);
if (This->sg->state != State_Stopped)
return VFW_E_NOT_STOPPED;
@ -1157,7 +1198,8 @@ SampleGrabber_In_IPin_Disconnect(IPin *iface)
static HRESULT WINAPI
SampleGrabber_Out_IPin_Disconnect(IPin *iface)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->() pair = %p\n", This, This->pair);
if (This->sg->state != State_Stopped)
return VFW_E_NOT_STOPPED;
@ -1176,7 +1218,8 @@ SampleGrabber_Out_IPin_Disconnect(IPin *iface)
static HRESULT WINAPI
SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%p) pair = %p\n", This, pin, This->pair);
if (!pin)
return E_POINTER;
@ -1192,7 +1235,8 @@ SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin)
static HRESULT WINAPI
SampleGrabber_IPin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mtype)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%p)\n", This, mtype);
if (!mtype)
return E_POINTER;
@ -1210,12 +1254,13 @@ SampleGrabber_IPin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mtype)
static HRESULT WINAPI
SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%p)\n", This, info);
if (!info)
return E_POINTER;
SampleGrabber_addref(This->sg);
info->pFilter = (IBaseFilter *)This->sg;
IBaseFilter_AddRef(&This->sg->IBaseFilter_iface);
info->pFilter = &This->sg->IBaseFilter_iface;
info->dir = This->dir;
lstrcpynW(info->achName,This->name,MAX_PIN_NAME);
return S_OK;
@ -1225,7 +1270,8 @@ SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info)
static HRESULT WINAPI
SampleGrabber_IPin_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%p)\n", This, dir);
if (!dir)
return E_POINTER;
@ -1237,7 +1283,8 @@ SampleGrabber_IPin_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
static HRESULT WINAPI
SampleGrabber_IPin_QueryId(IPin *iface, LPWSTR *id)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
int len;
TRACE("(%p)->(%p)\n", This, id);
if (!id)
@ -1260,7 +1307,8 @@ SampleGrabber_IPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mtype)
static HRESULT WINAPI
SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%p)\n", This, mtypes);
if (!mtypes)
return E_POINTER;
@ -1272,15 +1320,16 @@ SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes)
static HRESULT WINAPI
SampleGrabber_In_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins)
{
SG_Pin *This = (SG_Pin *)iface;
SG_Pin *This = impl_from_IPin(iface);
TRACE("(%p)->(%p, %p) size = %u\n", This, pins, nPins, (nPins ? *nPins : 0));
if (!nPins)
return E_POINTER;
if (*nPins) {
if (!pins)
return E_POINTER;
IPin_AddRef((IPin*)&This->sg->pin_out.lpVtbl);
*pins = (IPin*)&This->sg->pin_out.lpVtbl;
IPin_AddRef(&This->sg->pin_out.IPin_iface);
*pins = &This->sg->pin_out.IPin_iface;
*nPins = 1;
return S_OK;
}
@ -1426,12 +1475,11 @@ 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);
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
obj = CoTaskMemAlloc(sizeof(SG_Impl));
if (NULL == obj) {
*ppv = NULL;
@ -1439,16 +1487,17 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
}
ZeroMemory(obj, sizeof(SG_Impl));
obj->refCount = 1;
obj->IBaseFilter_Vtbl = &IBaseFilter_VTable;
obj->ISampleGrabber_Vtbl = &ISampleGrabber_VTable;
obj->IMemInputPin_Vtbl = &IMemInputPin_VTable;
obj->pin_in.lpVtbl = &IPin_In_VTable;
obj->ref = 1;
obj->IUnknown_inner.lpVtbl = &samplegrabber_vtbl;
obj->IBaseFilter_iface.lpVtbl = &IBaseFilter_VTable;
obj->ISampleGrabber_iface.lpVtbl = &ISampleGrabber_VTable;
obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable;
obj->pin_in.IPin_iface.lpVtbl = &IPin_In_VTable;
obj->pin_in.dir = PINDIR_INPUT;
obj->pin_in.name = pin_in_name;
obj->pin_in.sg = obj;
obj->pin_in.pair = NULL;
obj->pin_out.lpVtbl = &IPin_Out_VTable;
obj->pin_out.IPin_iface.lpVtbl = &IPin_Out_VTable;
obj->pin_out.dir = PINDIR_OUTPUT;
obj->pin_out.name = pin_out_name;
obj->pin_out.sg = obj;
@ -1469,7 +1518,19 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
obj->oneShot = OneShot_None;
obj->bufferLen = -1;
obj->bufferData = NULL;
*ppv = obj;
if (pUnkOuter)
obj->outer_unk = pUnkOuter;
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;
}

View file

@ -44,7 +44,7 @@ reactos/dll/directx/wine/dsound # Synced to Wine-1.7.1
reactos/dll/directx/wine/dxdiagn # Synced to Wine-1.7.1
reactos/dll/directx/wine/dxgi # Synced to Wine-1.7.1
reactos/dll/directx/wine/msdmo # Synced to Wine-1.7.1
reactos/dll/directx/wine/qedit # Autosync
reactos/dll/directx/wine/qedit # Synced to Wine-1.7.1
reactos/dll/directx/wine/quartz # Synced to Wine-1.5.26
reactos/dll/directx/wine/wined3d # Synced to Wine-1.7.1