1 /* DirectShow FilterGraph object (QUARTZ.DLL)
3 * Copyright 2002 Lionel Ulmer
4 * Copyright 2004 Christian Costa
6 * This file contains the (internal) driver registration functions,
7 * driver enumeration APIs and DirectDraw creation functions.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
35 #include "wine/debug.h"
36 #include "quartz_private.h"
42 #include "wine/unicode.h"
45 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
48 HWND hWnd; /* Target window */
49 long msg; /* User window message */
50 long instance; /* User data */
51 int disabled; /* Disabled messages posting */
55 long lEventCode; /* Event code */
56 LONG_PTR lParam1; /* Param1 */
57 LONG_PTR lParam2; /* Param2 */
60 /* messages ring implementation for queuing events (taken from winmm) */
61 #define EVENTS_RING_BUFFER_INCREMENT 64
67 CRITICAL_SECTION msg_crst;
68 HANDLE msg_event; /* Signaled for no empty queue */
71 static int EventsQueue_Init(EventsQueue* omr)
75 omr->msg_event = CreateEventW(NULL, TRUE, FALSE, NULL);
76 omr->ring_buffer_size = EVENTS_RING_BUFFER_INCREMENT;
77 omr->messages = CoTaskMemAlloc(omr->ring_buffer_size * sizeof(Event));
78 ZeroMemory(omr->messages, omr->ring_buffer_size * sizeof(Event));
80 InitializeCriticalSection(&omr->msg_crst);
81 omr->msg_crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": EventsQueue.msg_crst");
85 static int EventsQueue_Destroy(EventsQueue* omr)
87 CloseHandle(omr->msg_event);
88 CoTaskMemFree(omr->messages);
89 omr->msg_crst.DebugInfo->Spare[0] = 0;
90 DeleteCriticalSection(&omr->msg_crst);
94 static int EventsQueue_PutEvent(EventsQueue* omr, const Event* evt)
96 EnterCriticalSection(&omr->msg_crst);
97 if ((omr->msg_toget == ((omr->msg_tosave + 1) % omr->ring_buffer_size)))
99 int old_ring_buffer_size = omr->ring_buffer_size;
100 omr->ring_buffer_size += EVENTS_RING_BUFFER_INCREMENT;
101 TRACE("omr->ring_buffer_size=%d\n",omr->ring_buffer_size);
102 omr->messages = HeapReAlloc(GetProcessHeap(),0,omr->messages, omr->ring_buffer_size * sizeof(Event));
103 /* Now we need to rearrange the ring buffer so that the new
104 buffers just allocated are in between omr->msg_tosave and
107 if (omr->msg_tosave < omr->msg_toget)
109 memmove(&(omr->messages[omr->msg_toget + EVENTS_RING_BUFFER_INCREMENT]),
110 &(omr->messages[omr->msg_toget]),
111 sizeof(Event)*(old_ring_buffer_size - omr->msg_toget)
113 omr->msg_toget += EVENTS_RING_BUFFER_INCREMENT;
116 omr->messages[omr->msg_tosave] = *evt;
117 SetEvent(omr->msg_event);
118 omr->msg_tosave = (omr->msg_tosave + 1) % omr->ring_buffer_size;
119 LeaveCriticalSection(&omr->msg_crst);
123 static int EventsQueue_GetEvent(EventsQueue* omr, Event* evt, long msTimeOut)
125 if (WaitForSingleObject(omr->msg_event, msTimeOut) != WAIT_OBJECT_0)
128 EnterCriticalSection(&omr->msg_crst);
130 if (omr->msg_toget == omr->msg_tosave) /* buffer empty ? */
132 LeaveCriticalSection(&omr->msg_crst);
136 *evt = omr->messages[omr->msg_toget];
137 omr->msg_toget = (omr->msg_toget + 1) % omr->ring_buffer_size;
139 /* Mark the buffer as empty if needed */
140 if (omr->msg_toget == omr->msg_tosave) /* buffer empty ? */
141 ResetEvent(omr->msg_event);
143 LeaveCriticalSection(&omr->msg_crst);
147 #define MAX_ITF_CACHE_ENTRIES 3
148 typedef struct _ITF_CACHE_ENTRY {
154 typedef struct _IFilterGraphImpl {
155 const IFilterGraph2Vtbl *IFilterGraph2_vtbl;
156 const IMediaControlVtbl *IMediaControl_vtbl;
157 const IMediaSeekingVtbl *IMediaSeeking_vtbl;
158 const IBasicAudioVtbl *IBasicAudio_vtbl;
159 const IBasicVideo2Vtbl *IBasicVideo_vtbl;
160 const IVideoWindowVtbl *IVideoWindow_vtbl;
161 const IMediaEventExVtbl *IMediaEventEx_vtbl;
162 const IMediaFilterVtbl *IMediaFilter_vtbl;
163 const IMediaEventSinkVtbl *IMediaEventSink_vtbl;
164 const IGraphConfigVtbl *IGraphConfig_vtbl;
165 const IMediaPositionVtbl *IMediaPosition_vtbl;
166 const IUnknownVtbl * IInner_vtbl;
167 /* IAMGraphStreams */
173 /* IRegisterServiceProvider */
174 /* IResourceMananger */
175 /* IServiceProvider */
176 /* IVideoFrameStep */
179 IFilterMapper2 * pFilterMapper2;
180 IBaseFilter ** ppFiltersInGraph;
181 LPWSTR * pFilterNames;
185 IReferenceClock *refClock;
187 HANDLE hEventCompletion;
188 int CompletionStatus;
192 int HandleEcComplete;
194 int HandleEcClockChanged;
197 ITF_CACHE_ENTRY ItfCacheEntries[MAX_ITF_CACHE_ENTRIES];
198 int nItfCacheEntries;
199 IUnknown * pUnkOuter;
205 LONGLONG stop_position;
208 static HRESULT WINAPI Filtergraph_QueryInterface(IFilterGraphImpl *This,
209 REFIID riid, LPVOID * ppv);
210 static ULONG WINAPI Filtergraph_AddRef(IFilterGraphImpl *This);
211 static ULONG WINAPI Filtergraph_Release(IFilterGraphImpl *This);
213 static HRESULT WINAPI FilterGraphInner_QueryInterface(IUnknown * iface,
216 ICOM_THIS_MULTI(IFilterGraphImpl, IInner_vtbl, iface);
217 TRACE("(%p)->(%s (%p), %p)\n", This, debugstr_guid(riid), riid, ppvObj);
219 if (This->bAggregatable)
220 This->bUnkOuterValid = TRUE;
222 if (IsEqualGUID(&IID_IUnknown, riid)) {
223 *ppvObj = &(This->IInner_vtbl);
224 TRACE(" returning IUnknown interface (%p)\n", *ppvObj);
225 } else if (IsEqualGUID(&IID_IFilterGraph, riid) ||
226 IsEqualGUID(&IID_IFilterGraph2, riid) ||
227 IsEqualGUID(&IID_IGraphBuilder, riid)) {
228 *ppvObj = &(This->IFilterGraph2_vtbl);
229 TRACE(" returning IGraphBuilder interface (%p)\n", *ppvObj);
230 } else if (IsEqualGUID(&IID_IMediaControl, riid)) {
231 *ppvObj = &(This->IMediaControl_vtbl);
232 TRACE(" returning IMediaControl interface (%p)\n", *ppvObj);
233 } else if (IsEqualGUID(&IID_IMediaSeeking, riid)) {
234 *ppvObj = &(This->IMediaSeeking_vtbl);
235 TRACE(" returning IMediaSeeking interface (%p)\n", *ppvObj);
236 } else if (IsEqualGUID(&IID_IBasicAudio, riid)) {
237 *ppvObj = &(This->IBasicAudio_vtbl);
238 TRACE(" returning IBasicAudio interface (%p)\n", *ppvObj);
239 } else if (IsEqualGUID(&IID_IBasicVideo, riid) ||
240 IsEqualGUID(&IID_IBasicVideo2, riid)) {
241 *ppvObj = &(This->IBasicVideo_vtbl);
242 TRACE(" returning IBasicVideo2 interface (%p)\n", *ppvObj);
243 } else if (IsEqualGUID(&IID_IVideoWindow, riid)) {
244 *ppvObj = &(This->IVideoWindow_vtbl);
245 TRACE(" returning IVideoWindow interface (%p)\n", *ppvObj);
246 } else if (IsEqualGUID(&IID_IMediaEvent, riid) ||
247 IsEqualGUID(&IID_IMediaEventEx, riid)) {
248 *ppvObj = &(This->IMediaEventEx_vtbl);
249 TRACE(" returning IMediaEvent(Ex) interface (%p)\n", *ppvObj);
250 } else if (IsEqualGUID(&IID_IMediaFilter, riid) ||
251 IsEqualGUID(&IID_IPersist, riid)) {
252 *ppvObj = &(This->IMediaFilter_vtbl);
253 TRACE(" returning IMediaFilter interface (%p)\n", *ppvObj);
254 } else if (IsEqualGUID(&IID_IMediaEventSink, riid)) {
255 *ppvObj = &(This->IMediaEventSink_vtbl);
256 TRACE(" returning IMediaEventSink interface (%p)\n", *ppvObj);
257 } else if (IsEqualGUID(&IID_IGraphConfig, riid)) {
258 *ppvObj = &(This->IGraphConfig_vtbl);
259 TRACE(" returning IGraphConfig interface (%p)\n", *ppvObj);
260 } else if (IsEqualGUID(&IID_IMediaPosition, riid)) {
261 *ppvObj = &(This->IMediaPosition_vtbl);
262 TRACE(" returning IMediaPosition interface (%p)\n", *ppvObj);
265 FIXME("unknown interface %s\n", debugstr_guid(riid));
266 return E_NOINTERFACE;
269 IUnknown_AddRef((IUnknown *)(*ppvObj));
273 static ULONG WINAPI FilterGraphInner_AddRef(IUnknown * iface) {
274 ICOM_THIS_MULTI(IFilterGraphImpl, IInner_vtbl, iface);
275 ULONG ref = InterlockedIncrement(&This->ref);
277 TRACE("(%p)->(): new ref = %d\n", This, ref);
282 static ULONG WINAPI FilterGraphInner_Release(IUnknown * iface) {
283 ICOM_THIS_MULTI(IFilterGraphImpl, IInner_vtbl, iface);
284 ULONG ref = InterlockedDecrement(&This->ref);
286 TRACE("(%p)->(): new ref = %d\n", This, ref);
291 IMediaControl_Stop((IMediaControl*)&(This->IMediaControl_vtbl));
293 IReferenceClock_Release(This->refClock);
295 while (This->nFilters)
296 IFilterGraph2_RemoveFilter((IFilterGraph2*)This, This->ppFiltersInGraph[0]);
298 for (i = 0; i < This->nItfCacheEntries; i++)
300 if (This->ItfCacheEntries[i].iface)
301 IUnknown_Release(This->ItfCacheEntries[i].iface);
303 IFilterMapper2_Release(This->pFilterMapper2);
304 CloseHandle(This->hEventCompletion);
305 EventsQueue_Destroy(&This->evqueue);
306 This->cs.DebugInfo->Spare[0] = 0;
307 DeleteCriticalSection(&This->cs);
308 CoTaskMemFree(This->ppFiltersInGraph);
309 CoTaskMemFree(This->pFilterNames);
316 /*** IUnknown methods ***/
317 static HRESULT WINAPI FilterGraph2_QueryInterface(IFilterGraph2 *iface,
320 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
322 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
323 return Filtergraph_QueryInterface(This, riid, ppvObj);
326 static ULONG WINAPI FilterGraph2_AddRef(IFilterGraph2 *iface) {
327 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
329 TRACE("(%p/%p)->() calling FilterGraph AddRef\n", This, iface);
331 return Filtergraph_AddRef(This);
334 static ULONG WINAPI FilterGraph2_Release(IFilterGraph2 *iface) {
335 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
337 TRACE("(%p/%p)->() calling FilterGraph Release\n", This, iface);
339 return Filtergraph_Release(This);
342 /*** IFilterGraph methods ***/
343 static HRESULT WINAPI FilterGraph2_AddFilter(IFilterGraph2 *iface,
344 IBaseFilter *pFilter,
346 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
349 WCHAR* wszFilterName = NULL;
350 int duplicate_name = FALSE;
352 TRACE("(%p/%p)->(%p, %s (%p))\n", This, iface, pFilter, debugstr_w(pName), pName);
357 wszFilterName = CoTaskMemAlloc( (pName ? strlenW(pName) + 6 : 5) * sizeof(WCHAR) );
361 /* Check if name already exists */
362 for(i = 0; i < This->nFilters; i++)
363 if (!strcmpW(This->pFilterNames[i], pName))
365 duplicate_name = TRUE;
370 /* If no name given or name already existing, generate one */
371 if (!pName || duplicate_name)
373 static const WCHAR wszFmt1[] = {'%','s',' ','%','0','4','d',0};
374 static const WCHAR wszFmt2[] = {'%','0','4','d',0};
376 for (j = 0; j < 10000 ; j++)
380 sprintfW(wszFilterName, wszFmt1, pName, This->nameIndex);
382 sprintfW(wszFilterName, wszFmt2, This->nameIndex);
383 TRACE("Generated name %s\n", debugstr_w(wszFilterName));
385 /* Check if the generated name already exists */
386 for(i = 0; i < This->nFilters; i++)
387 if (!strcmpW(This->pFilterNames[i], wszFilterName))
390 /* Compute next index and exit if generated name is suitable */
391 if (This->nameIndex++ == 10000)
393 if (i == This->nFilters)
396 /* Unable to find a suitable name */
399 CoTaskMemFree(wszFilterName);
400 return VFW_E_DUPLICATE_NAME;
404 memcpy(wszFilterName, pName, (strlenW(pName) + 1) * sizeof(WCHAR));
406 if (This->nFilters + 1 > This->filterCapacity)
408 int newCapacity = This->filterCapacity ? 2 * This->filterCapacity : 1;
409 IBaseFilter ** ppNewFilters = CoTaskMemAlloc(newCapacity * sizeof(IBaseFilter*));
410 LPWSTR * pNewNames = CoTaskMemAlloc(newCapacity * sizeof(LPWSTR));
411 memcpy(ppNewFilters, This->ppFiltersInGraph, This->nFilters * sizeof(IBaseFilter*));
412 memcpy(pNewNames, This->pFilterNames, This->nFilters * sizeof(LPWSTR));
413 if (This->filterCapacity)
415 CoTaskMemFree(This->ppFiltersInGraph);
416 CoTaskMemFree(This->pFilterNames);
418 This->ppFiltersInGraph = ppNewFilters;
419 This->pFilterNames = pNewNames;
420 This->filterCapacity = newCapacity;
423 hr = IBaseFilter_JoinFilterGraph(pFilter, (IFilterGraph *)This, wszFilterName);
427 IBaseFilter_AddRef(pFilter);
428 This->ppFiltersInGraph[This->nFilters] = pFilter;
429 This->pFilterNames[This->nFilters] = wszFilterName;
431 IBaseFilter_SetSyncSource(pFilter, This->refClock);
434 CoTaskMemFree(wszFilterName);
436 if (SUCCEEDED(hr) && duplicate_name)
437 return VFW_S_DUPLICATE_NAME;
442 static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface,
443 IBaseFilter *pFilter) {
444 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
448 TRACE("(%p/%p)->(%p)\n", This, iface, pFilter);
450 /* FIXME: check graph is stopped */
452 for (i = 0; i < This->nFilters; i++)
454 if (This->ppFiltersInGraph[i] == pFilter)
456 IEnumPins *penumpins;
457 IBaseFilter_Stop(pFilter);
458 hr = IBaseFilter_EnumPins(pFilter, &penumpins);
461 while(IEnumPins_Next(penumpins, 1, &ppin, NULL) == S_OK) {
464 IPin_ConnectedTo(ppin, &victim);
467 h = IPin_Disconnect(victim);
468 TRACE("Disconnect other side: %08x\n", h);
469 if (h == VFW_E_NOT_STOPPED)
472 IPin_QueryPinInfo(victim, &pinfo);
473 IBaseFilter_Stop(pinfo.pFilter);
474 IBaseFilter_Release(pinfo.pFilter);
475 h = IPin_Disconnect(victim);
476 TRACE("Disconnect retry: %08x\n", h);
478 IPin_Release(victim);
480 h = IPin_Disconnect(ppin);
481 TRACE("Disconnect 2: %08x\n", h);
483 IEnumPins_Release(penumpins);
486 hr = IBaseFilter_JoinFilterGraph(pFilter, NULL, This->pFilterNames[i]);
489 IBaseFilter_SetSyncSource(pFilter, NULL);
490 IBaseFilter_Release(pFilter);
491 CoTaskMemFree(This->pFilterNames[i]);
492 memmove(This->ppFiltersInGraph+i, This->ppFiltersInGraph+i+1, sizeof(IBaseFilter*)*(This->nFilters - 1 - i));
493 memmove(This->pFilterNames+i, This->pFilterNames+i+1, sizeof(LPWSTR)*(This->nFilters - 1 - i));
495 /* Invalidate interfaces in the cache */
496 for (i = 0; i < This->nItfCacheEntries; i++)
497 if (pFilter == This->ItfCacheEntries[i].filter)
499 IUnknown_Release(This->ItfCacheEntries[i].iface);
500 This->ItfCacheEntries[i].iface = NULL;
501 This->ItfCacheEntries[i].filter = NULL;
509 return hr; /* FIXME: check this error code */
512 static HRESULT WINAPI FilterGraph2_EnumFilters(IFilterGraph2 *iface,
513 IEnumFilters **ppEnum) {
514 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
516 TRACE("(%p/%p)->(%p)\n", This, iface, ppEnum);
518 return IEnumFiltersImpl_Construct(This->ppFiltersInGraph, This->nFilters, ppEnum);
521 static HRESULT WINAPI FilterGraph2_FindFilterByName(IFilterGraph2 *iface,
523 IBaseFilter **ppFilter) {
524 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
527 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_w(pName), pName, ppFilter);
532 for (i = 0; i < This->nFilters; i++)
534 if (!strcmpW(pName, This->pFilterNames[i]))
536 *ppFilter = This->ppFiltersInGraph[i];
537 IBaseFilter_AddRef(*ppFilter);
543 return VFW_E_NOT_FOUND;
546 /* NOTE: despite the implication, it doesn't matter which
547 * way round you put in the input and output pins */
548 static HRESULT WINAPI FilterGraph2_ConnectDirect(IFilterGraph2 *iface,
551 const AM_MEDIA_TYPE *pmt) {
555 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
557 TRACE("(%p/%p)->(%p, %p, %p)\n", This, iface, ppinIn, ppinOut, pmt);
559 /* FIXME: check pins are in graph */
561 if (TRACE_ON(quartz))
565 hr = IPin_QueryPinInfo(ppinIn, &PinInfo);
569 TRACE("Filter owning first pin => %p\n", PinInfo.pFilter);
570 IBaseFilter_Release(PinInfo.pFilter);
572 hr = IPin_QueryPinInfo(ppinOut, &PinInfo);
576 TRACE("Filter owning second pin => %p\n", PinInfo.pFilter);
577 IBaseFilter_Release(PinInfo.pFilter);
580 hr = IPin_QueryDirection(ppinIn, &dir);
583 if (dir == PINDIR_INPUT)
584 hr = IPin_Connect(ppinOut, ppinIn, pmt);
586 hr = IPin_Connect(ppinIn, ppinOut, pmt);
592 static HRESULT WINAPI FilterGraph2_Reconnect(IFilterGraph2 *iface,
594 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
595 IPin *pConnectedTo = NULL;
597 PIN_DIRECTION pindir;
599 IPin_QueryDirection(ppin, &pindir);
600 hr = IPin_ConnectedTo(ppin, &pConnectedTo);
602 TRACE("Querying connected to failed: %x\n", hr);
605 IPin_Disconnect(ppin);
606 IPin_Disconnect(pConnectedTo);
607 if (pindir == PINDIR_INPUT)
608 hr = IPin_Connect(pConnectedTo, ppin, NULL);
610 hr = IPin_Connect(ppin, pConnectedTo, NULL);
611 IPin_Release(pConnectedTo);
613 ERR("Reconnecting pins failed, pins are not connected now..\n");
614 TRACE("(%p->%p) -- %p %p -> %x\n", iface, This, ppin, pConnectedTo, hr);
618 static HRESULT WINAPI FilterGraph2_Disconnect(IFilterGraph2 *iface,
620 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
622 TRACE("(%p/%p)->(%p)\n", This, iface, ppin);
624 return IPin_Disconnect(ppin);
627 static HRESULT WINAPI FilterGraph2_SetDefaultSyncSource(IFilterGraph2 *iface) {
628 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
629 IReferenceClock *pClock = NULL;
632 TRACE("(%p/%p)->() semi-stub\n", iface, This);
634 hr = CoCreateInstance(&CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (LPVOID*)&pClock);
638 hr = IMediaFilter_SetSyncSource((IMediaFilter*)&(This->IMediaFilter_vtbl), pClock);
639 IReferenceClock_Release(pClock);
645 static HRESULT GetFilterInfo(IMoniker* pMoniker, GUID* pclsid, VARIANT* pvar)
647 static const WCHAR wszClsidName[] = {'C','L','S','I','D',0};
648 static const WCHAR wszFriendlyName[] = {'F','r','i','e','n','d','l','y','N','a','m','e',0};
649 IPropertyBag * pPropBagCat = NULL;
653 V_VT(pvar) = VT_BSTR;
655 hr = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID*)&pPropBagCat);
658 hr = IPropertyBag_Read(pPropBagCat, wszClsidName, pvar, NULL);
661 hr = CLSIDFromString(V_UNION(pvar, bstrVal), pclsid);
664 hr = IPropertyBag_Read(pPropBagCat, wszFriendlyName, pvar, NULL);
667 TRACE("Moniker = %s - %s\n", debugstr_guid(pclsid), debugstr_w(V_UNION(pvar, bstrVal)));
670 IPropertyBag_Release(pPropBagCat);
675 static HRESULT GetInternalConnections(IBaseFilter* pfilter, IPin* pinputpin, IPin*** pppins, ULONG* pnb)
680 TRACE("(%p, %p, %p, %p)\n", pfilter, pinputpin, pppins, pnb);
681 hr = IPin_QueryInternalConnections(pinputpin, NULL, &nb);
684 } else if (hr == S_FALSE) {
685 *pppins = CoTaskMemAlloc(sizeof(IPin*)*nb);
686 hr = IPin_QueryInternalConnections(pinputpin, *pppins, &nb);
688 ERR("Error (%x)\n", hr);
690 } else if (hr == E_NOTIMPL) {
691 /* Input connected to all outputs */
692 IEnumPins* penumpins;
695 TRACE("E_NOTIMPL\n");
696 hr = IBaseFilter_EnumPins(pfilter, &penumpins);
698 ERR("filter Enumpins failed (%x)\n", hr);
702 /* Count output pins */
703 while(IEnumPins_Next(penumpins, 1, &ppin, &nb) == S_OK) {
704 PIN_DIRECTION pindir;
705 IPin_QueryDirection(ppin, &pindir);
706 if (pindir == PINDIR_OUTPUT)
710 *pppins = CoTaskMemAlloc(sizeof(IPin*)*i);
711 /* Retrieve output pins */
712 IEnumPins_Reset(penumpins);
714 while(IEnumPins_Next(penumpins, 1, &ppin, &nb) == S_OK) {
715 PIN_DIRECTION pindir;
716 IPin_QueryDirection(ppin, &pindir);
717 if (pindir == PINDIR_OUTPUT)
718 (*pppins)[i++] = ppin;
722 IEnumPins_Release(penumpins);
725 ERR("Next failed (%x)\n", hr);
728 } else if (FAILED(hr)) {
729 ERR("Cannot get internal connection (%x)\n", hr);
737 /*** IGraphBuilder methods ***/
738 static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface,
741 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
744 IEnumMediaTypes* penummt;
746 IEnumPins* penumpins;
747 IEnumMoniker* pEnumMoniker;
755 TRACE("(%p/%p)->(%p, %p)\n", This, iface, ppinOut, ppinIn);
757 if (TRACE_ON(quartz))
759 hr = IPin_QueryPinInfo(ppinIn, &PinInfo);
763 TRACE("Filter owning first pin => %p\n", PinInfo.pFilter);
764 IBaseFilter_Release(PinInfo.pFilter);
766 hr = IPin_QueryPinInfo(ppinOut, &PinInfo);
770 TRACE("Filter owning second pin => %p\n", PinInfo.pFilter);
771 IBaseFilter_Release(PinInfo.pFilter);
774 /* Try direct connection first */
775 hr = IPin_Connect(ppinOut, ppinIn, NULL);
779 TRACE("Direct connection failed, trying to insert other filters\n");
781 hr = IPin_QueryPinInfo(ppinIn, &PinInfo);
785 hr = IBaseFilter_GetClassID(PinInfo.pFilter, &FilterCLSID);
786 IBaseFilter_Release(PinInfo.pFilter);
790 /* Find the appropriate transform filter than can transform the minor media type of output pin of the upstream
791 * filter to the minor mediatype of input pin of the renderer */
792 hr = IPin_EnumMediaTypes(ppinOut, &penummt);
794 ERR("EnumMediaTypes (%x)\n", hr);
798 hr = IEnumMediaTypes_Next(penummt, 1, &mt, &nbmt);
800 ERR("IEnumMediaTypes_Next (%x)\n", hr);
805 ERR("No media type found!\n");
808 TRACE("MajorType %s\n", debugstr_guid(&mt->majortype));
809 TRACE("SubType %s\n", debugstr_guid(&mt->subtype));
811 /* Try to find a suitable filter that can connect to the pin to render */
812 tab[0] = mt->majortype;
813 tab[1] = mt->subtype;
814 hr = IFilterMapper2_EnumMatchingFilters(This->pFilterMapper2, &pEnumMoniker, 0, FALSE, MERIT_UNLIKELY, TRUE, 1, tab, NULL, NULL, FALSE, FALSE, 0, NULL, NULL, NULL);
816 ERR("Unable to enum filters (%x)\n", hr);
820 while(IEnumMoniker_Next(pEnumMoniker, 1, &pMoniker, &nb) == S_OK)
825 IPin* ppinfilter = NULL;
826 IBaseFilter* pfilter = NULL;
828 hr = GetFilterInfo(pMoniker, &clsid, &var);
829 IMoniker_Release(pMoniker);
831 ERR("Unable to retrieve filter info (%x)\n", hr);
835 if (IsEqualGUID(&clsid, &FilterCLSID)) {
836 /* Skip filter (same as the one the output pin belongs to) */
840 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&pfilter);
842 ERR("Unable to create filter (%x), trying next one\n", hr);
846 hr = IFilterGraph2_AddFilter(iface, pfilter, V_UNION(&var, bstrVal));
848 ERR("Unable to add filter (%x)\n", hr);
849 IBaseFilter_Release(pfilter);
854 hr = IBaseFilter_EnumPins(pfilter, &penumpins);
856 ERR("Enumpins (%x)\n", hr);
860 hr = IEnumPins_Next(penumpins, 1, &ppinfilter, &pin);
861 IEnumPins_Release(penumpins);
864 ERR("Next (%x)\n", hr);
872 hr = IPin_Connect(ppinOut, ppinfilter, NULL);
874 TRACE("Cannot connect to filter (%x), trying next one\n", hr);
877 TRACE("Successfully connected to filter, follow chain...\n");
879 /* Render all output pins of the filter by calling IFilterGraph2_Render on each of them */
880 hr = GetInternalConnections(pfilter, ppinfilter, &ppins, &nb);
885 IPin_Disconnect(ppinOut);
888 TRACE("pins to consider: %d\n", nb);
889 for(i = 0; i < nb; i++) {
890 TRACE("Processing pin %d\n", i);
891 hr = IFilterGraph2_Connect(iface, ppins[i], ppinIn);
893 TRACE("Cannot render pin %p (%x)\n", ppinfilter, hr);
895 IPin_Release(ppins[i]);
896 if (SUCCEEDED(hr)) break;
898 while (++i < nb) IPin_Release(ppins[i]);
899 CoTaskMemFree(ppins);
900 IPin_Release(ppinfilter);
901 IBaseFilter_Release(pfilter);
906 if (ppinfilter) IPin_Release(ppinfilter);
908 IFilterGraph2_RemoveFilter(iface, pfilter);
909 IBaseFilter_Release(pfilter);
913 IEnumMediaTypes_Release(penummt);
919 static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface,
921 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
922 IEnumMediaTypes* penummt;
927 IEnumMoniker* pEnumMoniker;
933 TRACE("(%p/%p)->(%p)\n", This, iface, ppinOut);
935 if (TRACE_ON(quartz))
939 hr = IPin_QueryPinInfo(ppinOut, &PinInfo);
943 TRACE("Filter owning pin => %p\n", PinInfo.pFilter);
944 IBaseFilter_Release(PinInfo.pFilter);
947 /* Try to find out if there is a renderer for the specified subtype already, and use that
949 EnterCriticalSection(&This->cs);
950 for (x = 0; x < This->nFilters; ++x)
952 BOOL renderer = TRUE;
953 IEnumPins *enumpins = NULL;
956 hr = IBaseFilter_EnumPins(This->ppFiltersInGraph[x], &enumpins);
958 if (FAILED(hr) || !enumpins)
961 IEnumPins_Reset(enumpins);
962 while (IEnumPins_Next(enumpins, 1, &pin, NULL) == S_OK)
964 PIN_DIRECTION dir = PINDIR_OUTPUT;
966 IPin_QueryDirection(pin, &dir);
969 if (dir != PINDIR_INPUT)
976 IEnumPins_Reset(enumpins);
977 if (renderer == TRUE)
979 while (IEnumPins_Next(enumpins, 1, &pin, NULL) == S_OK)
983 IPin_ConnectedTo(pin, &to);
987 hr = IFilterGraph2_Connect(iface, ppinOut, pin);
991 IEnumPins_Release(enumpins);
992 LeaveCriticalSection(&This->cs);
993 ERR("Connected succesfully\n");
1004 IEnumPins_Release(enumpins);
1007 LeaveCriticalSection(&This->cs);
1009 hr = IPin_EnumMediaTypes(ppinOut, &penummt);
1011 ERR("EnumMediaTypes (%x)\n", hr);
1015 IEnumMediaTypes_Reset(penummt);
1019 hr = IEnumMediaTypes_Next(penummt, 1, &mt, &nbmt);
1021 ERR("IEnumMediaTypes_Next (%x)\n", hr);
1026 TRACE("MajorType %s\n", debugstr_guid(&mt->majortype));
1027 TRACE("SubType %s\n", debugstr_guid(&mt->subtype));
1029 /* Try to find a suitable renderer with the same media type */
1030 tab[0] = mt->majortype;
1032 hr = IFilterMapper2_EnumMatchingFilters(This->pFilterMapper2, &pEnumMoniker, 0, FALSE, MERIT_UNLIKELY, TRUE, 1, tab, NULL, NULL, TRUE, FALSE, 0, NULL, NULL, NULL);
1034 ERR("Unable to enum filters (%x)\n", hr);
1038 while(IEnumMoniker_Next(pEnumMoniker, 1, &pMoniker, &nb) == S_OK)
1043 IBaseFilter* pfilter = NULL;
1044 IEnumPins* penumpins;
1047 hr = GetFilterInfo(pMoniker, &clsid, &var);
1048 IMoniker_Release(pMoniker);
1050 ERR("Unable to retrieve filter info (%x)\n", hr);
1054 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&pfilter);
1056 ERR("Unable to create filter (%x), trying next one\n", hr);
1060 hr = IFilterGraph2_AddFilter(iface, pfilter, V_UNION(&var, bstrVal));
1062 ERR("Unable to add filter (%x)\n", hr);
1063 IBaseFilter_Release(pfilter);
1068 hr = IBaseFilter_EnumPins(pfilter, &penumpins);
1070 ERR("Splitter Enumpins (%x)\n", hr);
1073 hr = IEnumPins_Next(penumpins, 1, &ppinfilter, &pin);
1074 IEnumPins_Release(penumpins);
1076 ERR("Next (%x)\n", hr);
1084 /* Connect the pin to render to the renderer */
1085 hr = IFilterGraph2_Connect(iface, ppinOut, ppinfilter);
1087 TRACE("Unable to connect to renderer (%x)\n", hr);
1088 IPin_Release(ppinfilter);
1091 IPin_Release(ppinfilter);
1092 IBaseFilter_Release(pfilter);
1098 IFilterGraph2_RemoveFilter(iface, pfilter);
1099 IBaseFilter_Release(pfilter);
1103 DeleteMediaType(mt);
1107 IEnumMediaTypes_Release(penummt);
1112 static HRESULT WINAPI FilterGraph2_RenderFile(IFilterGraph2 *iface,
1113 LPCWSTR lpcwstrFile,
1114 LPCWSTR lpcwstrPlayList) {
1115 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1116 static const WCHAR string[] = {'R','e','a','d','e','r',0};
1117 IBaseFilter* preader = NULL;
1118 IBaseFilter* psplitter = NULL;
1119 IPin* ppinreader = NULL;
1120 IPin* ppinsplitter = NULL;
1121 IEnumPins* penumpins;
1124 IEnumMoniker* pEnumMoniker = NULL;
1126 IPin** ppins = NULL;
1129 IFileSourceFilter* pfile = NULL;
1133 TRACE("(%p/%p)->(%s, %s)\n", This, iface, debugstr_w(lpcwstrFile), debugstr_w(lpcwstrPlayList));
1135 if (lpcwstrPlayList != NULL)
1136 return E_INVALIDARG;
1138 hr = IFilterGraph2_AddSourceFilter(iface, lpcwstrFile, string, &preader);
1140 /* Retrieve file media type */
1142 hr = IBaseFilter_QueryInterface(preader, &IID_IFileSourceFilter, (LPVOID*)&pfile);
1143 if (SUCCEEDED(hr)) {
1144 hr = IFileSourceFilter_GetCurFile(pfile, &filename, &mt);
1145 IFileSourceFilter_Release(pfile);
1149 hr = IBaseFilter_EnumPins(preader, &penumpins);
1150 if (SUCCEEDED(hr)) {
1151 hr = IEnumPins_Next(penumpins, 1, &ppinreader, &pin);
1152 IEnumPins_Release(penumpins);
1155 if (SUCCEEDED(hr)) {
1156 tab[0] = mt.majortype;
1157 tab[1] = mt.subtype;
1158 hr = IFilterMapper2_EnumMatchingFilters(This->pFilterMapper2, &pEnumMoniker, 0, FALSE, MERIT_UNLIKELY, TRUE, 1, tab, NULL, NULL, FALSE, FALSE, 0, NULL, NULL, NULL);
1164 IPin_Release(ppinreader);
1166 IEnumMoniker_Release(pEnumMoniker);
1168 IFilterGraph2_RemoveFilter(iface, preader);
1169 IBaseFilter_Release(preader);
1174 hr = VFW_E_CANNOT_RENDER;
1175 while(IEnumMoniker_Next(pEnumMoniker, 1, &pMoniker, &nb) == S_OK)
1180 hr = GetFilterInfo(pMoniker, &clsid, &var);
1181 IMoniker_Release(pMoniker);
1183 ERR("Unable to retrieve filter info (%x)\n", hr);
1187 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&psplitter);
1189 ERR("Unable to create filter (%x), trying next one\n", hr);
1193 hr = IFilterGraph2_AddFilter(iface, psplitter, V_UNION(&var, bstrVal));
1195 ERR("Unable add filter (%x)\n", hr);
1196 IBaseFilter_Release(psplitter);
1200 /* Connect file source and splitter filters together */
1201 /* Make the splitter analyze incoming data */
1203 hr = IBaseFilter_EnumPins(psplitter, &penumpins);
1204 if (SUCCEEDED(hr)) {
1205 hr = IEnumPins_Next(penumpins, 1, &ppinsplitter, &pin);
1206 IEnumPins_Release(penumpins);
1210 hr = IPin_Connect(ppinreader, ppinsplitter, NULL);
1212 /* Make sure there's some output pins in the filter */
1214 hr = GetInternalConnections(psplitter, ppinsplitter, &ppins, &nb);
1215 if (SUCCEEDED(hr)) {
1217 IPin_Disconnect(ppinreader);
1218 TRACE("No output pins found in filter\n");
1219 hr = VFW_E_CANNOT_RENDER;
1224 IPin_Release(ppinsplitter);
1225 ppinsplitter = NULL;
1227 if (SUCCEEDED(hr)) {
1228 TRACE("Successfully connected to filter\n");
1232 TRACE("Cannot connect to filter (%x), trying next one\n", hr);
1235 CoTaskMemFree(ppins);
1238 IFilterGraph2_RemoveFilter(iface, psplitter);
1239 IBaseFilter_Release(psplitter);
1243 /* Render all output pin of the splitter by calling IFilterGraph2_Render on each of them */
1244 if (SUCCEEDED(hr)) {
1247 TRACE("pins to consider: %d\n", nb);
1248 for(i = 0; i < nb; i++) {
1249 TRACE("Processing pin %d\n", i);
1250 hr = IFilterGraph2_Render(iface, ppins[i]);
1252 ERR("Cannot render pin %p (%x)\n", ppins[i], hr);
1255 IPin_Release(ppins[i]);
1257 CoTaskMemFree(ppins);
1259 hr = (partial ? VFW_S_PARTIAL_RENDER : S_OK);
1262 IPin_Release(ppinreader);
1263 IBaseFilter_Release(preader);
1265 IBaseFilter_Release(psplitter);
1270 /* Some filters implement their own asynchronous reader (Theoretically they all should, try to load it first */
1271 static HRESULT GetFileSourceFilter(LPCOLESTR pszFileName, IBaseFilter **filter)
1273 static const WCHAR wszReg[] = {'M','e','d','i','a',' ','T','y','p','e','\\','E','x','t','e','n','s','i','o','n','s',0};
1278 lRet = RegOpenKeyExW(HKEY_CLASSES_ROOT, wszReg, 0, KEY_READ, &extkey);
1279 hr = HRESULT_FROM_WIN32(lRet);
1283 static const WCHAR filtersource[] = {'S','o','u','r','c','e',' ','F','i','l','t','e','r',0};
1284 WCHAR *ext = PathFindExtensionW(pszFileName);
1285 WCHAR clsid_key[39];
1287 DWORD size = sizeof(clsid_key);
1292 CloseHandle(extkey);
1296 lRet = RegOpenKeyExW(extkey, ext, 0, KEY_READ, &pathkey);
1297 hr = HRESULT_FROM_WIN32(lRet);
1298 CloseHandle(extkey);
1302 lRet = RegQueryValueExW(pathkey, filtersource, NULL, NULL, (LPBYTE)clsid_key, &size);
1303 hr = HRESULT_FROM_WIN32(lRet);
1304 CloseHandle(pathkey);
1308 CLSIDFromString(clsid_key, &clsid);
1310 TRACE("CLSID: %s\n", debugstr_guid(&clsid));
1311 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)filter);
1314 IFileSourceFilter *source = NULL;
1315 hr = IBaseFilter_QueryInterface(*filter, &IID_IFileSourceFilter, (LPVOID*)&source);
1317 IFileSourceFilter_Release(source);
1319 IBaseFilter_Release(*filter);
1327 static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface,
1328 LPCWSTR lpcwstrFileName,
1329 LPCWSTR lpcwstrFilterName,
1330 IBaseFilter **ppFilter) {
1331 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1333 IBaseFilter* preader;
1334 IFileSourceFilter* pfile = NULL;
1338 TRACE("(%p/%p)->(%s, %s, %p)\n", This, iface, debugstr_w(lpcwstrFileName), debugstr_w(lpcwstrFilterName), ppFilter);
1340 /* Try from file name first, then fall back to default asynchronous reader */
1341 hr = GetFileSourceFilter(lpcwstrFileName, &preader);
1344 hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&preader);
1346 ERR("Unable to create file source filter (%x)\n", hr);
1350 hr = IFilterGraph2_AddFilter(iface, preader, lpcwstrFilterName);
1352 ERR("Unable add filter (%x)\n", hr);
1353 IBaseFilter_Release(preader);
1357 hr = IBaseFilter_QueryInterface(preader, &IID_IFileSourceFilter, (LPVOID*)&pfile);
1359 ERR("Unable to get IFileSourceInterface (%x)\n", hr);
1363 /* Load the file in the file source filter */
1364 hr = IFileSourceFilter_Load(pfile, lpcwstrFileName, NULL);
1366 ERR("Load (%x)\n", hr);
1370 IFileSourceFilter_GetCurFile(pfile, &filename, &mt);
1372 ERR("GetCurFile (%x)\n", hr);
1376 TRACE("File %s\n", debugstr_w(filename));
1377 TRACE("MajorType %s\n", debugstr_guid(&mt.majortype));
1378 TRACE("SubType %s\n", debugstr_guid(&mt.subtype));
1381 *ppFilter = preader;
1382 IFileSourceFilter_Release(pfile);
1388 IFileSourceFilter_Release(pfile);
1389 IFilterGraph2_RemoveFilter(iface, preader);
1390 IBaseFilter_Release(preader);
1395 static HRESULT WINAPI FilterGraph2_SetLogFile(IFilterGraph2 *iface,
1397 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1399 TRACE("(%p/%p)->(%08x): stub !!!\n", This, iface, (DWORD) hFile);
1404 static HRESULT WINAPI FilterGraph2_Abort(IFilterGraph2 *iface) {
1405 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1407 TRACE("(%p/%p)->(): stub !!!\n", This, iface);
1412 static HRESULT WINAPI FilterGraph2_ShouldOperationContinue(IFilterGraph2 *iface) {
1413 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1415 TRACE("(%p/%p)->(): stub !!!\n", This, iface);
1420 /*** IFilterGraph2 methods ***/
1421 static HRESULT WINAPI FilterGraph2_AddSourceFilterForMoniker(IFilterGraph2 *iface,
1424 LPCWSTR lpcwstrFilterName,
1425 IBaseFilter **ppFilter) {
1426 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1428 TRACE("(%p/%p)->(%p %p %s %p): stub !!!\n", This, iface, pMoniker, pCtx, debugstr_w(lpcwstrFilterName), ppFilter);
1433 static HRESULT WINAPI FilterGraph2_ReconnectEx(IFilterGraph2 *iface,
1435 const AM_MEDIA_TYPE *pmt) {
1436 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1438 TRACE("(%p/%p)->(%p %p): stub !!!\n", This, iface, ppin, pmt);
1443 static HRESULT WINAPI FilterGraph2_RenderEx(IFilterGraph2 *iface,
1447 ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
1449 TRACE("(%p/%p)->(%p %08x %p): stub !!!\n", This, iface, pPinOut, dwFlags, pvContext);
1455 static const IFilterGraph2Vtbl IFilterGraph2_VTable =
1457 FilterGraph2_QueryInterface,
1458 FilterGraph2_AddRef,
1459 FilterGraph2_Release,
1460 FilterGraph2_AddFilter,
1461 FilterGraph2_RemoveFilter,
1462 FilterGraph2_EnumFilters,
1463 FilterGraph2_FindFilterByName,
1464 FilterGraph2_ConnectDirect,
1465 FilterGraph2_Reconnect,
1466 FilterGraph2_Disconnect,
1467 FilterGraph2_SetDefaultSyncSource,
1468 FilterGraph2_Connect,
1469 FilterGraph2_Render,
1470 FilterGraph2_RenderFile,
1471 FilterGraph2_AddSourceFilter,
1472 FilterGraph2_SetLogFile,
1474 FilterGraph2_ShouldOperationContinue,
1475 FilterGraph2_AddSourceFilterForMoniker,
1476 FilterGraph2_ReconnectEx,
1477 FilterGraph2_RenderEx
1480 /*** IUnknown methods ***/
1481 static HRESULT WINAPI MediaControl_QueryInterface(IMediaControl *iface,
1484 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1486 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
1488 return Filtergraph_QueryInterface(This, riid, ppvObj);
1491 static ULONG WINAPI MediaControl_AddRef(IMediaControl *iface) {
1492 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1494 TRACE("(%p/%p)->()\n", This, iface);
1496 return Filtergraph_AddRef(This);
1499 static ULONG WINAPI MediaControl_Release(IMediaControl *iface) {
1500 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1502 TRACE("(%p/%p)->()\n", This, iface);
1504 return Filtergraph_Release(This);
1508 /*** IDispatch methods ***/
1509 static HRESULT WINAPI MediaControl_GetTypeInfoCount(IMediaControl *iface,
1511 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1513 TRACE("(%p/%p)->(%p): stub !!!\n", This, iface, pctinfo);
1518 static HRESULT WINAPI MediaControl_GetTypeInfo(IMediaControl *iface,
1521 ITypeInfo**ppTInfo) {
1522 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1524 TRACE("(%p/%p)->(%d, %d, %p): stub !!!\n", This, iface, iTInfo, lcid, ppTInfo);
1529 static HRESULT WINAPI MediaControl_GetIDsOfNames(IMediaControl *iface,
1535 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1537 TRACE("(%p/%p)->(%s (%p), %p, %d, %d, %p): stub !!!\n", This, iface, debugstr_guid(riid), riid, rgszNames, cNames, lcid, rgDispId);
1542 static HRESULT WINAPI MediaControl_Invoke(IMediaControl *iface,
1543 DISPID dispIdMember,
1547 DISPPARAMS*pDispParams,
1549 EXCEPINFO*pExepInfo,
1551 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1553 TRACE("(%p/%p)->(%d, %s (%p), %d, %04x, %p, %p, %p, %p): stub !!!\n", This, iface, dispIdMember, debugstr_guid(riid), riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
1558 typedef HRESULT(WINAPI *fnFoundFilter)(IBaseFilter *, DWORD_PTR data);
1560 static HRESULT ExploreGraph(IFilterGraphImpl* pGraph, IPin* pOutputPin, fnFoundFilter FoundFilter, DWORD_PTR data)
1569 TRACE("%p %p\n", pGraph, pOutputPin);
1570 PinInfo.pFilter = NULL;
1572 hr = IPin_ConnectedTo(pOutputPin, &pInputPin);
1576 hr = IPin_QueryPinInfo(pInputPin, &PinInfo);
1578 hr = GetInternalConnections(PinInfo.pFilter, pInputPin, &ppPins, &nb);
1579 IPin_Release(pInputPin);
1586 TRACE("Reached a renderer\n");
1587 /* Count renderers for end of stream notification */
1588 pGraph->nRenderers++;
1592 for(i = 0; i < nb; i++)
1594 /* Explore the graph downstream from this pin
1595 * FIXME: We should prevent exploring from a pin more than once. This can happens when
1596 * several input pins are connected to the same output (a MUX for instance). */
1597 ExploreGraph(pGraph, ppPins[i], FoundFilter, data);
1598 IPin_Release(ppPins[i]);
1601 CoTaskMemFree(ppPins);
1603 TRACE("Doing stuff with filter %p\n", PinInfo.pFilter);
1605 FoundFilter(PinInfo.pFilter, data);
1608 if (PinInfo.pFilter) IBaseFilter_Release(PinInfo.pFilter);
1612 static HRESULT WINAPI SendRun(IBaseFilter *pFilter, DWORD_PTR data)
1615 IReferenceClock *clock = NULL;
1617 IBaseFilter_GetSyncSource(pFilter, &clock);
1620 IReferenceClock_GetTime(clock, &time);
1626 IReferenceClock_Release(clock);
1629 return IBaseFilter_Run(pFilter, time);
1632 static HRESULT WINAPI SendPause(IBaseFilter *pFilter, DWORD_PTR data)
1634 return IBaseFilter_Pause(pFilter);
1637 static HRESULT WINAPI SendStop(IBaseFilter *pFilter, DWORD_PTR data)
1639 return IBaseFilter_Stop(pFilter);
1642 static HRESULT WINAPI SendGetState(IBaseFilter *pFilter, DWORD_PTR data)
1645 DWORD time_end = data;
1646 DWORD time_now = GetTickCount();
1649 if (time_end == INFINITE)
1653 else if (time_end > time_now)
1655 wait = time_end - time_now;
1660 return IBaseFilter_GetState(pFilter, wait, &state);
1664 static HRESULT SendFilterMessage(IMediaControl *iface, fnFoundFilter FoundFilter, DWORD_PTR data) {
1665 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1667 IBaseFilter* pfilter;
1673 TRACE("(%p/%p)->()\n", This, iface);
1675 /* Explorer the graph from source filters to renderers, determine renderers
1676 * number and run filters from renderers to source filters */
1677 This->nRenderers = 0;
1678 ResetEvent(This->hEventCompletion);
1680 for(i = 0; i < This->nFilters; i++)
1683 pfilter = This->ppFiltersInGraph[i];
1684 hr = IBaseFilter_EnumPins(pfilter, &pEnum);
1687 ERR("Enum pins failed %x\n", hr);
1690 /* Check if it is a source filter */
1691 while(IEnumPins_Next(pEnum, 1, &pPin, &dummy) == S_OK)
1693 IPin_QueryDirection(pPin, &dir);
1695 if (dir == PINDIR_INPUT)
1703 TRACE("Found a source filter %p\n", pfilter);
1704 IEnumPins_Reset(pEnum);
1705 while(IEnumPins_Next(pEnum, 1, &pPin, &dummy) == S_OK)
1707 /* Explore the graph downstream from this pin */
1708 ExploreGraph(This, pPin, FoundFilter, data);
1711 FoundFilter(pfilter, data);
1713 IEnumPins_Release(pEnum);
1719 /*** IMediaControl methods ***/
1720 static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) {
1721 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1722 TRACE("(%p/%p)->()\n", This, iface);
1724 if (This->state == State_Running) return S_OK;
1726 EnterCriticalSection(&This->cs);
1727 if (This->state == State_Stopped)
1728 This->EcCompleteCount = 0;
1732 IReferenceClock_GetTime(This->refClock, &This->start_time);
1733 This->start_time += 500000;
1735 else This->position = This->start_time = 0;
1737 SendFilterMessage(iface, SendRun, 0);
1738 This->state = State_Running;
1739 LeaveCriticalSection(&This->cs);
1743 static HRESULT WINAPI MediaControl_Pause(IMediaControl *iface) {
1744 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1745 TRACE("(%p/%p)->()\n", This, iface);
1747 if (This->state == State_Paused) return S_OK;
1749 EnterCriticalSection(&This->cs);
1750 if (This->state == State_Stopped)
1751 This->EcCompleteCount = 0;
1753 if (This->state == State_Running && This->refClock)
1755 LONGLONG time = This->start_time;
1756 IReferenceClock_GetTime(This->refClock, &time);
1757 This->position += time - This->start_time;
1760 SendFilterMessage(iface, SendPause, 0);
1761 This->state = State_Paused;
1762 LeaveCriticalSection(&This->cs);
1766 static HRESULT WINAPI MediaControl_Stop(IMediaControl *iface) {
1767 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1768 TRACE("(%p/%p)->()\n", This, iface);
1770 if (This->state == State_Stopped) return S_OK;
1772 EnterCriticalSection(&This->cs);
1773 if (This->state == State_Running && This->refClock)
1775 LONGLONG time = This->start_time;
1776 IReferenceClock_GetTime(This->refClock, &time);
1777 This->position += time - This->start_time;
1780 if (This->state == State_Running) SendFilterMessage(iface, SendPause, 0);
1781 SendFilterMessage(iface, SendStop, 0);
1782 This->state = State_Stopped;
1783 LeaveCriticalSection(&This->cs);
1787 static HRESULT WINAPI MediaControl_GetState(IMediaControl *iface,
1789 OAFilterState *pfs) {
1790 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1793 TRACE("(%p/%p)->(%d, %p)\n", This, iface, msTimeout, pfs);
1798 EnterCriticalSection(&This->cs);
1803 end = GetTickCount() + msTimeout;
1805 else if (msTimeout < 0)
1814 SendFilterMessage(iface, SendGetState, end);
1816 LeaveCriticalSection(&This->cs);
1821 static HRESULT WINAPI MediaControl_RenderFile(IMediaControl *iface,
1823 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1825 FIXME("(%p/%p)->(%s (%p)): stub !!!\n", This, iface, debugstr_w(strFilename), strFilename);
1830 static HRESULT WINAPI MediaControl_AddSourceFilter(IMediaControl *iface,
1832 IDispatch **ppUnk) {
1833 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1835 FIXME("(%p/%p)->(%s (%p), %p): stub !!!\n", This, iface, debugstr_w(strFilename), strFilename, ppUnk);
1840 static HRESULT WINAPI MediaControl_get_FilterCollection(IMediaControl *iface,
1841 IDispatch **ppUnk) {
1842 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1844 FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, ppUnk);
1849 static HRESULT WINAPI MediaControl_get_RegFilterCollection(IMediaControl *iface,
1850 IDispatch **ppUnk) {
1851 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1853 FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, ppUnk);
1858 static HRESULT WINAPI MediaControl_StopWhenReady(IMediaControl *iface) {
1859 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface);
1861 FIXME("(%p/%p)->(): stub !!!\n", This, iface);
1867 static const IMediaControlVtbl IMediaControl_VTable =
1869 MediaControl_QueryInterface,
1870 MediaControl_AddRef,
1871 MediaControl_Release,
1872 MediaControl_GetTypeInfoCount,
1873 MediaControl_GetTypeInfo,
1874 MediaControl_GetIDsOfNames,
1875 MediaControl_Invoke,
1879 MediaControl_GetState,
1880 MediaControl_RenderFile,
1881 MediaControl_AddSourceFilter,
1882 MediaControl_get_FilterCollection,
1883 MediaControl_get_RegFilterCollection,
1884 MediaControl_StopWhenReady
1888 /*** IUnknown methods ***/
1889 static HRESULT WINAPI MediaSeeking_QueryInterface(IMediaSeeking *iface,
1892 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
1894 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
1896 return Filtergraph_QueryInterface(This, riid, ppvObj);
1899 static ULONG WINAPI MediaSeeking_AddRef(IMediaSeeking *iface) {
1900 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
1902 TRACE("(%p/%p)->()\n", This, iface);
1904 return Filtergraph_AddRef(This);
1907 static ULONG WINAPI MediaSeeking_Release(IMediaSeeking *iface) {
1908 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
1910 TRACE("(%p/%p)->()\n", This, iface);
1912 return Filtergraph_Release(This);
1915 typedef HRESULT WINAPI (*fnFoundSeek)(IFilterGraphImpl *This, IMediaSeeking*, DWORD_PTR arg);
1917 static HRESULT all_renderers_seek(IFilterGraphImpl *This, fnFoundSeek FoundSeek, DWORD_PTR arg) {
1918 BOOL allnotimpl = TRUE;
1920 IBaseFilter* pfilter;
1922 HRESULT hr, hr_return = S_OK;
1927 TRACE("(%p)->(%p %08lx)\n", This, FoundSeek, arg);
1928 /* Send a message to all renderers, they are responsible for broadcasting it further */
1930 for(i = 0; i < This->nFilters; i++)
1932 BOOL renderer = TRUE;
1933 pfilter = This->ppFiltersInGraph[i];
1934 hr = IBaseFilter_EnumPins(pfilter, &pEnum);
1937 ERR("Enum pins failed %x\n", hr);
1940 /* Check if it is a source filter */
1941 while(IEnumPins_Next(pEnum, 1, &pPin, &dummy) == S_OK)
1943 IPin_QueryDirection(pPin, &dir);
1945 if (dir != PINDIR_INPUT)
1951 IEnumPins_Release(pEnum);
1954 IMediaSeeking *seek = NULL;
1955 IBaseFilter_QueryInterface(pfilter, &IID_IMediaSeeking, (void**)&seek);
1959 hr = FoundSeek(This, seek, arg);
1961 IMediaSeeking_Release(seek);
1962 if (hr_return != E_NOTIMPL)
1964 if (hr_return == S_OK || (FAILED(hr) && hr != E_NOTIMPL && !FAILED(hr_return)))
1974 static HRESULT WINAPI FoundCapabilities(IFilterGraphImpl *This, IMediaSeeking *seek, DWORD_PTR pcaps)
1979 hr = IMediaSeeking_GetCapabilities(seek, &caps);
1983 /* Only add common capabilities everything supports */
1984 *(DWORD*)pcaps &= caps;
1989 /*** IMediaSeeking methods ***/
1990 static HRESULT WINAPI MediaSeeking_GetCapabilities(IMediaSeeking *iface,
1991 DWORD *pCapabilities) {
1992 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
1994 TRACE("(%p/%p)->(%p)\n", This, iface, pCapabilities);
1999 EnterCriticalSection(&This->cs);
2000 *pCapabilities = 0xffffffff;
2002 hr = all_renderers_seek(This, FoundCapabilities, (DWORD_PTR)pCapabilities);
2003 LeaveCriticalSection(&This->cs);
2008 static HRESULT WINAPI MediaSeeking_CheckCapabilities(IMediaSeeking *iface,
2009 DWORD *pCapabilities) {
2010 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2013 TRACE("(%p/%p)->(%p)\n", This, iface, pCapabilities);
2018 EnterCriticalSection(&This->cs);
2019 originalcaps = *pCapabilities;
2020 hr = all_renderers_seek(This, FoundCapabilities, (DWORD_PTR)pCapabilities);
2021 LeaveCriticalSection(&This->cs);
2026 if (!*pCapabilities)
2028 if (*pCapabilities != originalcaps)
2033 static HRESULT WINAPI MediaSeeking_IsFormatSupported(IMediaSeeking *iface,
2034 const GUID *pFormat) {
2035 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2040 TRACE("(%p/%p)->(%s)\n", This, iface, debugstr_guid(pFormat));
2042 if (!IsEqualGUID(&TIME_FORMAT_MEDIA_TIME, pFormat))
2044 FIXME("Unhandled time format %s\n", debugstr_guid(pFormat));
2051 static HRESULT WINAPI MediaSeeking_QueryPreferredFormat(IMediaSeeking *iface,
2053 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2058 FIXME("(%p/%p)->(%p): semi-stub !!!\n", This, iface, pFormat);
2059 memcpy(pFormat, &TIME_FORMAT_MEDIA_TIME, sizeof(GUID));
2064 static HRESULT WINAPI MediaSeeking_GetTimeFormat(IMediaSeeking *iface,
2066 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2071 TRACE("(%p/%p)->(%p)\n", This, iface, pFormat);
2072 memcpy(pFormat, &This->timeformatseek, sizeof(GUID));
2077 static HRESULT WINAPI MediaSeeking_IsUsingTimeFormat(IMediaSeeking *iface,
2078 const GUID *pFormat) {
2079 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2081 TRACE("(%p/%p)->(%p)\n", This, iface, pFormat);
2085 if (memcmp(pFormat, &This->timeformatseek, sizeof(GUID)))
2091 static HRESULT WINAPI MediaSeeking_SetTimeFormat(IMediaSeeking *iface,
2092 const GUID *pFormat) {
2093 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2098 TRACE("(%p/%p)->(%s)\n", This, iface, debugstr_guid(pFormat));
2100 if (This->state != State_Stopped)
2101 return VFW_E_WRONG_STATE;
2103 if (!IsEqualGUID(&TIME_FORMAT_MEDIA_TIME, pFormat))
2105 FIXME("Unhandled time format %s\n", debugstr_guid(pFormat));
2106 return E_INVALIDARG;
2112 static HRESULT WINAPI FoundDuration(IFilterGraphImpl *This, IMediaSeeking *seek, DWORD_PTR pduration)
2115 LONGLONG duration = 0, *pdur = (LONGLONG*)pduration;
2117 hr = IMediaSeeking_GetDuration(seek, &duration);
2121 /* FIXME: Minimum or maximum duration? Assuming minimum */
2122 if (duration > 0 && *pdur < duration)
2128 static HRESULT WINAPI MediaSeeking_GetDuration(IMediaSeeking *iface,
2129 LONGLONG *pDuration) {
2130 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2133 TRACE("(%p/%p)->(%p)\n", This, iface, pDuration);
2138 EnterCriticalSection(&This->cs);
2140 hr = all_renderers_seek(This, FoundDuration, (DWORD_PTR)pDuration);
2141 LeaveCriticalSection(&This->cs);
2143 TRACE("--->%08x\n", hr);
2147 static HRESULT WINAPI MediaSeeking_GetStopPosition(IMediaSeeking *iface,
2149 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2152 TRACE("(%p/%p)->(%p)\n", This, iface, pStop);
2157 EnterCriticalSection(&This->cs);
2158 if (This->stop_position < 0)
2159 /* Stop position not set, use duration instead */
2160 hr = IMediaSeeking_GetDuration(iface, pStop);
2162 *pStop = This->stop_position;
2164 LeaveCriticalSection(&This->cs);
2169 static HRESULT WINAPI MediaSeeking_GetCurrentPosition(IMediaSeeking *iface,
2170 LONGLONG *pCurrent) {
2171 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2177 EnterCriticalSection(&This->cs);
2178 if (This->state == State_Running && This->refClock)
2180 IReferenceClock_GetTime(This->refClock, &time);
2182 time += This->position - This->start_time;
2183 if (time < This->position)
2184 time = This->position;
2188 *pCurrent = This->position;
2189 LeaveCriticalSection(&This->cs);
2191 TRACE("Time: %u.%03u\n", (DWORD)(*pCurrent / 10000000), (DWORD)((*pCurrent / 10000)%1000));
2196 static HRESULT WINAPI MediaSeeking_ConvertTimeFormat(IMediaSeeking *iface,
2198 const GUID *pTargetFormat,
2200 const GUID *pSourceFormat) {
2201 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2203 FIXME("(%p/%p)->(%p, %p, 0x%s, %p): stub !!!\n", This, iface, pTarget,
2204 pTargetFormat, wine_dbgstr_longlong(Source), pSourceFormat);
2210 LONGLONG* current, *stop;
2211 DWORD curflags, stopflags;
2214 static HRESULT WINAPI found_setposition(IFilterGraphImpl *This, IMediaSeeking *seek, DWORD_PTR pargs)
2216 struct pos_args *args = (void*)pargs;
2218 return IMediaSeeking_SetPositions(seek, args->current, args->curflags, args->stop, args->stopflags);
2221 static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface,
2223 DWORD dwCurrentFlags,
2225 DWORD dwStopFlags) {
2226 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2229 struct pos_args args;
2231 TRACE("(%p/%p)->(%p, %08x, %p, %08x)\n", This, iface, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
2233 EnterCriticalSection(&This->cs);
2234 state = This->state;
2235 TRACE("State: %s\n", state == State_Running ? "Running" : (state == State_Paused ? "Paused" : (state == State_Stopped ? "Stopped" : "UNKNOWN")));
2237 if ((dwCurrentFlags & 0x7) == AM_SEEKING_AbsolutePositioning)
2239 This->position = *pCurrent;
2241 else if ((dwCurrentFlags & 0x7) != AM_SEEKING_NoPositioning)
2242 FIXME("Adjust method %x not handled yet!\n", dwCurrentFlags & 0x7);
2244 if ((dwStopFlags & 0x7) == AM_SEEKING_AbsolutePositioning)
2245 This->stop_position = *pStop;
2246 else if ((dwStopFlags & 0x7) != AM_SEEKING_NoPositioning)
2247 FIXME("Stop position not handled yet!\n");
2249 args.current = pCurrent;
2251 args.curflags = dwCurrentFlags;
2252 args.stopflags = dwStopFlags;
2253 hr = all_renderers_seek(This, found_setposition, (DWORD_PTR)&args);
2255 if (This->refClock && ((dwCurrentFlags & 0x7) != AM_SEEKING_NoPositioning))
2257 /* Update start time, prevents weird jumps */
2258 IReferenceClock_GetTime(This->refClock, &This->start_time);
2260 LeaveCriticalSection(&This->cs);
2265 static HRESULT WINAPI MediaSeeking_GetPositions(IMediaSeeking *iface,
2268 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2271 TRACE("(%p/%p)->(%p, %p)\n", This, iface, pCurrent, pStop);
2272 hr = IMediaSeeking_GetCurrentPosition(iface, pCurrent);
2274 hr = IMediaSeeking_GetStopPosition(iface, pStop);
2279 static HRESULT WINAPI MediaSeeking_GetAvailable(IMediaSeeking *iface,
2280 LONGLONG *pEarliest,
2281 LONGLONG *pLatest) {
2282 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2284 FIXME("(%p/%p)->(%p, %p): stub !!!\n", This, iface, pEarliest, pLatest);
2289 static HRESULT WINAPI MediaSeeking_SetRate(IMediaSeeking *iface,
2291 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2293 FIXME("(%p/%p)->(%f): stub !!!\n", This, iface, dRate);
2298 static HRESULT WINAPI MediaSeeking_GetRate(IMediaSeeking *iface,
2300 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2302 FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, pdRate);
2307 static HRESULT WINAPI MediaSeeking_GetPreroll(IMediaSeeking *iface,
2308 LONGLONG *pllPreroll) {
2309 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
2311 FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, pllPreroll);
2317 static const IMediaSeekingVtbl IMediaSeeking_VTable =
2319 MediaSeeking_QueryInterface,
2320 MediaSeeking_AddRef,
2321 MediaSeeking_Release,
2322 MediaSeeking_GetCapabilities,
2323 MediaSeeking_CheckCapabilities,
2324 MediaSeeking_IsFormatSupported,
2325 MediaSeeking_QueryPreferredFormat,
2326 MediaSeeking_GetTimeFormat,
2327 MediaSeeking_IsUsingTimeFormat,
2328 MediaSeeking_SetTimeFormat,
2329 MediaSeeking_GetDuration,
2330 MediaSeeking_GetStopPosition,
2331 MediaSeeking_GetCurrentPosition,
2332 MediaSeeking_ConvertTimeFormat,
2333 MediaSeeking_SetPositions,
2334 MediaSeeking_GetPositions,
2335 MediaSeeking_GetAvailable,
2336 MediaSeeking_SetRate,
2337 MediaSeeking_GetRate,
2338 MediaSeeking_GetPreroll
2341 /*** IUnknown methods ***/
2342 static HRESULT WINAPI MediaPosition_QueryInterface(IMediaPosition* iface, REFIID riid, void** ppvObj){
2343 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaPosition_vtbl, iface);
2345 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
2347 return Filtergraph_QueryInterface(This, riid, ppvObj);
2350 static ULONG WINAPI MediaPosition_AddRef(IMediaPosition *iface){
2351 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaPosition_vtbl, iface);
2353 TRACE("(%p/%p)->()\n", This, iface);
2355 return Filtergraph_AddRef(This);
2358 static ULONG WINAPI MediaPosition_Release(IMediaPosition *iface){
2359 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaPosition_vtbl, iface);
2361 TRACE("(%p/%p)->()\n", This, iface);
2363 return Filtergraph_Release(This);
2366 /*** IDispatch methods ***/
2367 static HRESULT WINAPI MediaPosition_GetTypeInfoCount(IMediaPosition *iface, UINT* pctinfo){
2368 FIXME("(%p) stub!\n", iface);
2372 static HRESULT WINAPI MediaPosition_GetTypeInfo(IMediaPosition *iface, UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo){
2373 FIXME("(%p) stub!\n", iface);
2377 static HRESULT WINAPI MediaPosition_GetIDsOfNames(IMediaPosition* iface, REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId){
2378 FIXME("(%p) stub!\n", iface);
2382 static HRESULT WINAPI MediaPosition_Invoke(IMediaPosition* iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr){
2383 FIXME("(%p) stub!\n", iface);
2387 /*** IMediaPosition methods ***/
2388 static HRESULT WINAPI MediaPosition_get_Duration(IMediaPosition * iface, REFTIME *plength){
2389 FIXME("(%p)->(%p) stub!\n", iface, plength);
2393 static HRESULT WINAPI MediaPosition_put_CurrentPosition(IMediaPosition * iface, REFTIME llTime){
2394 FIXME("(%p)->(%f) stub!\n", iface, llTime);
2398 static HRESULT WINAPI MediaPosition_get_CurrentPosition(IMediaPosition * iface, REFTIME *pllTime){
2399 FIXME("(%p)->(%p) stub!\n", iface, pllTime);
2403 static HRESULT WINAPI MediaPosition_get_StopTime(IMediaPosition * iface, REFTIME *pllTime){
2404 FIXME("(%p)->(%p) stub!\n", iface, pllTime);
2408 static HRESULT WINAPI MediaPosition_put_StopTime(IMediaPosition * iface, REFTIME llTime){
2409 FIXME("(%p)->(%f) stub!\n", iface, llTime);
2413 static HRESULT WINAPI MediaPosition_get_PrerollTime(IMediaPosition * iface, REFTIME *pllTime){
2414 FIXME("(%p)->(%p) stub!\n", iface, pllTime);
2418 static HRESULT WINAPI MediaPosition_put_PrerollTime(IMediaPosition * iface, REFTIME llTime){
2419 FIXME("(%p)->(%f) stub!\n", iface, llTime);
2423 static HRESULT WINAPI MediaPosition_put_Rate(IMediaPosition * iface, double dRate){
2424 FIXME("(%p)->(%f) stub!\n", iface, dRate);
2428 static HRESULT WINAPI MediaPosition_get_Rate(IMediaPosition * iface, double *pdRate){
2429 FIXME("(%p)->(%p) stub!\n", iface, pdRate);
2433 static HRESULT WINAPI MediaPosition_CanSeekForward(IMediaPosition * iface, LONG *pCanSeekForward){
2434 FIXME("(%p)->(%p) stub!\n", iface, pCanSeekForward);
2438 static HRESULT WINAPI MediaPosition_CanSeekBackward(IMediaPosition * iface, LONG *pCanSeekBackward){
2439 FIXME("(%p)->(%p) stub!\n", iface, pCanSeekBackward);
2444 static const IMediaPositionVtbl IMediaPosition_VTable =
2446 MediaPosition_QueryInterface,
2447 MediaPosition_AddRef,
2448 MediaPosition_Release,
2449 MediaPosition_GetTypeInfoCount,
2450 MediaPosition_GetTypeInfo,
2451 MediaPosition_GetIDsOfNames,
2452 MediaPosition_Invoke,
2453 MediaPosition_get_Duration,
2454 MediaPosition_put_CurrentPosition,
2455 MediaPosition_get_CurrentPosition,
2456 MediaPosition_get_StopTime,
2457 MediaPosition_put_StopTime,
2458 MediaPosition_get_PrerollTime,
2459 MediaPosition_put_PrerollTime,
2460 MediaPosition_put_Rate,
2461 MediaPosition_get_Rate,
2462 MediaPosition_CanSeekForward,
2463 MediaPosition_CanSeekBackward
2466 static HRESULT GetTargetInterface(IFilterGraphImpl* pGraph, REFIID riid, LPVOID* ppvObj)
2468 HRESULT hr = E_NOINTERFACE;
2472 /* Check if the interface type is already registered */
2473 for (entry = 0; entry < pGraph->nItfCacheEntries; entry++)
2474 if (riid == pGraph->ItfCacheEntries[entry].riid)
2476 if (pGraph->ItfCacheEntries[entry].iface)
2478 /* Return the interface if available */
2479 *ppvObj = pGraph->ItfCacheEntries[entry].iface;
2485 if (entry >= MAX_ITF_CACHE_ENTRIES)
2487 FIXME("Not enough space to store interface in the cache\n");
2488 return E_OUTOFMEMORY;
2491 /* Find a filter supporting the requested interface */
2492 for (i = 0; i < pGraph->nFilters; i++)
2494 hr = IBaseFilter_QueryInterface(pGraph->ppFiltersInGraph[i], riid, ppvObj);
2497 pGraph->ItfCacheEntries[entry].riid = riid;
2498 pGraph->ItfCacheEntries[entry].filter = pGraph->ppFiltersInGraph[i];
2499 pGraph->ItfCacheEntries[entry].iface = (IUnknown*)*ppvObj;
2500 if (entry >= pGraph->nItfCacheEntries)
2501 pGraph->nItfCacheEntries++;
2504 if (hr != E_NOINTERFACE)
2511 /*** IUnknown methods ***/
2512 static HRESULT WINAPI BasicAudio_QueryInterface(IBasicAudio *iface,
2515 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2517 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
2519 return Filtergraph_QueryInterface(This, riid, ppvObj);
2522 static ULONG WINAPI BasicAudio_AddRef(IBasicAudio *iface) {
2523 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2525 TRACE("(%p/%p)->()\n", This, iface);
2527 return Filtergraph_AddRef(This);
2530 static ULONG WINAPI BasicAudio_Release(IBasicAudio *iface) {
2531 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2533 TRACE("(%p/%p)->()\n", This, iface);
2535 return Filtergraph_Release(This);
2538 /*** IDispatch methods ***/
2539 static HRESULT WINAPI BasicAudio_GetTypeInfoCount(IBasicAudio *iface,
2541 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2542 IBasicAudio* pBasicAudio;
2545 TRACE("(%p/%p)->(%p)\n", This, iface, pctinfo);
2547 EnterCriticalSection(&This->cs);
2549 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2552 hr = IBasicAudio_GetTypeInfoCount(pBasicAudio, pctinfo);
2554 LeaveCriticalSection(&This->cs);
2559 static HRESULT WINAPI BasicAudio_GetTypeInfo(IBasicAudio *iface,
2562 ITypeInfo**ppTInfo) {
2563 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2564 IBasicAudio* pBasicAudio;
2567 TRACE("(%p/%p)->(%d, %d, %p)\n", This, iface, iTInfo, lcid, ppTInfo);
2569 EnterCriticalSection(&This->cs);
2571 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2574 hr = IBasicAudio_GetTypeInfo(pBasicAudio, iTInfo, lcid, ppTInfo);
2576 LeaveCriticalSection(&This->cs);
2581 static HRESULT WINAPI BasicAudio_GetIDsOfNames(IBasicAudio *iface,
2587 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2588 IBasicAudio* pBasicAudio;
2591 TRACE("(%p/%p)->(%s (%p), %p, %d, %d, %p)\n", This, iface, debugstr_guid(riid), riid, rgszNames, cNames, lcid, rgDispId);
2593 EnterCriticalSection(&This->cs);
2595 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2598 hr = IBasicAudio_GetIDsOfNames(pBasicAudio, riid, rgszNames, cNames, lcid, rgDispId);
2600 LeaveCriticalSection(&This->cs);
2605 static HRESULT WINAPI BasicAudio_Invoke(IBasicAudio *iface,
2606 DISPID dispIdMember,
2610 DISPPARAMS*pDispParams,
2612 EXCEPINFO*pExepInfo,
2614 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2615 IBasicAudio* pBasicAudio;
2618 TRACE("(%p/%p)->(%d, %s (%p), %d, %04x, %p, %p, %p, %p)\n", This, iface, dispIdMember, debugstr_guid(riid), riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
2620 EnterCriticalSection(&This->cs);
2622 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2625 hr = IBasicAudio_Invoke(pBasicAudio, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
2627 LeaveCriticalSection(&This->cs);
2632 /*** IBasicAudio methods ***/
2633 static HRESULT WINAPI BasicAudio_put_Volume(IBasicAudio *iface,
2635 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2636 IBasicAudio* pBasicAudio;
2639 TRACE("(%p/%p)->(%ld)\n", This, iface, lVolume);
2641 EnterCriticalSection(&This->cs);
2643 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2646 hr = IBasicAudio_put_Volume(pBasicAudio, lVolume);
2648 LeaveCriticalSection(&This->cs);
2653 static HRESULT WINAPI BasicAudio_get_Volume(IBasicAudio *iface,
2655 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2656 IBasicAudio* pBasicAudio;
2659 TRACE("(%p/%p)->(%p)\n", This, iface, plVolume);
2661 EnterCriticalSection(&This->cs);
2663 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2666 hr = IBasicAudio_get_Volume(pBasicAudio, plVolume);
2668 LeaveCriticalSection(&This->cs);
2673 static HRESULT WINAPI BasicAudio_put_Balance(IBasicAudio *iface,
2675 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2676 IBasicAudio* pBasicAudio;
2679 TRACE("(%p/%p)->(%ld)\n", This, iface, lBalance);
2681 EnterCriticalSection(&This->cs);
2683 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2686 hr = IBasicAudio_put_Balance(pBasicAudio, lBalance);
2688 LeaveCriticalSection(&This->cs);
2693 static HRESULT WINAPI BasicAudio_get_Balance(IBasicAudio *iface,
2695 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicAudio_vtbl, iface);
2696 IBasicAudio* pBasicAudio;
2699 TRACE("(%p/%p)->(%p)\n", This, iface, plBalance);
2701 EnterCriticalSection(&This->cs);
2703 hr = GetTargetInterface(This, &IID_IBasicAudio, (LPVOID*)&pBasicAudio);
2706 hr = IBasicAudio_get_Balance(pBasicAudio, plBalance);
2708 LeaveCriticalSection(&This->cs);
2713 static const IBasicAudioVtbl IBasicAudio_VTable =
2715 BasicAudio_QueryInterface,
2718 BasicAudio_GetTypeInfoCount,
2719 BasicAudio_GetTypeInfo,
2720 BasicAudio_GetIDsOfNames,
2722 BasicAudio_put_Volume,
2723 BasicAudio_get_Volume,
2724 BasicAudio_put_Balance,
2725 BasicAudio_get_Balance
2728 /*** IUnknown methods ***/
2729 static HRESULT WINAPI BasicVideo_QueryInterface(IBasicVideo2 *iface,
2732 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2734 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
2736 return Filtergraph_QueryInterface(This, riid, ppvObj);
2739 static ULONG WINAPI BasicVideo_AddRef(IBasicVideo2 *iface) {
2740 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2742 TRACE("(%p/%p)->()\n", This, iface);
2744 return Filtergraph_AddRef(This);
2747 static ULONG WINAPI BasicVideo_Release(IBasicVideo2 *iface) {
2748 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2750 TRACE("(%p/%p)->()\n", This, iface);
2752 return Filtergraph_Release(This);
2755 /*** IDispatch methods ***/
2756 static HRESULT WINAPI BasicVideo_GetTypeInfoCount(IBasicVideo2 *iface,
2758 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2759 IBasicVideo* pBasicVideo;
2762 TRACE("(%p/%p)->(%p)\n", This, iface, pctinfo);
2764 EnterCriticalSection(&This->cs);
2766 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2769 hr = IBasicVideo_GetTypeInfoCount(pBasicVideo, pctinfo);
2771 LeaveCriticalSection(&This->cs);
2776 static HRESULT WINAPI BasicVideo_GetTypeInfo(IBasicVideo2 *iface,
2779 ITypeInfo**ppTInfo) {
2780 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2781 IBasicVideo* pBasicVideo;
2784 TRACE("(%p/%p)->(%d, %d, %p)\n", This, iface, iTInfo, lcid, ppTInfo);
2786 EnterCriticalSection(&This->cs);
2788 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2791 hr = IBasicVideo_GetTypeInfo(pBasicVideo, iTInfo, lcid, ppTInfo);
2793 LeaveCriticalSection(&This->cs);
2798 static HRESULT WINAPI BasicVideo_GetIDsOfNames(IBasicVideo2 *iface,
2804 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2805 IBasicVideo* pBasicVideo;
2808 TRACE("(%p/%p)->(%s (%p), %p, %d, %d, %p)\n", This, iface, debugstr_guid(riid), riid, rgszNames, cNames, lcid, rgDispId);
2810 EnterCriticalSection(&This->cs);
2812 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2815 hr = IBasicVideo_GetIDsOfNames(pBasicVideo, riid, rgszNames, cNames, lcid, rgDispId);
2817 LeaveCriticalSection(&This->cs);
2822 static HRESULT WINAPI BasicVideo_Invoke(IBasicVideo2 *iface,
2823 DISPID dispIdMember,
2827 DISPPARAMS*pDispParams,
2829 EXCEPINFO*pExepInfo,
2831 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2832 IBasicVideo* pBasicVideo;
2835 TRACE("(%p/%p)->(%d, %s (%p), %d, %04x, %p, %p, %p, %p)\n", This, iface, dispIdMember, debugstr_guid(riid), riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
2837 EnterCriticalSection(&This->cs);
2839 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2842 hr = IBasicVideo_Invoke(pBasicVideo, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
2844 LeaveCriticalSection(&This->cs);
2849 /*** IBasicVideo methods ***/
2850 static HRESULT WINAPI BasicVideo_get_AvgTimePerFrame(IBasicVideo2 *iface,
2851 REFTIME *pAvgTimePerFrame) {
2852 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2853 IBasicVideo* pBasicVideo;
2856 TRACE("(%p/%p)->(%p)\n", This, iface, pAvgTimePerFrame);
2858 EnterCriticalSection(&This->cs);
2860 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2863 hr = IBasicVideo_get_AvgTimePerFrame(pBasicVideo, pAvgTimePerFrame);
2865 LeaveCriticalSection(&This->cs);
2870 static HRESULT WINAPI BasicVideo_get_BitRate(IBasicVideo2 *iface,
2872 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2873 IBasicVideo* pBasicVideo;
2876 TRACE("(%p/%p)->(%p)\n", This, iface, pBitRate);
2878 EnterCriticalSection(&This->cs);
2880 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2883 hr = IBasicVideo_get_BitRate(pBasicVideo, pBitRate);
2885 LeaveCriticalSection(&This->cs);
2890 static HRESULT WINAPI BasicVideo_get_BitErrorRate(IBasicVideo2 *iface,
2891 long *pBitErrorRate) {
2892 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2893 IBasicVideo* pBasicVideo;
2896 TRACE("(%p/%p)->(%p)\n", This, iface, pBitErrorRate);
2898 EnterCriticalSection(&This->cs);
2900 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2903 hr = IBasicVideo_get_BitErrorRate(pBasicVideo, pBitErrorRate);
2905 LeaveCriticalSection(&This->cs);
2910 static HRESULT WINAPI BasicVideo_get_VideoWidth(IBasicVideo2 *iface,
2911 long *pVideoWidth) {
2912 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2913 IBasicVideo* pBasicVideo;
2916 TRACE("(%p/%p)->(%p)\n", This, iface, pVideoWidth);
2918 EnterCriticalSection(&This->cs);
2920 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2923 hr = IBasicVideo_get_VideoWidth(pBasicVideo, pVideoWidth);
2925 LeaveCriticalSection(&This->cs);
2930 static HRESULT WINAPI BasicVideo_get_VideoHeight(IBasicVideo2 *iface,
2931 long *pVideoHeight) {
2932 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2933 IBasicVideo* pBasicVideo;
2936 TRACE("(%p/%p)->(%p)\n", This, iface, pVideoHeight);
2938 EnterCriticalSection(&This->cs);
2940 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2943 hr = IBasicVideo_get_VideoHeight(pBasicVideo, pVideoHeight);
2945 LeaveCriticalSection(&This->cs);
2950 static HRESULT WINAPI BasicVideo_put_SourceLeft(IBasicVideo2 *iface,
2952 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2953 IBasicVideo* pBasicVideo;
2956 TRACE("(%p/%p)->(%ld)\n", This, iface, SourceLeft);
2958 EnterCriticalSection(&This->cs);
2960 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2963 hr = IBasicVideo_put_SourceLeft(pBasicVideo, SourceLeft);
2965 LeaveCriticalSection(&This->cs);
2970 static HRESULT WINAPI BasicVideo_get_SourceLeft(IBasicVideo2 *iface,
2971 long *pSourceLeft) {
2972 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2973 IBasicVideo* pBasicVideo;
2976 TRACE("(%p/%p)->(%p)\n", This, iface, pSourceLeft);
2978 EnterCriticalSection(&This->cs);
2980 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
2983 hr = IBasicVideo_get_SourceLeft(pBasicVideo, pSourceLeft);
2985 LeaveCriticalSection(&This->cs);
2990 static HRESULT WINAPI BasicVideo_put_SourceWidth(IBasicVideo2 *iface,
2992 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
2993 IBasicVideo* pBasicVideo;
2996 TRACE("(%p/%p)->(%ld)\n", This, iface, SourceWidth);
2998 EnterCriticalSection(&This->cs);
3000 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3003 hr = IBasicVideo_put_SourceWidth(pBasicVideo, SourceWidth);
3005 LeaveCriticalSection(&This->cs);
3010 static HRESULT WINAPI BasicVideo_get_SourceWidth(IBasicVideo2 *iface,
3011 long *pSourceWidth) {
3012 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3013 IBasicVideo* pBasicVideo;
3016 TRACE("(%p/%p)->(%p)\n", This, iface, pSourceWidth);
3018 EnterCriticalSection(&This->cs);
3020 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3023 hr = IBasicVideo_get_SourceWidth(pBasicVideo, pSourceWidth);
3025 LeaveCriticalSection(&This->cs);
3030 static HRESULT WINAPI BasicVideo_put_SourceTop(IBasicVideo2 *iface,
3032 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3033 IBasicVideo* pBasicVideo;
3036 TRACE("(%p/%p)->(%ld)\n", This, iface, SourceTop);
3038 EnterCriticalSection(&This->cs);
3040 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3043 hr = IBasicVideo_put_SourceTop(pBasicVideo, SourceTop);
3045 LeaveCriticalSection(&This->cs);
3050 static HRESULT WINAPI BasicVideo_get_SourceTop(IBasicVideo2 *iface,
3052 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3053 IBasicVideo* pBasicVideo;
3056 TRACE("(%p/%p)->(%p)\n", This, iface, pSourceTop);
3058 EnterCriticalSection(&This->cs);
3060 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3063 hr = IBasicVideo_get_SourceTop(pBasicVideo, pSourceTop);
3065 LeaveCriticalSection(&This->cs);
3070 static HRESULT WINAPI BasicVideo_put_SourceHeight(IBasicVideo2 *iface,
3071 long SourceHeight) {
3072 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3073 IBasicVideo* pBasicVideo;
3076 TRACE("(%p/%p)->(%ld)\n", This, iface, SourceHeight);
3078 EnterCriticalSection(&This->cs);
3080 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3083 hr = IBasicVideo_put_SourceHeight(pBasicVideo, SourceHeight);
3085 LeaveCriticalSection(&This->cs);
3090 static HRESULT WINAPI BasicVideo_get_SourceHeight(IBasicVideo2 *iface,
3091 long *pSourceHeight) {
3092 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3093 IBasicVideo* pBasicVideo;
3096 TRACE("(%p/%p)->(%p)\n", This, iface, pSourceHeight);
3098 EnterCriticalSection(&This->cs);
3100 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3103 hr = IBasicVideo_get_SourceHeight(pBasicVideo, pSourceHeight);
3105 LeaveCriticalSection(&This->cs);
3110 static HRESULT WINAPI BasicVideo_put_DestinationLeft(IBasicVideo2 *iface,
3111 long DestinationLeft) {
3112 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3113 IBasicVideo* pBasicVideo;
3116 TRACE("(%p/%p)->(%ld)\n", This, iface, DestinationLeft);
3118 EnterCriticalSection(&This->cs);
3120 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3123 hr = IBasicVideo_put_DestinationLeft(pBasicVideo, DestinationLeft);
3125 LeaveCriticalSection(&This->cs);
3130 static HRESULT WINAPI BasicVideo_get_DestinationLeft(IBasicVideo2 *iface,
3131 long *pDestinationLeft) {
3132 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3133 IBasicVideo* pBasicVideo;
3136 TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationLeft);
3138 EnterCriticalSection(&This->cs);
3140 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3143 hr = IBasicVideo_get_DestinationLeft(pBasicVideo, pDestinationLeft);
3145 LeaveCriticalSection(&This->cs);
3150 static HRESULT WINAPI BasicVideo_put_DestinationWidth(IBasicVideo2 *iface,
3151 long DestinationWidth) {
3152 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3153 IBasicVideo* pBasicVideo;
3156 TRACE("(%p/%p)->(%ld)\n", This, iface, DestinationWidth);
3158 EnterCriticalSection(&This->cs);
3160 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3163 hr = IBasicVideo_put_DestinationWidth(pBasicVideo, DestinationWidth);
3165 LeaveCriticalSection(&This->cs);
3170 static HRESULT WINAPI BasicVideo_get_DestinationWidth(IBasicVideo2 *iface,
3171 long *pDestinationWidth) {
3172 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3173 IBasicVideo* pBasicVideo;
3176 TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationWidth);
3178 EnterCriticalSection(&This->cs);
3180 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3183 hr = IBasicVideo_get_DestinationWidth(pBasicVideo, pDestinationWidth);
3185 LeaveCriticalSection(&This->cs);
3190 static HRESULT WINAPI BasicVideo_put_DestinationTop(IBasicVideo2 *iface,
3191 long DestinationTop) {
3192 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3193 IBasicVideo* pBasicVideo;
3196 TRACE("(%p/%p)->(%ld)\n", This, iface, DestinationTop);
3198 EnterCriticalSection(&This->cs);
3200 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3203 hr = IBasicVideo_put_DestinationTop(pBasicVideo, DestinationTop);
3205 LeaveCriticalSection(&This->cs);
3210 static HRESULT WINAPI BasicVideo_get_DestinationTop(IBasicVideo2 *iface,
3211 long *pDestinationTop) {
3212 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3213 IBasicVideo* pBasicVideo;
3216 TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationTop);
3218 EnterCriticalSection(&This->cs);
3220 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3223 hr = IBasicVideo_get_DestinationTop(pBasicVideo, pDestinationTop);
3225 LeaveCriticalSection(&This->cs);
3230 static HRESULT WINAPI BasicVideo_put_DestinationHeight(IBasicVideo2 *iface,
3231 long DestinationHeight) {
3232 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3233 IBasicVideo* pBasicVideo;
3236 TRACE("(%p/%p)->(%ld)\n", This, iface, DestinationHeight);
3238 EnterCriticalSection(&This->cs);
3240 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3243 hr = IBasicVideo_put_DestinationHeight(pBasicVideo, DestinationHeight);
3245 LeaveCriticalSection(&This->cs);
3250 static HRESULT WINAPI BasicVideo_get_DestinationHeight(IBasicVideo2 *iface,
3251 long *pDestinationHeight) {
3252 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3253 IBasicVideo* pBasicVideo;
3256 TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationHeight);
3258 EnterCriticalSection(&This->cs);
3260 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3263 hr = IBasicVideo_get_DestinationHeight(pBasicVideo, pDestinationHeight);
3265 LeaveCriticalSection(&This->cs);
3270 static HRESULT WINAPI BasicVideo_SetSourcePosition(IBasicVideo2 *iface,
3275 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3276 IBasicVideo* pBasicVideo;
3279 TRACE("(%p/%p)->(%ld, %ld, %ld, %ld)\n", This, iface, Left, Top, Width, Height);
3281 EnterCriticalSection(&This->cs);
3283 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3286 hr = IBasicVideo_SetSourcePosition(pBasicVideo, Left, Top, Width, Height);
3288 LeaveCriticalSection(&This->cs);
3293 static HRESULT WINAPI BasicVideo_GetSourcePosition(IBasicVideo2 *iface,
3298 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3299 IBasicVideo* pBasicVideo;
3302 TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight);
3304 EnterCriticalSection(&This->cs);
3306 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3309 hr = IBasicVideo_GetSourcePosition(pBasicVideo, pLeft, pTop, pWidth, pHeight);
3311 LeaveCriticalSection(&This->cs);
3316 static HRESULT WINAPI BasicVideo_SetDefaultSourcePosition(IBasicVideo2 *iface) {
3317 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3318 IBasicVideo* pBasicVideo;
3321 TRACE("(%p/%p)->()\n", This, iface);
3323 EnterCriticalSection(&This->cs);
3325 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3328 hr = IBasicVideo_SetDefaultSourcePosition(pBasicVideo);
3330 LeaveCriticalSection(&This->cs);
3335 static HRESULT WINAPI BasicVideo_SetDestinationPosition(IBasicVideo2 *iface,
3340 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3341 IBasicVideo* pBasicVideo;
3344 TRACE("(%p/%p)->(%ld, %ld, %ld, %ld)\n", This, iface, Left, Top, Width, Height);
3346 EnterCriticalSection(&This->cs);
3348 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3351 hr = IBasicVideo_SetDestinationPosition(pBasicVideo, Left, Top, Width, Height);
3353 LeaveCriticalSection(&This->cs);
3358 static HRESULT WINAPI BasicVideo_GetDestinationPosition(IBasicVideo2 *iface,
3363 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3364 IBasicVideo* pBasicVideo;
3367 TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight);
3369 EnterCriticalSection(&This->cs);
3371 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3374 hr = IBasicVideo_GetDestinationPosition(pBasicVideo, pLeft, pTop, pWidth, pHeight);
3376 LeaveCriticalSection(&This->cs);
3381 static HRESULT WINAPI BasicVideo_SetDefaultDestinationPosition(IBasicVideo2 *iface) {
3382 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3383 IBasicVideo* pBasicVideo;
3386 TRACE("(%p/%p)->()\n", This, iface);
3388 EnterCriticalSection(&This->cs);
3390 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3393 hr = IBasicVideo_SetDefaultDestinationPosition(pBasicVideo);
3395 LeaveCriticalSection(&This->cs);
3400 static HRESULT WINAPI BasicVideo_GetVideoSize(IBasicVideo2 *iface,
3403 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3404 IBasicVideo* pBasicVideo;
3407 TRACE("(%p/%p)->(%p, %p)\n", This, iface, pWidth, pHeight);
3409 EnterCriticalSection(&This->cs);
3411 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3414 hr = IBasicVideo_GetVideoSize(pBasicVideo, pWidth, pHeight);
3416 LeaveCriticalSection(&This->cs);
3421 static HRESULT WINAPI BasicVideo_GetVideoPaletteEntries(IBasicVideo2 *iface,
3426 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3427 IBasicVideo* pBasicVideo;
3430 TRACE("(%p/%p)->(%ld, %ld, %p, %p)\n", This, iface, StartIndex, Entries, pRetrieved, pPalette);
3432 EnterCriticalSection(&This->cs);
3434 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3437 hr = IBasicVideo_GetVideoPaletteEntries(pBasicVideo, StartIndex, Entries, pRetrieved, pPalette);
3439 LeaveCriticalSection(&This->cs);
3444 static HRESULT WINAPI BasicVideo_GetCurrentImage(IBasicVideo2 *iface,
3447 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3448 IBasicVideo* pBasicVideo;
3451 TRACE("(%p/%p)->(%p, %p)\n", This, iface, pBufferSize, pDIBImage);
3453 EnterCriticalSection(&This->cs);
3455 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3458 hr = IBasicVideo_GetCurrentImage(pBasicVideo, pBufferSize, pDIBImage);
3460 LeaveCriticalSection(&This->cs);
3465 static HRESULT WINAPI BasicVideo_IsUsingDefaultSource(IBasicVideo2 *iface) {
3466 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3467 IBasicVideo* pBasicVideo;
3470 TRACE("(%p/%p)->()\n", This, iface);
3472 EnterCriticalSection(&This->cs);
3474 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3477 hr = IBasicVideo_IsUsingDefaultSource(pBasicVideo);
3479 LeaveCriticalSection(&This->cs);
3484 static HRESULT WINAPI BasicVideo_IsUsingDefaultDestination(IBasicVideo2 *iface) {
3485 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3486 IBasicVideo* pBasicVideo;
3489 TRACE("(%p/%p)->()\n", This, iface);
3491 EnterCriticalSection(&This->cs);
3493 hr = GetTargetInterface(This, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
3496 hr = IBasicVideo_IsUsingDefaultDestination(pBasicVideo);
3498 LeaveCriticalSection(&This->cs);
3503 static HRESULT WINAPI BasicVideo2_GetPreferredAspectRatio(IBasicVideo2 *iface, LONG *plAspectX, LONG *plAspectY) {
3504 ICOM_THIS_MULTI(IFilterGraphImpl, IBasicVideo_vtbl, iface);
3505 IBasicVideo2 *pBasicVideo2;
3508 TRACE("(%p/%p)->()\n", This, iface);
3510 EnterCriticalSection(&This->cs);
3512 hr = GetTargetInterface(This, &IID_IBasicVideo2, (LPVOID*)&pBasicVideo2);
3515 hr = BasicVideo2_GetPreferredAspectRatio(iface, plAspectX, plAspectY);
3517 LeaveCriticalSection(&This->cs);
3522 static const IBasicVideo2Vtbl IBasicVideo_VTable =
3524 BasicVideo_QueryInterface,
3527 BasicVideo_GetTypeInfoCount,
3528 BasicVideo_GetTypeInfo,
3529 BasicVideo_GetIDsOfNames,
3531 BasicVideo_get_AvgTimePerFrame,
3532 BasicVideo_get_BitRate,
3533 BasicVideo_get_BitErrorRate,
3534 BasicVideo_get_VideoWidth,
3535 BasicVideo_get_VideoHeight,
3536 BasicVideo_put_SourceLeft,
3537 BasicVideo_get_SourceLeft,
3538 BasicVideo_put_SourceWidth,
3539 BasicVideo_get_SourceWidth,
3540 BasicVideo_put_SourceTop,
3541 BasicVideo_get_SourceTop,
3542 BasicVideo_put_SourceHeight,
3543 BasicVideo_get_SourceHeight,
3544 BasicVideo_put_DestinationLeft,
3545 BasicVideo_get_DestinationLeft,
3546 BasicVideo_put_DestinationWidth,
3547 BasicVideo_get_DestinationWidth,
3548 BasicVideo_put_DestinationTop,
3549 BasicVideo_get_DestinationTop,
3550 BasicVideo_put_DestinationHeight,
3551 BasicVideo_get_DestinationHeight,
3552 BasicVideo_SetSourcePosition,
3553 BasicVideo_GetSourcePosition,
3554 BasicVideo_SetDefaultSourcePosition,
3555 BasicVideo_SetDestinationPosition,
3556 BasicVideo_GetDestinationPosition,
3557 BasicVideo_SetDefaultDestinationPosition,
3558 BasicVideo_GetVideoSize,
3559 BasicVideo_GetVideoPaletteEntries,
3560 BasicVideo_GetCurrentImage,
3561 BasicVideo_IsUsingDefaultSource,
3562 BasicVideo_IsUsingDefaultDestination,
3563 BasicVideo2_GetPreferredAspectRatio
3567 /*** IUnknown methods ***/
3568 static HRESULT WINAPI VideoWindow_QueryInterface(IVideoWindow *iface,
3571 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3573 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
3575 return Filtergraph_QueryInterface(This, riid, ppvObj);
3578 static ULONG WINAPI VideoWindow_AddRef(IVideoWindow *iface) {
3579 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3581 TRACE("(%p/%p)->()\n", This, iface);
3583 return Filtergraph_AddRef(This);
3586 static ULONG WINAPI VideoWindow_Release(IVideoWindow *iface) {
3587 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3589 TRACE("(%p/%p)->()\n", This, iface);
3591 return Filtergraph_Release(This);
3594 /*** IDispatch methods ***/
3595 static HRESULT WINAPI VideoWindow_GetTypeInfoCount(IVideoWindow *iface,
3597 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3598 IVideoWindow* pVideoWindow;
3601 TRACE("(%p/%p)->(%p)\n", This, iface, pctinfo);
3603 EnterCriticalSection(&This->cs);
3605 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3608 hr = IVideoWindow_GetTypeInfoCount(pVideoWindow, pctinfo);
3610 LeaveCriticalSection(&This->cs);
3615 static HRESULT WINAPI VideoWindow_GetTypeInfo(IVideoWindow *iface,
3618 ITypeInfo**ppTInfo) {
3619 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3620 IVideoWindow* pVideoWindow;
3623 TRACE("(%p/%p)->(%d, %d, %p)\n", This, iface, iTInfo, lcid, ppTInfo);
3625 EnterCriticalSection(&This->cs);
3627 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3630 hr = IVideoWindow_GetTypeInfo(pVideoWindow, iTInfo, lcid, ppTInfo);
3632 LeaveCriticalSection(&This->cs);
3637 static HRESULT WINAPI VideoWindow_GetIDsOfNames(IVideoWindow *iface,
3643 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3644 IVideoWindow* pVideoWindow;
3647 TRACE("(%p/%p)->(%s (%p), %p, %d, %d, %p)\n", This, iface, debugstr_guid(riid), riid, rgszNames, cNames, lcid, rgDispId);
3649 EnterCriticalSection(&This->cs);
3651 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3654 hr = IVideoWindow_GetIDsOfNames(pVideoWindow, riid, rgszNames, cNames, lcid, rgDispId);
3656 LeaveCriticalSection(&This->cs);
3661 static HRESULT WINAPI VideoWindow_Invoke(IVideoWindow *iface,
3662 DISPID dispIdMember,
3666 DISPPARAMS*pDispParams,
3668 EXCEPINFO*pExepInfo,
3670 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3671 IVideoWindow* pVideoWindow;
3674 TRACE("(%p/%p)->(%d, %s (%p), %d, %04x, %p, %p, %p, %p)\n", This, iface, dispIdMember, debugstr_guid(riid), riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
3676 EnterCriticalSection(&This->cs);
3678 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3681 hr = IVideoWindow_Invoke(pVideoWindow, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
3683 LeaveCriticalSection(&This->cs);
3689 /*** IVideoWindow methods ***/
3690 static HRESULT WINAPI VideoWindow_put_Caption(IVideoWindow *iface,
3692 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3693 IVideoWindow* pVideoWindow;
3696 TRACE("(%p/%p)->(%s (%p))\n", This, iface, debugstr_w(strCaption), strCaption);
3698 EnterCriticalSection(&This->cs);
3700 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3703 hr = IVideoWindow_put_Caption(pVideoWindow, strCaption);
3705 LeaveCriticalSection(&This->cs);
3710 static HRESULT WINAPI VideoWindow_get_Caption(IVideoWindow *iface,
3712 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3713 IVideoWindow* pVideoWindow;
3716 TRACE("(%p/%p)->(%p)\n", This, iface, strCaption);
3718 EnterCriticalSection(&This->cs);
3720 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3723 hr = IVideoWindow_get_Caption(pVideoWindow, strCaption);
3725 LeaveCriticalSection(&This->cs);
3730 static HRESULT WINAPI VideoWindow_put_WindowStyle(IVideoWindow *iface,
3732 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3733 IVideoWindow* pVideoWindow;
3736 TRACE("(%p/%p)->(%ld)\n", This, iface, WindowStyle);
3738 EnterCriticalSection(&This->cs);
3740 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3743 hr = IVideoWindow_put_WindowStyle(pVideoWindow, WindowStyle);
3745 LeaveCriticalSection(&This->cs);
3750 static HRESULT WINAPI VideoWindow_get_WindowStyle(IVideoWindow *iface,
3751 long *WindowStyle) {
3752 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3753 IVideoWindow* pVideoWindow;
3756 TRACE("(%p/%p)->(%p)\n", This, iface, WindowStyle);
3758 EnterCriticalSection(&This->cs);
3760 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3763 hr = IVideoWindow_get_WindowStyle(pVideoWindow, WindowStyle);
3765 LeaveCriticalSection(&This->cs);
3770 static HRESULT WINAPI VideoWindow_put_WindowStyleEx(IVideoWindow *iface,
3771 long WindowStyleEx) {
3772 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3773 IVideoWindow* pVideoWindow;
3776 TRACE("(%p/%p)->(%ld)\n", This, iface, WindowStyleEx);
3778 EnterCriticalSection(&This->cs);
3780 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3783 hr = IVideoWindow_put_WindowStyleEx(pVideoWindow, WindowStyleEx);
3785 LeaveCriticalSection(&This->cs);
3790 static HRESULT WINAPI VideoWindow_get_WindowStyleEx(IVideoWindow *iface,
3791 long *WindowStyleEx) {
3792 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3793 IVideoWindow* pVideoWindow;
3796 TRACE("(%p/%p)->(%p)\n", This, iface, WindowStyleEx);
3798 EnterCriticalSection(&This->cs);
3800 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3803 hr = IVideoWindow_get_WindowStyleEx(pVideoWindow, WindowStyleEx);
3805 LeaveCriticalSection(&This->cs);
3810 static HRESULT WINAPI VideoWindow_put_AutoShow(IVideoWindow *iface,
3812 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3813 IVideoWindow* pVideoWindow;
3816 TRACE("(%p/%p)->(%ld)\n", This, iface, AutoShow);
3818 EnterCriticalSection(&This->cs);
3820 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3823 hr = IVideoWindow_put_AutoShow(pVideoWindow, AutoShow);
3825 LeaveCriticalSection(&This->cs);
3830 static HRESULT WINAPI VideoWindow_get_AutoShow(IVideoWindow *iface,
3832 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3833 IVideoWindow* pVideoWindow;
3836 TRACE("(%p/%p)->(%p)\n", This, iface, AutoShow);
3838 EnterCriticalSection(&This->cs);
3840 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3843 hr = IVideoWindow_get_AutoShow(pVideoWindow, AutoShow);
3845 LeaveCriticalSection(&This->cs);
3850 static HRESULT WINAPI VideoWindow_put_WindowState(IVideoWindow *iface,
3852 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3853 IVideoWindow* pVideoWindow;
3856 TRACE("(%p/%p)->(%ld)\n", This, iface, WindowState);
3858 EnterCriticalSection(&This->cs);
3860 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3863 hr = IVideoWindow_put_WindowState(pVideoWindow, WindowState);
3865 LeaveCriticalSection(&This->cs);
3870 static HRESULT WINAPI VideoWindow_get_WindowState(IVideoWindow *iface,
3871 long *WindowState) {
3872 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3873 IVideoWindow* pVideoWindow;
3876 TRACE("(%p/%p)->(%p)\n", This, iface, WindowState);
3878 EnterCriticalSection(&This->cs);
3880 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3883 hr = IVideoWindow_get_WindowState(pVideoWindow, WindowState);
3885 LeaveCriticalSection(&This->cs);
3890 static HRESULT WINAPI VideoWindow_put_BackgroundPalette(IVideoWindow *iface,
3891 long BackgroundPalette) {
3892 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3893 IVideoWindow* pVideoWindow;
3896 TRACE("(%p/%p)->(%ld)\n", This, iface, BackgroundPalette);
3898 EnterCriticalSection(&This->cs);
3900 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3903 hr = IVideoWindow_put_BackgroundPalette(pVideoWindow, BackgroundPalette);
3905 LeaveCriticalSection(&This->cs);
3910 static HRESULT WINAPI VideoWindow_get_BackgroundPalette(IVideoWindow *iface,
3911 long *pBackgroundPalette) {
3912 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3913 IVideoWindow* pVideoWindow;
3916 TRACE("(%p/%p)->(%p)\n", This, iface, pBackgroundPalette);
3918 EnterCriticalSection(&This->cs);
3920 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3923 hr = IVideoWindow_get_BackgroundPalette(pVideoWindow, pBackgroundPalette);
3925 LeaveCriticalSection(&This->cs);
3930 static HRESULT WINAPI VideoWindow_put_Visible(IVideoWindow *iface,
3932 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3933 IVideoWindow* pVideoWindow;
3936 TRACE("(%p/%p)->(%ld)\n", This, iface, Visible);
3938 EnterCriticalSection(&This->cs);
3940 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3943 hr = IVideoWindow_put_Visible(pVideoWindow, Visible);
3945 LeaveCriticalSection(&This->cs);
3950 static HRESULT WINAPI VideoWindow_get_Visible(IVideoWindow *iface,
3952 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3953 IVideoWindow* pVideoWindow;
3956 TRACE("(%p/%p)->(%p)\n", This, iface, pVisible);
3958 EnterCriticalSection(&This->cs);
3960 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3963 hr = IVideoWindow_get_Visible(pVideoWindow, pVisible);
3965 LeaveCriticalSection(&This->cs);
3970 static HRESULT WINAPI VideoWindow_put_Left(IVideoWindow *iface,
3972 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3973 IVideoWindow* pVideoWindow;
3976 TRACE("(%p/%p)->(%ld)\n", This, iface, Left);
3978 EnterCriticalSection(&This->cs);
3980 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
3983 hr = IVideoWindow_put_Left(pVideoWindow, Left);
3985 LeaveCriticalSection(&This->cs);
3990 static HRESULT WINAPI VideoWindow_get_Left(IVideoWindow *iface,
3992 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
3993 IVideoWindow* pVideoWindow;
3996 TRACE("(%p/%p)->(%p)\n", This, iface, pLeft);
3998 EnterCriticalSection(&This->cs);
4000 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4003 hr = IVideoWindow_get_Left(pVideoWindow, pLeft);
4005 LeaveCriticalSection(&This->cs);
4010 static HRESULT WINAPI VideoWindow_put_Width(IVideoWindow *iface,
4012 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4013 IVideoWindow* pVideoWindow;
4016 TRACE("(%p/%p)->(%ld)\n", This, iface, Width);
4018 EnterCriticalSection(&This->cs);
4020 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4023 hr = IVideoWindow_put_Width(pVideoWindow, Width);
4025 LeaveCriticalSection(&This->cs);
4030 static HRESULT WINAPI VideoWindow_get_Width(IVideoWindow *iface,
4032 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4033 IVideoWindow* pVideoWindow;
4036 TRACE("(%p/%p)->(%p)\n", This, iface, pWidth);
4038 EnterCriticalSection(&This->cs);
4040 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4043 hr = IVideoWindow_get_Width(pVideoWindow, pWidth);
4045 LeaveCriticalSection(&This->cs);
4050 static HRESULT WINAPI VideoWindow_put_Top(IVideoWindow *iface,
4052 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4053 IVideoWindow* pVideoWindow;
4056 TRACE("(%p/%p)->(%ld)\n", This, iface, Top);
4058 EnterCriticalSection(&This->cs);
4060 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4063 hr = IVideoWindow_put_Top(pVideoWindow, Top);
4065 LeaveCriticalSection(&This->cs);
4070 static HRESULT WINAPI VideoWindow_get_Top(IVideoWindow *iface,
4072 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4073 IVideoWindow* pVideoWindow;
4076 TRACE("(%p/%p)->(%p)\n", This, iface, pTop);
4078 EnterCriticalSection(&This->cs);
4080 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4083 hr = IVideoWindow_get_Top(pVideoWindow, pTop);
4085 LeaveCriticalSection(&This->cs);
4090 static HRESULT WINAPI VideoWindow_put_Height(IVideoWindow *iface,
4092 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4093 IVideoWindow* pVideoWindow;
4096 TRACE("(%p/%p)->(%ld)\n", This, iface, Height);
4098 EnterCriticalSection(&This->cs);
4100 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4103 hr = IVideoWindow_put_Height(pVideoWindow, Height);
4105 LeaveCriticalSection(&This->cs);
4110 static HRESULT WINAPI VideoWindow_get_Height(IVideoWindow *iface,
4112 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4113 IVideoWindow* pVideoWindow;
4116 TRACE("(%p/%p)->(%p)\n", This, iface, pHeight);
4118 EnterCriticalSection(&This->cs);
4120 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4123 hr = IVideoWindow_get_Height(pVideoWindow, pHeight);
4125 LeaveCriticalSection(&This->cs);
4130 static HRESULT WINAPI VideoWindow_put_Owner(IVideoWindow *iface,
4132 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4133 IVideoWindow* pVideoWindow;
4136 TRACE("(%p/%p)->(%08x)\n", This, iface, (DWORD) Owner);
4138 EnterCriticalSection(&This->cs);
4140 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4143 hr = IVideoWindow_put_Owner(pVideoWindow, Owner);
4145 LeaveCriticalSection(&This->cs);
4150 static HRESULT WINAPI VideoWindow_get_Owner(IVideoWindow *iface,
4152 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4153 IVideoWindow* pVideoWindow;
4156 TRACE("(%p/%p)->(%p)\n", This, iface, Owner);
4158 EnterCriticalSection(&This->cs);
4160 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4163 hr = IVideoWindow_get_Owner(pVideoWindow, Owner);
4165 LeaveCriticalSection(&This->cs);
4170 static HRESULT WINAPI VideoWindow_put_MessageDrain(IVideoWindow *iface,
4172 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4173 IVideoWindow* pVideoWindow;
4176 TRACE("(%p/%p)->(%08x)\n", This, iface, (DWORD) Drain);
4178 EnterCriticalSection(&This->cs);
4180 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4183 hr = IVideoWindow_put_MessageDrain(pVideoWindow, Drain);
4185 LeaveCriticalSection(&This->cs);
4190 static HRESULT WINAPI VideoWindow_get_MessageDrain(IVideoWindow *iface,
4192 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4193 IVideoWindow* pVideoWindow;
4196 TRACE("(%p/%p)->(%p)\n", This, iface, Drain);
4198 EnterCriticalSection(&This->cs);
4200 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4203 hr = IVideoWindow_get_MessageDrain(pVideoWindow, Drain);
4205 LeaveCriticalSection(&This->cs);
4210 static HRESULT WINAPI VideoWindow_get_BorderColor(IVideoWindow *iface,
4212 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4213 IVideoWindow* pVideoWindow;
4216 TRACE("(%p/%p)->(%p)\n", This, iface, Color);
4218 EnterCriticalSection(&This->cs);
4220 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4223 hr = IVideoWindow_get_BorderColor(pVideoWindow, Color);
4225 LeaveCriticalSection(&This->cs);
4230 static HRESULT WINAPI VideoWindow_put_BorderColor(IVideoWindow *iface,
4232 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4233 IVideoWindow* pVideoWindow;
4236 TRACE("(%p/%p)->(%ld)\n", This, iface, Color);
4238 EnterCriticalSection(&This->cs);
4240 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4243 hr = IVideoWindow_put_BorderColor(pVideoWindow, Color);
4245 LeaveCriticalSection(&This->cs);
4250 static HRESULT WINAPI VideoWindow_get_FullScreenMode(IVideoWindow *iface,
4251 long *FullScreenMode) {
4252 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4253 IVideoWindow* pVideoWindow;
4256 TRACE("(%p/%p)->(%p)\n", This, iface, FullScreenMode);
4258 EnterCriticalSection(&This->cs);
4260 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4263 hr = IVideoWindow_get_FullScreenMode(pVideoWindow, FullScreenMode);
4265 LeaveCriticalSection(&This->cs);
4270 static HRESULT WINAPI VideoWindow_put_FullScreenMode(IVideoWindow *iface,
4271 long FullScreenMode) {
4272 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4273 IVideoWindow* pVideoWindow;
4276 TRACE("(%p/%p)->(%ld)\n", This, iface, FullScreenMode);
4278 EnterCriticalSection(&This->cs);
4280 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4283 hr = IVideoWindow_put_FullScreenMode(pVideoWindow, FullScreenMode);
4285 LeaveCriticalSection(&This->cs);
4290 static HRESULT WINAPI VideoWindow_SetWindowForeground(IVideoWindow *iface,
4292 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4293 IVideoWindow* pVideoWindow;
4296 TRACE("(%p/%p)->(%ld)\n", This, iface, Focus);
4298 EnterCriticalSection(&This->cs);
4300 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4303 hr = IVideoWindow_SetWindowForeground(pVideoWindow, Focus);
4305 LeaveCriticalSection(&This->cs);
4310 static HRESULT WINAPI VideoWindow_NotifyOwnerMessage(IVideoWindow *iface,
4315 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4316 IVideoWindow* pVideoWindow;
4319 TRACE("(%p/%p)->(%08x, %ld, %08lx, %08lx)\n", This, iface, (DWORD) hwnd, uMsg, wParam, lParam);
4321 EnterCriticalSection(&This->cs);
4323 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4326 hr = IVideoWindow_NotifyOwnerMessage(pVideoWindow, hwnd, uMsg, wParam, lParam);
4328 LeaveCriticalSection(&This->cs);
4333 static HRESULT WINAPI VideoWindow_SetWindowPosition(IVideoWindow *iface,
4338 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4339 IVideoWindow* pVideoWindow;
4342 TRACE("(%p/%p)->(%ld, %ld, %ld, %ld)\n", This, iface, Left, Top, Width, Height);
4344 EnterCriticalSection(&This->cs);
4346 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4349 hr = IVideoWindow_SetWindowPosition(pVideoWindow, Left, Top, Width, Height);
4351 LeaveCriticalSection(&This->cs);
4356 static HRESULT WINAPI VideoWindow_GetWindowPosition(IVideoWindow *iface,
4361 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4362 IVideoWindow* pVideoWindow;
4365 TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight);
4367 EnterCriticalSection(&This->cs);
4369 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4372 hr = IVideoWindow_GetWindowPosition(pVideoWindow, pLeft, pTop, pWidth, pHeight);
4374 LeaveCriticalSection(&This->cs);
4379 static HRESULT WINAPI VideoWindow_GetMinIdealImageSize(IVideoWindow *iface,
4382 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4383 IVideoWindow* pVideoWindow;
4386 TRACE("(%p/%p)->(%p, %p)\n", This, iface, pWidth, pHeight);
4388 EnterCriticalSection(&This->cs);
4390 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4393 hr = IVideoWindow_GetMinIdealImageSize(pVideoWindow, pWidth, pHeight);
4395 LeaveCriticalSection(&This->cs);
4400 static HRESULT WINAPI VideoWindow_GetMaxIdealImageSize(IVideoWindow *iface,
4403 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4404 IVideoWindow* pVideoWindow;
4407 TRACE("(%p/%p)->(%p, %p)\n", This, iface, pWidth, pHeight);
4409 EnterCriticalSection(&This->cs);
4411 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4414 hr = IVideoWindow_GetMaxIdealImageSize(pVideoWindow, pWidth, pHeight);
4416 LeaveCriticalSection(&This->cs);
4421 static HRESULT WINAPI VideoWindow_GetRestorePosition(IVideoWindow *iface,
4426 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4427 IVideoWindow* pVideoWindow;
4430 TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight);
4432 EnterCriticalSection(&This->cs);
4434 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4437 hr = IVideoWindow_GetRestorePosition(pVideoWindow, pLeft, pTop, pWidth, pHeight);
4439 LeaveCriticalSection(&This->cs);
4444 static HRESULT WINAPI VideoWindow_HideCursor(IVideoWindow *iface,
4446 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4447 IVideoWindow* pVideoWindow;
4450 TRACE("(%p/%p)->(%ld)\n", This, iface, HideCursor);
4452 EnterCriticalSection(&This->cs);
4454 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4457 hr = IVideoWindow_HideCursor(pVideoWindow, HideCursor);
4459 LeaveCriticalSection(&This->cs);
4464 static HRESULT WINAPI VideoWindow_IsCursorHidden(IVideoWindow *iface,
4465 long *CursorHidden) {
4466 ICOM_THIS_MULTI(IFilterGraphImpl, IVideoWindow_vtbl, iface);
4467 IVideoWindow* pVideoWindow;
4470 TRACE("(%p/%p)->(%p)\n", This, iface, CursorHidden);
4472 EnterCriticalSection(&This->cs);
4474 hr = GetTargetInterface(This, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
4477 hr = IVideoWindow_IsCursorHidden(pVideoWindow, CursorHidden);
4479 LeaveCriticalSection(&This->cs);
4485 static const IVideoWindowVtbl IVideoWindow_VTable =
4487 VideoWindow_QueryInterface,
4489 VideoWindow_Release,
4490 VideoWindow_GetTypeInfoCount,
4491 VideoWindow_GetTypeInfo,
4492 VideoWindow_GetIDsOfNames,
4494 VideoWindow_put_Caption,
4495 VideoWindow_get_Caption,
4496 VideoWindow_put_WindowStyle,
4497 VideoWindow_get_WindowStyle,
4498 VideoWindow_put_WindowStyleEx,
4499 VideoWindow_get_WindowStyleEx,
4500 VideoWindow_put_AutoShow,
4501 VideoWindow_get_AutoShow,
4502 VideoWindow_put_WindowState,
4503 VideoWindow_get_WindowState,
4504 VideoWindow_put_BackgroundPalette,
4505 VideoWindow_get_BackgroundPalette,
4506 VideoWindow_put_Visible,
4507 VideoWindow_get_Visible,
4508 VideoWindow_put_Left,
4509 VideoWindow_get_Left,
4510 VideoWindow_put_Width,
4511 VideoWindow_get_Width,
4512 VideoWindow_put_Top,
4513 VideoWindow_get_Top,
4514 VideoWindow_put_Height,
4515 VideoWindow_get_Height,
4516 VideoWindow_put_Owner,
4517 VideoWindow_get_Owner,
4518 VideoWindow_put_MessageDrain,
4519 VideoWindow_get_MessageDrain,
4520 VideoWindow_get_BorderColor,
4521 VideoWindow_put_BorderColor,
4522 VideoWindow_get_FullScreenMode,
4523 VideoWindow_put_FullScreenMode,
4524 VideoWindow_SetWindowForeground,
4525 VideoWindow_NotifyOwnerMessage,
4526 VideoWindow_SetWindowPosition,
4527 VideoWindow_GetWindowPosition,
4528 VideoWindow_GetMinIdealImageSize,
4529 VideoWindow_GetMaxIdealImageSize,
4530 VideoWindow_GetRestorePosition,
4531 VideoWindow_HideCursor,
4532 VideoWindow_IsCursorHidden
4536 /*** IUnknown methods ***/
4537 static HRESULT WINAPI MediaEvent_QueryInterface(IMediaEventEx *iface,
4540 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4542 TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
4544 return Filtergraph_QueryInterface(This, riid, ppvObj);
4547 static ULONG WINAPI MediaEvent_AddRef(IMediaEventEx *iface) {
4548 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4550 TRACE("(%p/%p)->()\n", This, iface);
4552 return Filtergraph_AddRef(This);
4555 static ULONG WINAPI MediaEvent_Release(IMediaEventEx *iface) {
4556 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4558 TRACE("(%p/%p)->()\n", This, iface);
4560 return Filtergraph_Release(This);
4563 /*** IDispatch methods ***/
4564 static HRESULT WINAPI MediaEvent_GetTypeInfoCount(IMediaEventEx *iface,
4566 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4568 TRACE("(%p/%p)->(%p): stub !!!\n", This, iface, pctinfo);
4573 static HRESULT WINAPI MediaEvent_GetTypeInfo(IMediaEventEx *iface,
4576 ITypeInfo**ppTInfo) {
4577 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4579 TRACE("(%p/%p)->(%d, %d, %p): stub !!!\n", This, iface, iTInfo, lcid, ppTInfo);
4584 static HRESULT WINAPI MediaEvent_GetIDsOfNames(IMediaEventEx *iface,
4590 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4592 TRACE("(%p/%p)->(%s (%p), %p, %d, %d, %p): stub !!!\n", This, iface, debugstr_guid(riid), riid, rgszNames, cNames, lcid, rgDispId);
4597 static HRESULT WINAPI MediaEvent_Invoke(IMediaEventEx *iface,
4598 DISPID dispIdMember,
4602 DISPPARAMS*pDispParams,
4604 EXCEPINFO*pExepInfo,
4606 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4608 TRACE("(%p/%p)->(%d, %s (%p), %d, %04x, %p, %p, %p, %p): stub !!!\n", This, iface, dispIdMember, debugstr_guid(riid), riid, lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
4613 /*** IMediaEvent methods ***/
4614 static HRESULT WINAPI MediaEvent_GetEventHandle(IMediaEventEx *iface,
4616 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4618 TRACE("(%p/%p)->(%p)\n", This, iface, hEvent);
4620 *hEvent = (OAEVENT)This->evqueue.msg_event;
4625 static HRESULT WINAPI MediaEvent_GetEvent(IMediaEventEx *iface,
4630 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4633 TRACE("(%p/%p)->(%p, %p, %p, %ld)\n", This, iface, lEventCode, lParam1, lParam2, msTimeout);
4635 if (EventsQueue_GetEvent(&This->evqueue, &evt, msTimeout))
4637 *lEventCode = evt.lEventCode;
4638 *lParam1 = evt.lParam1;
4639 *lParam2 = evt.lParam2;
4647 static HRESULT WINAPI MediaEvent_WaitForCompletion(IMediaEventEx *iface,
4650 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4652 TRACE("(%p/%p)->(%ld, %p)\n", This, iface, msTimeout, pEvCode);
4654 if (WaitForSingleObject(This->hEventCompletion, msTimeout) == WAIT_OBJECT_0)
4656 *pEvCode = This->CompletionStatus;
4664 static HRESULT WINAPI MediaEvent_CancelDefaultHandling(IMediaEventEx *iface,
4666 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4668 TRACE("(%p/%p)->(%ld)\n", This, iface, lEvCode);
4670 if (lEvCode == EC_COMPLETE)
4671 This->HandleEcComplete = FALSE;
4672 else if (lEvCode == EC_REPAINT)
4673 This->HandleEcRepaint = FALSE;
4674 else if (lEvCode == EC_CLOCK_CHANGED)
4675 This->HandleEcClockChanged = FALSE;
4682 static HRESULT WINAPI MediaEvent_RestoreDefaultHandling(IMediaEventEx *iface,
4684 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4686 TRACE("(%p/%p)->(%ld)\n", This, iface, lEvCode);
4688 if (lEvCode == EC_COMPLETE)
4689 This->HandleEcComplete = TRUE;
4690 else if (lEvCode == EC_REPAINT)
4691 This->HandleEcRepaint = TRUE;
4692 else if (lEvCode == EC_CLOCK_CHANGED)
4693 This->HandleEcClockChanged = TRUE;
4700 static HRESULT WINAPI MediaEvent_FreeEventParams(IMediaEventEx *iface,
4704 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4706 TRACE("(%p/%p)->(%ld, %08lx, %08lx): stub !!!\n", This, iface, lEvCode, lParam1, lParam2);
4711 /*** IMediaEventEx methods ***/
4712 static HRESULT WINAPI MediaEvent_SetNotifyWindow(IMediaEventEx *iface,
4715 LONG_PTR lInstanceData) {
4716 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4718 TRACE("(%p/%p)->(%08x, %ld, %08lx)\n", This, iface, (DWORD) hwnd, lMsg, lInstanceData);
4720 This->notif.hWnd = (HWND)hwnd;
4721 This->notif.msg = lMsg;
4722 This->notif.instance = (long) lInstanceData;
4727 static HRESULT WINAPI MediaEvent_SetNotifyFlags(IMediaEventEx *iface,
4728 long lNoNotifyFlags) {
4729 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4731 TRACE("(%p/%p)->(%ld)\n", This, iface, lNoNotifyFlags);
4733 if ((lNoNotifyFlags != 0) && (lNoNotifyFlags != 1))
4734 return E_INVALIDARG;
4736 This->notif.disabled = lNoNotifyFlags;
4741 static HRESULT WINAPI MediaEvent_GetNotifyFlags(IMediaEventEx *iface,
4742 long *lplNoNotifyFlags) {
4743 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventEx_vtbl, iface);
4745 TRACE("(%p/%p)->(%p)\n", This, iface, lplNoNotifyFlags);
4747 if (!lplNoNotifyFlags)
4750 *lplNoNotifyFlags = This->notif.disabled;
4756 static const IMediaEventExVtbl IMediaEventEx_VTable =
4758 MediaEvent_QueryInterface,
4761 MediaEvent_GetTypeInfoCount,
4762 MediaEvent_GetTypeInfo,
4763 MediaEvent_GetIDsOfNames,
4765 MediaEvent_GetEventHandle,
4766 MediaEvent_GetEvent,
4767 MediaEvent_WaitForCompletion,
4768 MediaEvent_CancelDefaultHandling,
4769 MediaEvent_RestoreDefaultHandling,
4770 MediaEvent_FreeEventParams,
4771 MediaEvent_SetNotifyWindow,
4772 MediaEvent_SetNotifyFlags,
4773 MediaEvent_GetNotifyFlags
4777 static HRESULT WINAPI MediaFilter_QueryInterface(IMediaFilter *iface, REFIID riid, LPVOID *ppv)
4779 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
4781 return Filtergraph_QueryInterface(This, riid, ppv);
4784 static ULONG WINAPI MediaFilter_AddRef(IMediaFilter *iface)
4786 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
4788 return Filtergraph_AddRef(This);
4791 static ULONG WINAPI MediaFilter_Release(IMediaFilter *iface)
4793 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
4795 return Filtergraph_Release(This);
4798 static HRESULT WINAPI MediaFilter_GetClassID(IMediaFilter *iface, CLSID * pClassID)
4800 FIXME("(%p): stub\n", pClassID);
4805 static HRESULT WINAPI MediaFilter_Stop(IMediaFilter *iface)
4807 FIXME("(): stub\n");
4812 static HRESULT WINAPI MediaFilter_Pause(IMediaFilter *iface)
4814 FIXME("(): stub\n");
4819 static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME tStart)
4821 FIXME("(0x%s): stub\n", wine_dbgstr_longlong(tStart));
4826 static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD dwMsTimeout, FILTER_STATE * pState)
4828 FIXME("(%d, %p): stub\n", dwMsTimeout, pState);
4833 static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceClock *pClock)
4835 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
4839 TRACE("(%p/%p)->(%p)\n", iface, This, pClock);
4841 EnterCriticalSection(&This->cs);
4843 for (i = 0;i < This->nFilters;i++)
4845 hr = IBaseFilter_SetSyncSource(This->ppFiltersInGraph[i], pClock);
4853 IBaseFilter_SetSyncSource(This->ppFiltersInGraph[i], This->refClock);
4858 IReferenceClock_Release(This->refClock);
4859 This->refClock = pClock;
4861 IReferenceClock_AddRef(This->refClock);
4863 if (This->HandleEcClockChanged)
4865 IMediaEventSink *pEventSink;
4868 eshr = IMediaFilter_QueryInterface(iface, &IID_IMediaEventSink, (LPVOID)&pEventSink);
4869 if (SUCCEEDED(eshr))
4871 IMediaEventSink_Notify(pEventSink, EC_CLOCK_CHANGED, 0, 0);
4872 IMediaEventSink_Release(pEventSink);
4877 LeaveCriticalSection(&This->cs);
4882 static HRESULT WINAPI MediaFilter_GetSyncSource(IMediaFilter *iface, IReferenceClock **ppClock)
4884 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
4886 TRACE("(%p/%p)->(%p)\n", iface, This, ppClock);
4891 EnterCriticalSection(&This->cs);
4893 *ppClock = This->refClock;
4895 IReferenceClock_AddRef(*ppClock);
4897 LeaveCriticalSection(&This->cs);
4902 static const IMediaFilterVtbl IMediaFilter_VTable =
4904 MediaFilter_QueryInterface,
4906 MediaFilter_Release,
4907 MediaFilter_GetClassID,
4911 MediaFilter_GetState,
4912 MediaFilter_SetSyncSource,
4913 MediaFilter_GetSyncSource
4916 static HRESULT WINAPI MediaEventSink_QueryInterface(IMediaEventSink *iface, REFIID riid, LPVOID *ppv)
4918 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventSink_vtbl, iface);
4920 return Filtergraph_QueryInterface(This, riid, ppv);
4923 static ULONG WINAPI MediaEventSink_AddRef(IMediaEventSink *iface)
4925 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventSink_vtbl, iface);
4927 return Filtergraph_AddRef(This);
4930 static ULONG WINAPI MediaEventSink_Release(IMediaEventSink *iface)
4932 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventSink_vtbl, iface);
4934 return Filtergraph_Release(This);
4937 static HRESULT WINAPI MediaEventSink_Notify(IMediaEventSink *iface, long EventCode, LONG_PTR EventParam1, LONG_PTR EventParam2)
4939 ICOM_THIS_MULTI(IFilterGraphImpl, IMediaEventSink_vtbl, iface);
4942 TRACE("(%p/%p)->(%ld, %ld, %ld)\n", This, iface, EventCode, EventParam1, EventParam2);
4944 /* We need thread safety here, let's use the events queue's one */
4945 EnterCriticalSection(&This->evqueue.msg_crst);
4947 if ((EventCode == EC_COMPLETE) && This->HandleEcComplete)
4949 TRACE("Process EC_COMPLETE notification\n");
4950 if (++This->EcCompleteCount == This->nRenderers)
4952 evt.lEventCode = EC_COMPLETE;
4955 TRACE("Send EC_COMPLETE to app\n");
4956 EventsQueue_PutEvent(&This->evqueue, &evt);
4957 if (!This->notif.disabled && This->notif.hWnd)
4959 TRACE("Send Window message\n");
4960 PostMessageW(This->notif.hWnd, This->notif.msg, 0, This->notif.instance);
4962 This->CompletionStatus = EC_COMPLETE;
4963 SetEvent(This->hEventCompletion);
4966 else if ((EventCode == EC_REPAINT) && This->HandleEcRepaint)
4968 /* FIXME: Not handled yet */
4972 evt.lEventCode = EventCode;
4973 evt.lParam1 = EventParam1;
4974 evt.lParam2 = EventParam2;
4975 EventsQueue_PutEvent(&This->evqueue, &evt);
4976 if (!This->notif.disabled && This->notif.hWnd)
4977 PostMessageW(This->notif.hWnd, This->notif.msg, 0, This->notif.instance);
4980 LeaveCriticalSection(&This->evqueue.msg_crst);
4984 static const IMediaEventSinkVtbl IMediaEventSink_VTable =
4986 MediaEventSink_QueryInterface,
4987 MediaEventSink_AddRef,
4988 MediaEventSink_Release,
4989 MediaEventSink_Notify
4992 static HRESULT WINAPI GraphConfig_QueryInterface(IGraphConfig *iface, REFIID riid, LPVOID *ppv)
4994 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
4996 return Filtergraph_QueryInterface(This, riid, ppv);
4999 static ULONG WINAPI GraphConfig_AddRef(IGraphConfig *iface)
5001 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5003 return Filtergraph_AddRef(This);
5006 static ULONG WINAPI GraphConfig_Release(IGraphConfig *iface)
5008 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5010 return Filtergraph_Release(This);
5013 static HRESULT WINAPI GraphConfig_Reconnect(IGraphConfig *iface,
5016 const AM_MEDIA_TYPE* pmtFirstConnection,
5017 IBaseFilter* pUsingFilter,
5021 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5023 FIXME("(%p)->(%p, %p, %p, %p, %p, %x): stub!\n", This, pOutputPin, pInputPin, pmtFirstConnection, pUsingFilter, hAbortEvent, dwFlags);
5028 static HRESULT WINAPI GraphConfig_Reconfigure(IGraphConfig *iface,
5029 IGraphConfigCallback* pCallback,
5034 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5037 WARN("(%p)->(%p, %p, %x, %p): partial stub!\n", This, pCallback, pvContext, dwFlags, hAbortEvent);
5040 FIXME("The parameter hAbortEvent is not handled!\n");
5042 EnterCriticalSection(&This->cs);
5044 hr = IGraphConfigCallback_Reconfigure(pCallback, pvContext, dwFlags);
5046 LeaveCriticalSection(&This->cs);
5051 static HRESULT WINAPI GraphConfig_AddFilterToCache(IGraphConfig *iface,
5052 IBaseFilter* pFilter)
5054 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5056 FIXME("(%p)->(%p): stub!\n", This, pFilter);
5061 static HRESULT WINAPI GraphConfig_EnumCacheFilter(IGraphConfig *iface,
5062 IEnumFilters** pEnum)
5064 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5066 FIXME("(%p)->(%p): stub!\n", This, pEnum);
5071 static HRESULT WINAPI GraphConfig_RemoveFilterFromCache(IGraphConfig *iface,
5072 IBaseFilter* pFilter)
5074 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5076 FIXME("(%p)->(%p): stub!\n", This, pFilter);
5081 static HRESULT WINAPI GraphConfig_GetStartTime(IGraphConfig *iface,
5082 REFERENCE_TIME* prtStart)
5084 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5086 FIXME("(%p)->(%p): stub!\n", This, prtStart);
5091 static HRESULT WINAPI GraphConfig_PushThroughData(IGraphConfig *iface,
5093 IPinConnection* pConnection,
5096 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5098 FIXME("(%p)->(%p, %p, %p): stub!\n", This, pOutputPin, pConnection, hEventAbort);
5103 static HRESULT WINAPI GraphConfig_SetFilterFlags(IGraphConfig *iface,
5104 IBaseFilter* pFilter,
5107 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5109 FIXME("(%p)->(%p, %x): stub!\n", This, pFilter, dwFlags);
5114 static HRESULT WINAPI GraphConfig_GetFilterFlags(IGraphConfig *iface,
5115 IBaseFilter* pFilter,
5118 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5120 FIXME("(%p)->(%p, %p): stub!\n", This, pFilter, dwFlags);
5125 static HRESULT WINAPI GraphConfig_RemoveFilterEx(IGraphConfig *iface,
5126 IBaseFilter* pFilter,
5129 ICOM_THIS_MULTI(IFilterGraphImpl, IGraphConfig_vtbl, iface);
5131 FIXME("(%p)->(%p, %x): stub!\n", This, pFilter, dwFlags);
5136 static const IGraphConfigVtbl IGraphConfig_VTable =
5138 GraphConfig_QueryInterface,
5140 GraphConfig_Release,
5141 GraphConfig_Reconnect,
5142 GraphConfig_Reconfigure,
5143 GraphConfig_AddFilterToCache,
5144 GraphConfig_EnumCacheFilter,
5145 GraphConfig_RemoveFilterFromCache,
5146 GraphConfig_GetStartTime,
5147 GraphConfig_PushThroughData,
5148 GraphConfig_SetFilterFlags,
5149 GraphConfig_GetFilterFlags,
5150 GraphConfig_RemoveFilterEx
5153 static const IUnknownVtbl IInner_VTable =
5155 FilterGraphInner_QueryInterface,
5156 FilterGraphInner_AddRef,
5157 FilterGraphInner_Release
5160 static HRESULT WINAPI Filtergraph_QueryInterface(IFilterGraphImpl *This,
5163 if (This->bAggregatable)
5164 This->bUnkOuterValid = TRUE;
5166 if (This->pUnkOuter)
5168 if (This->bAggregatable)
5169 return IUnknown_QueryInterface(This->pUnkOuter, riid, ppv);
5171 if (IsEqualIID(riid, &IID_IUnknown))
5175 IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
5176 hr = IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
5177 IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
5178 This->bAggregatable = TRUE;
5183 return E_NOINTERFACE;
5186 return IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
5189 static ULONG WINAPI Filtergraph_AddRef(IFilterGraphImpl *This) {
5190 if (This->pUnkOuter && This->bUnkOuterValid)
5191 return IUnknown_AddRef(This->pUnkOuter);
5192 return IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
5195 static ULONG WINAPI Filtergraph_Release(IFilterGraphImpl *This) {
5196 if (This->pUnkOuter && This->bUnkOuterValid)
5197 return IUnknown_Release(This->pUnkOuter);
5198 return IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
5201 /* This is the only function that actually creates a FilterGraph class... */
5202 HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj)
5204 IFilterGraphImpl *fimpl;
5207 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
5211 fimpl = CoTaskMemAlloc(sizeof(*fimpl));
5212 fimpl->pUnkOuter = pUnkOuter;
5213 fimpl->bUnkOuterValid = FALSE;
5214 fimpl->bAggregatable = FALSE;
5215 fimpl->IInner_vtbl = &IInner_VTable;
5216 fimpl->IFilterGraph2_vtbl = &IFilterGraph2_VTable;
5217 fimpl->IMediaControl_vtbl = &IMediaControl_VTable;
5218 fimpl->IMediaSeeking_vtbl = &IMediaSeeking_VTable;
5219 fimpl->IBasicAudio_vtbl = &IBasicAudio_VTable;
5220 fimpl->IBasicVideo_vtbl = &IBasicVideo_VTable;
5221 fimpl->IVideoWindow_vtbl = &IVideoWindow_VTable;
5222 fimpl->IMediaEventEx_vtbl = &IMediaEventEx_VTable;
5223 fimpl->IMediaFilter_vtbl = &IMediaFilter_VTable;
5224 fimpl->IMediaEventSink_vtbl = &IMediaEventSink_VTable;
5225 fimpl->IGraphConfig_vtbl = &IGraphConfig_VTable;
5226 fimpl->IMediaPosition_vtbl = &IMediaPosition_VTable;
5228 fimpl->ppFiltersInGraph = NULL;
5229 fimpl->pFilterNames = NULL;
5230 fimpl->nFilters = 0;
5231 fimpl->filterCapacity = 0;
5232 fimpl->nameIndex = 1;
5233 fimpl->refClock = NULL;
5234 fimpl->hEventCompletion = CreateEventW(0, TRUE, FALSE, 0);
5235 fimpl->HandleEcComplete = TRUE;
5236 fimpl->HandleEcRepaint = TRUE;
5237 fimpl->HandleEcClockChanged = TRUE;
5238 fimpl->notif.hWnd = 0;
5239 fimpl->notif.disabled = FALSE;
5240 fimpl->nRenderers = 0;
5241 fimpl->EcCompleteCount = 0;
5242 fimpl->state = State_Stopped;
5243 EventsQueue_Init(&fimpl->evqueue);
5244 InitializeCriticalSection(&fimpl->cs);
5245 fimpl->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IFilterGraphImpl.cs");
5246 fimpl->nItfCacheEntries = 0;
5247 memcpy(&fimpl->timeformatseek, &TIME_FORMAT_MEDIA_TIME, sizeof(GUID));
5248 fimpl->start_time = fimpl->position = 0;
5249 fimpl->stop_position = -1;
5251 hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (LPVOID*)&fimpl->pFilterMapper2);
5253 ERR("Unable to create filter mapper (%x)\n", hr);
5256 IFilterGraph2_SetDefaultSyncSource((IFilterGraph2*)fimpl);
5262 HRESULT FilterGraphNoThread_create(IUnknown *pUnkOuter, LPVOID *ppObj)
5264 FIXME("CLSID_FilterGraphNoThread partially implemented - Forwarding to CLSID_FilterGraph\n");
5265 return FilterGraph_create(pUnkOuter, ppObj);