/** * CGstMediaManager::Init(). * * @param data user-defined data. Pointer to this. * @return Java long reference to the media. */ uint32_t CGstMediaManager::Init() { GError* pError = NULL; uint32_t uRetCode = ERROR_NONE; #if ENABLE_LOWLEVELPERF && TARGET_OS_MAC g_mem_set_vtable (glib_mem_profiler_table); #endif #if ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION && TARGET_OS_WIN32 _CrtSetDbgFlag ( 0 ); #endif // ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION //***** Try to initialize the GStreamer system if (!g_thread_supported()) g_thread_init (NULL); LOWLEVELPERF_EXECTIMESTART("gst_init_check()"); // disable installing SIGSEGV signal handling as it interferes with Java's signal handling gst_segtrap_set_enabled(false); if (!gst_init_check(NULL, NULL, NULL)) { LOGGER_LOGMSG(LOGGER_DEBUG, "Could not init GStreamer!\n"); return ERROR_MANAGER_ENGINEINIT_FAIL; } LOWLEVELPERF_EXECTIMESTOP("gst_init_check()"); #if ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION && TARGET_OS_WIN32 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif // ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION //***** Create mutex and condition variable m_pRunloopCond = g_cond_new(); m_pRunloopMutex = g_mutex_new(); #if ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION && TARGET_OS_WIN32 _CrtSetDbgFlag(0); #endif // ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION //***** Create the primary run loop m_pMainLoopThread = g_thread_create((GThreadFunc)run_loop, this, FALSE, &pError); if (m_pMainLoopThread == NULL) { LOGGER_LOGMSG(LOGGER_DEBUG, "Could not create main GThread!!\n"); LOGGER_LOGMSG(LOGGER_DEBUG, pError->message); return ERROR_MANAGER_RUNLOOP_FAIL; } #if ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION && TARGET_OS_WIN32 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif // ENABLE_VISUAL_STUDIO_MEMORY_LEAKS_DETECTION //***** Wait till the run loop has fully initialized. Bad things happen if we do not do this, including crashers. g_mutex_lock(m_pRunloopMutex); while (NULL == m_pMainLoop) g_cond_wait(m_pRunloopCond, m_pRunloopMutex); g_mutex_unlock(m_pRunloopMutex); if (m_bMainLoopCreateFailed) uRetCode = ERROR_GSTREAMER_MAIN_LOOP_CREATE; // Free no longer needed GCond. if (NULL != m_pRunloopCond) { g_cond_free(m_pRunloopCond); m_pRunloopCond = NULL; } // Free no longer needed GMutex. if (NULL != m_pRunloopMutex) { g_mutex_free(m_pRunloopMutex); m_pRunloopMutex = NULL; } // Set the default Glib log handler. g_log_set_default_handler (GlibLogFunc, this); return uRetCode; }
//static bool MediaPluginGStreamer010::startup() { // first - check if GStreamer is explicitly disabled if (NULL != getenv("LL_DISABLE_GSTREAMER")) return false; // only do global GStreamer initialization once. if (!mDoneInit) { #if !GLIB_CHECK_VERSION(2, 36, 0) #if !GLIB_CHECK_VERSION(2, 32, 0) if (!g_thread_supported()) g_thread_init(NULL); #endif // Init the glib type system - we need it. g_type_init(); #endif set_gst_plugin_path(); /* // Get symbols! #if LL_DARWIN if (! grab_gst_syms("libgstreamer-0.10.dylib", "libgstvideo-0.10.dylib") ) #elseif LL_WINDOWS if (! grab_gst_syms("libgstreamer-0.10.dll", "libgstvideo-0.10.dll") ) #else // linux or other ELFy unixoid if (! grab_gst_syms("libgstreamer-0.10.so.0", "libgstvideo-0.10.so.0") ) #endif { WARNMSG("Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled."); return false; } */ // if (gst_segtrap_set_enabled) // { gst_segtrap_set_enabled(FALSE); // } // else // { // WARNMSG("gst_segtrap_set_enabled() is not available; plugin crashes won't be caught."); // } /* #if LL_LINUX // Gstreamer tries a fork during init, waitpid-ing on it, // which conflicts with any installed SIGCHLD handler... struct sigaction tmpact, oldact; if (gst_registry_fork_set_enabled) { // if we can disable SIGCHLD-using forking behaviour, // do it. gst_registry_fork_set_enabled(false); } else { // else temporarily install default SIGCHLD handler // while GStreamer initialises tmpact.sa_handler = SIG_DFL; sigemptyset( &tmpact.sa_mask ); tmpact.sa_flags = SA_SIGINFO; sigaction(SIGCHLD, &tmpact, &oldact); } #endif // LL_LINUX */ // Protect against GStreamer resetting the locale, yuck. static std::string saved_locale; saved_locale = setlocale(LC_ALL, NULL); // finally, try to initialize GStreamer! GError *err = NULL; gboolean init_gst_success = gst_init_check(NULL, NULL, &err); // restore old locale setlocale(LC_ALL, saved_locale.c_str() ); /* #if LL_LINUX // restore old SIGCHLD handler if (!gst_registry_fork_set_enabled) sigaction(SIGCHLD, &oldact, NULL); #endif // LL_LINUX */ if (!init_gst_success) // fail { if (err) { WARNMSG("GST init failed: %s", err->message); g_error_free(err); } else { WARNMSG("GST init failed for unspecified reason."); } return false; } // Set up logging facilities gst_debug_remove_log_function( gst_debug_log_default ); // gst_debug_add_log_function( gstreamer_log, NULL ); // Init our custom plugins - only really need do this once. gst_slvideo_init_class(); /* // List the plugins GStreamer can find LL_DEBUGS("MediaImpl") << "Found GStreamer plugins:" << LL_ENDL; GList *list; GstRegistry *registry = gst_registry_get_default(); std::string loaded = ""; for (list = gst_registry_get_plugin_list(registry); list != NULL; list = g_list_next(list)) { GstPlugin *list_plugin = (GstPlugin *)list->data; (bool)gst_plugin_is_loaded(list_plugin) ? loaded = "Yes" : loaded = "No"; LL_DEBUGS("MediaImpl") << gst_plugin_get_name(list_plugin) << ", loaded? " << loaded << LL_ENDL; } gst_plugin_list_free(list); */ mDoneInit = true; } return true; }