ReactOS  0.4.14-dev-317-g96040ec
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 
33 static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0};
34 static 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 {
48  return CONTAINING_RECORD(iface, BaseRenderer, filter);
49 }
50 
51 static const IQualityControlVtbl Renderer_QualityControl_Vtbl = {
57 };
58 
59 static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
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);
88  hr = BasePinImpl_Disconnect(iface);
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
117  hr = BaseRendererImpl_EndOfStream(pFilter);
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
142  hr = BaseRendererImpl_BeginFlush(pFilter);
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);
161  hr = BaseInputPinImpl_EndFlush(iface);
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 
175 static 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 
241 HRESULT 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  {
358  if (hr == VFW_E_SAMPLE_REJECTED)
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  }
500 out:
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 
550 HRESULT 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 }
HRESULT WINAPI BaseRendererImpl_SetSyncSource(IBaseFilter *iface, IReferenceClock *clock)
Definition: renderer.c:537
HRESULT WINAPI BaseRenderer_Init(BaseRenderer *This, const IBaseFilterVtbl *Vtbl, IUnknown *pUnkOuter, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseRendererFuncTable *pBaseFuncsTable)
Definition: renderer.c:241
FILTER_INFO filterInfo
Definition: strmbase.h:170
HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev)
HRESULT WINAPI BasePinImpl_GetMediaType(BasePin *This, int iPosition, AM_MEDIA_TYPE *pmt)
Definition: pin.c:175
HRESULT WINAPI BaseFilterImpl_SetSyncSource(IBaseFilter *iface, IReferenceClock *pClock)
Definition: filter.c:101
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
HRESULT WINAPI BaseRendererImpl_Pause(IBaseFilter *iface)
Definition: renderer.c:506
HRESULT WINAPI BaseInputPinImpl_QueryInterface(IPin *iface, REFIID riid, LPVOID *ppv)
Definition: pin.c:838
IMediaSample * pMediaSample
Definition: strmbase.h:588
HRESULT WINAPI BaseRendererImpl_ClearPendingSample(BaseRenderer *iface)
Definition: renderer.c:609
HANDLE evComplete
Definition: strmbase.h:585
#define DWORD_PTR
Definition: treelist.c:76
HRESULT hr
Definition: shlfolder.c:183
HANDLE RenderEvent
Definition: strmbase.h:587
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define VFW_S_STATE_INTERMEDIATE
Definition: vfwmsgs.h:21
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv)
REFERENCE_TIME rtStreamStart
Definition: strmbase.h:168
REFIID riid
Definition: precomp.h:44
HRESULT WINAPI BaseFilterImpl_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
Definition: filter.c:87
HRESULT WINAPI BaseInputPinImpl_Connect(IPin *iface, IPin *pConnector, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:881
static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: renderer.c:59
HRESULT WINAPI BaseInputPinImpl_EndFlush(IPin *iface)
Definition: pin.c:988
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample *pSample)
Definition: renderer.c:329
void QualityControlImpl_Destroy(QualityControlImpl *This)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
IUnknown * pPosition
Definition: strmbase.h:583
ULONG WINAPI QualityControlImpl_Release(IQualityControl *iface)
void QualityControlRender_DoQOS(QualityControlImpl *priv)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static BaseInputPin * impl_BaseInputPin_from_IPin(IPin *iface)
Definition: renderer.c:36
void QualityControlRender_BeginRender(QualityControlImpl *This)
static IPin *WINAPI BaseRenderer_GetPin(BaseFilter *iface, int pos)
Definition: renderer.c:197
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
ULONG WINAPI BaseRendererImpl_Release(IBaseFilter *iface)
Definition: renderer.c:296
#define lstrcpynW
Definition: compat.h:397
struct QualityControlImpl * qcimpl
Definition: strmbase.h:591
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
DWORD Id
void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart)
HRESULT QualityControlImpl_Create(IPin *input, IBaseFilter *self, QualityControlImpl **ppv)
HRESULT WINAPI BaseRendererImpl_BeginFlush(BaseRenderer *iface)
Definition: renderer.c:590
Definition: regsvr.c:103
HRESULT WINAPI BaseRendererImpl_EndOfStream(BaseRenderer *iface)
Definition: renderer.c:567
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HRESULT WINAPI BaseRendererImpl_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
Definition: renderer.c:550
HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityControl *tonotify)
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
static const BaseFilterFuncTable RendererBaseFilterFuncTable
Definition: renderer.c:225
HRESULT WINAPI BasePinImpl_Disconnect(IPin *iface)
Definition: pin.c:197
#define S_FALSE
Definition: winerror.h:2357
HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start)
Definition: pospass.c:601
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
smooth NULL
Definition: ftsmooth.c:416
ULONG WINAPI QualityControlImpl_AddRef(IQualityControl *iface)
static const BaseInputPinFuncTable input_BaseInputFuncTable
Definition: renderer.c:230
HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
Definition: renderer.c:280
HRESULT WINAPI BasePinImpl_QueryDirection(IPin *iface, PIN_DIRECTION *pPinDir)
Definition: pin.c:285
#define VFW_E_NOT_FOUND
Definition: vfwmsgs.h:61
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin *iface, IPin **ppPin)
Definition: pin.c:222
HRESULT WINAPI BasePinImpl_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEnum)
Definition: pin.c:318
ULONG WINAPI BaseInputPinImpl_Release(IPin *iface)
Definition: pin.c:868
static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin *iface)
Definition: renderer.c:79
#define EC_COMPLETE
Definition: evcode.h:17
HRESULT WINAPI BaseFilterImpl_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
Definition: filter.c:37
void QualityControlRender_EndRender(QualityControlImpl *This)
static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin *iface)
Definition: renderer.c:150
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
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
WINE_DEFAULT_DEBUG_CHANNEL(strmbase)
HRESULT WINAPI BaseRendererImpl_Stop(IBaseFilter *iface)
Definition: renderer.c:440
static BaseRenderer * impl_from_IBaseFilter(IBaseFilter *iface)
Definition: renderer.c:41
HRESULT WINAPI BaseFilter_Destroy(BaseFilter *This)
Definition: filter.c:214
#define TRACE(s)
Definition: solgame.cpp:4
static const IQualityControlVtbl Renderer_QualityControl_Vtbl
Definition: renderer.c:51
HRESULT WINAPI BaseInputPinImpl_BeginFlush(IPin *iface)
Definition: pin.c:968
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
__wchar_t WCHAR
Definition: xmlstorage.h:180
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface)
Definition: pospass.c:611
LONG HRESULT
Definition: typedefs.h:77
static LONG WINAPI BaseRenderer_GetPinCount(BaseFilter *iface)
Definition: renderer.c:208
#define WINAPI
Definition: msvc.h:8
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT WINAPI BaseRendererImpl_FindPin(IBaseFilter *iface, LPCWSTR Id, IPin **ppPin)
Definition: renderer.c:421
HRESULT WINAPI RendererPosPassThru_EOS(IUnknown *iface)
Definition: pospass.c:620
#define WAIT_TIMEOUT
Definition: dderror.h:14
HRESULT WINAPI BasePinImpl_QueryPinInfo(IPin *iface, PIN_INFO *pInfo)
Definition: pin.c:273
static HRESULT WINAPI BaseRenderer_Receive(BaseInputPin *pin, IMediaSample *pSample)
Definition: renderer.c:219
#define InterlockedDecrement
Definition: armddk.h:52
#define VFW_E_TYPE_NOT_ACCEPTED
Definition: vfwmsgs.h:81
HRESULT WINAPI BasePinImpl_QueryId(IPin *iface, LPWSTR *Id)
Definition: pin.c:296
CRITICAL_SECTION csFilter
Definition: strmbase.h:165
static const WCHAR wcsInputPinName[]
Definition: renderer.c:33
static HRESULT WINAPI BaseRenderer_InputPin_BeginFlush(IPin *iface)
Definition: renderer.c:125
HRESULT WINAPI BasePinImpl_QueryInternalConnections(IPin *iface, IPin **apPin, ULONG *cPin)
Definition: pin.c:329
static const IPinVtbl BaseRenderer_InputPin_Vtbl
Definition: renderer.c:175
CRITICAL_SECTION csRenderLock
Definition: strmbase.h:584
BaseFilter filter
Definition: strmbase.h:580
uint32_t DWORD_PTR
Definition: typedefs.h:63
static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin *iface)
Definition: renderer.c:100
HRESULT WINAPI CreatePosPassThru(IUnknown *pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru)
Definition: pospass.c:233
const struct BaseRendererFuncTable * pFuncsTable
Definition: strmbase.h:593
#define S_OK
Definition: intsafe.h:59
GLuint start
Definition: gl.h:1545
Definition: axcore.idl:91
static BaseRenderer * impl_from_BaseFilter(BaseFilter *iface)
Definition: renderer.c:46
HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
Definition: renderer.c:461
HRESULT WINAPI BaseInputPinImpl_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:935
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
HANDLE ThreadSignal
Definition: strmbase.h:586
_Check_return_ _CRTIMP clock_t __cdecl clock(void)
Definition: clock.c:23
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:714
HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:889
static HRESULT WINAPI BaseRenderer_Input_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE *pmt)
Definition: renderer.c:213
void QualityControlRender_SetClock(QualityControlImpl *This, IReferenceClock *clock)
unsigned int ULONG
Definition: retypes.h:1
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:41
HRESULT WINAPI BaseFilter_Init(BaseFilter *This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable *pBaseFuncsTable)
Definition: filter.c:196
static const WCHAR wcsAltInputPinName[]
Definition: renderer.c:34
ULONG WINAPI BasePinImpl_AddRef(IPin *iface)
Definition: pin.c:187
HRESULT WINAPI BaseInputPinImpl_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
Definition: pin.c:1015
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm)
#define VFW_E_WRONG_STATE
Definition: vfwmsgs.h:78
HRESULT WINAPI BasePinImpl_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *pmt)
Definition: pin.c:248
#define VFW_E_SAMPLE_REJECTED
Definition: vfwmsgs.h:82
#define E_POINTER
Definition: winerror.h:2365
HRESULT WINAPI BaseRendererImpl_EndFlush(BaseRenderer *iface)
Definition: renderer.c:599
LONG WINAPI BasePinImpl_GetMediaTypeVersion(BasePin *This)
Definition: pin.c:182
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glext.h:7005
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define SUCCEEDED(hr)
Definition: intsafe.h:57
HRESULT WINAPI BaseInputPinImpl_EndOfStream(IPin *iface)
Definition: pin.c:944