From e8c689fe9403bc5e036559f13388a33475802e09 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 2 Nov 2009 08:47:12 +0100 Subject: [PATCH] ffdemux: avoid generating caps when registering Don't generate caps when we register the class but delay that till when we actually create an instance of the class. --- ext/ffmpeg/gstffmpegdemux.c | 78 +++++++++++++------------------------ 1 file changed, 28 insertions(+), 50 deletions(-) diff --git a/ext/ffmpeg/gstffmpegdemux.c b/ext/ffmpeg/gstffmpegdemux.c index 6a8438fb4f..80880be288 100644 --- a/ext/ffmpeg/gstffmpegdemux.c +++ b/ext/ffmpeg/gstffmpegdemux.c @@ -101,12 +101,6 @@ struct _GstFFMpegDemux GStaticRecMutex *task_lock; }; -typedef struct _GstFFMpegDemuxClassParams -{ - AVInputFormat *in_plugin; - GstCaps *sinkcaps, *videosrccaps, *audiosrccaps; -} GstFFMpegDemuxClassParams; - typedef struct _GstFFMpegDemuxClass GstFFMpegDemuxClass; struct _GstFFMpegDemuxClass @@ -186,20 +180,29 @@ static void gst_ffmpegdemux_base_init (GstFFMpegDemuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstFFMpegDemuxClassParams *params; + AVInputFormat *in_plugin; + gchar *p, *name; GstElementDetails details; + GstCaps *sinkcaps; GstPadTemplate *sinktempl, *audiosrctempl, *videosrctempl; - params = (GstFFMpegDemuxClassParams *) + in_plugin = (AVInputFormat *) g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), GST_FFDEMUX_PARAMS_QDATA); - g_assert (params != NULL); + g_assert (in_plugin != NULL); + + p = name = g_strdup (in_plugin->name); + while (*p) { + if (*p == '.' || *p == ',') + *p = '_'; + p++; + } /* construct the element details struct */ details.longname = g_strdup_printf ("FFmpeg %s demuxer", - params->in_plugin->long_name); + in_plugin->long_name); details.klass = "Codec/Demuxer"; details.description = g_strdup_printf ("FFmpeg %s demuxer", - params->in_plugin->long_name); + in_plugin->long_name); details.author = "Wim Taymans , " "Ronald Bultje , " "Edward Hervey "; @@ -208,22 +211,19 @@ gst_ffmpegdemux_base_init (GstFFMpegDemuxClass * klass) g_free (details.description); /* pad templates */ - gst_caps_ref (params->sinkcaps); + sinkcaps = gst_ffmpeg_formatid_to_caps (name); sinktempl = gst_pad_template_new ("sink", - GST_PAD_SINK, GST_PAD_ALWAYS, params->sinkcaps); + GST_PAD_SINK, GST_PAD_ALWAYS, sinkcaps); videosrctempl = gst_pad_template_new ("video_%02d", - GST_PAD_SRC, GST_PAD_SOMETIMES, params->videosrccaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, GST_CAPS_ANY); audiosrctempl = gst_pad_template_new ("audio_%02d", - GST_PAD_SRC, GST_PAD_SOMETIMES, params->audiosrccaps); - - params->videosrccaps = NULL; - params->audiosrccaps = NULL; + GST_PAD_SRC, GST_PAD_SOMETIMES, GST_CAPS_ANY); gst_element_class_add_pad_template (element_class, videosrctempl); gst_element_class_add_pad_template (element_class, audiosrctempl); gst_element_class_add_pad_template (element_class, sinktempl); - klass->in_plugin = params->in_plugin; + klass->in_plugin = in_plugin; klass->videosrctempl = videosrctempl; klass->audiosrctempl = audiosrctempl; klass->sinktempl = sinktempl; @@ -1258,10 +1258,10 @@ static void gst_ffmpegdemux_type_find (GstTypeFind * tf, gpointer priv) { guint8 *data; - GstFFMpegDemuxClassParams *params = (GstFFMpegDemuxClassParams *) priv; - AVInputFormat *in_plugin = params->in_plugin; + AVInputFormat *in_plugin = (AVInputFormat *) priv; gint res = 0; guint64 length; + GstCaps *sinkcaps; /* We want GST_FFMPEG_TYPE_FIND_SIZE bytes, but if the file is shorter than * that we'll give it a try... */ @@ -1297,10 +1297,12 @@ gst_ffmpegdemux_type_find (GstTypeFind * tf, gpointer priv) if (g_str_has_prefix (in_plugin->name, "mpegts")) res = MIN (res, GST_TYPE_FIND_POSSIBLE); - GST_LOG ("ffmpeg typefinder '%s' suggests %" GST_PTR_FORMAT ", p=%u%%", - in_plugin->name, params->sinkcaps, res); + sinkcaps = gst_ffmpeg_formatid_to_caps (in_plugin->name); - gst_type_find_suggest (tf, res, params->sinkcaps); + GST_LOG ("ffmpeg typefinder '%s' suggests %" GST_PTR_FORMAT ", p=%u%%", + in_plugin->name, sinkcaps, res); + + gst_type_find_suggest (tf, res, sinkcaps); } } } @@ -1835,7 +1837,6 @@ gst_ffmpegdemux_register (GstPlugin * plugin) { GType type; AVInputFormat *in_plugin; - GstFFMpegDemuxClassParams *params; gchar **extensions; GTypeInfo typeinfo = { sizeof (GstFFMpegDemuxClass), @@ -1856,7 +1857,6 @@ gst_ffmpegdemux_register (GstPlugin * plugin) while (in_plugin) { gchar *type_name, *typefind_name; gchar *p, *name = NULL; - GstCaps *sinkcaps, *audiosrccaps, *videosrccaps; gint rank; gboolean register_typefind_func = TRUE; @@ -1971,42 +1971,20 @@ gst_ffmpegdemux_register (GstPlugin * plugin) p++; } - /* Try to find the caps that belongs here */ - sinkcaps = gst_ffmpeg_formatid_to_caps (name); - if (!sinkcaps) { - GST_DEBUG ("Couldn't get sinkcaps for demuxer '%s', skipping format", - in_plugin->name); - goto next; - } - /* This is a bit ugly, but we just take all formats - * for the pad template. We'll get an exact match - * when we open the stream */ - audiosrccaps = gst_caps_new_any (); - videosrccaps = gst_caps_new_any (); - /* construct the type */ type_name = g_strdup_printf ("ffdemux_%s", name); /* if it's already registered, drop it */ if (g_type_from_name (type_name)) { - gst_caps_unref (videosrccaps); - gst_caps_unref (audiosrccaps); g_free (type_name); goto next; } typefind_name = g_strdup_printf ("fftype_%s", name); - /* create a cache for these properties */ - params = g_new0 (GstFFMpegDemuxClassParams, 1); - params->in_plugin = in_plugin; - params->sinkcaps = sinkcaps; - params->videosrccaps = videosrccaps; - params->audiosrccaps = audiosrccaps; - /* create the type now */ type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); - g_type_set_qdata (type, GST_FFDEMUX_PARAMS_QDATA, (gpointer) params); + g_type_set_qdata (type, GST_FFDEMUX_PARAMS_QDATA, (gpointer) in_plugin); if (in_plugin->extensions) extensions = g_strsplit (in_plugin->extensions, " ", 0); @@ -2016,7 +1994,7 @@ gst_ffmpegdemux_register (GstPlugin * plugin) if (!gst_element_register (plugin, type_name, rank, type) || (register_typefind_func == TRUE && !gst_type_find_register (plugin, typefind_name, rank, - gst_ffmpegdemux_type_find, extensions, sinkcaps, params, + gst_ffmpegdemux_type_find, extensions, NULL, in_plugin, NULL))) { g_warning ("Register of type ffdemux_%s failed", name); g_free (type_name);