mirror of
https://github.com/reactos/reactos.git
synced 2024-06-29 01:12:06 +00:00
[QEDIT]
* Sync with Wine 1.7.1. CORE-7469 svn path=/trunk/; revision=60605
This commit is contained in:
parent
fa4306dffc
commit
e007f33d9a
|
@ -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)
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
1
reactos/dll/directx/wine/qedit/qedit.rc
Normal file
1
reactos/dll/directx/wine/qedit/qedit.rc
Normal file
|
@ -0,0 +1 @@
|
|||
1 WINE_REGISTRY qedit_classes.rgs
|
32
reactos/dll/directx/wine/qedit/qedit_classes.idl
Normal file
32
reactos/dll/directx/wine/qedit/qedit_classes.idl
Normal 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; }
|
17
reactos/dll/directx/wine/qedit/qedit_classes.rgs
Normal file
17
reactos/dll/directx/wine/qedit/qedit_classes.rgs
Normal 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' }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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__ */
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue