diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2007-05-06 15:25:05 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2007-05-06 15:25:05 +0000 |
commit | e792718ddf7f8c879ba38c4801b52b74a6b80766 (patch) | |
tree | e5f09189820ec9d067e44c6bd9ddf638c344acb0 /gst/real/gstrealvideodec.c | |
parent | fcfbf0f58ca1f8d7b5f43fd42f235e44785ed9a7 (diff) | |
download | gst-plugins-bad-e792718ddf7f8c879ba38c4801b52b74a6b80766.tar.gz gst-plugins-bad-e792718ddf7f8c879ba38c4801b52b74a6b80766.tar.bz2 gst-plugins-bad-e792718ddf7f8c879ba38c4801b52b74a6b80766.zip |
gst/real/: Use GModule instead of using dlsym() directly. Fixes #430598.
Original commit message from CVS:
* gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps),
(gst_real_audio_dec_finalize):
* gst/real/gstrealaudiodec.h:
* gst/real/gstrealvideodec.c: (open_library), (close_library):
* gst/real/gstrealvideodec.h:
Use GModule instead of using dlsym() directly. Fixes #430598.
Diffstat (limited to 'gst/real/gstrealvideodec.c')
-rw-r--r-- | gst/real/gstrealvideodec.c | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/gst/real/gstrealvideodec.c b/gst/real/gstrealvideodec.c index 0e4c17f1..32b04ea7 100644 --- a/gst/real/gstrealvideodec.c +++ b/gst/real/gstrealvideodec.c @@ -1,7 +1,7 @@ /* RealVideo wrapper plugin * * Copyright (C) 2005 Lutz Mueller <lutz@topfrose.de> - * 2006 Edward Hervey <bilboed@bilboed.com> + * Copyright (C) 2006 Edward Hervey <bilboed@bilboed.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -25,7 +25,6 @@ #include "gstrealvideodec.h" -#include <dlfcn.h> #include <string.h> GST_DEBUG_CATEGORY_STATIC (realvideode_debug); @@ -626,6 +625,8 @@ static gboolean open_library (GstRealVideoDec * dec, GstRealVideoDecHooks * hooks, GstRealVideoDecVersion version) { + gpointer rv_custom_msg, rv_free, rv_init, rv_transform; + GModule *module; gchar *path = NULL; GST_DEBUG_OBJECT (dec, @@ -677,29 +678,34 @@ open_library (GstRealVideoDec * dec, GstRealVideoDecHooks * hooks, goto unknown_version; } - hooks->handle = dlopen (path, RTLD_LAZY); - if (!hooks->handle) - goto could_not_open; - - /* First try opening legacy symbols */ - hooks->custom_message = dlsym (hooks->handle, "RV20toYUV420CustomMessage"); - hooks->free = dlsym (hooks->handle, "RV20toYUV420Free"); - hooks->init = dlsym (hooks->handle, "RV20toYUV420Init"); - hooks->transform = dlsym (hooks->handle, "RV20toYUV420Transform"); + GST_LOG_OBJECT (dec, "Trying to open '%s'", path); + hooks->module = g_module_open (path, G_MODULE_BIND_LAZY); - if (!(hooks->custom_message && hooks->free && hooks->init - && hooks->transform)) { - /* Else try loading new symbols */ - hooks->custom_message = dlsym (hooks->handle, "RV40toYUV420CustomMessage"); - hooks->free = dlsym (hooks->handle, "RV40toYUV420Free"); - hooks->init = dlsym (hooks->handle, "RV40toYUV420Init"); - hooks->transform = dlsym (hooks->handle, "RV40toYUV420Transform"); + if (hooks->module == NULL) + goto could_not_open; - if (!(hooks->custom_message && hooks->free && hooks->init - && hooks->transform)) - goto could_not_load; + module = hooks->module; + + /* First try opening legacy symbols, if that fails try loading new symbols */ + if (g_module_symbol (module, "RV20toYUV420Init", &rv_init) && + g_module_symbol (module, "RV20toYUV420Free", &rv_free) && + g_module_symbol (module, "RV20toYUV420Transform", &rv_transform) && + g_module_symbol (module, "RV20toYUV420CustomMessage", &rv_custom_msg)) { + GST_LOG_OBJECT (dec, "Loaded legacy symbols"); + } else if (g_module_symbol (module, "RV40toYUV420Init", &rv_init) && + g_module_symbol (module, "RV40toYUV420Free", &rv_free) && + g_module_symbol (module, "RV40toYUV420Transform", &rv_transform) && + g_module_symbol (module, "RV40toYUV420CustomMessage", &rv_custom_msg)) { + GST_LOG_OBJECT (dec, "Loaded new symbols"); + } else { + goto could_not_load; } + hooks->init = rv_init; + hooks->free = rv_free; + hooks->transform = rv_transform; + hooks->custom_message = rv_custom_msg; + return TRUE; no_known_libraries: @@ -718,14 +724,15 @@ unknown_version: could_not_open: { - GST_ERROR_OBJECT (dec, "Could not open library '%s'.", path); + GST_ERROR_OBJECT (dec, "Could not open library '%s':%s", path, + g_module_error ()); return FALSE; } could_not_load: { close_library (*hooks); - GST_ERROR_OBJECT (dec, "Could not load all symbols."); + GST_ERROR_OBJECT (dec, "Could not load all symbols: %s", g_module_error ()); return FALSE; } } @@ -736,8 +743,10 @@ close_library (GstRealVideoDecHooks hooks) if (hooks.context && hooks.free) hooks.free (hooks.context); - if (hooks.handle) - dlclose (hooks.handle); + if (hooks.module) { + g_module_close (hooks.module); + hooks.module = NULL; + } } static void |