mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-22 07:50:37 +00:00
3bb8700577
On macOS, a Cocoa event loop is needed in the main thread to ensure things like opening a GL window work correctly. In the past, this was patched into glib via Cerbero, but that prevented us from updating it. This workaround simply runs an NSApplication and then calls the main function on a secondary thread, allowing GStreamer to correctly display windows and/or system permission prompts, for example. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3532>
102 lines
2.5 KiB
Mathematica
102 lines
2.5 KiB
Mathematica
#include "gstmacos.h"
|
|
#include <Cocoa/Cocoa.h>
|
|
|
|
typedef struct _ThreadArgs ThreadArgs;
|
|
|
|
struct _ThreadArgs {
|
|
void* main_func;
|
|
int argc;
|
|
char **argv;
|
|
gpointer user_data;
|
|
gboolean is_simple;
|
|
};
|
|
|
|
int
|
|
gst_thread_func (ThreadArgs *args)
|
|
{
|
|
int ret;
|
|
if (args->is_simple) {
|
|
ret = ((GstMainFuncSimple) args->main_func) (args->user_data);
|
|
} else {
|
|
ret = ((GstMainFunc) args->main_func) (args->argc, args->argv, args->user_data);
|
|
}
|
|
|
|
[NSApp terminate: nil];
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
run_main_with_nsapp (ThreadArgs args)
|
|
{
|
|
GThread *gst_thread;
|
|
|
|
[NSApplication sharedApplication];
|
|
gst_thread = g_thread_new ("macos-gst-thread", (GThreadFunc) gst_thread_func, &args);
|
|
[NSApp run];
|
|
|
|
return GPOINTER_TO_INT (g_thread_join (gst_thread));
|
|
}
|
|
|
|
/**
|
|
* gst_macos_main:
|
|
* @main_func: (scope async): pointer to the main function to be called
|
|
* @argc: the amount of arguments passed in @argv
|
|
* @argv: (array length=argc): an array of arguments to be passed to the main function
|
|
* @user_data: (nullable): user data to be passed to the main function
|
|
*
|
|
* Starts an NSApplication on the main thread before calling
|
|
* the provided main() function on a secondary thread.
|
|
*
|
|
* This ensures that GStreamer can correctly perform actions
|
|
* such as creating a GL window, which require a Cocoa main loop
|
|
* to be running on the main thread.
|
|
*
|
|
* Do not call this function more than once - especially while
|
|
* another one is still running - as that will cause unpredictable
|
|
* behaviour and most likely completely fail.
|
|
*
|
|
* Returns: the return value of the provided main_func
|
|
*
|
|
* Since: 1.22
|
|
*/
|
|
int
|
|
gst_macos_main (GstMainFunc main_func, int argc, char **argv, gpointer user_data)
|
|
{
|
|
ThreadArgs args;
|
|
|
|
args.argc = argc;
|
|
args.argv = argv;
|
|
args.main_func = main_func;
|
|
args.user_data = user_data;
|
|
args.is_simple = FALSE;
|
|
|
|
return run_main_with_nsapp (args);
|
|
}
|
|
|
|
/**
|
|
* gst_macos_main_simple:
|
|
* @main_func: (scope async): pointer to the main function to be called
|
|
* @user_data: (nullable): user data to be passed to the main function
|
|
*
|
|
* Simplified variant of gst_macos_main(), meant to be used with bindings
|
|
* for languages which do not have to pass argc and argv like C does.
|
|
* See gst_macos_main() for a more detailed description.
|
|
*
|
|
* Returns: the return value of the provided main_func
|
|
*
|
|
* Since: 1.22
|
|
*/
|
|
int
|
|
gst_macos_main_simple (GstMainFuncSimple main_func, gpointer user_data)
|
|
{
|
|
ThreadArgs args;
|
|
|
|
args.argc = 0;
|
|
args.argv = NULL;
|
|
args.main_func = main_func;
|
|
args.user_data = user_data;
|
|
args.is_simple = TRUE;
|
|
|
|
return run_main_with_nsapp (args);
|
|
}
|