ReactOS 0.4.15-dev-7934-g1dc8d80
renderer.c
Go to the documentation of this file.
1/*
2 * Generic Implementation of strmbase Base Renderer classes
3 *
4 * Copyright 2012 Aric Stewart, CodeWeavers
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#define COBJMACROS
22
23#include "dshow.h"
24#include "wine/debug.h"
25#include "wine/unicode.h"
26#include "wine/strmbase.h"
27#include "uuids.h"
28#include "vfwmsgs.h"
29#include "strmbase_private.h"
30
32
33static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0};
34static const WCHAR wcsAltInputPinName[] = {'I','n',0};
35
37{
38 return CONTAINING_RECORD(iface, BaseInputPin, pin.IPin_iface);
39}
40
42{
43 return CONTAINING_RECORD(iface, BaseRenderer, filter.IBaseFilter_iface);
44}
45
47{
49}
50
51static const IQualityControlVtbl Renderer_QualityControl_Vtbl = {
57};
58
60{
62 BaseRenderer *renderer = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
63 HRESULT hr;
64
65 TRACE("(%p/%p)->(%p, %p)\n", This, renderer, pReceivePin, pmt);
66
67 EnterCriticalSection(This->pin.pCritSec);
68 hr = BaseInputPinImpl_ReceiveConnection(iface, pReceivePin, pmt);
69 if (SUCCEEDED(hr))
70 {
71 if (renderer->pFuncsTable->pfnCompleteConnect)
72 hr = renderer->pFuncsTable->pfnCompleteConnect(renderer, pReceivePin);
73 }
74 LeaveCriticalSection(This->pin.pCritSec);
75
76 return hr;
77}
78
80{
82 BaseRenderer *renderer = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
83 HRESULT hr;
84
85 TRACE("(%p/%p)\n", This, renderer);
86
87 EnterCriticalSection(This->pin.pCritSec);
89 if (SUCCEEDED(hr))
90 {
91 if (renderer->pFuncsTable->pfnBreakConnect)
92 hr = renderer->pFuncsTable->pfnBreakConnect(renderer);
93 }
95 LeaveCriticalSection(This->pin.pCritSec);
96
97 return hr;
98}
99
101{
102 HRESULT hr;
104 BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
105
106 TRACE("(%p/%p)->()\n", This, pFilter);
107
111 EnterCriticalSection(This->pin.pCritSec);
112 if (SUCCEEDED(hr))
113 {
114 if (pFilter->pFuncsTable->pfnEndOfStream)
115 hr = pFilter->pFuncsTable->pfnEndOfStream(pFilter);
116 else
118 }
119 LeaveCriticalSection(This->pin.pCritSec);
122 return hr;
123}
124
126{
128 BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
129 HRESULT hr;
130
131 TRACE("(%p/%p)->()\n", This, iface);
132
135 EnterCriticalSection(This->pin.pCritSec);
137 if (SUCCEEDED(hr))
138 {
139 if (pFilter->pFuncsTable->pfnBeginFlush)
140 hr = pFilter->pFuncsTable->pfnBeginFlush(pFilter);
141 else
143 }
144 LeaveCriticalSection(This->pin.pCritSec);
147 return hr;
148}
149
151{
153 BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
154 HRESULT hr;
155
156 TRACE("(%p/%p)->()\n", This, pFilter);
157
160 EnterCriticalSection(This->pin.pCritSec);
162 if (SUCCEEDED(hr))
163 {
164 if (pFilter->pFuncsTable->pfnEndFlush)
165 hr = pFilter->pFuncsTable->pfnEndFlush(pFilter);
166 else
167 hr = BaseRendererImpl_EndFlush(pFilter);
168 }
169 LeaveCriticalSection(This->pin.pCritSec);
172 return hr;
173}
174
175static const IPinVtbl BaseRenderer_InputPin_Vtbl =
176{
195};
196
198{
200
201 if (pos >= 1 || pos < 0)
202 return NULL;
203
204 IPin_AddRef(&This->pInputPin->pin.IPin_iface);
205 return &This->pInputPin->pin.IPin_iface;
206}
207
209{
210 return 1;
211}
212
214{
215 BaseRenderer *This = impl_from_IBaseFilter(pin->pinInfo.pFilter);
216 return This->pFuncsTable->pfnCheckMediaType(This, pmt);
217}
218
220{
221 BaseRenderer *This = impl_from_IBaseFilter(pin->pin.pinInfo.pFilter);
222 return BaseRendererImpl_Receive(This, pSample);
223}
224
228};
229
231 {
233 NULL,
236 },
238};
239
240
241HRESULT WINAPI BaseRenderer_Init(BaseRenderer * This, const IBaseFilterVtbl *Vtbl, IUnknown *pUnkOuter, const CLSID *pClsid,
242 DWORD_PTR DebugInfo, const BaseRendererFuncTable* pBaseFuncsTable)
243{
244 PIN_INFO piInput;
245 HRESULT hr;
246
247 BaseFilter_Init(&This->filter, Vtbl, pClsid, DebugInfo, &RendererBaseFilterFuncTable);
248
249 This->pFuncsTable = pBaseFuncsTable;
250
251 /* construct input pin */
252 piInput.dir = PINDIR_INPUT;
253 piInput.pFilter = &This->filter.IBaseFilter_iface;
254 lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0]));
255
257 &input_BaseInputFuncTable, &This->filter.csFilter, NULL, (IPin **)&This->pInputPin);
258
259 if (SUCCEEDED(hr))
260 {
261 hr = CreatePosPassThru(pUnkOuter ? pUnkOuter: (IUnknown *)&This->filter.IBaseFilter_iface, TRUE,
262 &This->pInputPin->pin.IPin_iface, &This->pPosition);
263 if (FAILED(hr))
264 return hr;
265
266 InitializeCriticalSection(&This->csRenderLock);
267 This->csRenderLock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": BaseRenderer.csRenderLock");
268 This->evComplete = CreateEventW(NULL, TRUE, TRUE, NULL);
269 This->ThreadSignal = CreateEventW(NULL, TRUE, TRUE, NULL);
270 This->RenderEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
271 This->pMediaSample = NULL;
272
273 QualityControlImpl_Create(&This->pInputPin->pin.IPin_iface, &This->filter.IBaseFilter_iface, &This->qcimpl);
274 This->qcimpl->IQualityControl_iface.lpVtbl = &Renderer_QualityControl_Vtbl;
275 }
276
277 return hr;
278}
279
281{
283
284 if (IsEqualIID(riid, &IID_IMediaSeeking) || IsEqualIID(riid, &IID_IMediaPosition))
285 return IUnknown_QueryInterface(This->pPosition, riid, ppv);
286 else if (IsEqualIID(riid, &IID_IQualityControl))
287 {
288 *ppv = &This->qcimpl->IQualityControl_iface;
289 IUnknown_AddRef((IUnknown *)(*ppv));
290 return S_OK;
291 }
292 else
293 return BaseFilterImpl_QueryInterface(iface, riid, ppv);
294}
295
297{
299 ULONG refCount = InterlockedDecrement(&This->filter.refCount);
300
301 if (!refCount)
302 {
303 IPin *pConnectedTo;
304
305 if (SUCCEEDED(IPin_ConnectedTo(&This->pInputPin->pin.IPin_iface, &pConnectedTo)))
306 {
307 IPin_Disconnect(pConnectedTo);
308 IPin_Release(pConnectedTo);
309 }
310 IPin_Disconnect(&This->pInputPin->pin.IPin_iface);
311 IPin_Release(&This->pInputPin->pin.IPin_iface);
312
313 if (This->pPosition)
314 IUnknown_Release(This->pPosition);
315
316 This->csRenderLock.DebugInfo->Spare[0] = 0;
317 DeleteCriticalSection(&This->csRenderLock);
318
320 CloseHandle(This->evComplete);
321 CloseHandle(This->ThreadSignal);
322 CloseHandle(This->RenderEvent);
324 BaseFilter_Destroy(&This->filter);
325 }
326 return refCount;
327}
328
330{
331 HRESULT hr = S_OK;
332 REFERENCE_TIME start, stop;
333 AM_MEDIA_TYPE *pmt;
334
335 TRACE("(%p)->%p\n", This, pSample);
336
337 if (This->pInputPin->end_of_stream || This->pInputPin->flushing)
338 return S_FALSE;
339
340 if (This->filter.state == State_Stopped)
341 return VFW_E_WRONG_STATE;
342
343 if (IMediaSample_GetMediaType(pSample, &pmt) == S_OK)
344 {
345 if (FAILED(This->pFuncsTable->pfnCheckMediaType(This, pmt)))
346 {
348 }
349 }
350
351 This->pMediaSample = pSample;
352 IMediaSample_AddRef(pSample);
353
354 if (This->pFuncsTable->pfnPrepareReceive)
355 hr = This->pFuncsTable->pfnPrepareReceive(This, pSample);
356 if (FAILED(hr))
357 {
359 return S_OK;
360 else
361 return hr;
362 }
363
364 if (This->pFuncsTable->pfnPrepareRender)
365 This->pFuncsTable->pfnPrepareRender(This);
366
367 EnterCriticalSection(&This->csRenderLock);
368 if ( This->filter.state == State_Paused )
369 {
370 if (This->pFuncsTable->pfnOnReceiveFirstSample)
371 This->pFuncsTable->pfnOnReceiveFirstSample(This, pSample);
372
373 SetEvent(This->evComplete);
374 }
375
376 /* Wait for render Time */
377 if (SUCCEEDED(IMediaSample_GetTime(pSample, &start, &stop)))
378 {
379 hr = S_FALSE;
381 if (This->pFuncsTable->pfnShouldDrawSampleNow)
382 hr = This->pFuncsTable->pfnShouldDrawSampleNow(This, pSample, &start, &stop);
383
384 if (hr == S_OK)
385 ;/* Do not wait: drop through */
386 else if (hr == S_FALSE)
387 {
388 if (This->pFuncsTable->pfnOnWaitStart)
389 This->pFuncsTable->pfnOnWaitStart(This);
390
391 LeaveCriticalSection(&This->csRenderLock);
392 hr = QualityControlRender_WaitFor(This->qcimpl, pSample, This->RenderEvent);
393 EnterCriticalSection(&This->csRenderLock);
394
395 if (This->pFuncsTable->pfnOnWaitEnd)
396 This->pFuncsTable->pfnOnWaitEnd(This);
397 }
398 else
399 {
400 LeaveCriticalSection(&This->csRenderLock);
401 /* Drop Sample */
402 return S_OK;
403 }
404 }
405
406 if (SUCCEEDED(hr))
407 {
409 hr = This->pFuncsTable->pfnDoRenderSample(This, pSample);
411 }
412
414
416 LeaveCriticalSection(&This->csRenderLock);
417
418 return hr;
419}
420
422{
424
425 TRACE("(%p)->(%s,%p)\n", This, debugstr_w(Id), ppPin);
426
427 if (!Id || !ppPin)
428 return E_POINTER;
429
431 {
432 *ppPin = &This->pInputPin->pin.IPin_iface;
433 IPin_AddRef(*ppPin);
434 return S_OK;
435 }
436 *ppPin = NULL;
437 return VFW_E_NOT_FOUND;
438}
439
441{
443
444 TRACE("(%p)->()\n", This);
445
446 EnterCriticalSection(&This->csRenderLock);
447 {
449 if (This->pFuncsTable->pfnOnStopStreaming)
450 This->pFuncsTable->pfnOnStopStreaming(This);
451 This->filter.state = State_Stopped;
452 SetEvent(This->evComplete);
453 SetEvent(This->ThreadSignal);
454 SetEvent(This->RenderEvent);
455 }
456 LeaveCriticalSection(&This->csRenderLock);
457
458 return S_OK;
459}
460
462{
463 HRESULT hr = S_OK;
465 TRACE("(%p)->(%s)\n", This, wine_dbgstr_longlong(tStart));
466
467 EnterCriticalSection(&This->csRenderLock);
468 This->filter.rtStreamStart = tStart;
469 if (This->filter.state == State_Running)
470 goto out;
471
472 SetEvent(This->evComplete);
473 ResetEvent(This->ThreadSignal);
474
475 if (This->pInputPin->pin.pConnectedTo)
476 {
477 This->pInputPin->end_of_stream = FALSE;
478 }
479 else if (This->filter.filterInfo.pGraph)
480 {
481 IMediaEventSink *pEventSink;
482 hr = IFilterGraph_QueryInterface(This->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
483 if (SUCCEEDED(hr))
484 {
485 hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)This);
486 IMediaEventSink_Release(pEventSink);
487 }
488 hr = S_OK;
489 }
490 if (SUCCEEDED(hr))
491 {
492 QualityControlRender_Start(This->qcimpl, This->filter.rtStreamStart);
493 if (This->pFuncsTable->pfnOnStartStreaming)
494 This->pFuncsTable->pfnOnStartStreaming(This);
495 if (This->filter.state == State_Stopped)
497 SetEvent(This->RenderEvent);
498 This->filter.state = State_Running;
499 }
500out:
501 LeaveCriticalSection(&This->csRenderLock);
502
503 return hr;
504}
505
507{
509
510 TRACE("(%p)->()\n", This);
511
512 EnterCriticalSection(&This->csRenderLock);
513 {
514 if (This->filter.state != State_Paused)
515 {
516 if (This->filter.state == State_Stopped)
517 {
518 if (This->pInputPin->pin.pConnectedTo)
519 ResetEvent(This->evComplete);
520 This->pInputPin->end_of_stream = FALSE;
521 }
522 else if (This->pFuncsTable->pfnOnStopStreaming)
523 This->pFuncsTable->pfnOnStopStreaming(This);
524
525 if (This->filter.state == State_Stopped)
527 ResetEvent(This->RenderEvent);
528 This->filter.state = State_Paused;
529 }
530 }
531 ResetEvent(This->ThreadSignal);
532 LeaveCriticalSection(&This->csRenderLock);
533
534 return S_OK;
535}
536
538{
540 HRESULT hr;
541
542 EnterCriticalSection(&This->filter.csFilter);
545 LeaveCriticalSection(&This->filter.csFilter);
546 return hr;
547}
548
549
550HRESULT WINAPI BaseRendererImpl_GetState(IBaseFilter * iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
551{
552 HRESULT hr;
554
555 TRACE("(%p)->(%d, %p)\n", This, dwMilliSecsTimeout, pState);
556
557 if (WaitForSingleObject(This->evComplete, dwMilliSecsTimeout) == WAIT_TIMEOUT)
559 else
560 hr = S_OK;
561
562 BaseFilterImpl_GetState(iface, dwMilliSecsTimeout, pState);
563
564 return hr;
565}
566
568{
569 IMediaEventSink* pEventSink;
570 IFilterGraph *graph;
571 HRESULT hr = S_OK;
572
573 TRACE("(%p)\n", iface);
574
575 graph = iface->filter.filterInfo.pGraph;
576 if (graph)
577 { hr = IFilterGraph_QueryInterface(iface->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
578 if (SUCCEEDED(hr))
579 {
580 hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)iface);
581 IMediaEventSink_Release(pEventSink);
582 }
583 }
585 SetEvent(iface->evComplete);
586
587 return hr;
588}
589
591{
592 TRACE("(%p)\n", iface);
594 SetEvent(iface->ThreadSignal);
595 SetEvent(iface->RenderEvent);
596 return S_OK;
597}
598
600{
601 TRACE("(%p)\n", iface);
604 ResetEvent(iface->ThreadSignal);
605 ResetEvent(iface->RenderEvent);
606 return S_OK;
607}
608
610{
611 if (iface->pMediaSample)
612 {
613 IMediaSample_Release(iface->pMediaSample);
614 iface->pMediaSample = NULL;
615 }
616 return S_OK;
617}
DWORD Id
#define InterlockedDecrement
Definition: armddk.h:52
@ PINDIR_INPUT
Definition: axcore.idl:41
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define lstrcpynW
Definition: compat.h:738
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
#define EC_COMPLETE
Definition: evcode.h:17
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glext.h:7005
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
Definition: axcore.idl:92
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
void QualityControlRender_EndRender(QualityControlImpl *This)
void QualityControlRender_BeginRender(QualityControlImpl *This)
ULONG WINAPI QualityControlImpl_AddRef(IQualityControl *iface)
void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart)
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm)
void QualityControlImpl_Destroy(QualityControlImpl *This)
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv)
ULONG WINAPI QualityControlImpl_Release(IQualityControl *iface)
void QualityControlRender_DoQOS(QualityControlImpl *priv)
HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev)
HRESULT QualityControlImpl_Create(IPin *input, IBaseFilter *self, QualityControlImpl **ppv)
void QualityControlRender_SetClock(QualityControlImpl *This, IReferenceClock *clock)
HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityControl *tonotify)
static FILE * out
Definition: regtests2xml.c:44
static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin *iface)
Definition: renderer.c:150
HRESULT WINAPI BaseRendererImpl_SetSyncSource(IBaseFilter *iface, IReferenceClock *clock)
Definition: renderer.c:537
static IPin *WINAPI BaseRenderer_GetPin(BaseFilter *iface, int pos)
Definition: renderer.c:197
HRESULT WINAPI BaseRendererImpl_EndFlush(BaseRenderer *iface)
Definition: renderer.c:599
static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: renderer.c:59
ULONG WINAPI BaseRendererImpl_Release(IBaseFilter *iface)
Definition: renderer.c:296
static LONG WINAPI BaseRenderer_GetPinCount(BaseFilter *iface)
Definition: renderer.c:208
HRESULT WINAPI BaseRendererImpl_Stop(IBaseFilter *iface)
Definition: renderer.c:440
static const IPinVtbl BaseRenderer_InputPin_Vtbl
Definition: renderer.c:175
static const WCHAR wcsAltInputPinName[]
Definition: renderer.c:34
HRESULT WINAPI BaseRendererImpl_FindPin(IBaseFilter *iface, LPCWSTR Id, IPin **ppPin)
Definition: renderer.c:421
HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
Definition: renderer.c:461
static BaseRenderer * impl_from_IBaseFilter(IBaseFilter *iface)
Definition: renderer.c:41
static HRESULT WINAPI BaseRenderer_Input_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE *pmt)
Definition: renderer.c:213
HRESULT WINAPI BaseRendererImpl_Pause(IBaseFilter *iface)
Definition: renderer.c:506
static HRESULT WINAPI BaseRenderer_Receive(BaseInputPin *pin, IMediaSample *pSample)
Definition: renderer.c:219
HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample *pSample)
Definition: renderer.c:329
HRESULT WINAPI BaseRendererImpl_ClearPendingSample(BaseRenderer *iface)
Definition: renderer.c:609
static HRESULT WINAPI BaseRenderer_InputPin_BeginFlush(IPin *iface)
Definition: renderer.c:125
static BaseInputPin * impl_BaseInputPin_from_IPin(IPin *iface)
Definition: renderer.c:36
static const BaseFilterFuncTable RendererBaseFilterFuncTable
Definition: renderer.c:225
HRESULT WINAPI BaseRendererImpl_BeginFlush(BaseRenderer *iface)
Definition: renderer.c:590
static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin *iface)
Definition: renderer.c:100
static BaseRenderer * impl_from_BaseFilter(BaseFilter *iface)
Definition: renderer.c:46
static const BaseInputPinFuncTable input_BaseInputFuncTable
Definition: renderer.c:230
HRESULT WINAPI BaseRendererImpl_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
Definition: renderer.c:550
static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin *iface)
Definition: renderer.c:79
HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
Definition: renderer.c:280
static const IQualityControlVtbl Renderer_QualityControl_Vtbl
Definition: renderer.c:51
HRESULT WINAPI BaseRenderer_Init(BaseRenderer *This, const IBaseFilterVtbl *Vtbl, IUnknown *pUnkOuter, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseRendererFuncTable *pBaseFuncsTable)
Definition: renderer.c:241
HRESULT WINAPI BaseRendererImpl_EndOfStream(BaseRenderer *iface)
Definition: renderer.c:567
static const WCHAR wcsInputPinName[]
Definition: renderer.c:33
_Check_return_ _CRTIMP clock_t __cdecl clock(void)
Definition: clock.c:23
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT WINAPI BasePinImpl_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *pmt)
Definition: pin.c:248
HRESULT WINAPI BaseInputPinImpl_EndFlush(IPin *iface)
Definition: pin.c:988
HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface)
Definition: pospass.c:611
HRESULT WINAPI BaseFilterImpl_SetSyncSource(IBaseFilter *iface, IReferenceClock *pClock)
Definition: filter.c:101
ULONG WINAPI BaseInputPinImpl_Release(IPin *iface)
Definition: pin.c:868
HRESULT WINAPI BaseInputPinImpl_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:935
HRESULT WINAPI BasePinImpl_QueryInternalConnections(IPin *iface, IPin **apPin, ULONG *cPin)
Definition: pin.c:329
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin *iface, IPin **ppPin)
Definition: pin.c:222
HRESULT WINAPI BaseInputPinImpl_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
Definition: pin.c:1015
HRESULT WINAPI RendererPosPassThru_EOS(IUnknown *iface)
Definition: pospass.c:620
HRESULT WINAPI BasePinImpl_QueryId(IPin *iface, LPWSTR *Id)
Definition: pin.c:296
HRESULT BaseInputPin_Construct(const IPinVtbl *InputPin_Vtbl, LONG inputpin_size, const PIN_INFO *pPinInfo, const BaseInputPinFuncTable *pBaseInputFuncsTable, LPCRITICAL_SECTION pCritSec, IMemAllocator *, IPin **ppPin)
Definition: pin.c:1189
HRESULT WINAPI CreatePosPassThru(IUnknown *pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru)
Definition: pospass.c:233
HRESULT WINAPI BasePinImpl_QueryPinInfo(IPin *iface, PIN_INFO *pInfo)
Definition: pin.c:273
HRESULT WINAPI BaseFilter_Destroy(BaseFilter *This)
Definition: filter.c:214
HRESULT WINAPI BaseFilterImpl_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
Definition: filter.c:37
HRESULT WINAPI BaseFilterImpl_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
Definition: filter.c:87
HRESULT WINAPI BaseInputPinImpl_QueryInterface(IPin *iface, REFIID riid, LPVOID *ppv)
Definition: pin.c:838
HRESULT WINAPI BasePinImpl_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEnum)
Definition: pin.c:318
HRESULT WINAPI BaseInputPinImpl_BeginFlush(IPin *iface)
Definition: pin.c:968
LONG WINAPI BasePinImpl_GetMediaTypeVersion(BasePin *This)
Definition: pin.c:182
HRESULT WINAPI BasePinImpl_GetMediaType(BasePin *This, int iPosition, AM_MEDIA_TYPE *pmt)
Definition: pin.c:175
HRESULT WINAPI BasePinImpl_Disconnect(IPin *iface)
Definition: pin.c:197
HRESULT WINAPI BasePinImpl_QueryDirection(IPin *iface, PIN_DIRECTION *pPinDir)
Definition: pin.c:285
HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:889
HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start)
Definition: pospass.c:601
HRESULT WINAPI BaseInputPinImpl_Connect(IPin *iface, IPin *pConnector, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:881
HRESULT WINAPI BaseInputPinImpl_EndOfStream(IPin *iface)
Definition: pin.c:944
HRESULT WINAPI BaseFilter_Init(BaseFilter *This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable *pBaseFuncsTable)
Definition: filter.c:196
ULONG WINAPI BasePinImpl_AddRef(IPin *iface)
Definition: pin.c:187
REFERENCE_TIME rtStreamStart
Definition: strmbase.h:168
CRITICAL_SECTION csFilter
Definition: strmbase.h:165
FILTER_INFO filterInfo
Definition: strmbase.h:170
HANDLE ThreadSignal
Definition: strmbase.h:586
CRITICAL_SECTION csRenderLock
Definition: strmbase.h:584
BaseFilter filter
Definition: strmbase.h:580
HANDLE RenderEvent
Definition: strmbase.h:587
struct QualityControlImpl * qcimpl
Definition: strmbase.h:591
HANDLE evComplete
Definition: strmbase.h:585
const struct BaseRendererFuncTable * pFuncsTable
Definition: strmbase.h:593
IUnknown * pPosition
Definition: strmbase.h:583
IMediaSample * pMediaSample
Definition: strmbase.h:588
Definition: regsvr.c:104
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:714
#define DWORD_PTR
Definition: treelist.c:76
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define VFW_E_TYPE_NOT_ACCEPTED
Definition: vfwmsgs.h:81
#define VFW_E_WRONG_STATE
Definition: vfwmsgs.h:78
#define VFW_S_STATE_INTERMEDIATE
Definition: vfwmsgs.h:21
#define VFW_E_NOT_FOUND
Definition: vfwmsgs.h:61
#define VFW_E_SAMPLE_REJECTED
Definition: vfwmsgs.h:82
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_POINTER
Definition: winerror.h:2365
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185