ReactOS 0.4.15-dev-7958-gcd0bb1a
pospass.c
Go to the documentation of this file.
1/*
2 * Filter Seeking and Control Interfaces
3 *
4 * Copyright 2003 Robert Shearman
5 * Copyright 2012 Aric Stewart, CodeWeavers
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/* FIXME: critical sections */
22
23#define COBJMACROS
24
25#include "dshow.h"
26#include "uuids.h"
27
28#include "wine/debug.h"
29#include "wine/strmbase.h"
30
31#include <assert.h>
32
34
35static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl;
36static const IMediaPositionVtbl IMediaPositionPassThru_Vtbl;
37
38typedef struct PassThruImpl {
42 IMediaPosition IMediaPosition_iface;
44
55
57{
58 return CONTAINING_RECORD(iface, PassThruImpl, IUnknown_inner);
59}
60
62{
63 return CONTAINING_RECORD(iface, PassThruImpl, ISeekingPassThru_iface);
64}
65
67{
68 return CONTAINING_RECORD(iface, PassThruImpl, IMediaSeeking_iface);
69}
70
71static inline PassThruImpl *impl_from_IMediaPosition(IMediaPosition *iface)
72{
73 return CONTAINING_RECORD(iface, PassThruImpl, IMediaPosition_iface);
74}
75
78 LPVOID *ppvObj) {
80 TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppvObj);
81
82 if (This->bAggregatable)
83 This->bUnkOuterValid = TRUE;
84
86 {
87 *ppvObj = &(This->IUnknown_inner);
88 TRACE(" returning IUnknown interface (%p)\n", *ppvObj);
89 } else if (IsEqualGUID(&IID_ISeekingPassThru, riid)) {
90 *ppvObj = &(This->ISeekingPassThru_iface);
91 TRACE(" returning ISeekingPassThru interface (%p)\n", *ppvObj);
92 } else if (IsEqualGUID(&IID_IMediaSeeking, riid)) {
93 *ppvObj = &(This->IMediaSeeking_iface);
94 TRACE(" returning IMediaSeeking interface (%p)\n", *ppvObj);
95 } else if (IsEqualGUID(&IID_IMediaPosition, riid)) {
96 *ppvObj = &(This->IMediaPosition_iface);
97 TRACE(" returning IMediaPosition interface (%p)\n", *ppvObj);
98 } else {
99 *ppvObj = NULL;
100 FIXME("unknown interface %s\n", debugstr_guid(riid));
101 return E_NOINTERFACE;
102 }
103
104 IUnknown_AddRef((IUnknown *)(*ppvObj));
105 return S_OK;
106}
107
111
112 TRACE("(%p)->(): new ref = %d\n", This, ref);
113
114 return ref;
115}
116
120
121 TRACE("(%p)->(): new ref = %d\n", This, ref);
122
123 if (ref == 0)
124 {
125 BaseDispatch_Destroy(&This->baseDispatch);
126 This->time_cs.DebugInfo->Spare[0] = 0;
127 DeleteCriticalSection(&This->time_cs);
129 }
130 return ref;
131}
132
133static const IUnknownVtbl IInner_VTable =
134{
138};
139
140/* Generic functions for aggregation */
142{
143 if (This->bAggregatable)
144 This->bUnkOuterValid = TRUE;
145
146 if (This->outer_unk)
147 {
148 if (This->bAggregatable)
149 return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
150
152 {
153 HRESULT hr;
154
155 IUnknown_AddRef(&This->IUnknown_inner);
156 hr = IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
157 IUnknown_Release(&This->IUnknown_inner);
158 This->bAggregatable = TRUE;
159 return hr;
160 }
161
162 *ppv = NULL;
163 return E_NOINTERFACE;
164 }
165
166 return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
167}
168
170{
171 if (This->outer_unk && This->bUnkOuterValid)
172 return IUnknown_AddRef(This->outer_unk);
173 return IUnknown_AddRef(&This->IUnknown_inner);
174}
175
177{
178 if (This->outer_unk && This->bUnkOuterValid)
179 return IUnknown_Release(This->outer_unk);
180 return IUnknown_Release(&This->IUnknown_inner);
181}
182
184{
186
187 TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
188
189 return SeekOuter_QueryInterface(This, riid, ppvObj);
190}
191
193{
195
196 TRACE("(%p/%p)->()\n", This, iface);
197
198 return SeekOuter_AddRef(This);
199}
200
202{
204
205 TRACE("(%p/%p)->()\n", This, iface);
206
207 return SeekOuter_Release(This);
208}
209
211{
213
214 TRACE("(%p/%p)->(%d, %p)\n", This, iface, renderer, pin);
215
216 if (This->pin)
217 FIXME("Re-initializing?\n");
218
219 This->renderer = renderer;
220 This->pin = pin;
221
222 return S_OK;
223}
224
225static const ISeekingPassThruVtbl ISeekingPassThru_Vtbl =
226{
231};
232
233HRESULT WINAPI CreatePosPassThru(IUnknown* pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru)
234{
235 HRESULT hr;
236 ISeekingPassThru *passthru;
237
238 hr = CoCreateInstance(&CLSID_SeekingPassThru, pUnkOuter, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)ppPassThru);
239 if (FAILED(hr))
240 return hr;
241
242 IUnknown_QueryInterface(*ppPassThru, &IID_ISeekingPassThru, (void**)&passthru);
243 hr = ISeekingPassThru_Init(passthru, bRenderer, pPin);
244 ISeekingPassThru_Release(passthru);
245
246 return hr;
247}
248
250{
251 PassThruImpl *fimpl;
252
253 TRACE("(%p,%p)\n", pUnkOuter, ppPassThru);
254
255 *ppPassThru = fimpl = CoTaskMemAlloc(sizeof(*fimpl));
256 if (!fimpl)
257 return E_OUTOFMEMORY;
258
259 fimpl->outer_unk = pUnkOuter;
260 fimpl->bUnkOuterValid = FALSE;
261 fimpl->bAggregatable = FALSE;
262 fimpl->IUnknown_inner.lpVtbl = &IInner_VTable;
266 fimpl->ref = 1;
267 fimpl->pin = NULL;
268 fimpl->timevalid = FALSE;
270 fimpl->time_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PassThruImpl.time_cs");
271 BaseDispatch_Init(&fimpl->baseDispatch, &IID_IMediaPosition);
272 return S_OK;
273}
274
276{
278
279 TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
280
281 return SeekOuter_QueryInterface(This, riid, ppvObj);
282}
283
285{
287
288 TRACE("(%p/%p)->()\n", iface, This);
289
290 return SeekOuter_AddRef(This);
291}
292
294{
296
297 TRACE("(%p/%p)->()\n", iface, This);
298
299 return SeekOuter_Release(This);
300}
301
303 HRESULT hr;
304 IPin *pin;
305 *ppvObj = NULL;
306 hr = IPin_ConnectedTo(This->pin, &pin);
307 if (FAILED(hr))
308 return VFW_E_NOT_CONNECTED;
309 hr = IPin_QueryInterface(pin, riid, ppvObj);
310 IPin_Release(pin);
311 if (FAILED(hr))
312 hr = E_NOTIMPL;
313 return hr;
314}
315
317{
320 HRESULT hr;
321 TRACE("(%p/%p)->(%p)\n", iface, This, pCapabilities);
322 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
323 if (SUCCEEDED(hr)) {
324 hr = IMediaSeeking_GetCapabilities(seek, pCapabilities);
325 IMediaSeeking_Release(seek);
326 }
327 else
328 return E_NOTIMPL;
329 return hr;
330}
331
333{
336 HRESULT hr;
337 TRACE("(%p/%p)->(%p)\n", iface, This, pCapabilities);
338 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
339 if (SUCCEEDED(hr)) {
340 hr = IMediaSeeking_CheckCapabilities(seek, pCapabilities);
341 IMediaSeeking_Release(seek);
342 }
343 else
344 return E_NOTIMPL;
345 return hr;
346}
347
349{
352 HRESULT hr;
353 TRACE("(%p/%p)->(%s)\n", iface, This, debugstr_guid(pFormat));
354 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
355 if (SUCCEEDED(hr)) {
356 hr = IMediaSeeking_IsFormatSupported(seek, pFormat);
357 IMediaSeeking_Release(seek);
358 }
359 else
360 return E_NOTIMPL;
361 return hr;
362}
363
365{
368 HRESULT hr;
369 TRACE("(%p/%p)->(%p)\n", iface, This, pFormat);
370 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
371 if (SUCCEEDED(hr)) {
372 hr = IMediaSeeking_QueryPreferredFormat(seek, pFormat);
373 IMediaSeeking_Release(seek);
374 }
375 else
376 return E_NOTIMPL;
377 return hr;
378}
379
381{
384 HRESULT hr;
385 TRACE("(%p/%p)->(%p)\n", iface, This, pFormat);
386 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
387 if (SUCCEEDED(hr)) {
388 hr = IMediaSeeking_GetTimeFormat(seek, pFormat);
389 IMediaSeeking_Release(seek);
390 }
391 else
392 return E_NOTIMPL;
393 return hr;
394}
395
397{
400 HRESULT hr;
401 TRACE("(%p/%p)->(%s)\n", iface, This, debugstr_guid(pFormat));
402 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
403 if (SUCCEEDED(hr)) {
404 hr = IMediaSeeking_IsUsingTimeFormat(seek, pFormat);
405 IMediaSeeking_Release(seek);
406 }
407 else
408 return E_NOTIMPL;
409 return hr;
410}
411
413{
416 HRESULT hr;
417 TRACE("(%p/%p)->(%s)\n", iface, This, debugstr_guid(pFormat));
418 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
419 if (SUCCEEDED(hr)) {
420 hr = IMediaSeeking_SetTimeFormat(seek, pFormat);
421 IMediaSeeking_Release(seek);
422 }
423 else
424 return E_NOTIMPL;
425 return hr;
426}
427
429{
432 HRESULT hr;
433 TRACE("(%p/%p)->(%p)\n", iface, This, pDuration);
434 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
435 if (SUCCEEDED(hr)) {
436 hr = IMediaSeeking_GetDuration(seek, pDuration);
437 IMediaSeeking_Release(seek);
438 }
439 else
440 return E_NOTIMPL;
441 return hr;
442}
443
445{
448 HRESULT hr;
449 TRACE("(%p/%p)->(%p)\n", iface, This, pStop);
450 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
451 if (SUCCEEDED(hr)) {
452 hr = IMediaSeeking_GetStopPosition(seek, pStop);
453 IMediaSeeking_Release(seek);
454 }
455 else
456 return E_NOTIMPL;
457 return hr;
458}
459
461{
464 HRESULT hr = S_OK;
465 TRACE("(%p/%p)->(%p)\n", iface, This, pCurrent);
466 if (!pCurrent)
467 return E_POINTER;
468 EnterCriticalSection(&This->time_cs);
469 if (This->timevalid)
470 *pCurrent = This->time_earliest;
471 else
472 hr = E_FAIL;
473 LeaveCriticalSection(&This->time_cs);
474 if (SUCCEEDED(hr)) {
475 hr = IMediaSeeking_ConvertTimeFormat(iface, pCurrent, NULL, *pCurrent, &TIME_FORMAT_MEDIA_TIME);
476 return hr;
477 }
478 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
479 if (SUCCEEDED(hr)) {
480 hr = IMediaSeeking_GetCurrentPosition(seek, pCurrent);
481 IMediaSeeking_Release(seek);
482 }
483 else
484 return E_NOTIMPL;
485 return hr;
486}
487
488static HRESULT WINAPI MediaSeekingPassThru_ConvertTimeFormat(IMediaSeeking * iface, LONGLONG * pTarget, const GUID * pTargetFormat, LONGLONG Source, const GUID * pSourceFormat)
489{
492 HRESULT hr;
493 TRACE("(%p/%p)->(%p,%s,%x%08x,%s)\n", iface, This, pTarget, debugstr_guid(pTargetFormat), (DWORD)(Source>>32), (DWORD)Source, debugstr_guid(pSourceFormat));
494 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
495 if (SUCCEEDED(hr)) {
496 hr = IMediaSeeking_ConvertTimeFormat(seek, pTarget, pTargetFormat, Source, pSourceFormat);
497 IMediaSeeking_Release(seek);
498 }
499 else
500 return E_NOTIMPL;
501 return hr;
502}
503
504static HRESULT WINAPI MediaSeekingPassThru_SetPositions(IMediaSeeking * iface, LONGLONG * pCurrent, DWORD dwCurrentFlags, LONGLONG * pStop, DWORD dwStopFlags)
505{
508 HRESULT hr;
509 TRACE("(%p/%p)->(%p,%x,%p,%x)\n", iface, This, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
510 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
511 if (SUCCEEDED(hr)) {
512 hr = IMediaSeeking_SetPositions(seek, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
513 IMediaSeeking_Release(seek);
514 } else if (hr == VFW_E_NOT_CONNECTED)
515 hr = S_OK;
516 return hr;
517}
518
520{
523 HRESULT hr;
524 TRACE("(%p/%p)->(%p, %p)\n", iface, This, pCurrent, pStop);
525 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
526 if (SUCCEEDED(hr)) {
527 hr = IMediaSeeking_GetPositions(seek, pCurrent, pStop);
528 IMediaSeeking_Release(seek);
529 } else if (hr == VFW_E_NOT_CONNECTED) {
530 *pCurrent = 0;
531 *pStop = 0;
532 hr = S_OK;
533 }
534 return hr;
535}
536
538{
541 HRESULT hr;
542 TRACE("(%p/%p)->(%p,%p)\n", iface, This, pEarliest, pLatest);
543 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
544 if (SUCCEEDED(hr)) {
545 hr = IMediaSeeking_GetAvailable(seek, pEarliest, pLatest);
546 IMediaSeeking_Release(seek);
547 }
548 else
549 return E_NOTIMPL;
550 return hr;
551}
552
554{
557 HRESULT hr;
558 TRACE("(%p/%p)->(%e)\n", iface, This, dRate);
559 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
560 if (SUCCEEDED(hr)) {
561 hr = IMediaSeeking_SetRate(seek, dRate);
562 IMediaSeeking_Release(seek);
563 }
564 else
565 return E_NOTIMPL;
566 return hr;
567}
568
570{
573 HRESULT hr;
574 TRACE("(%p/%p)->(%p)\n", iface, This, dRate);
575 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
576 if (SUCCEEDED(hr)) {
577 hr = IMediaSeeking_GetRate(seek, dRate);
578 IMediaSeeking_Release(seek);
579 }
580 else
581 return E_NOTIMPL;
582 return hr;
583}
584
586{
589 HRESULT hr;
590 TRACE("(%p)\n", pPreroll);
591 hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek);
592 if (SUCCEEDED(hr)) {
593 hr = IMediaSeeking_GetPreroll(seek, pPreroll);
594 IMediaSeeking_Release(seek);
595 }
596 else
597 return E_NOTIMPL;
598 return hr;
599}
600
602{
604 EnterCriticalSection(&This->time_cs);
605 This->time_earliest = start;
606 This->timevalid = TRUE;
607 LeaveCriticalSection(&This->time_cs);
608 return S_OK;
609}
610
612{
614 EnterCriticalSection(&This->time_cs);
615 This->timevalid = FALSE;
616 LeaveCriticalSection(&This->time_cs);
617 return S_OK;
618}
619
621{
624 HRESULT hr;
625 hr = IMediaSeeking_GetStopPosition(&This->IMediaSeeking_iface, &time);
626 EnterCriticalSection(&This->time_cs);
627 if (SUCCEEDED(hr)) {
628 This->timevalid = TRUE;
629 This->time_earliest = time;
630 } else
631 This->timevalid = FALSE;
632 LeaveCriticalSection(&This->time_cs);
633 return hr;
634}
635
636static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl =
637{
658};
659
661{
663
664 TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
665
666 return SeekOuter_QueryInterface(This, riid, ppvObj);
667}
668
669static ULONG WINAPI MediaPositionPassThru_AddRef(IMediaPosition *iface)
670{
672
673 TRACE("(%p/%p)->()\n", iface, This);
674
675 return SeekOuter_AddRef(This);
676}
677
678static ULONG WINAPI MediaPositionPassThru_Release(IMediaPosition *iface)
679{
681
682 TRACE("(%p/%p)->()\n", iface, This);
683
684 return SeekOuter_Release(This);
685}
686
687static HRESULT WINAPI MediaPositionPassThru_GetTypeInfoCount(IMediaPosition *iface, UINT*pctinfo)
688{
690
691 return BaseDispatchImpl_GetTypeInfoCount(&This->baseDispatch, pctinfo);
692}
693
694static HRESULT WINAPI MediaPositionPassThru_GetTypeInfo(IMediaPosition *iface, UINT iTInfo, LCID lcid, ITypeInfo**ppTInfo)
695{
697
698 return BaseDispatchImpl_GetTypeInfo(&This->baseDispatch, &IID_NULL, iTInfo, lcid, ppTInfo);
699}
700
701static HRESULT WINAPI MediaPositionPassThru_GetIDsOfNames(IMediaPosition *iface, REFIID riid, LPOLESTR*rgszNames, UINT cNames, LCID lcid, DISPID*rgDispId)
702{
704
705 return BaseDispatchImpl_GetIDsOfNames(&This->baseDispatch, riid, rgszNames, cNames, lcid, rgDispId);
706}
707
708static HRESULT WINAPI MediaPositionPassThru_Invoke(IMediaPosition *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS*pDispParams, VARIANT*pVarResult, EXCEPINFO*pExepInfo, UINT*puArgErr)
709{
711 HRESULT hr = S_OK;
712 ITypeInfo *pTypeInfo;
713
714 hr = BaseDispatchImpl_GetTypeInfo(&This->baseDispatch, riid, 1, lcid, &pTypeInfo);
715 if (SUCCEEDED(hr))
716 {
717 hr = ITypeInfo_Invoke(pTypeInfo, &This->IMediaPosition_iface, dispIdMember, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
718 ITypeInfo_Release(pTypeInfo);
719 }
720
721 return hr;
722}
723
724static HRESULT WINAPI MediaPositionPassThru_get_Duration(IMediaPosition *iface, REFTIME *plength)
725{
727 IMediaPosition *pos;
728 HRESULT hr;
729
730 TRACE("(%p)\n", plength);
731
732 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
733 if (SUCCEEDED(hr)) {
734 hr = IMediaPosition_get_Duration(pos, plength);
735 IMediaPosition_Release(pos);
736 }
737 else
738 return E_NOTIMPL;
739 return hr;
740}
741
743{
745 IMediaPosition *pos;
746 HRESULT hr;
747
748 TRACE("(%s)\n", wine_dbgstr_longlong(llTime));
749
750 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
751 if (SUCCEEDED(hr)) {
752 hr = IMediaPosition_put_CurrentPosition(pos, llTime);
753 IMediaPosition_Release(pos);
754 }
755 else
756 return E_NOTIMPL;
757 return hr;
758}
759
761{
763 IMediaPosition *pos;
764 HRESULT hr;
765
766 TRACE("(%p)\n", pllTime);
767
768 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
769 if (SUCCEEDED(hr)) {
770 hr = IMediaPosition_get_CurrentPosition(pos, pllTime);
771 IMediaPosition_Release(pos);
772 }
773 else
774 return E_NOTIMPL;
775 return hr;
776}
777
778static HRESULT WINAPI MediaPositionPassThru_get_StopTime(IMediaPosition *iface, REFTIME *pllTime)
779{
781 IMediaPosition *pos;
782 HRESULT hr;
783
784 TRACE("(%p)\n", pllTime);
785
786 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
787 if (SUCCEEDED(hr)) {
788 hr = IMediaPosition_get_StopTime(pos, pllTime);
789 IMediaPosition_Release(pos);
790 }
791 else
792 return E_NOTIMPL;
793 return hr;
794}
795
796static HRESULT WINAPI MediaPositionPassThru_put_StopTime(IMediaPosition *iface, REFTIME llTime)
797{
799 IMediaPosition *pos;
800 HRESULT hr;
801
802 TRACE("(%s)\n", wine_dbgstr_longlong(llTime));
803
804 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
805 if (SUCCEEDED(hr)) {
806 hr = IMediaPosition_put_StopTime(pos, llTime);
807 IMediaPosition_Release(pos);
808 }
809 else
810 return E_NOTIMPL;
811 return hr;
812}
813
814static HRESULT WINAPI MediaPositionPassThru_get_PrerollTime(IMediaPosition *iface, REFTIME *pllTime)
815{
817 IMediaPosition *pos;
818 HRESULT hr;
819
820 TRACE("(%p)\n", pllTime);
821
822 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
823 if (SUCCEEDED(hr)) {
824 hr = IMediaPosition_get_PrerollTime(pos, pllTime);
825 IMediaPosition_Release(pos);
826 }
827 else
828 return E_NOTIMPL;
829 return hr;
830}
831
832static HRESULT WINAPI MediaPositionPassThru_put_PrerollTime(IMediaPosition *iface, REFTIME llTime)
833{
835 IMediaPosition *pos;
836 HRESULT hr;
837
838 TRACE("(%s)\n", wine_dbgstr_longlong(llTime));
839
840 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
841 if (SUCCEEDED(hr)) {
842 hr = IMediaPosition_put_PrerollTime(pos, llTime);
843 IMediaPosition_Release(pos);
844 }
845 else
846 return E_NOTIMPL;
847 return hr;
848}
849
850static HRESULT WINAPI MediaPositionPassThru_put_Rate(IMediaPosition *iface, double dRate)
851{
853 IMediaPosition *pos;
854 HRESULT hr;
855
856 TRACE("(%f)\n", dRate);
857
858 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
859 if (SUCCEEDED(hr)) {
860 hr = IMediaPosition_put_Rate(pos, dRate);
861 IMediaPosition_Release(pos);
862 }
863 else
864 return E_NOTIMPL;
865 return hr;
866}
867
868static HRESULT WINAPI MediaPositionPassThru_get_Rate(IMediaPosition *iface, double *pdRate)
869{
871 IMediaPosition *pos;
872 HRESULT hr;
873
874 TRACE("(%p)\n", pdRate);
875
876 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
877 if (SUCCEEDED(hr)) {
878 hr = IMediaPosition_get_Rate(pos, pdRate);
879 IMediaPosition_Release(pos);
880 }
881 else
882 return E_NOTIMPL;
883 return hr;
884}
885
886static HRESULT WINAPI MediaPositionPassThru_CanSeekForward(IMediaPosition *iface, LONG *pCanSeekForward)
887{
889 IMediaPosition *pos;
890 HRESULT hr;
891
892 TRACE("(%p)\n", pCanSeekForward);
893
894 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
895 if (SUCCEEDED(hr)) {
896 hr = IMediaPosition_CanSeekForward(pos, pCanSeekForward);
897 IMediaPosition_Release(pos);
898 }
899 else
900 return E_NOTIMPL;
901 return hr;
902}
903
904static HRESULT WINAPI MediaPositionPassThru_CanSeekBackward(IMediaPosition *iface, LONG *pCanSeekBackward)
905{
907 IMediaPosition *pos;
908 HRESULT hr;
909
910 TRACE("(%p)\n", pCanSeekBackward);
911
912 hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos);
913 if (SUCCEEDED(hr)) {
914 hr = IMediaPosition_CanSeekBackward(pos, pCanSeekBackward);
915 IMediaPosition_Release(pos);
916 }
917 else
918 return E_NOTIMPL;
919 return hr;
920}
921
922static const IMediaPositionVtbl IMediaPositionPassThru_Vtbl =
923{
942};
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
DOUBLE REFTIME
Definition: axcore.idl:57
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:111
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
FxIoTarget * pTarget
Definition: fxdeviceapi.cpp:97
GLuint start
Definition: gl.h:1545
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_guid
Definition: kernel32.h:35
__u16 time
Definition: mkdosfs.c:8
static LPOLESTR
Definition: stg_prop.c:27
static VARIANTARG static DISPID
Definition: ordinal.c:52
unsigned int UINT
Definition: ndis.h:50
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
long LONG
Definition: pedump.c:60
static HRESULT WINAPI MediaSeekingPassThru_GetAvailable(IMediaSeeking *iface, LONGLONG *pEarliest, LONGLONG *pLatest)
Definition: pospass.c:537
static HRESULT WINAPI MediaSeekingPassThru_GetPreroll(IMediaSeeking *iface, LONGLONG *pPreroll)
Definition: pospass.c:585
HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface)
Definition: pospass.c:611
static ULONG WINAPI SeekingPassThru_Release(ISeekingPassThru *iface)
Definition: pospass.c:201
static ULONG WINAPI SeekInner_Release(IUnknown *iface)
Definition: pospass.c:117
static HRESULT WINAPI SeekInner_QueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:76
static HRESULT WINAPI MediaSeekingPassThru_GetDuration(IMediaSeeking *iface, LONGLONG *pDuration)
Definition: pospass.c:428
static HRESULT WINAPI MediaPositionPassThru_GetTypeInfo(IMediaPosition *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: pospass.c:694
static HRESULT WINAPI MediaPositionPassThru_put_CurrentPosition(IMediaPosition *iface, REFTIME llTime)
Definition: pospass.c:742
static HRESULT WINAPI MediaPositionPassThru_get_Duration(IMediaPosition *iface, REFTIME *plength)
Definition: pospass.c:724
static HRESULT WINAPI MediaSeekingPassThru_IsFormatSupported(IMediaSeeking *iface, const GUID *pFormat)
Definition: pospass.c:348
static HRESULT WINAPI SeekingPassThru_QueryInterface(ISeekingPassThru *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:183
HRESULT WINAPI PosPassThru_Construct(IUnknown *pUnkOuter, LPVOID *ppPassThru)
Definition: pospass.c:249
HRESULT WINAPI RendererPosPassThru_EOS(IUnknown *iface)
Definition: pospass.c:620
static HRESULT WINAPI MediaPositionPassThru_put_StopTime(IMediaPosition *iface, REFTIME llTime)
Definition: pospass.c:796
static HRESULT SeekOuter_QueryInterface(PassThruImpl *This, REFIID riid, LPVOID *ppv)
Definition: pospass.c:141
static HRESULT WINAPI MediaPositionPassThru_Invoke(IMediaPosition *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExepInfo, UINT *puArgErr)
Definition: pospass.c:708
static HRESULT WINAPI MediaPositionPassThru_CanSeekForward(IMediaPosition *iface, LONG *pCanSeekForward)
Definition: pospass.c:886
HRESULT WINAPI CreatePosPassThru(IUnknown *pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru)
Definition: pospass.c:233
static ULONG WINAPI MediaPositionPassThru_Release(IMediaPosition *iface)
Definition: pospass.c:678
static HRESULT WINAPI MediaSeekingPassThru_GetCurrentPosition(IMediaSeeking *iface, LONGLONG *pCurrent)
Definition: pospass.c:460
static ULONG WINAPI SeekingPassThru_AddRef(ISeekingPassThru *iface)
Definition: pospass.c:192
static HRESULT WINAPI MediaPositionPassThru_GetIDsOfNames(IMediaPosition *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: pospass.c:701
static HRESULT WINAPI MediaPositionPassThru_get_Rate(IMediaPosition *iface, double *pdRate)
Definition: pospass.c:868
static PassThruImpl * impl_from_IUnknown_inner(IUnknown *iface)
Definition: pospass.c:56
static ULONG WINAPI SeekInner_AddRef(IUnknown *iface)
Definition: pospass.c:108
static HRESULT WINAPI MediaSeekingPassThru_ConvertTimeFormat(IMediaSeeking *iface, LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat)
Definition: pospass.c:488
static ULONG WINAPI MediaPositionPassThru_AddRef(IMediaPosition *iface)
Definition: pospass.c:669
static HRESULT WINAPI MediaSeekingPassThru_SetPositions(IMediaSeeking *iface, LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags)
Definition: pospass.c:504
static const ISeekingPassThruVtbl ISeekingPassThru_Vtbl
Definition: pospass.c:225
static HRESULT WINAPI MediaPositionPassThru_GetTypeInfoCount(IMediaPosition *iface, UINT *pctinfo)
Definition: pospass.c:687
static HRESULT WINAPI MediaSeekingPassThru_QueryPreferredFormat(IMediaSeeking *iface, GUID *pFormat)
Definition: pospass.c:364
static HRESULT WINAPI MediaPositionPassThru_get_CurrentPosition(IMediaPosition *iface, REFTIME *pllTime)
Definition: pospass.c:760
static HRESULT WINAPI MediaPositionPassThru_get_StopTime(IMediaPosition *iface, REFTIME *pllTime)
Definition: pospass.c:778
static HRESULT WINAPI MediaSeekingPassThru_IsUsingTimeFormat(IMediaSeeking *iface, const GUID *pFormat)
Definition: pospass.c:396
static HRESULT WINAPI MediaSeekingPassThru_GetStopPosition(IMediaSeeking *iface, LONGLONG *pStop)
Definition: pospass.c:444
static HRESULT WINAPI MediaPositionPassThru_get_PrerollTime(IMediaPosition *iface, REFTIME *pllTime)
Definition: pospass.c:814
static HRESULT WINAPI MediaSeekingPassThru_GetCapabilities(IMediaSeeking *iface, DWORD *pCapabilities)
Definition: pospass.c:316
static HRESULT WINAPI MediaPositionPassThru_put_PrerollTime(IMediaPosition *iface, REFTIME llTime)
Definition: pospass.c:832
static ULONG SeekOuter_AddRef(PassThruImpl *This)
Definition: pospass.c:169
static HRESULT WINAPI MediaSeekingPassThru_SetRate(IMediaSeeking *iface, double dRate)
Definition: pospass.c:553
static ULONG WINAPI MediaSeekingPassThru_AddRef(IMediaSeeking *iface)
Definition: pospass.c:284
static HRESULT WINAPI MediaPositionPassThru_CanSeekBackward(IMediaPosition *iface, LONG *pCanSeekBackward)
Definition: pospass.c:904
static PassThruImpl * impl_from_IMediaPosition(IMediaPosition *iface)
Definition: pospass.c:71
static HRESULT WINAPI MediaSeekingPassThru_GetTimeFormat(IMediaSeeking *iface, GUID *pFormat)
Definition: pospass.c:380
static ULONG SeekOuter_Release(PassThruImpl *This)
Definition: pospass.c:176
HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start)
Definition: pospass.c:601
static HRESULT WINAPI MediaSeekingPassThru_SetTimeFormat(IMediaSeeking *iface, const GUID *pFormat)
Definition: pospass.c:412
static HRESULT WINAPI MediaSeekingPassThru_CheckCapabilities(IMediaSeeking *iface, DWORD *pCapabilities)
Definition: pospass.c:332
static HRESULT WINAPI SeekingPassThru_Init(ISeekingPassThru *iface, BOOL renderer, IPin *pin)
Definition: pospass.c:210
static PassThruImpl * impl_from_ISeekingPassThru(ISeekingPassThru *iface)
Definition: pospass.c:61
static HRESULT WINAPI MediaSeekingPassThru_GetRate(IMediaSeeking *iface, double *dRate)
Definition: pospass.c:569
static HRESULT WINAPI MediaPositionPassThru_QueryInterface(IMediaPosition *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:660
static HRESULT get_connected(PassThruImpl *This, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:302
static HRESULT WINAPI MediaSeekingPassThru_QueryInterface(IMediaSeeking *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:275
static PassThruImpl * impl_from_IMediaSeeking(IMediaSeeking *iface)
Definition: pospass.c:66
static ULONG WINAPI MediaSeekingPassThru_Release(IMediaSeeking *iface)
Definition: pospass.c:293
static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl
Definition: pospass.c:35
static const IMediaPositionVtbl IMediaPositionPassThru_Vtbl
Definition: pospass.c:36
static const IUnknownVtbl IInner_VTable
Definition: pospass.c:133
static HRESULT WINAPI MediaSeekingPassThru_GetPositions(IMediaSeeking *iface, LONGLONG *pCurrent, LONGLONG *pStop)
Definition: pospass.c:519
static HRESULT WINAPI MediaPositionPassThru_put_Rate(IMediaPosition *iface, double dRate)
Definition: pospass.c:850
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
DWORD LCID
Definition: nls.h:13
int seek(void *fd, ulong off, int mode)
Definition: pe.c:51
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT WINAPI BaseDispatchImpl_GetTypeInfoCount(BaseDispatch *This, UINT *pctinfo)
Definition: dispatch.c:70
HRESULT WINAPI BaseDispatchImpl_GetIDsOfNames(BaseDispatch *This, REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid)
Definition: dispatch.c:52
HRESULT WINAPI BaseDispatch_Init(BaseDispatch *This, REFIID riid)
Definition: dispatch.c:30
HRESULT WINAPI BaseDispatch_Destroy(BaseDispatch *This)
Definition: dispatch.c:45
HRESULT WINAPI BaseDispatchImpl_GetTypeInfo(BaseDispatch *This, REFIID riid, UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
Definition: dispatch.c:59
BaseDispatch baseDispatch
Definition: pospass.c:43
LONG ref
Definition: pospass.c:45
BOOL bAggregatable
Definition: pospass.c:49
CRITICAL_SECTION time_cs
Definition: pospass.c:51
REFERENCE_TIME time_earliest
Definition: pospass.c:53
BOOL bUnkOuterValid
Definition: pospass.c:48
IUnknown IUnknown_inner
Definition: pospass.c:39
ISeekingPassThru ISeekingPassThru_iface
Definition: pospass.c:40
IUnknown * outer_unk
Definition: pospass.c:46
BOOL timevalid
Definition: pospass.c:52
IMediaPosition IMediaPosition_iface
Definition: pospass.c:42
BOOL renderer
Definition: pospass.c:50
IMediaSeeking IMediaSeeking_iface
Definition: pospass.c:41
IPin * pin
Definition: pospass.c:47
DWORD_PTR Spare[8/sizeof(DWORD_PTR)]
Definition: winbase.h:887
PCRITICAL_SECTION_DEBUG DebugInfo
Definition: winbase.h:894
Definition: regsvr.c:104
Definition: send.c:48
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
#define DWORD_PTR
Definition: treelist.c:76
int64_t LONGLONG
Definition: typedefs.h:68
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define VFW_E_NOT_CONNECTED
Definition: vfwmsgs.h:48
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
#define E_POINTER
Definition: winerror.h:2365