1 /* GStreamer Base Functions
3 * Copyright 2002 Lionel Ulmer
4 * Copyright 2010 Aric Stewart, CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define WINE_NO_NAMELESS_EXTENSION
23 #include "gst_private.h"
28 #include "gst_guids.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(quartz
);
34 const struct unix_funcs
*unix_funcs
= NULL
;
36 BOOL WINAPI
DllMain(HINSTANCE instance
, DWORD reason
, void *reserved
)
38 if (reason
== DLL_PROCESS_ATTACH
)
40 DisableThreadLibraryCalls(instance
);
41 __wine_init_unix_lib(instance
, reason
, NULL
, &unix_funcs
);
46 HRESULT WINAPI
DllCanUnloadNow(void)
50 return object_locks
? S_FALSE
: S_OK
;
55 IClassFactory IClassFactory_iface
;
56 HRESULT (*create_instance
)(IUnknown
*outer
, IUnknown
**out
);
59 static inline struct class_factory
*impl_from_IClassFactory(IClassFactory
*iface
)
61 return CONTAINING_RECORD(iface
, struct class_factory
, IClassFactory_iface
);
64 static HRESULT WINAPI
class_factory_QueryInterface(IClassFactory
*iface
, REFIID iid
, void **out
)
66 TRACE("iface %p, iid %s, out %p.\n", iface
, debugstr_guid(iid
), out
);
68 if (IsEqualGUID(iid
, &IID_IUnknown
) || IsEqualGUID(iid
, &IID_IClassFactory
))
71 IClassFactory_AddRef(iface
);
76 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid
));
80 static ULONG WINAPI
class_factory_AddRef(IClassFactory
*iface
)
85 static ULONG WINAPI
class_factory_Release(IClassFactory
*iface
)
90 static HRESULT WINAPI
class_factory_CreateInstance(IClassFactory
*iface
, IUnknown
*outer
, REFIID iid
, void **out
)
92 struct class_factory
*factory
= impl_from_IClassFactory(iface
);
96 TRACE("iface %p, outer %p, iid %s, out %p.\n", iface
, outer
, debugstr_guid(iid
), out
);
98 if (outer
&& !IsEqualGUID(iid
, &IID_IUnknown
))
102 if (SUCCEEDED(hr
= factory
->create_instance(outer
, &unk
)))
104 hr
= IUnknown_QueryInterface(unk
, iid
, out
);
105 IUnknown_Release(unk
);
110 static HRESULT WINAPI
class_factory_LockServer(IClassFactory
*iface
, BOOL lock
)
112 TRACE("iface %p, lock %d.\n", iface
, lock
);
115 InterlockedIncrement(&object_locks
);
117 InterlockedDecrement(&object_locks
);
121 static const IClassFactoryVtbl class_factory_vtbl
=
123 class_factory_QueryInterface
,
124 class_factory_AddRef
,
125 class_factory_Release
,
126 class_factory_CreateInstance
,
127 class_factory_LockServer
,
130 static struct class_factory avi_splitter_cf
= {{&class_factory_vtbl
}, avi_splitter_create
};
131 static struct class_factory decodebin_parser_cf
= {{&class_factory_vtbl
}, decodebin_parser_create
};
132 static struct class_factory mpeg_splitter_cf
= {{&class_factory_vtbl
}, mpeg_splitter_create
};
133 static struct class_factory wave_parser_cf
= {{&class_factory_vtbl
}, wave_parser_create
};
135 HRESULT WINAPI
DllGetClassObject(REFCLSID clsid
, REFIID iid
, void **out
)
137 struct class_factory
*factory
;
140 TRACE("clsid %s, iid %s, out %p.\n", debugstr_guid(clsid
), debugstr_guid(iid
), out
);
142 if (!init_gstreamer())
143 return CLASS_E_CLASSNOTAVAILABLE
;
145 if (SUCCEEDED(hr
= mfplat_get_class_object(clsid
, iid
, out
)))
148 if (IsEqualGUID(clsid
, &CLSID_AviSplitter
))
149 factory
= &avi_splitter_cf
;
150 else if (IsEqualGUID(clsid
, &CLSID_decodebin_parser
))
151 factory
= &decodebin_parser_cf
;
152 else if (IsEqualGUID(clsid
, &CLSID_MPEG1Splitter
))
153 factory
= &mpeg_splitter_cf
;
154 else if (IsEqualGUID(clsid
, &CLSID_WAVEParser
))
155 factory
= &wave_parser_cf
;
158 FIXME("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(clsid
));
159 return CLASS_E_CLASSNOTAVAILABLE
;
162 return IClassFactory_QueryInterface(&factory
->IClassFactory_iface
, iid
, out
);
165 static BOOL CALLBACK
init_gstreamer_proc(INIT_ONCE
*once
, void *param
, void **ctx
)
169 /* Unloading glib is a bad idea.. it installs atexit handlers,
170 * so never unload the dll after loading */
171 GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
| GET_MODULE_HANDLE_EX_FLAG_PIN
,
172 (LPCWSTR
)init_gstreamer_proc
, &handle
);
174 ERR("Failed to pin module.\n");
179 BOOL
init_gstreamer(void)
181 static INIT_ONCE once
= INIT_ONCE_STATIC_INIT
;
183 InitOnceExecuteOnce(&once
, init_gstreamer_proc
, NULL
, NULL
);
188 static const REGPINTYPES reg_audio_mt
= {&MEDIATYPE_Audio
, &GUID_NULL
};
189 static const REGPINTYPES reg_stream_mt
= {&MEDIATYPE_Stream
, &GUID_NULL
};
190 static const REGPINTYPES reg_video_mt
= {&MEDIATYPE_Video
, &GUID_NULL
};
192 static const REGPINTYPES reg_avi_splitter_sink_mt
= {&MEDIATYPE_Stream
, &MEDIASUBTYPE_Avi
};
194 static const REGFILTERPINS2 reg_avi_splitter_pins
[2] =
198 .lpMediaType
= ®_avi_splitter_sink_mt
,
201 .dwFlags
= REG_PINFLAG_B_OUTPUT
,
203 .lpMediaType
= ®_video_mt
,
207 static const REGFILTER2 reg_avi_splitter
=
210 .dwMerit
= MERIT_NORMAL
,
212 .u
.s2
.rgPins2
= reg_avi_splitter_pins
,
215 static const REGPINTYPES reg_mpeg_splitter_sink_mts
[4] =
217 {&MEDIATYPE_Stream
, &MEDIASUBTYPE_MPEG1Audio
},
218 {&MEDIATYPE_Stream
, &MEDIASUBTYPE_MPEG1Video
},
219 {&MEDIATYPE_Stream
, &MEDIASUBTYPE_MPEG1System
},
220 {&MEDIATYPE_Stream
, &MEDIASUBTYPE_MPEG1VideoCD
},
223 static const REGPINTYPES reg_mpeg_splitter_audio_mts
[2] =
225 {&MEDIATYPE_Audio
, &MEDIASUBTYPE_MPEG1Packet
},
226 {&MEDIATYPE_Audio
, &MEDIASUBTYPE_MPEG1AudioPayload
},
229 static const REGPINTYPES reg_mpeg_splitter_video_mts
[2] =
231 {&MEDIATYPE_Video
, &MEDIASUBTYPE_MPEG1Packet
},
232 {&MEDIATYPE_Video
, &MEDIASUBTYPE_MPEG1Payload
},
235 static const REGFILTERPINS2 reg_mpeg_splitter_pins
[3] =
239 .lpMediaType
= reg_mpeg_splitter_sink_mts
,
242 .dwFlags
= REG_PINFLAG_B_ZERO
| REG_PINFLAG_B_OUTPUT
,
244 .lpMediaType
= reg_mpeg_splitter_audio_mts
,
247 .dwFlags
= REG_PINFLAG_B_ZERO
| REG_PINFLAG_B_OUTPUT
,
249 .lpMediaType
= reg_mpeg_splitter_video_mts
,
253 static const REGFILTER2 reg_mpeg_splitter
=
256 .dwMerit
= MERIT_NORMAL
,
258 .u
.s2
.rgPins2
= reg_mpeg_splitter_pins
,
261 static const REGPINTYPES reg_wave_parser_sink_mts
[3] =
263 {&MEDIATYPE_Stream
, &MEDIASUBTYPE_WAVE
},
264 {&MEDIATYPE_Stream
, &MEDIASUBTYPE_AU
},
265 {&MEDIATYPE_Stream
, &MEDIASUBTYPE_AIFF
},
268 static const REGFILTERPINS2 reg_wave_parser_pins
[2] =
272 .lpMediaType
= reg_wave_parser_sink_mts
,
275 .dwFlags
= REG_PINFLAG_B_OUTPUT
,
277 .lpMediaType
= ®_audio_mt
,
281 static const REGFILTER2 reg_wave_parser
=
284 .dwMerit
= MERIT_UNLIKELY
,
286 .u
.s2
.rgPins2
= reg_wave_parser_pins
,
289 static const REGFILTERPINS2 reg_decodebin_parser_pins
[3] =
293 .lpMediaType
= ®_stream_mt
,
296 .dwFlags
= REG_PINFLAG_B_OUTPUT
,
298 .lpMediaType
= ®_audio_mt
,
301 .dwFlags
= REG_PINFLAG_B_OUTPUT
,
303 .lpMediaType
= ®_video_mt
,
307 static const REGFILTER2 reg_decodebin_parser
=
310 .dwMerit
= MERIT_PREFERRED
,
312 .u
.s2
.rgPins2
= reg_decodebin_parser_pins
,
315 HRESULT WINAPI
DllRegisterServer(void)
317 IFilterMapper2
*mapper
;
322 if (FAILED(hr
= __wine_register_resources()))
325 if (FAILED(hr
= CoCreateInstance(&CLSID_FilterMapper2
, NULL
, CLSCTX_INPROC_SERVER
,
326 &IID_IFilterMapper2
, (void **)&mapper
)))
329 IFilterMapper2_RegisterFilter(mapper
, &CLSID_AviSplitter
, L
"AVI Splitter", NULL
, NULL
, NULL
, ®_avi_splitter
);
330 IFilterMapper2_RegisterFilter(mapper
, &CLSID_decodebin_parser
,
331 L
"GStreamer splitter filter", NULL
, NULL
, NULL
, ®_decodebin_parser
);
332 IFilterMapper2_RegisterFilter(mapper
, &CLSID_MPEG1Splitter
,
333 L
"MPEG-I Stream Splitter", NULL
, NULL
, NULL
, ®_mpeg_splitter
);
334 IFilterMapper2_RegisterFilter(mapper
, &CLSID_WAVEParser
, L
"Wave Parser", NULL
, NULL
, NULL
, ®_wave_parser
);
336 IFilterMapper2_Release(mapper
);
338 return mfplat_DllRegisterServer();
341 HRESULT WINAPI
DllUnregisterServer(void)
343 IFilterMapper2
*mapper
;
348 if (FAILED(hr
= __wine_unregister_resources()))
351 if (FAILED(hr
= CoCreateInstance(&CLSID_FilterMapper2
, NULL
, CLSCTX_INPROC_SERVER
,
352 &IID_IFilterMapper2
, (void **)&mapper
)))
355 IFilterMapper2_UnregisterFilter(mapper
, NULL
, NULL
, &CLSID_AviSplitter
);
356 IFilterMapper2_UnregisterFilter(mapper
, NULL
, NULL
, &CLSID_decodebin_parser
);
357 IFilterMapper2_UnregisterFilter(mapper
, NULL
, NULL
, &CLSID_MPEG1Splitter
);
358 IFilterMapper2_UnregisterFilter(mapper
, NULL
, NULL
, &CLSID_WAVEParser
);
360 IFilterMapper2_Release(mapper
);