mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
decklink: Re-add the COM initialization code for Windows
Untested, and we will never deinitialize COM again.
This commit is contained in:
parent
f9d16c5913
commit
5e7782ca39
1 changed files with 64 additions and 0 deletions
|
@ -328,6 +328,57 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
/* FIXME: We currently never deinit this */
|
||||
|
||||
static GMutex com_init_lock;
|
||||
static GMutex com_deinit_lock;
|
||||
static GCond com_init_cond;
|
||||
static GCond com_deinit_cond;
|
||||
static GCond com_deinited_cond;
|
||||
static gboolean com_initialized = FALSE;
|
||||
|
||||
/* COM initialization/uninitialization thread */
|
||||
static gpointer
|
||||
gst_decklink_com_thread (gpointer data)
|
||||
{
|
||||
HRESULT res;
|
||||
|
||||
g_mutex_lock (&com_init_lock);
|
||||
|
||||
/* Initialize COM with a MTA for this process. This thread will
|
||||
* be the first one to enter the apartement and the last one to leave
|
||||
* it, unitializing COM properly */
|
||||
|
||||
res = CoInitializeEx (0, COINIT_MULTITHREADED);
|
||||
if (res == S_FALSE)
|
||||
GST_WARNING ("COM has been already initialized in the same process");
|
||||
else if (res == RPC_E_CHANGED_MODE)
|
||||
GST_WARNING ("The concurrency model of COM has changed.");
|
||||
else
|
||||
GST_INFO ("COM intialized succesfully");
|
||||
|
||||
com_initialized = TRUE;
|
||||
|
||||
/* Signal other threads waiting on this condition that COM was initialized */
|
||||
g_cond_signal (&com_init_cond);
|
||||
|
||||
g_mutex_unlock (&com_init_lock);
|
||||
|
||||
/* Wait until the unitialize condition is met to leave the COM apartement */
|
||||
g_mutex_lock (&com_deinit_lock);
|
||||
g_cond_wait (&com_deinit_cond, &com_deinit_lock);
|
||||
|
||||
CoUninitialize ();
|
||||
GST_INFO ("COM unintialized succesfully");
|
||||
com_initialized = FALSE;
|
||||
g_cond_signal (&com_deinited_cond);
|
||||
g_mutex_unlock (&com_deinit_lock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
static GOnce devices_once = G_ONCE_INIT;
|
||||
static int n_devices;
|
||||
static Device devices[10];
|
||||
|
@ -340,6 +391,19 @@ init_devices (gpointer data)
|
|||
HRESULT ret;
|
||||
int i;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// Start COM thread for Windows
|
||||
|
||||
g_mutex_lock (&com_init_lock);
|
||||
|
||||
/* create the COM initialization thread */
|
||||
g_thread_create ((GThreadFunc) gst_decklink_com_thread, NULL, FALSE, NULL);
|
||||
|
||||
/* wait until the COM thread signals that COM has been initialized */
|
||||
g_cond_wait (&com_init_cond, &com_init_lock);
|
||||
g_mutex_unlock (&com_init_lock);
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
iterator = CreateDeckLinkIteratorInstance ();
|
||||
if (iterator == NULL) {
|
||||
GST_ERROR ("no driver");
|
||||
|
|
Loading…
Reference in a new issue