On 18.08.2017 4:25, Fabian Maurer wrote:
> +static const IBaseFilterVtbl IBaseFilter_Vtbl =
> +{
> + /*** IUnknown methods ***/
> + EnhancedVideoRendererImpl_QueryInterface,
> + EnhancedVideoRendererImpl_AddRef,
> + EnhancedVideoRendererImpl_Release,
> + /*** IPersist methods ***/
> + EnhancedVideoRendererImpl_GetClassID,
> + /*** IMediaFilter methods ***/
> + EnhancedVideoRendererImpl_Stop,
> + EnhancedVideoRendererImpl_Pause,
> + EnhancedVideoRendererImpl_Run,
> + EnhancedVideoRendererImpl_GetState,
> + EnhancedVideoRendererImpl_SetSyncSource,
> + EnhancedVideoRendererImpl_GetSyncSource,
> + /*** IBaseFilter methods ***/
> + EnhancedVideoRendererImpl_EnumPins,
> + EnhancedVideoRendererImpl_FindPin,
> + EnhancedVideoRendererImpl_QueryFilterInfo,
> + EnhancedVideoRendererImpl_JoinFilterGraph,
> + EnhancedVideoRendererImpl_QueryVendorInfo
> +};
Shouldn't it use strmbase?
> +HRESULT EnhancedVideoRendererImpl_Create(IUnknown *pUnkOuter, void **ppObj)
> +{
> + EnhancedVideoRendererImpl *object;
> +
> + TRACE("(%p,%p)\n", pUnkOuter, ppObj);
> +
> + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(EnhancedVideoRendererImpl));
> + if (!object)
> + return E_OUTOFMEMORY;
> +
> + object->IBaseFilter_iface.lpVtbl = &IBaseFilter_Vtbl;
> + object->ref = 1;
> +
> + *ppObj = &object->IBaseFilter_iface;
> +
> + return S_OK;
> +}
This needs at test for aggregation support.
> +typedef struct {
> + IBaseFilter IBaseFilter_iface;
> + LONG ref;
> +} EnhancedVideoRendererImpl;
Does this need to be exposed?
> + TRACE("(0x%p, %d, %p)\n", instance, reason, reserved);
> +
Format looks wrong.
> - case DLL_WINE_PREATTACH:
> - return FALSE; /* prefer native version */
It still doesn't do anything.
> +static HRESULT WINAPI XFCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid, void **ppobj)
> +{
What does XF prefix stand for? Also please use consistent type names and
formatting.
> +/*******************************************************************************
> + * Retrieves class object from a DLL object
> + *
> + * NOTES
> + * Docs say returns STDAPI
> + *
> + * PARAMS
> + * rclsid [I] CLSID for the class object
> + * riid [I] Reference to identifier of interface for class object
> + * ppv [O] Address of variable to receive interface pointer for riid
> + *
> + * RETURNS
> + * Success: S_OK
> + * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
> + * E_UNEXPECTED
> + */
> +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
I personally don't think this export needs a documentation header.
> + if ( !IsEqualGUID( &IID_IClassFactory, riid )
> + && ! IsEqualGUID( &IID_IUnknown, riid) )
> + return E_NOINTERFACE;
I think it's better to let QueryInterface handle this.
> + for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++)
> + {
> + if (IsEqualGUID(object_creation[i].clsid, rclsid))
> + break;
> + }
> +
> + if (i == sizeof(object_creation)/sizeof(object_creation[0]))
> + {
> + FIXME("%s: no class found.\n", debugstr_guid(rclsid));
> + return CLASS_E_CLASSNOTAVAILABLE;
> + }
Does it support any other CLSIDs? This seems like too much. Static
factory instance will work too I suppose.