ReactOS  0.4.15-dev-344-g6808e40
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 
35 static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl;
36 static const IMediaPositionVtbl IMediaPositionPassThru_Vtbl;
37 
38 typedef struct PassThruImpl {
42  IMediaPosition IMediaPosition_iface;
44 
47  IPin * pin;
54 } PassThruImpl;
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 
71 static inline PassThruImpl *impl_from_IMediaPosition(IMediaPosition *iface)
72 {
73  return CONTAINING_RECORD(iface, PassThruImpl, IMediaPosition_iface);
74 }
75 
77  REFIID riid,
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 
133 static 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 
225 static const ISeekingPassThruVtbl ISeekingPassThru_Vtbl =
226 {
231 };
232 
233 HRESULT 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 
488 static 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 
504 static 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 
636 static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl =
637 {
658 };
659 
660 static HRESULT WINAPI MediaPositionPassThru_QueryInterface(IMediaPosition *iface, REFIID riid, LPVOID *ppvObj)
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 
669 static ULONG WINAPI MediaPositionPassThru_AddRef(IMediaPosition *iface)
670 {
672 
673  TRACE("(%p/%p)->()\n", iface, This);
674 
675  return SeekOuter_AddRef(This);
676 }
677 
678 static ULONG WINAPI MediaPositionPassThru_Release(IMediaPosition *iface)
679 {
681 
682  TRACE("(%p/%p)->()\n", iface, This);
683 
684  return SeekOuter_Release(This);
685 }
686 
687 static HRESULT WINAPI MediaPositionPassThru_GetTypeInfoCount(IMediaPosition *iface, UINT*pctinfo)
688 {
690 
691  return BaseDispatchImpl_GetTypeInfoCount(&This->baseDispatch, pctinfo);
692 }
693 
694 static 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 
701 static 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 
708 static 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 
724 static 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 
760 static HRESULT WINAPI MediaPositionPassThru_get_CurrentPosition(IMediaPosition *iface, REFTIME *pllTime)
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 
778 static 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 
796 static 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 
814 static 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 
832 static 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 
850 static 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 
868 static 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 
886 static 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 
904 static 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 
922 static const IMediaPositionVtbl IMediaPositionPassThru_Vtbl =
923 {
942 };
static HRESULT SeekOuter_QueryInterface(PassThruImpl *This, REFIID riid, LPVOID *ppv)
Definition: pospass.c:141
static HRESULT WINAPI MediaPositionPassThru_get_StopTime(IMediaPosition *iface, REFTIME *pllTime)
Definition: pospass.c:778
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define E_NOINTERFACE
Definition: winerror.h:2364
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LONG ref
Definition: pospass.c:45
#define DWORD_PTR
Definition: treelist.c:76
HRESULT hr
Definition: shlfolder.c:183
BOOL bAggregatable
Definition: pospass.c:49
REFIID riid
Definition: precomp.h:44
REFERENCE_TIME time_earliest
Definition: pospass.c:53
static HRESULT WINAPI MediaSeekingPassThru_GetPreroll(IMediaSeeking *iface, LONGLONG *pPreroll)
Definition: pospass.c:585
IPin * pin
Definition: pospass.c:47
static HRESULT WINAPI MediaPositionPassThru_QueryInterface(IMediaPosition *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:660
IUnknown IUnknown_inner
Definition: pospass.c:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT WINAPI BaseDispatch_Init(BaseDispatch *This, REFIID riid)
Definition: dispatch.c:30
HRESULT WINAPI CreatePosPassThru(IUnknown *pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru)
Definition: pospass.c:233
static HRESULT WINAPI MediaSeekingPassThru_IsFormatSupported(IMediaSeeking *iface, const GUID *pFormat)
Definition: pospass.c:348
static HRESULT WINAPI MediaSeekingPassThru_ConvertTimeFormat(IMediaSeeking *iface, LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat)
Definition: pospass.c:488
HRESULT WINAPI PosPassThru_Construct(IUnknown *pUnkOuter, LPVOID *ppPassThru)
Definition: pospass.c:249
DWORD LCID
Definition: nls.h:13
static HRESULT WINAPI MediaSeekingPassThru_QueryPreferredFormat(IMediaSeeking *iface, GUID *pFormat)
Definition: pospass.c:364
__u16 time
Definition: mkdosfs.c:366
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static LPOLESTR
Definition: stg_prop.c:27
#define E_FAIL
Definition: ddrawi.h:102
Definition: send.c:48
static HRESULT WINAPI MediaPositionPassThru_put_PrerollTime(IMediaPosition *iface, REFTIME llTime)
Definition: pospass.c:832
static PassThruImpl * impl_from_IUnknown_inner(IUnknown *iface)
Definition: pospass.c:56
Definition: regsvr.c:103
static HRESULT WINAPI SeekInner_QueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:76
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static HRESULT WINAPI MediaPositionPassThru_put_CurrentPosition(IMediaPosition *iface, REFTIME llTime)
Definition: pospass.c:742
HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface)
Definition: pospass.c:611
unsigned int BOOL
Definition: ntddk_ex.h:94
IMediaSeeking IMediaSeeking_iface
Definition: pospass.c:41
long LONG
Definition: pedump.c:60
static HRESULT WINAPI MediaSeekingPassThru_GetTimeFormat(IMediaSeeking *iface, GUID *pFormat)
Definition: pospass.c:380
BOOL timevalid
Definition: pospass.c:52
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:111
static HRESULT WINAPI MediaSeekingPassThru_SetTimeFormat(IMediaSeeking *iface, const GUID *pFormat)
Definition: pospass.c:412
BaseDispatch baseDispatch
Definition: pospass.c:43
static HRESULT WINAPI MediaSeekingPassThru_CheckCapabilities(IMediaSeeking *iface, DWORD *pCapabilities)
Definition: pospass.c:332
static ULONG WINAPI SeekInner_AddRef(IUnknown *iface)
Definition: pospass.c:108
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
smooth NULL
Definition: ftsmooth.c:416
static ULONG SeekOuter_Release(PassThruImpl *This)
Definition: pospass.c:176
static HRESULT WINAPI MediaPositionPassThru_GetTypeInfoCount(IMediaPosition *iface, UINT *pctinfo)
Definition: pospass.c:687
#define VFW_E_NOT_CONNECTED
Definition: vfwmsgs.h:48
static ULONG WINAPI SeekInner_Release(IUnknown *iface)
Definition: pospass.c:117
#define debugstr_guid
Definition: kernel32.h:35
static HRESULT WINAPI MediaSeekingPassThru_GetStopPosition(IMediaSeeking *iface, LONGLONG *pStop)
Definition: pospass.c:444
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 WINAPI BaseDispatchImpl_GetIDsOfNames(BaseDispatch *This, REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid)
Definition: dispatch.c:52
int64_t LONGLONG
Definition: typedefs.h:67
static HRESULT WINAPI MediaSeekingPassThru_GetCurrentPosition(IMediaSeeking *iface, LONGLONG *pCurrent)
Definition: pospass.c:460
static HRESULT WINAPI SeekingPassThru_Init(ISeekingPassThru *iface, BOOL renderer, IPin *pin)
Definition: pospass.c:210
static HRESULT WINAPI MediaPositionPassThru_CanSeekForward(IMediaPosition *iface, LONG *pCanSeekForward)
Definition: pospass.c:886
#define TRACE(s)
Definition: solgame.cpp:4
static HRESULT WINAPI MediaPositionPassThru_put_StopTime(IMediaPosition *iface, REFTIME llTime)
Definition: pospass.c:796
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
static HRESULT WINAPI MediaPositionPassThru_CanSeekBackward(IMediaPosition *iface, LONG *pCanSeekBackward)
Definition: pospass.c:904
static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl
Definition: pospass.c:35
LONG HRESULT
Definition: typedefs.h:78
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:6
BOOL bUnkOuterValid
Definition: pospass.c:48
unsigned short WORD
Definition: ntddk_ex.h:93
static ULONG WINAPI MediaPositionPassThru_AddRef(IMediaPosition *iface)
Definition: pospass.c:669
unsigned long DWORD
Definition: ntddk_ex.h:95
static HRESULT WINAPI MediaSeekingPassThru_GetDuration(IMediaSeeking *iface, LONGLONG *pDuration)
Definition: pospass.c:428
HRESULT WINAPI BaseDispatchImpl_GetTypeInfo(BaseDispatch *This, REFIID riid, UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
Definition: dispatch.c:59
CRITICAL_SECTION time_cs
Definition: pospass.c:51
static ULONG WINAPI MediaSeekingPassThru_Release(IMediaSeeking *iface)
Definition: pospass.c:293
PCRITICAL_SECTION_DEBUG DebugInfo
Definition: winbase.h:872
BOOL renderer
Definition: pospass.c:50
struct PassThruImpl PassThruImpl
static ULONG SeekOuter_AddRef(PassThruImpl *This)
Definition: pospass.c:169
static HRESULT WINAPI MediaPositionPassThru_put_Rate(IMediaPosition *iface, double dRate)
Definition: pospass.c:850
int seek(void *fd, ulong off, int mode)
Definition: pe.c:51
HRESULT WINAPI BaseDispatchImpl_GetTypeInfoCount(BaseDispatch *This, UINT *pctinfo)
Definition: dispatch.c:70
#define IID_NULL
Definition: guiddef.h:98
static PassThruImpl * impl_from_IMediaSeeking(IMediaSeeking *iface)
Definition: pospass.c:66
#define InterlockedDecrement
Definition: armddk.h:52
static HRESULT WINAPI MediaSeekingPassThru_SetRate(IMediaSeeking *iface, double dRate)
Definition: pospass.c:553
static HRESULT WINAPI MediaSeekingPassThru_GetPositions(IMediaSeeking *iface, LONGLONG *pCurrent, LONGLONG *pStop)
Definition: pospass.c:519
IUnknown * outer_unk
Definition: pospass.c:46
static HRESULT WINAPI MediaSeekingPassThru_QueryInterface(IMediaSeeking *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:275
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI RendererPosPassThru_EOS(IUnknown *iface)
Definition: pospass.c:620
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:534
WINE_DEFAULT_DEBUG_CHANNEL(strmbase)
struct stdole::EXCEPINFO EXCEPINFO
static VARIANTARG static DISPID
Definition: ordinal.c:49
#define S_OK
Definition: intsafe.h:59
static HRESULT get_connected(PassThruImpl *This, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:302
static HRESULT WINAPI MediaPositionPassThru_GetIDsOfNames(IMediaPosition *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: pospass.c:701
#define InterlockedIncrement
Definition: armddk.h:53
static HRESULT WINAPI MediaPositionPassThru_get_CurrentPosition(IMediaPosition *iface, REFTIME *pllTime)
Definition: pospass.c:760
static HRESULT WINAPI MediaSeekingPassThru_SetPositions(IMediaSeeking *iface, LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags)
Definition: pospass.c:504
GLuint start
Definition: gl.h:1545
Definition: axcore.idl:91
static ULONG WINAPI SeekingPassThru_Release(ISeekingPassThru *iface)
Definition: pospass.c:201
#define E_NOTIMPL
Definition: ddrawi.h:99
static ULONG WINAPI MediaSeekingPassThru_AddRef(IMediaSeeking *iface)
Definition: pospass.c:284
static HRESULT WINAPI MediaSeekingPassThru_GetRate(IMediaSeeking *iface, double *dRate)
Definition: pospass.c:569
HRESULT WINAPI BaseDispatch_Destroy(BaseDispatch *This)
Definition: dispatch.c:45
static HRESULT WINAPI MediaPositionPassThru_get_Duration(IMediaPosition *iface, REFTIME *plength)
Definition: pospass.c:724
unsigned int UINT
Definition: ndis.h:50
static HRESULT WINAPI MediaPositionPassThru_get_PrerollTime(IMediaPosition *iface, REFTIME *pllTime)
Definition: pospass.c:814
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
static const ISeekingPassThruVtbl ISeekingPassThru_Vtbl
Definition: pospass.c:225
HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start)
Definition: pospass.c:601
IMediaPosition IMediaPosition_iface
Definition: pospass.c:42
struct stdole::DISPPARAMS DISPPARAMS
unsigned int ULONG
Definition: retypes.h:1
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:41
REFTIME_DEFINED typedef DOUBLE REFTIME
Definition: axcore.idl:56
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
ISeekingPassThru ISeekingPassThru_iface
Definition: pospass.c:40
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
static PassThruImpl * impl_from_ISeekingPassThru(ISeekingPassThru *iface)
Definition: pospass.c:61
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static HRESULT WINAPI MediaSeekingPassThru_GetAvailable(IMediaSeeking *iface, LONGLONG *pEarliest, LONGLONG *pLatest)
Definition: pospass.c:537
static ULONG WINAPI SeekingPassThru_AddRef(ISeekingPassThru *iface)
Definition: pospass.c:192
#define E_POINTER
Definition: winerror.h:2365
static const IMediaPositionVtbl IMediaPositionPassThru_Vtbl
Definition: pospass.c:36
static const IUnknownVtbl IInner_VTable
Definition: pospass.c:133
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
static ULONG WINAPI MediaPositionPassThru_Release(IMediaPosition *iface)
Definition: pospass.c:678
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
static HRESULT WINAPI MediaSeekingPassThru_GetCapabilities(IMediaSeeking *iface, DWORD *pCapabilities)
Definition: pospass.c:316
#define SUCCEEDED(hr)
Definition: intsafe.h:57
DWORD_PTR Spare[8/sizeof(DWORD_PTR)]
Definition: winbase.h:865
static HRESULT WINAPI SeekingPassThru_QueryInterface(ISeekingPassThru *iface, REFIID riid, LPVOID *ppvObj)
Definition: pospass.c:183
static PassThruImpl * impl_from_IMediaPosition(IMediaPosition *iface)
Definition: pospass.c:71
static HRESULT WINAPI MediaPositionPassThru_GetTypeInfo(IMediaPosition *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: pospass.c:694
static HRESULT WINAPI MediaSeekingPassThru_IsUsingTimeFormat(IMediaSeeking *iface, const GUID *pFormat)
Definition: pospass.c:396
static HRESULT WINAPI MediaPositionPassThru_get_Rate(IMediaPosition *iface, double *pdRate)
Definition: pospass.c:868