When including 'wine/port.h', include it first.
[wine] / dlls / quartz / seekpass.c
1 /*
2  *      Implementation of CLSID_SeekingPassThru
3  *
4  *      FIXME - not tested yet.
5  *
6  * hidenori@a2.ctktv.ne.jp
7  */
8
9 #include "config.h"
10
11 #include "windef.h"
12 #include "winbase.h"
13 #include "wingdi.h"
14 #include "winuser.h"
15 #include "winerror.h"
16 #include "strmif.h"
17 #include "control.h"
18 #include "uuids.h"
19
20 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(quartz);
22
23 #include "quartz_private.h"
24 #include "seekpass.h"
25
26
27 /***************************************************************************
28  *
29  *      CSeekingPassThru::ISeekingPassThru
30  *
31  */
32
33 static HRESULT WINAPI
34 ISeekingPassThru_fnQueryInterface(ISeekingPassThru* iface,REFIID riid,void** ppobj)
35 {
36         CSeekingPassThru_THIS(iface,seekpass);
37
38         TRACE("(%p)->()\n",This);
39
40         return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
41 }
42
43 static ULONG WINAPI
44 ISeekingPassThru_fnAddRef(ISeekingPassThru* iface)
45 {
46         CSeekingPassThru_THIS(iface,seekpass);
47
48         TRACE("(%p)->()\n",This);
49
50         return IUnknown_AddRef(This->unk.punkControl);
51 }
52
53 static ULONG WINAPI
54 ISeekingPassThru_fnRelease(ISeekingPassThru* iface)
55 {
56         CSeekingPassThru_THIS(iface,seekpass);
57
58         TRACE("(%p)->()\n",This);
59
60         return IUnknown_Release(This->unk.punkControl);
61 }
62
63 static HRESULT WINAPI
64 ISeekingPassThru_fnInit(ISeekingPassThru* iface,BOOL bRendering,IPin* pPin)
65 {
66         CSeekingPassThru_THIS(iface,seekpass);
67
68         FIXME("(%p)->(%d,%p) not tested!\n",This,bRendering,pPin);
69
70         if ( pPin == NULL )
71                 return E_POINTER;
72
73         /* Why is 'bRendering' given as an argument?? */
74         EnterCriticalSection( &This->cs );
75
76         if ( This->passthru.pPin != NULL )
77                 IPin_Release( This->passthru.pPin );
78         This->passthru.pPin = pPin; IPin_AddRef( pPin );
79
80         LeaveCriticalSection( &This->cs );
81
82         return NOERROR;
83 }
84
85
86 static ICOM_VTABLE(ISeekingPassThru) iseekingpassthru =
87 {
88         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
89         /* IUnknown fields */
90         ISeekingPassThru_fnQueryInterface,
91         ISeekingPassThru_fnAddRef,
92         ISeekingPassThru_fnRelease,
93         /* ISeekingPassThru fields */
94         ISeekingPassThru_fnInit,
95 };
96
97 static
98 HRESULT CSeekingPassThru_InitISeekingPassThru(CSeekingPassThru* This)
99 {
100         TRACE("(%p)\n",This);
101         ICOM_VTBL(&This->seekpass) = &iseekingpassthru;
102         This->passthru.punk = This->unk.punkControl;
103         This->passthru.pPin = NULL;
104         InitializeCriticalSection( &This->cs );
105
106         return NOERROR;
107 }
108
109 static
110 void CSeekingPassThru_UninitISeekingPassThru(CSeekingPassThru* This)
111 {
112         TRACE("(%p)\n",This);
113         if ( This->passthru.pPin != NULL )
114         {
115                 IPin_Release( This->passthru.pPin );
116                 This->passthru.pPin = NULL;
117         }
118         DeleteCriticalSection( &This->cs );
119 }
120
121 /***************************************************************************
122  *
123  *      new/delete for CLSID_SeekingPassThru.
124  *
125  */
126
127 /* can I use offsetof safely? - FIXME? */
128 static QUARTZ_IFEntry IFEntries[] =
129 {
130   { &IID_ISeekingPassThru, offsetof(CSeekingPassThru,seekpass)-offsetof(CSeekingPassThru,unk) },
131   { &IID_IMediaPosition, offsetof(CSeekingPassThru,passthru.mpos)-offsetof(CSeekingPassThru,unk) },
132   { &IID_IMediaSeeking, offsetof(CSeekingPassThru,passthru.mseek)-offsetof(CSeekingPassThru,unk) },
133 };
134
135
136 static void QUARTZ_DestroySeekingPassThru(IUnknown* punk)
137 {
138         CSeekingPassThru_THIS(punk,unk);
139
140         CSeekingPassThru_UninitISeekingPassThru(This);
141 }
142
143 HRESULT QUARTZ_CreateSeekingPassThru(IUnknown* punkOuter,void** ppobj)
144 {
145         CSeekingPassThru*       This;
146         HRESULT hr;
147
148         TRACE("(%p,%p)\n",punkOuter,ppobj);
149
150         This = (CSeekingPassThru*)QUARTZ_AllocObj( sizeof(CSeekingPassThru) );
151         if ( This == NULL )
152                 return E_OUTOFMEMORY;
153
154         QUARTZ_IUnkInit( &This->unk, punkOuter );
155         hr = CSeekingPassThru_InitISeekingPassThru(This);
156         if ( FAILED(hr) )
157         {
158                 QUARTZ_FreeObj( This );
159                 return hr;
160         }
161
162         This->unk.pEntries = IFEntries;
163         This->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
164         This->unk.pOnFinalRelease = QUARTZ_DestroySeekingPassThru;
165
166         *ppobj = (void*)(&This->unk);
167
168         return S_OK;
169 }
170
171
172
173
174 /***************************************************************************
175  *
176  *      CPassThruImpl Helper methods.
177  *
178  */
179
180 static
181 HRESULT CPassThruImpl_GetConnected( CPassThruImpl* pImpl, IPin** ppPin )
182 {
183         return IPin_ConnectedTo( pImpl->pPin, ppPin );
184 }
185
186 HRESULT CPassThruImpl_QueryPosPass(
187         CPassThruImpl* pImpl, IMediaPosition** ppPosition )
188 {
189         IPin*   pPin;
190         HRESULT hr;
191
192         hr = CPassThruImpl_GetConnected( pImpl, &pPin );
193         if ( FAILED(hr) )
194                 return hr;
195         hr = IPin_QueryInterface(pPin,&IID_IMediaPosition,(void**)ppPosition);
196         IPin_Release(pPin);
197
198         return hr;
199 }
200
201 HRESULT CPassThruImpl_QuerySeekPass(
202         CPassThruImpl* pImpl, IMediaSeeking** ppSeeking )
203 {
204         IPin*   pPin;
205         HRESULT hr;
206
207         hr = CPassThruImpl_GetConnected( pImpl, &pPin );
208         if ( FAILED(hr) )
209                 return hr;
210         hr = IPin_QueryInterface(pPin,&IID_IMediaSeeking,(void**)ppSeeking);
211         IPin_Release(pPin);
212
213         return hr;
214 }
215
216 /***************************************************************************
217  *
218  *      An implementation for CPassThruImpl::IMediaPosition.
219  *
220  */
221
222
223 #define QUERYPOSPASS \
224         IMediaPosition* pPos = NULL; \
225         HRESULT hr; \
226         hr = CPassThruImpl_QueryPosPass( This, &pPos ); \
227         if ( FAILED(hr) ) return hr;
228
229 static HRESULT WINAPI
230 IMediaPosition_fnQueryInterface(IMediaPosition* iface,REFIID riid,void** ppobj)
231 {
232         CPassThruImpl_THIS(iface,mpos);
233
234         TRACE("(%p)->()\n",This);
235
236         return IUnknown_QueryInterface(This->punk,riid,ppobj);
237 }
238
239 static ULONG WINAPI
240 IMediaPosition_fnAddRef(IMediaPosition* iface)
241 {
242         CPassThruImpl_THIS(iface,mpos);
243
244         TRACE("(%p)->()\n",This);
245
246         return IUnknown_AddRef(This->punk);
247 }
248
249 static ULONG WINAPI
250 IMediaPosition_fnRelease(IMediaPosition* iface)
251 {
252         CPassThruImpl_THIS(iface,mpos);
253
254         TRACE("(%p)->()\n",This);
255
256         return IUnknown_Release(This->punk);
257 }
258
259 static HRESULT WINAPI
260 IMediaPosition_fnGetTypeInfoCount(IMediaPosition* iface,UINT* pcTypeInfo)
261 {
262         CPassThruImpl_THIS(iface,mpos);
263
264         FIXME("(%p)->() stub!\n",This);
265
266         return E_NOTIMPL;
267 }
268
269 static HRESULT WINAPI
270 IMediaPosition_fnGetTypeInfo(IMediaPosition* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
271 {
272         CPassThruImpl_THIS(iface,mpos);
273
274         FIXME("(%p)->() stub!\n",This);
275
276         return E_NOTIMPL;
277 }
278
279 static HRESULT WINAPI
280 IMediaPosition_fnGetIDsOfNames(IMediaPosition* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
281 {
282         CPassThruImpl_THIS(iface,mpos);
283
284         FIXME("(%p)->() stub!\n",This);
285
286         return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI
290 IMediaPosition_fnInvoke(IMediaPosition* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
291 {
292         CPassThruImpl_THIS(iface,mpos);
293
294         FIXME("(%p)->() stub!\n",This);
295
296         return E_NOTIMPL;
297 }
298
299
300 static HRESULT WINAPI
301 IMediaPosition_fnget_Duration(IMediaPosition* iface,REFTIME* prefTime)
302 {
303         CPassThruImpl_THIS(iface,mpos);
304         QUERYPOSPASS
305
306         TRACE("(%p)->()\n",This);
307
308         return IMediaPosition_get_Duration(pPos,prefTime);
309 }
310
311 static HRESULT WINAPI
312 IMediaPosition_fnput_CurrentPosition(IMediaPosition* iface,REFTIME refTime)
313 {
314         CPassThruImpl_THIS(iface,mpos);
315         QUERYPOSPASS
316
317         TRACE("(%p)->()\n",This);
318
319         return IMediaPosition_put_CurrentPosition(pPos,refTime);
320 }
321
322 static HRESULT WINAPI
323 IMediaPosition_fnget_CurrentPosition(IMediaPosition* iface,REFTIME* prefTime)
324 {
325         CPassThruImpl_THIS(iface,mpos);
326         QUERYPOSPASS
327
328         TRACE("(%p)->()\n",This);
329
330         return IMediaPosition_get_CurrentPosition(pPos,prefTime);
331 }
332
333 static HRESULT WINAPI
334 IMediaPosition_fnget_StopTime(IMediaPosition* iface,REFTIME* prefTime)
335 {
336         CPassThruImpl_THIS(iface,mpos);
337         QUERYPOSPASS
338
339         TRACE("(%p)->()\n",This);
340
341         return IMediaPosition_get_StopTime(pPos,prefTime);
342 }
343
344 static HRESULT WINAPI
345 IMediaPosition_fnput_StopTime(IMediaPosition* iface,REFTIME refTime)
346 {
347         CPassThruImpl_THIS(iface,mpos);
348         QUERYPOSPASS
349
350         TRACE("(%p)->()\n",This);
351
352         return IMediaPosition_put_StopTime(pPos,refTime);
353 }
354
355 static HRESULT WINAPI
356 IMediaPosition_fnget_PrerollTime(IMediaPosition* iface,REFTIME* prefTime)
357 {
358         CPassThruImpl_THIS(iface,mpos);
359         QUERYPOSPASS
360
361         TRACE("(%p)->()\n",This);
362
363         return IMediaPosition_get_PrerollTime(pPos,prefTime);
364 }
365
366 static HRESULT WINAPI
367 IMediaPosition_fnput_PrerollTime(IMediaPosition* iface,REFTIME refTime)
368 {
369         CPassThruImpl_THIS(iface,mpos);
370         QUERYPOSPASS
371
372         TRACE("(%p)->()\n",This);
373
374         return IMediaPosition_put_PrerollTime(pPos,refTime);
375 }
376
377 static HRESULT WINAPI
378 IMediaPosition_fnput_Rate(IMediaPosition* iface,double dblRate)
379 {
380         CPassThruImpl_THIS(iface,mpos);
381         QUERYPOSPASS
382
383         TRACE("(%p)->()\n",This);
384
385         return IMediaPosition_put_Rate(pPos,dblRate);
386 }
387
388 static HRESULT WINAPI
389 IMediaPosition_fnget_Rate(IMediaPosition* iface,double* pdblRate)
390 {
391         CPassThruImpl_THIS(iface,mpos);
392         QUERYPOSPASS
393
394         TRACE("(%p)->()\n",This);
395
396         return IMediaPosition_get_Rate(pPos,pdblRate);
397 }
398
399 static HRESULT WINAPI
400 IMediaPosition_fnCanSeekForward(IMediaPosition* iface,LONG* pCanSeek)
401 {
402         CPassThruImpl_THIS(iface,mpos);
403         QUERYPOSPASS
404
405         TRACE("(%p)->()\n",This);
406
407         return IMediaPosition_CanSeekForward(pPos,pCanSeek);
408 }
409
410 static HRESULT WINAPI
411 IMediaPosition_fnCanSeekBackward(IMediaPosition* iface,LONG* pCanSeek)
412 {
413         CPassThruImpl_THIS(iface,mpos);
414         QUERYPOSPASS
415
416         TRACE("(%p)->()\n",This);
417
418         return IMediaPosition_CanSeekBackward(pPos,pCanSeek);
419 }
420
421
422 static ICOM_VTABLE(IMediaPosition) impos =
423 {
424         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
425         /* IUnknown fields */
426         IMediaPosition_fnQueryInterface,
427         IMediaPosition_fnAddRef,
428         IMediaPosition_fnRelease,
429         /* IDispatch fields */
430         IMediaPosition_fnGetTypeInfoCount,
431         IMediaPosition_fnGetTypeInfo,
432         IMediaPosition_fnGetIDsOfNames,
433         IMediaPosition_fnInvoke,
434         /* IMediaPosition fields */
435         IMediaPosition_fnget_Duration,
436         IMediaPosition_fnput_CurrentPosition,
437         IMediaPosition_fnget_CurrentPosition,
438         IMediaPosition_fnget_StopTime,
439         IMediaPosition_fnput_StopTime,
440         IMediaPosition_fnget_PrerollTime,
441         IMediaPosition_fnput_PrerollTime,
442         IMediaPosition_fnput_Rate,
443         IMediaPosition_fnget_Rate,
444         IMediaPosition_fnCanSeekForward,
445         IMediaPosition_fnCanSeekBackward,
446 };
447
448
449 HRESULT CPassThruImpl_InitIMediaPosition( CPassThruImpl* pImpl )
450 {
451         TRACE("(%p)\n",pImpl);
452         ICOM_VTBL(&pImpl->mpos) = &impos;
453
454         return NOERROR;
455 }
456
457 void CPassThruImpl_UninitIMediaPosition( CPassThruImpl* pImpl )
458 {
459         TRACE("(%p)\n",pImpl);
460 }
461
462 #undef QUERYPOSPASS
463
464
465 /***************************************************************************
466  *
467  *      An implementation for CPassThruImpl::IMediaSeeking.
468  *
469  */
470
471 #define QUERYSEEKPASS \
472         IMediaSeeking* pSeek = NULL; \
473         HRESULT hr; \
474         hr = CPassThruImpl_QuerySeekPass( This, &pSeek ); \
475         if ( FAILED(hr) ) return hr;
476
477
478 static HRESULT WINAPI
479 IMediaSeeking_fnQueryInterface(IMediaSeeking* iface,REFIID riid,void** ppobj)
480 {
481         CPassThruImpl_THIS(iface,mseek);
482
483         TRACE("(%p)->()\n",This);
484
485         return IUnknown_QueryInterface(This->punk,riid,ppobj);
486 }
487
488 static ULONG WINAPI
489 IMediaSeeking_fnAddRef(IMediaSeeking* iface)
490 {
491         CPassThruImpl_THIS(iface,mseek);
492
493         TRACE("(%p)->()\n",This);
494
495         return IUnknown_AddRef(This->punk);
496 }
497
498 static ULONG WINAPI
499 IMediaSeeking_fnRelease(IMediaSeeking* iface)
500 {
501         CPassThruImpl_THIS(iface,mseek);
502
503         TRACE("(%p)->()\n",This);
504
505         return IUnknown_Release(This->punk);
506 }
507
508
509 static HRESULT WINAPI
510 IMediaSeeking_fnGetCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
511 {
512         CPassThruImpl_THIS(iface,mseek);
513         QUERYSEEKPASS
514
515         TRACE("(%p)->()\n",This);
516
517         return IMediaSeeking_GetCapabilities(pSeek,pdwCaps);
518 }
519
520 static HRESULT WINAPI
521 IMediaSeeking_fnCheckCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
522 {
523         CPassThruImpl_THIS(iface,mseek);
524         QUERYSEEKPASS
525
526         TRACE("(%p)->()\n",This);
527
528         return IMediaSeeking_CheckCapabilities(pSeek,pdwCaps);
529 }
530
531 static HRESULT WINAPI
532 IMediaSeeking_fnIsFormatSupported(IMediaSeeking* iface,const GUID* pidFormat)
533 {
534         CPassThruImpl_THIS(iface,mseek);
535         QUERYSEEKPASS
536
537         TRACE("(%p)->()\n",This);
538
539         return IMediaSeeking_IsFormatSupported(pSeek,pidFormat);
540 }
541
542 static HRESULT WINAPI
543 IMediaSeeking_fnQueryPreferredFormat(IMediaSeeking* iface,GUID* pidFormat)
544 {
545         CPassThruImpl_THIS(iface,mseek);
546         QUERYSEEKPASS
547
548         TRACE("(%p)->()\n",This);
549
550         return IMediaSeeking_QueryPreferredFormat(pSeek,pidFormat);
551 }
552
553 static HRESULT WINAPI
554 IMediaSeeking_fnGetTimeFormat(IMediaSeeking* iface,GUID* pidFormat)
555 {
556         CPassThruImpl_THIS(iface,mseek);
557         QUERYSEEKPASS
558
559         TRACE("(%p)->()\n",This);
560
561         return IMediaSeeking_GetTimeFormat(pSeek,pidFormat);
562 }
563
564 static HRESULT WINAPI
565 IMediaSeeking_fnIsUsingTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
566 {
567         CPassThruImpl_THIS(iface,mseek);
568         QUERYSEEKPASS
569
570         TRACE("(%p)->()\n",This);
571
572         return IMediaSeeking_IsUsingTimeFormat(pSeek,pidFormat);
573 }
574
575 static HRESULT WINAPI
576 IMediaSeeking_fnSetTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
577 {
578         CPassThruImpl_THIS(iface,mseek);
579         QUERYSEEKPASS
580
581         TRACE("(%p)->()\n",This);
582
583         return IMediaSeeking_SetTimeFormat(pSeek,pidFormat);
584 }
585
586 static HRESULT WINAPI
587 IMediaSeeking_fnGetDuration(IMediaSeeking* iface,LONGLONG* pllDuration)
588 {
589         CPassThruImpl_THIS(iface,mseek);
590         QUERYSEEKPASS
591
592         TRACE("(%p)->()\n",This);
593
594         return IMediaSeeking_GetDuration(pSeek,pllDuration);
595 }
596
597 static HRESULT WINAPI
598 IMediaSeeking_fnGetStopPosition(IMediaSeeking* iface,LONGLONG* pllPos)
599 {
600         CPassThruImpl_THIS(iface,mseek);
601         QUERYSEEKPASS
602
603         TRACE("(%p)->()\n",This);
604
605         return IMediaSeeking_GetStopPosition(pSeek,pllPos);
606 }
607
608 static HRESULT WINAPI
609 IMediaSeeking_fnGetCurrentPosition(IMediaSeeking* iface,LONGLONG* pllPos)
610 {
611         CPassThruImpl_THIS(iface,mseek);
612         QUERYSEEKPASS
613
614         TRACE("(%p)->()\n",This);
615
616         return IMediaSeeking_GetCurrentPosition(pSeek,pllPos);
617 }
618
619 static HRESULT WINAPI
620 IMediaSeeking_fnConvertTimeFormat(IMediaSeeking* iface,LONGLONG* pllOut,const GUID* pidFmtOut,LONGLONG llIn,const GUID* pidFmtIn)
621 {
622         CPassThruImpl_THIS(iface,mseek);
623         QUERYSEEKPASS
624
625         TRACE("(%p)->()\n",This);
626
627         return IMediaSeeking_ConvertTimeFormat(pSeek,pllOut,pidFmtOut,llIn,pidFmtIn);
628 }
629
630 static HRESULT WINAPI
631 IMediaSeeking_fnSetPositions(IMediaSeeking* iface,LONGLONG* pllCur,DWORD dwCurFlags,LONGLONG* pllStop,DWORD dwStopFlags)
632 {
633         CPassThruImpl_THIS(iface,mseek);
634         QUERYSEEKPASS
635
636         TRACE("(%p)->()\n",This);
637
638         return IMediaSeeking_SetPositions(pSeek,pllCur,dwCurFlags,pllStop,dwStopFlags);
639 }
640
641 static HRESULT WINAPI
642 IMediaSeeking_fnGetPositions(IMediaSeeking* iface,LONGLONG* pllCur,LONGLONG* pllStop)
643 {
644         CPassThruImpl_THIS(iface,mseek);
645         QUERYSEEKPASS
646
647         TRACE("(%p)->()\n",This);
648
649         return IMediaSeeking_GetPositions(pSeek,pllCur,pllStop);
650 }
651
652 static HRESULT WINAPI
653 IMediaSeeking_fnGetAvailable(IMediaSeeking* iface,LONGLONG* pllFirst,LONGLONG* pllLast)
654 {
655         CPassThruImpl_THIS(iface,mseek);
656         QUERYSEEKPASS
657
658         TRACE("(%p)->()\n",This);
659
660         return IMediaSeeking_GetAvailable(pSeek,pllFirst,pllLast);
661 }
662
663 static HRESULT WINAPI
664 IMediaSeeking_fnSetRate(IMediaSeeking* iface,double dblRate)
665 {
666         CPassThruImpl_THIS(iface,mseek);
667         QUERYSEEKPASS
668
669         TRACE("(%p)->()\n",This);
670
671         return IMediaSeeking_SetRate(pSeek,dblRate);
672 }
673
674 static HRESULT WINAPI
675 IMediaSeeking_fnGetRate(IMediaSeeking* iface,double* pdblRate)
676 {
677         CPassThruImpl_THIS(iface,mseek);
678         QUERYSEEKPASS
679
680         TRACE("(%p)->()\n",This);
681
682         return IMediaSeeking_GetRate(pSeek,pdblRate);
683 }
684
685 static HRESULT WINAPI
686 IMediaSeeking_fnGetPreroll(IMediaSeeking* iface,LONGLONG* pllPreroll)
687 {
688         CPassThruImpl_THIS(iface,mseek);
689         QUERYSEEKPASS
690
691         TRACE("(%p)->()\n",This);
692
693         return IMediaSeeking_GetPreroll(pSeek,pllPreroll);
694 }
695
696
697
698
699 static ICOM_VTABLE(IMediaSeeking) imseek =
700 {
701         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
702         /* IUnknown fields */
703         IMediaSeeking_fnQueryInterface,
704         IMediaSeeking_fnAddRef,
705         IMediaSeeking_fnRelease,
706         /* IMediaSeeking fields */
707         IMediaSeeking_fnGetCapabilities,
708         IMediaSeeking_fnCheckCapabilities,
709         IMediaSeeking_fnIsFormatSupported,
710         IMediaSeeking_fnQueryPreferredFormat,
711         IMediaSeeking_fnGetTimeFormat,
712         IMediaSeeking_fnIsUsingTimeFormat,
713         IMediaSeeking_fnSetTimeFormat,
714         IMediaSeeking_fnGetDuration,
715         IMediaSeeking_fnGetStopPosition,
716         IMediaSeeking_fnGetCurrentPosition,
717         IMediaSeeking_fnConvertTimeFormat,
718         IMediaSeeking_fnSetPositions,
719         IMediaSeeking_fnGetPositions,
720         IMediaSeeking_fnGetAvailable,
721         IMediaSeeking_fnSetRate,
722         IMediaSeeking_fnGetRate,
723         IMediaSeeking_fnGetPreroll,
724 };
725
726
727
728 HRESULT CPassThruImpl_InitIMediaSeeking( CPassThruImpl* pImpl )
729 {
730         TRACE("(%p)\n",pImpl);
731         ICOM_VTBL(&pImpl->mseek) = &imseek;
732
733         return NOERROR;
734 }
735
736 void CPassThruImpl_UninitIMediaSeeking( CPassThruImpl* pImpl )
737 {
738         TRACE("(%p)\n",pImpl);
739 }
740
741 #undef QUERYSEEKPASS