mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 16:08:51 +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 GOnce devices_once = G_ONCE_INIT;
|
||||||
static int n_devices;
|
static int n_devices;
|
||||||
static Device devices[10];
|
static Device devices[10];
|
||||||
|
@ -340,6 +391,19 @@ init_devices (gpointer data)
|
||||||
HRESULT ret;
|
HRESULT ret;
|
||||||
int i;
|
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 ();
|
iterator = CreateDeckLinkIteratorInstance ();
|
||||||
if (iterator == NULL) {
|
if (iterator == NULL) {
|
||||||
GST_ERROR ("no driver");
|
GST_ERROR ("no driver");
|
||||||
|
|
Loading…
Reference in a new issue