2 * Implementation of CLSID_FilterGraph.
4 * hidenori@a2.ctktv.ne.jp
14 #include "wine/obj_base.h"
15 #include "wine/obj_oleaut.h"
20 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(quartz
);
23 #include "quartz_private.h"
26 /* can I use offsetof safely? - FIXME? */
27 static QUARTZ_IFEntry IFEntries
[] =
29 { &IID_IPersist
, offsetof(CFilterGraph
,persist
)-offsetof(CFilterGraph
,unk
) },
30 { &IID_IDispatch
, offsetof(CFilterGraph
,disp
)-offsetof(CFilterGraph
,unk
) },
31 { &IID_IFilterGraph
, offsetof(CFilterGraph
,fgraph
)-offsetof(CFilterGraph
,unk
) },
32 { &IID_IGraphBuilder
, offsetof(CFilterGraph
,fgraph
)-offsetof(CFilterGraph
,unk
) },
33 { &IID_IFilterGraph2
, offsetof(CFilterGraph
,fgraph
)-offsetof(CFilterGraph
,unk
) },
34 { &IID_IGraphVersion
, offsetof(CFilterGraph
,graphversion
)-offsetof(CFilterGraph
,unk
) },
35 { &IID_IMediaControl
, offsetof(CFilterGraph
,mediacontrol
)-offsetof(CFilterGraph
,unk
) },
36 { &IID_IMediaFilter
, offsetof(CFilterGraph
,mediafilter
)-offsetof(CFilterGraph
,unk
) },
37 { &IID_IMediaEvent
, offsetof(CFilterGraph
,mediaevent
)-offsetof(CFilterGraph
,unk
) },
38 { &IID_IMediaEventEx
, offsetof(CFilterGraph
,mediaevent
)-offsetof(CFilterGraph
,unk
) },
39 { &IID_IMediaEventSink
, offsetof(CFilterGraph
,mediaeventsink
)-offsetof(CFilterGraph
,unk
) },
40 { &IID_IMediaPosition
, offsetof(CFilterGraph
,mediaposition
)-offsetof(CFilterGraph
,unk
) },
41 { &IID_IMediaSeeking
, offsetof(CFilterGraph
,mediaseeking
)-offsetof(CFilterGraph
,unk
) },
42 { &IID_IBasicVideo
, offsetof(CFilterGraph
,basvid
)-offsetof(CFilterGraph
,unk
) },
43 { &IID_IBasicVideo2
, offsetof(CFilterGraph
,basvid
)-offsetof(CFilterGraph
,unk
) },
44 { &IID_IBasicAudio
, offsetof(CFilterGraph
,basaud
)-offsetof(CFilterGraph
,unk
) },
45 { &IID_IVideoWindow
, offsetof(CFilterGraph
,vidwin
)-offsetof(CFilterGraph
,unk
) },
51 HRESULT (*pInit
)(CFilterGraph
*);
52 void (*pUninit
)(CFilterGraph
*);
55 static const struct FGInitEntry FGRAPH_Init
[] =
57 #define FGENT(a) {&CFilterGraph_Init##a,&CFilterGraph_Uninit##a},
66 FGENT(IMediaEventSink
)
78 static void QUARTZ_DestroyFilterGraph(IUnknown
* punk
)
80 CFilterGraph_THIS(punk
,unk
);
83 /* At first, call Stop. */
84 IMediaControl_Stop( CFilterGraph_IMediaControl(This
) );
85 IMediaFilter_Stop( CFilterGraph_IMediaFilter(This
) );
88 while ( FGRAPH_Init
[i
].pInit
!= NULL
)
90 FGRAPH_Init
[i
].pUninit( This
);
94 TRACE( "succeeded.\n" );
97 HRESULT
QUARTZ_CreateFilterGraph(IUnknown
* punkOuter
,void** ppobj
)
103 TRACE("(%p,%p)\n",punkOuter
,ppobj
);
105 pfg
= (CFilterGraph
*)QUARTZ_AllocObj( sizeof(CFilterGraph
) );
107 return E_OUTOFMEMORY
;
109 QUARTZ_IUnkInit( &pfg
->unk
, punkOuter
);
113 while ( FGRAPH_Init
[i
].pInit
!= NULL
)
115 hr
= FGRAPH_Init
[i
].pInit( pfg
);
124 FGRAPH_Init
[i
].pUninit( pfg
);
125 QUARTZ_FreeObj( pfg
);
129 pfg
->unk
.pEntries
= IFEntries
;
130 pfg
->unk
.dwEntries
= sizeof(IFEntries
)/sizeof(IFEntries
[0]);
131 pfg
->unk
.pOnFinalRelease
= QUARTZ_DestroyFilterGraph
;
133 *ppobj
= (void*)(&pfg
->unk
);