ReactOS 0.4.15-dev-7961-gdcf9eb0
parser.c
Go to the documentation of this file.
1/*
2 * Parser (Base for parsers and splitters)
3 *
4 * Copyright 2003 Robert Shearman
5 * Copyright 2004-2005 Christian Costa
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "quartz_private.h"
23#include "pin.h"
24
25#include "vfwmsgs.h"
26#include "amvideo.h"
27
28#include "wine/unicode.h"
29#include "wine/debug.h"
30
31#include <math.h>
32#include <assert.h>
33
34#include "parser.h"
35
37
38static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0};
39static const IMediaSeekingVtbl Parser_Seeking_Vtbl;
40static const IPinVtbl Parser_OutputPin_Vtbl;
41static const IPinVtbl Parser_InputPin_Vtbl;
42
48static HRESULT WINAPI Parser_OutputPin_GetMediaType(BasePin *iface, int iPosition, AM_MEDIA_TYPE *pmt);
51
53{
54 return CONTAINING_RECORD(iface, ParserImpl, sourceSeeking.IMediaSeeking_iface);
55}
56
58{
59 return CONTAINING_RECORD(iface, ParserImpl, filter.IBaseFilter_iface);
60}
61
63{
64 return CONTAINING_RECORD(iface, ParserImpl, filter);
65}
66
67/* FIXME: WRONG */
69{
71
72 TRACE("%p->(%x)\n", This, pos);
73
74 /* Input pin also has a pin, hence the > and not >= */
75 if (pos > This->cStreams || pos < 0)
76 return NULL;
77
78 IPin_AddRef(This->ppPins[pos]);
79 return This->ppPins[pos];
80}
81
83{
85
86 TRACE("%p->()\n", This);
87
88 return This->cStreams;
89}
90
94};
95
96HRESULT Parser_Create(ParserImpl* pParser, const IBaseFilterVtbl *Parser_Vtbl, const CLSID* pClsid, PFN_PROCESS_SAMPLE fnProcessSample, PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, PFN_CLEANUP fnCleanup, PFN_DISCONNECT fnDisconnect, REQUESTPROC fnRequest, STOPPROCESSPROC fnDone, SourceSeeking_ChangeStop stop, SourceSeeking_ChangeStart start, SourceSeeking_ChangeRate rate)
97{
98 HRESULT hr;
99 PIN_INFO piInput;
100
101 /* pTransformFilter is already allocated */
102 BaseFilter_Init(&pParser->filter, Parser_Vtbl, pClsid, (DWORD_PTR)(__FILE__ ": ParserImpl.csFilter"), &BaseFuncTable);
103
104 pParser->fnDisconnect = fnDisconnect;
105
106 pParser->cStreams = 0;
107 pParser->ppPins = CoTaskMemAlloc(1 * sizeof(IPin *));
108
109 /* construct input pin */
110 piInput.dir = PINDIR_INPUT;
111 piInput.pFilter = &pParser->filter.IBaseFilter_iface;
112 lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0]));
113
114 if (!start)
116
117 if (!stop)
118 stop = Parser_ChangeStop;
119
120 if (!rate)
122
124
125 hr = PullPin_Construct(&Parser_InputPin_Vtbl, &piInput, fnProcessSample, (LPVOID)pParser, fnQueryAccept, fnCleanup, fnRequest, fnDone, &pParser->filter.csFilter, (IPin **)&pParser->pInputPin);
126
127 if (SUCCEEDED(hr))
128 {
129 pParser->ppPins[0] = &pParser->pInputPin->pin.IPin_iface;
130 pParser->pInputPin->fnPreConnect = fnPreConnect;
131 }
132 else
133 {
134 CoTaskMemFree(pParser->ppPins);
136 CoTaskMemFree(pParser);
137 }
138
139 return hr;
140}
141
143{
145 TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv);
146
147 *ppv = NULL;
148
151 || IsEqualIID(riid, &IID_IMediaFilter)
153 *ppv = &This->filter.IBaseFilter_iface;
154
155 if (*ppv)
156 {
157 IUnknown_AddRef((IUnknown *)*ppv);
158 return S_OK;
159 }
160
161 if (!IsEqualIID(riid, &IID_IPin) &&
162 !IsEqualIID(riid, &IID_IVideoWindow) &&
163 !IsEqualIID(riid, &IID_IAMFilterMiscFlags))
164 {
165 FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
166 }
167
168 return E_NOINTERFACE;
169}
170
172{
173 return BaseFilterImpl_AddRef(iface);
174}
175
177{
179 ULONG pinref;
180 HRESULT hr;
181
182 assert(!This->filter.refCount);
184
185 /* Don't need to clean up output pins, freeing input pin will do that */
186 IPin_ConnectedTo(&This->pInputPin->pin.IPin_iface, &connected);
187 if (connected)
188 {
189 hr = IPin_Disconnect(connected);
190 assert(hr == S_OK);
191 IPin_Release(connected);
192 hr = IPin_Disconnect(&This->pInputPin->pin.IPin_iface);
193 assert(hr == S_OK);
194 }
195 pinref = IPin_Release(&This->pInputPin->pin.IPin_iface);
196 if (pinref)
197 {
198 /* Valgrind could find this, if I kill it here */
199 ERR("pinref should be null, is %u, destroying anyway\n", pinref);
200 assert((LONG)pinref > 0);
201
202 while (pinref)
203 pinref = IPin_Release(&This->pInputPin->pin.IPin_iface);
204 }
205
206 CoTaskMemFree(This->ppPins);
207 BaseFilter_Destroy(&This->filter);
208
209 TRACE("Destroying parser\n");
211}
212
214{
216 ULONG refCount = InterlockedDecrement(&This->filter.refCount);
217
218 TRACE("(%p)->() Release from %d\n", This, refCount + 1);
219
220 if (!refCount)
222
223 return refCount;
224}
225
229{
231
232 TRACE("%p->(%p)\n", This, pClsid);
233
234 *pClsid = This->filter.clsid;
235
236 return S_OK;
237}
238
242{
244 PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
245 ULONG i;
246
247 TRACE("%p->()\n", This);
248
249 EnterCriticalSection(&pin->thread_lock);
250
251 IAsyncReader_BeginFlush(This->pInputPin->pReader);
252 EnterCriticalSection(&This->filter.csFilter);
253
254 if (This->filter.state == State_Stopped)
255 {
256 LeaveCriticalSection(&This->filter.csFilter);
257 IAsyncReader_EndFlush(This->pInputPin->pReader);
258 LeaveCriticalSection(&pin->thread_lock);
259 return S_OK;
260 }
261
262 This->filter.state = State_Stopped;
263
264 for (i = 1; i < (This->cStreams + 1); i++)
265 {
267 }
268
269 LeaveCriticalSection(&This->filter.csFilter);
270
271 PullPin_PauseProcessing(This->pInputPin);
273 IAsyncReader_EndFlush(This->pInputPin->pReader);
274
275 LeaveCriticalSection(&pin->thread_lock);
276 return S_OK;
277}
278
280{
281 HRESULT hr = S_OK;
283 PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
284
285 TRACE("%p->()\n", This);
286
287 EnterCriticalSection(&pin->thread_lock);
288 EnterCriticalSection(&This->filter.csFilter);
289
290 if (This->filter.state == State_Paused)
291 {
292 LeaveCriticalSection(&This->filter.csFilter);
293 LeaveCriticalSection(&pin->thread_lock);
294 return S_OK;
295 }
296
297 if (This->filter.state == State_Stopped)
298 {
299 LeaveCriticalSection(&This->filter.csFilter);
300 hr = IBaseFilter_Run(iface, -1);
301 EnterCriticalSection(&This->filter.csFilter);
302 }
303
304 if (SUCCEEDED(hr))
305 This->filter.state = State_Paused;
306
307 LeaveCriticalSection(&This->filter.csFilter);
308 LeaveCriticalSection(&pin->thread_lock);
309
310 return hr;
311}
312
314{
315 HRESULT hr = S_OK;
317 PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
318
319 ULONG i;
320
321 TRACE("%p->(%s)\n", This, wine_dbgstr_longlong(tStart));
322
323 EnterCriticalSection(&pin->thread_lock);
324 EnterCriticalSection(&This->filter.csFilter);
325 {
327
328 This->filter.rtStreamStart = tStart;
329 if (This->filter.state == State_Running || This->filter.state == State_Paused)
330 {
331 This->filter.state = State_Running;
332 LeaveCriticalSection(&This->filter.csFilter);
333 LeaveCriticalSection(&pin->thread_lock);
334 return S_OK;
335 }
336
337 for (i = 1; i < (This->cStreams + 1); i++)
338 {
340 if (SUCCEEDED(hr))
341 hr_any = hr;
342 }
343
344 hr = hr_any;
345 if (SUCCEEDED(hr))
346 {
347 LeaveCriticalSection(&This->filter.csFilter);
348 hr = PullPin_StartProcessing(This->pInputPin);
349 EnterCriticalSection(&This->filter.csFilter);
350 }
351
352 if (SUCCEEDED(hr))
353 This->filter.state = State_Running;
354 }
355 LeaveCriticalSection(&This->filter.csFilter);
356 LeaveCriticalSection(&pin->thread_lock);
357
358 return hr;
359}
360
361HRESULT WINAPI Parser_GetState(IBaseFilter * iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
362{
364 PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
365 HRESULT hr = S_OK;
366
367 TRACE("%p->(%d, %p)\n", This, dwMilliSecsTimeout, pState);
368
369 EnterCriticalSection(&pin->thread_lock);
370 EnterCriticalSection(&This->filter.csFilter);
371 {
372 *pState = This->filter.state;
373 }
374 LeaveCriticalSection(&This->filter.csFilter);
375
376 if (This->pInputPin && (PullPin_WaitForStateChange(This->pInputPin, dwMilliSecsTimeout) == S_FALSE))
378 LeaveCriticalSection(&pin->thread_lock);
379
380 return hr;
381}
382
384{
386 PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
387
388 TRACE("%p->(%p)\n", This, pClock);
389
390 EnterCriticalSection(&pin->thread_lock);
391 BaseFilterImpl_SetSyncSource(iface,pClock);
392 LeaveCriticalSection(&pin->thread_lock);
393
394 return S_OK;
395}
396
398{
399 return BaseFilterImpl_GetSyncSource(iface, ppClock);
400}
401
405{
406 return BaseFilterImpl_EnumPins(iface,ppEnum);
407}
408
410{
412 FIXME("(%p)->(%s,%p)\n", This, debugstr_w(Id), ppPin);
413
414 /* FIXME: critical section */
415
416 return E_NOTIMPL;
417}
418
420{
421 return BaseFilterImpl_QueryFilterInfo(iface, pInfo);
422}
423
425{
426 return BaseFilterImpl_JoinFilterGraph(iface, pGraph, pName);
427}
428
430{
431 return BaseFilterImpl_QueryVendorInfo(iface, pVendorInfo);
432}
433
435 {
440 },
444};
445
447{
448 IPin ** ppOldPins;
449 HRESULT hr;
450
451 ppOldPins = This->ppPins;
452
453 This->ppPins = CoTaskMemAlloc((This->cStreams + 2) * sizeof(IPin *));
454 memcpy(This->ppPins, ppOldPins, (This->cStreams + 1) * sizeof(IPin *));
455
456 hr = BaseOutputPin_Construct(&Parser_OutputPin_Vtbl, sizeof(Parser_OutputPin), piOutput, &output_BaseOutputFuncTable, &This->filter.csFilter, This->ppPins + (This->cStreams + 1));
457
458 if (SUCCEEDED(hr))
459 {
460 IPin *pPin = This->ppPins[This->cStreams + 1];
462 pin->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
463 CopyMediaType(pin->pmt, amt);
464 pin->dwSamplesProcessed = 0;
465
466 pin->pin.pin.pinInfo.pFilter = &This->filter.IBaseFilter_iface;
467 pin->allocProps = *props;
468 This->cStreams++;
470 CoTaskMemFree(ppOldPins);
471 }
472 else
473 {
474 CoTaskMemFree(This->ppPins);
475 This->ppPins = ppOldPins;
476 ERR("Failed with error %x\n", hr);
477 }
478
479 return hr;
480}
481
483{
484 /* NOTE: should be in critical section when calling this function */
485 HRESULT hr;
486 ULONG i;
487 IPin ** ppOldPins = This->ppPins;
488
489 TRACE("(%p)\n", This);
490
491 /* reduce the pin array down to 1 (just our input pin) */
492 This->ppPins = CoTaskMemAlloc(sizeof(IPin *) * 1);
493 memcpy(This->ppPins, ppOldPins, sizeof(IPin *) * 1);
494
495 for (i = 0; i < This->cStreams; i++)
496 {
497 hr = ((BaseOutputPin *)ppOldPins[i + 1])->pFuncsTable->pfnBreakConnect((BaseOutputPin *)ppOldPins[i + 1]);
498 TRACE("Disconnect: %08x\n", hr);
499 IPin_Release(ppOldPins[i + 1]);
500 }
501
503 This->cStreams = 0;
504 CoTaskMemFree(ppOldPins);
505
506 return S_OK;
507}
508
510{
511 FIXME("(%p) filter hasn't implemented start position change!\n", iface);
512 return S_OK;
513}
514
516{
517 FIXME("(%p) filter hasn't implemented stop position change!\n", iface);
518 return S_OK;
519}
520
522{
523 FIXME("(%p) filter hasn't implemented rate change!\n", iface);
524 return S_OK;
525}
526
527
529{
531
532 return IBaseFilter_QueryInterface(&This->filter.IBaseFilter_iface, riid, ppv);
533}
534
536{
538
539 return IBaseFilter_AddRef(&This->filter.IBaseFilter_iface);
540}
541
543{
545
546 return IBaseFilter_Release(&This->filter.IBaseFilter_iface);
547}
548
549static const IMediaSeekingVtbl Parser_Seeking_Vtbl =
550{
571};
572
574{
577
578 if (ppropInputRequest->cbAlign && ppropInputRequest->cbAlign != This->allocProps.cbAlign)
579 FIXME("Requested Buffer cbAlign mismatch %i,%i\n",This->allocProps.cbAlign, ppropInputRequest->cbAlign);
580 if (ppropInputRequest->cbPrefix)
581 FIXME("Requested Buffer cbPrefix mismatch %i,%i\n",This->allocProps.cbPrefix, ppropInputRequest->cbPrefix);
582 if (ppropInputRequest->cbBuffer)
583 FIXME("Requested Buffer cbBuffer mismatch %i,%i\n",This->allocProps.cbBuffer, ppropInputRequest->cbBuffer);
584 if (ppropInputRequest->cBuffers)
585 FIXME("Requested Buffer cBuffers mismatch %i,%i\n",This->allocProps.cBuffers, ppropInputRequest->cBuffers);
586
587 return IMemAllocator_SetProperties(pAlloc, &This->allocProps, &actual);
588}
589
591{
593 if (iPosition < 0)
594 return E_INVALIDARG;
595 if (iPosition > 0)
596 return VFW_S_NO_MORE_ITEMS;
597 CopyMediaType(pmt, This->pmt);
598 return S_OK;
599}
600
602{
604 HRESULT hr;
605
606 *pAlloc = NULL;
607
608 if (This->alloc)
609 {
610 hr = IMemInputPin_NotifyAllocator(pPin, This->alloc, This->readonly);
611 if (SUCCEEDED(hr))
612 {
613 *pAlloc = This->alloc;
614 IMemAllocator_AddRef(*pAlloc);
615 }
616 }
617 else
619
620 return hr;
621}
622
624{
625 HRESULT hr;
626
627 TRACE("(%p)->()\n", This);
628
629 EnterCriticalSection(This->pin.pCritSec);
630 if (!This->pin.pConnectedTo || !This->pMemInputPin)
632 else
633 {
634 hr = IPin_Disconnect(This->pin.pConnectedTo);
635 IPin_Disconnect(&This->pin.IPin_iface);
636 }
637 LeaveCriticalSection(This->pin.pCritSec);
638
639 return hr;
640}
641
642
644{
646
647 TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv);
648
649 *ppv = NULL;
650
652 *ppv = iface;
653 else if (IsEqualIID(riid, &IID_IPin))
654 *ppv = iface;
655 /* The Parser filter does not support querying IMediaSeeking, return it directly */
656 else if (IsEqualIID(riid, &IID_IMediaSeeking))
657 *ppv = &impl_from_IBaseFilter(This->pin.pin.pinInfo.pFilter)->sourceSeeking;
658
659 if (*ppv)
660 {
661 IUnknown_AddRef((IUnknown *)(*ppv));
662 return S_OK;
663 }
664
665 FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
666
667 return E_NOINTERFACE;
668}
669
671{
673 ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
674
675 TRACE("(%p)->() Release from %d\n", iface, refCount + 1);
676
677 if (!refCount)
678 {
679 FreeMediaType(This->pmt);
680 CoTaskMemFree(This->pmt);
681 FreeMediaType(&This->pin.pin.mtCurrent);
682 if (This->pin.pAllocator)
683 IMemAllocator_Release(This->pin.pAllocator);
685 return 0;
686 }
687 return refCount;
688}
689
690static HRESULT WINAPI Parser_OutputPin_Connect(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
691{
693 ParserImpl *parser = impl_from_IBaseFilter(This->pin.pin.pinInfo.pFilter);
694
695 /* Set the allocator to our input pin's */
696 EnterCriticalSection(This->pin.pin.pCritSec);
697 This->alloc = parser->pInputPin->pAlloc;
698 LeaveCriticalSection(This->pin.pin.pCritSec);
699
700 return BaseOutputPinImpl_Connect(iface, pReceivePin, pmt);
701}
702
704{
706
708
709 return (memcmp(This->pmt, pmt, sizeof(AM_MEDIA_TYPE)) == 0);
710}
711
712static const IPinVtbl Parser_OutputPin_Vtbl =
713{
732};
733
735{
737
738 TRACE("(%p/%p)->(%s, %p)\n", This, iface, qzdebugstr_guid(riid), ppv);
739
740 *ppv = NULL;
741
742 /*
743 * It is important to capture the request for the IMediaSeeking interface before it is passed
744 * on to PullPin_QueryInterface, this is necessary since the Parser filter does not support
745 * querying IMediaSeeking
746 */
747 if (IsEqualIID(riid, &IID_IMediaSeeking))
748 *ppv = &impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->sourceSeeking;
749
750 if (*ppv)
751 {
752 IUnknown_AddRef((IUnknown *)(*ppv));
753 return S_OK;
754 }
755
756 return PullPin_QueryInterface(iface, riid, ppv);
757}
758
760{
761 HRESULT hr;
763
764 TRACE("()\n");
765
766 EnterCriticalSection(&This->thread_lock);
767 EnterCriticalSection(This->pin.pCritSec);
768 {
769 if (This->pin.pConnectedTo)
770 {
771 FILTER_STATE state;
772 ParserImpl *Parser = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
773
774 LeaveCriticalSection(This->pin.pCritSec);
775 hr = IBaseFilter_GetState(This->pin.pinInfo.pFilter, INFINITE, &state);
776 EnterCriticalSection(This->pin.pCritSec);
777
778 if (SUCCEEDED(hr) && (state == State_Stopped) && SUCCEEDED(Parser->fnDisconnect(Parser)))
779 {
780 LeaveCriticalSection(This->pin.pCritSec);
781 PullPin_Disconnect(iface);
782 EnterCriticalSection(This->pin.pCritSec);
783 hr = Parser_RemoveOutputPins(impl_from_IBaseFilter(This->pin.pinInfo.pFilter));
784 }
785 else
787 }
788 else
789 hr = S_FALSE;
790 }
791 LeaveCriticalSection(This->pin.pCritSec);
792 LeaveCriticalSection(&This->thread_lock);
793
794 return hr;
795}
796
797static HRESULT WINAPI Parser_PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
798{
799 HRESULT hr;
800
801 TRACE("()\n");
802
803 hr = PullPin_ReceiveConnection(iface, pReceivePin, pmt);
804 if (FAILED(hr))
805 {
806 BasePin *This = (BasePin *)iface;
807
808 EnterCriticalSection(This->pCritSec);
810 LeaveCriticalSection(This->pCritSec);
811 }
812
813 return hr;
814}
815
817{
818 BasePin *This = (BasePin *)iface;
819
820 TRACE("(%p/%p)->(%p)\n", This, iface, ppEnum);
821
823}
824
825static const IPinVtbl Parser_InputPin_Vtbl =
826{
845};
DWORD Id
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
static int state
Definition: maze.c:121
#define InterlockedDecrement
Definition: armddk.h:52
@ PINDIR_INPUT
Definition: axcore.idl:41
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:111
#define ERR(fmt,...)
Definition: debug.h:110
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
const GUID IID_IBaseFilter
#define NULL
Definition: types.h:112
const char * qzdebugstr_guid(const GUID *id)
Definition: main.c:279
static HRESULT WINAPI Parser_OutputPin_QueryInterface(IPin *iface, REFIID riid, LPVOID *ppv)
Definition: parser.c:643
HRESULT WINAPI Parser_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *pInfo)
Definition: parser.c:419
static ULONG WINAPI Parser_Seeking_Release(IMediaSeeking *iface)
Definition: parser.c:542
HRESULT WINAPI Parser_GetClassID(IBaseFilter *iface, CLSID *pClsid)
Definition: parser.c:228
static const IPinVtbl Parser_OutputPin_Vtbl
Definition: parser.c:40
static HRESULT WINAPI Parser_ChangeStop(IMediaSeeking *iface)
Definition: parser.c:515
static HRESULT Parser_RemoveOutputPins(ParserImpl *This)
Definition: parser.c:482
static ULONG WINAPI Parser_OutputPin_Release(IPin *iface)
Definition: parser.c:670
static HRESULT WINAPI Parser_OutputPin_DecideBufferSize(BaseOutputPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
Definition: parser.c:573
static const BaseOutputPinFuncTable output_BaseOutputFuncTable
Definition: parser.c:434
HRESULT WINAPI Parser_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
Definition: parser.c:313
HRESULT WINAPI Parser_Pause(IBaseFilter *iface)
Definition: parser.c:279
static HRESULT WINAPI Parser_ChangeStart(IMediaSeeking *iface)
Definition: parser.c:509
static const IPinVtbl Parser_InputPin_Vtbl
Definition: parser.c:41
static HRESULT WINAPI Parser_PullPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: parser.c:797
static HRESULT WINAPI Parser_OutputPin_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE *pmt)
Definition: parser.c:703
HRESULT WINAPI Parser_Stop(IBaseFilter *iface)
Definition: parser.c:241
static HRESULT WINAPI Parser_OutputPin_DecideAllocator(BaseOutputPin *This, IMemInputPin *pPin, IMemAllocator **pAlloc)
Definition: parser.c:601
ULONG WINAPI Parser_AddRef(IBaseFilter *iface)
Definition: parser.c:171
static HRESULT WINAPI Parser_OutputPin_BreakConnect(BaseOutputPin *This)
Definition: parser.c:623
HRESULT WINAPI Parser_QueryVendorInfo(IBaseFilter *iface, LPWSTR *pVendorInfo)
Definition: parser.c:429
static ParserImpl * impl_from_BaseFilter(BaseFilter *iface)
Definition: parser.c:62
static IPin *WINAPI Parser_GetPin(BaseFilter *iface, int pos)
Definition: parser.c:68
static const BaseFilterFuncTable BaseFuncTable
Definition: parser.c:91
static ParserImpl * impl_from_IBaseFilter(IBaseFilter *iface)
Definition: parser.c:57
void Parser_Destroy(ParserImpl *This)
Definition: parser.c:176
HRESULT Parser_AddPin(ParserImpl *This, const PIN_INFO *piOutput, ALLOCATOR_PROPERTIES *props, const AM_MEDIA_TYPE *amt)
Definition: parser.c:446
static HRESULT WINAPI Parser_ChangeRate(IMediaSeeking *iface)
Definition: parser.c:521
HRESULT WINAPI Parser_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
Definition: parser.c:361
HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *Parser_Vtbl, const CLSID *pClsid, PFN_PROCESS_SAMPLE fnProcessSample, PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, PFN_CLEANUP fnCleanup, PFN_DISCONNECT fnDisconnect, REQUESTPROC fnRequest, STOPPROCESSPROC fnDone, SourceSeeking_ChangeStop stop, SourceSeeking_ChangeStart start, SourceSeeking_ChangeRate rate)
Definition: parser.c:96
static ULONG WINAPI Parser_Seeking_AddRef(IMediaSeeking *iface)
Definition: parser.c:535
HRESULT WINAPI Parser_GetSyncSource(IBaseFilter *iface, IReferenceClock **ppClock)
Definition: parser.c:397
ULONG WINAPI Parser_Release(IBaseFilter *iface)
Definition: parser.c:213
static HRESULT WINAPI Parser_PullPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEnum)
Definition: parser.c:816
HRESULT WINAPI Parser_EnumPins(IBaseFilter *iface, IEnumPins **ppEnum)
Definition: parser.c:404
static HRESULT WINAPI Parser_OutputPin_Connect(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: parser.c:690
static HRESULT WINAPI Parser_Seeking_QueryInterface(IMediaSeeking *iface, REFIID riid, LPVOID *ppv)
Definition: parser.c:528
static const IMediaSeekingVtbl Parser_Seeking_Vtbl
Definition: parser.c:39
static HRESULT WINAPI Parser_PullPin_Disconnect(IPin *iface)
Definition: parser.c:759
static HRESULT WINAPI Parser_OutputPin_GetMediaType(BasePin *iface, int iPosition, AM_MEDIA_TYPE *pmt)
Definition: parser.c:590
HRESULT WINAPI Parser_SetSyncSource(IBaseFilter *iface, IReferenceClock *pClock)
Definition: parser.c:383
static HRESULT WINAPI Parser_PullPin_QueryInterface(IPin *iface, REFIID riid, LPVOID *ppv)
Definition: parser.c:734
HRESULT WINAPI Parser_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
Definition: parser.c:142
static LONG WINAPI Parser_GetPinCount(BaseFilter *iface)
Definition: parser.c:82
HRESULT WINAPI Parser_FindPin(IBaseFilter *iface, LPCWSTR Id, IPin **ppPin)
Definition: parser.c:409
static ParserImpl * impl_from_IMediaSeeking(IMediaSeeking *iface)
Definition: parser.c:52
HRESULT WINAPI Parser_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *pGraph, LPCWSTR pName)
Definition: parser.c:424
static const WCHAR wcsInputPinName[]
Definition: parser.c:38
HRESULT(* PFN_PRE_CONNECT)(IPin *iface, IPin *pConnectPin, ALLOCATOR_PROPERTIES *prop)
Definition: parser.h:27
HRESULT(* PFN_DISCONNECT)(LPVOID iface)
Definition: parser.h:29
HRESULT(* PFN_PROCESS_SAMPLE)(LPVOID iface, IMediaSample *pSample, DWORD_PTR cookie)
Definition: parser.h:25
HRESULT(* PFN_QUERY_ACCEPT)(LPVOID iface, const AM_MEDIA_TYPE *pmt)
Definition: parser.h:26
HRESULT(* PFN_CLEANUP)(LPVOID iface)
Definition: parser.h:28
static Parser_OutputPin * unsafe_impl_Parser_OutputPin_from_IPin(IPin *iface)
Definition: parser.h:81
HRESULT PullPin_Construct(const IPinVtbl *PullPin_Vtbl, const PIN_INFO *pPinInfo, SAMPLEPROC_PULL pSampleProc, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, CLEANUPPROC pCleanUp, REQUESTPROC pCustomRequest, STOPPROCESSPROC pDone, LPCRITICAL_SECTION pCritSec, IPin **ppPin)
Definition: pin.c:221
HRESULT PullPin_StartProcessing(PullPin *This)
Definition: pin.c:623
HRESULT WINAPI PullPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:253
HRESULT WINAPI PullPin_EndFlush(IPin *iface)
Definition: pin.c:773
HRESULT WINAPI PullPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:715
HRESULT WINAPI PullPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
Definition: pin.c:837
HRESULT WINAPI PullPin_QueryInterface(IPin *iface, REFIID riid, LPVOID *ppv)
Definition: pin.c:345
HRESULT WINAPI PullPin_EndOfStream(IPin *iface)
Definition: pin.c:724
HRESULT WINAPI PullPin_BeginFlush(IPin *iface)
Definition: pin.c:739
HRESULT WINAPI PullPin_Disconnect(IPin *iface)
Definition: pin.c:803
HRESULT PullPin_WaitForStateChange(PullPin *This, DWORD dwMilliseconds)
Definition: pin.c:708
ULONG WINAPI PullPin_Release(IPin *iface)
Definition: pin.c:374
HRESULT PullPin_PauseProcessing(PullPin *This)
Definition: pin.c:646
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define lstrcpynW
Definition: compat.h:738
#define assert(x)
Definition: debug.h:53
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
#define INFINITE
Definition: serial.h:102
unsigned long DWORD
Definition: ntddk_ex.h:95
int connected
Definition: main.c:61
GLuint start
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glext.h:7005
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
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
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static LPSTR pName
Definition: security.c:75
static void FreeMediaType(AM_MEDIA_TYPE *pMediaType)
Definition: filtergraph.c:692
static HRESULT CopyMediaType(AM_MEDIA_TYPE *pDest, const AM_MEDIA_TYPE *pSrc)
Definition: filtergraph.c:706
int rate
Definition: pcmconverter.c:97
long LONG
Definition: pedump.c:60
HRESULT(* STOPPROCESSPROC)(LPVOID userdata)
Definition: pin.h:65
HRESULT(* REQUESTPROC)(LPVOID userdata)
Definition: pin.h:60
static PullPin * impl_PullPin_from_IPin(IPin *iface)
Definition: pin.h:132
const GUID IID_IPin
Definition: pincontrol.cpp:15
const GUID IID_IPersist
Definition: proxy.cpp:14
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE *pmt)
Definition: enummedia.c:38
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 SourceSeekingImpl_SetTimeFormat(IMediaSeeking *iface, const GUID *pFormat)
Definition: seeking.c:137
HRESULT WINAPI BaseFilterImpl_SetSyncSource(IBaseFilter *iface, IReferenceClock *pClock)
Definition: filter.c:101
HRESULT WINAPI BasePinImpl_QueryInternalConnections(IPin *iface, IPin **apPin, ULONG *cPin)
Definition: pin.c:329
HRESULT WINAPI BaseOutputPinImpl_EndFlush(IPin *iface)
Definition: pin.c:545
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin *iface, IPin **ppPin)
Definition: pin.c:222
HRESULT WINAPI SourceSeekingImpl_SetPositions(IMediaSeeking *iface, LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags)
Definition: seeking.c:218
HRESULT WINAPI BasePinImpl_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
Definition: pin.c:338
ULONG WINAPI BaseFilterImpl_Release(IBaseFilter *iface)
Definition: filter.c:64
HRESULT WINAPI BaseFilterImpl_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *pInfo)
Definition: filter.c:145
HRESULT SourceSeeking_Init(SourceSeeking *pSeeking, const IMediaSeekingVtbl *Vtbl, SourceSeeking_ChangeStop fnChangeStop, SourceSeeking_ChangeStart fnChangeStart, SourceSeeking_ChangeRate fnChangeRate, PCRITICAL_SECTION crit_sect)
Definition: seeking.c:40
HRESULT WINAPI BasePinImpl_QueryId(IPin *iface, LPWSTR *Id)
Definition: pin.c:296
HRESULT WINAPI BaseOutputPinImpl_AttemptConnection(BasePin *This, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:712
HRESULT WINAPI SourceSeekingImpl_IsUsingTimeFormat(IMediaSeeking *iface, const GUID *pFormat)
Definition: seeking.c:122
HRESULT WINAPI BasePinImpl_QueryPinInfo(IPin *iface, PIN_INFO *pInfo)
Definition: pin.c:273
HRESULT WINAPI BaseOutputPinImpl_Inactive(BaseOutputPin *This)
Definition: pin.c:634
HRESULT WINAPI BaseOutputPinImpl_EndOfStream(IPin *iface)
Definition: pin.c:527
HRESULT WINAPI SourceSeekingImpl_GetRate(IMediaSeeking *iface, double *dRate)
Definition: seeking.c:305
ULONG WINAPI BaseFilterImpl_AddRef(IBaseFilter *iface)
Definition: filter.c:54
HRESULT WINAPI BaseFilter_Destroy(BaseFilter *This)
Definition: filter.c:214
HRESULT WINAPI SourceSeekingImpl_GetTimeFormat(IMediaSeeking *iface, GUID *pFormat)
Definition: seeking.c:110
HRESULT WINAPI BaseOutputPinImpl_BeginFlush(IPin *iface)
Definition: pin.c:536
HRESULT WINAPI SourceSeekingImpl_GetCapabilities(IMediaSeeking *iface, DWORD *pCapabilities)
Definition: seeking.c:63
HRESULT WINAPI SourceSeekingImpl_GetCurrentPosition(IMediaSeeking *iface, LONGLONG *pCurrent)
Definition: seeking.c:172
HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO *pPinInfo, const BaseOutputPinFuncTable *pBaseOutputFuncsTable, LPCRITICAL_SECTION pCritSec, IPin **ppPin)
Definition: pin.c:791
HRESULT WINAPI SourceSeekingImpl_GetPreroll(IMediaSeeking *iface, LONGLONG *pPreroll)
Definition: seeking.c:319
HRESULT WINAPI BasePinImpl_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEnum)
Definition: pin.c:318
HRESULT WINAPI BaseFilterImpl_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *pGraph, LPCWSTR pName)
Definition: filter.c:159
HRESULT(WINAPI * SourceSeeking_ChangeStop)(IMediaSeeking *iface)
Definition: strmbase.h:272
LONG WINAPI BasePinImpl_GetMediaTypeVersion(BasePin *This)
Definition: pin.c:182
HRESULT WINAPI SourceSeekingImpl_SetRate(IMediaSeeking *iface, double dRate)
Definition: seeking.c:282
HRESULT WINAPI BasePinImpl_GetMediaType(BasePin *This, int iPosition, AM_MEDIA_TYPE *pmt)
Definition: pin.c:175
HRESULT WINAPI BaseOutputPinImpl_Connect(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:405
HRESULT WINAPI BaseFilterImpl_QueryVendorInfo(IBaseFilter *iface, LPWSTR *pVendorInfo)
Definition: filter.c:178
HRESULT WINAPI BaseFilterImpl_GetSyncSource(IBaseFilter *iface, IReferenceClock **ppClock)
Definition: filter.c:119
HRESULT WINAPI SourceSeekingImpl_ConvertTimeFormat(IMediaSeeking *iface, LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat)
Definition: seeking.c:185
HRESULT(WINAPI * SourceSeeking_ChangeRate)(IMediaSeeking *iface)
Definition: strmbase.h:270
HRESULT WINAPI BasePinImpl_QueryDirection(IPin *iface, PIN_DIRECTION *pPinDir)
Definition: pin.c:285
HRESULT WINAPI SourceSeekingImpl_IsFormatSupported(IMediaSeeking *iface, const GUID *pFormat)
Definition: seeking.c:95
HRESULT WINAPI BasePinImpl_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:311
HRESULT WINAPI EnumMediaTypes_Construct(BasePin *iface, BasePin_GetMediaType enumFunc, BasePin_GetMediaTypeVersion versionFunc, IEnumMediaTypes **ppEnum)
Definition: mediatype.c:108
HRESULT WINAPI BaseOutputPinImpl_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:490
HRESULT WINAPI SourceSeekingImpl_GetStopPosition(IMediaSeeking *iface, LONGLONG *pStop)
Definition: seeking.c:158
HRESULT WINAPI BaseOutputPinImpl_Disconnect(IPin *iface)
Definition: pin.c:497
VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter *This)
Definition: filter.c:190
HRESULT WINAPI BaseInputPinImpl_Connect(IPin *iface, IPin *pConnector, const AM_MEDIA_TYPE *pmt)
Definition: pin.c:881
HRESULT WINAPI SourceSeekingImpl_GetDuration(IMediaSeeking *iface, LONGLONG *pDuration)
Definition: seeking.c:145
HRESULT WINAPI SourceSeekingImpl_GetPositions(IMediaSeeking *iface, LONGLONG *pCurrent, LONGLONG *pStop)
Definition: seeking.c:254
HRESULT WINAPI SourceSeekingImpl_CheckCapabilities(IMediaSeeking *iface, DWORD *pCapabilities)
Definition: seeking.c:74
HRESULT WINAPI BaseFilterImpl_EnumPins(IBaseFilter *iface, IEnumPins **ppEnum)
Definition: filter.c:135
HRESULT WINAPI SourceSeekingImpl_QueryPreferredFormat(IMediaSeeking *iface, GUID *pFormat)
Definition: seeking.c:102
HRESULT WINAPI BaseOutputPinImpl_Active(BaseOutputPin *This)
Definition: pin.c:614
HRESULT WINAPI BaseFilter_Init(BaseFilter *This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable *pBaseFuncsTable)
Definition: filter.c:196
HRESULT(WINAPI * SourceSeeking_ChangeStart)(IMediaSeeking *iface)
Definition: strmbase.h:271
HRESULT WINAPI SourceSeekingImpl_GetAvailable(IMediaSeeking *iface, LONGLONG *pEarliest, LONGLONG *pLatest)
Definition: seeking.c:268
ULONG WINAPI BasePinImpl_AddRef(IPin *iface)
Definition: pin.c:187
IBaseFilter IBaseFilter_iface
Definition: strmbase.h:163
CRITICAL_SECTION csFilter
Definition: strmbase.h:165
IPin IPin_iface
Definition: strmbase.h:35
ULONG cStreams
Definition: parser.h:40
BaseFilter filter
Definition: parser.h:33
PullPin * pInputPin
Definition: parser.h:38
SourceSeeking sourceSeeking
Definition: parser.h:41
IPin ** ppPins
Definition: parser.h:39
PFN_DISCONNECT fnDisconnect
Definition: parser.h:36
Definition: pin.h:71
PRECONNECTPROC fnPreConnect
Definition: pin.h:82
BasePin pin
Definition: pin.h:73
Definition: import.c:81
Definition: regsvr.c:104
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_NOT_STOPPED
Definition: vfwmsgs.h:75
#define VFW_S_STATE_INTERMEDIATE
Definition: vfwmsgs.h:21
#define VFW_E_NO_ALLOCATOR
Definition: vfwmsgs.h:49
#define VFW_S_NO_MORE_ITEMS
Definition: vfwmsgs.h:19
#define VFW_E_NOT_CONNECTED
Definition: vfwmsgs.h:48
static const WCHAR props[]
Definition: wbemdisp.c:288
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185