From cfbb046f1e73e5b27c3436120660f27bacc7d6c4 Mon Sep 17 00:00:00 2001 From: Jordi Mas Date: Fri, 5 Jun 2009 13:19:03 +0200 Subject: [PATCH] ffmpeg: make elements reusable after registry rescan If the same instance of the plugin is asked to be initialised more that once, instances after the first one do not register the elements properly and the elements become not usable. For example, if you call gst_update_registry (), is not possible to create elements after the call since the plugin is asked to be initialised again and does not register the elements. Fixes #584291 --- ext/ffmpeg/gstffmpegdec.c | 24 +++++++++++------------- ext/ffmpeg/gstffmpegenc.c | 36 +++++++++++++++++------------------- ext/ffmpeg/gstffmpegmux.c | 36 +++++++++++++++--------------------- 3 files changed, 43 insertions(+), 53 deletions(-) diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c index 031ba08ecd..45052f5879 100644 --- a/ext/ffmpeg/gstffmpegdec.c +++ b/ext/ffmpeg/gstffmpegdec.c @@ -2731,21 +2731,19 @@ gst_ffmpegdec_register (GstPlugin * plugin) type_name = g_strdup_printf ("ffdec_%s", plugin_name); g_free (plugin_name); - /* if it's already registered, drop it */ - if (g_type_from_name (type_name)) { - g_free (type_name); - goto next; + type = g_type_from_name (type_name); + + if (!type) { + params = g_new0 (GstFFMpegDecClassParams, 1); + params->in_plugin = in_plugin; + params->srccaps = gst_caps_ref (srccaps); + params->sinkcaps = gst_caps_ref (sinkcaps); + + /* create the gtype now */ + type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); + g_type_set_qdata (type, GST_FFDEC_PARAMS_QDATA, (gpointer) params); } - params = g_new0 (GstFFMpegDecClassParams, 1); - params->in_plugin = in_plugin; - params->srccaps = gst_caps_ref (srccaps); - params->sinkcaps = gst_caps_ref (sinkcaps); - - /* create the gtype now */ - type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); - g_type_set_qdata (type, GST_FFDEC_PARAMS_QDATA, (gpointer) params); - /* (Ronald) MPEG-4 gets a higher priority because it has been well- * tested and by far outperforms divxdec/xviddec - so we prefer it. * msmpeg4v3 same, as it outperforms divxdec for divx3 playback. diff --git a/ext/ffmpeg/gstffmpegenc.c b/ext/ffmpeg/gstffmpegenc.c index 767d359a33..538fbe6088 100644 --- a/ext/ffmpeg/gstffmpegenc.c +++ b/ext/ffmpeg/gstffmpegenc.c @@ -1177,28 +1177,26 @@ gst_ffmpegenc_register (GstPlugin * plugin) /* construct the type */ type_name = g_strdup_printf ("ffenc_%s", in_plugin->name); - /* if it's already registered, drop it */ - if (g_type_from_name (type_name)) { - g_free (type_name); - goto next; - } + type = g_type_from_name (type_name); - params = g_new0 (GstFFMpegEncClassParams, 1); - params->in_plugin = in_plugin; - params->srccaps = gst_caps_ref (srccaps); - params->sinkcaps = gst_caps_ref (sinkcaps); + if (!type) { + params = g_new0 (GstFFMpegEncClassParams, 1); + params->in_plugin = in_plugin; + params->srccaps = gst_caps_ref (srccaps); + params->sinkcaps = gst_caps_ref (sinkcaps); - /* create the glib type now */ - type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); - g_type_set_qdata (type, GST_FFENC_PARAMS_QDATA, (gpointer) params); + /* create the glib type now */ + type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); + g_type_set_qdata (type, GST_FFENC_PARAMS_QDATA, (gpointer) params); - { - static const GInterfaceInfo preset_info = { - NULL, - NULL, - NULL - }; - g_type_add_interface_static (type, GST_TYPE_PRESET, &preset_info); + { + static const GInterfaceInfo preset_info = { + NULL, + NULL, + NULL + }; + g_type_add_interface_static (type, GST_TYPE_PRESET, &preset_info); + } } if (!gst_element_register (plugin, type_name, GST_RANK_NONE, type)) { diff --git a/ext/ffmpeg/gstffmpegmux.c b/ext/ffmpeg/gstffmpegmux.c index 15cbaf4593..5f04d2b819 100644 --- a/ext/ffmpeg/gstffmpegmux.c +++ b/ext/ffmpeg/gstffmpegmux.c @@ -835,17 +835,6 @@ gst_ffmpegmux_register (GstPlugin * plugin) p++; } - /* if it's already registered, drop it */ - if (g_type_from_name (type_name)) { - g_free (type_name); - gst_caps_unref (srccaps); - if (audiosinkcaps) - gst_caps_unref (audiosinkcaps); - if (videosinkcaps) - gst_caps_unref (videosinkcaps); - goto next; - } - /* fix up allowed caps for some muxers */ if (strcmp (in_plugin->name, "flv") == 0) { const gint rates[] = { 44100, 22050, 11025 }; @@ -859,17 +848,22 @@ gst_ffmpegmux_register (GstPlugin * plugin) gst_caps_from_string ("video/x-raw-rgb, bpp=(int)24, depth=(int)24"); } - /* create a cache for these properties */ - params = g_new0 (GstFFMpegMuxClassParams, 1); - params->in_plugin = in_plugin; - params->srccaps = srccaps; - params->videosinkcaps = videosinkcaps; - params->audiosinkcaps = audiosinkcaps; + type = g_type_from_name (type_name); - /* create the type now */ - type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); - g_type_set_qdata (type, GST_FFMUX_PARAMS_QDATA, (gpointer) params); - g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info); + if (!type) { + /* create a cache for these properties */ + params = g_new0 (GstFFMpegMuxClassParams, 1); + params->in_plugin = in_plugin; + params->srccaps = srccaps; + params->videosinkcaps = videosinkcaps; + params->audiosinkcaps = audiosinkcaps; + + /* create the type now */ + type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); + g_type_set_qdata (type, GST_FFMUX_PARAMS_QDATA, (gpointer) params); + g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info); + + } if (!gst_element_register (plugin, type_name, GST_RANK_NONE, type)) { g_free (type_name);