diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-10-22 16:27:28 -0400 |
---|---|---|
committer | Wim Taymans <wim@metal.(none)> | 2009-10-22 16:27:28 -0400 |
commit | 343c82b18c9a852fb25a31677a65fc4693187691 (patch) | |
tree | 68de40dddd5366ee4b1cfa626e0b9455895901a6 | |
parent | 629969b6955912d0c09e8f4478d78b622880e915 (diff) |
ffdec: 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.
-rw-r--r-- | ext/ffmpeg/gstffmpegdec.c | 55 |
1 files changed, 24 insertions, 31 deletions
diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c index b946a55..264b215 100644 --- a/ext/ffmpeg/gstffmpegdec.c +++ b/ext/ffmpeg/gstffmpegdec.c @@ -174,7 +174,6 @@ typedef struct _GstFFMpegDecClassParams GstFFMpegDecClassParams; struct _GstFFMpegDecClassParams { AVCodec *in_plugin; - GstCaps *srccaps, *sinkcaps; }; #define GST_TYPE_FFMPEGDEC \ @@ -300,12 +299,16 @@ gst_ffmpegdec_base_init (GstFFMpegDecClass * klass) GstFFMpegDecClassParams *params; GstElementDetails details; GstPadTemplate *sinktempl, *srctempl; + GstCaps *sinkcaps, *srccaps; + AVCodec *in_plugin; params = (GstFFMpegDecClassParams *) g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), GST_FFDEC_PARAMS_QDATA); g_assert (params != NULL); + in_plugin = params->in_plugin; + /* construct the element details struct */ details.longname = g_strdup_printf ("FFmpeg %s decoder", params->in_plugin->long_name); @@ -321,16 +324,32 @@ gst_ffmpegdec_base_init (GstFFMpegDecClass * klass) g_free (details.klass); g_free (details.description); + /* get the caps */ + sinkcaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL, FALSE); + if (!sinkcaps) { + GST_DEBUG ("Couldn't get sink caps for decoder '%s'", in_plugin->name); + sinkcaps = gst_caps_from_string ("unknown/unknown"); + } + if (in_plugin->type == CODEC_TYPE_VIDEO) { + srccaps = gst_caps_from_string ("video/x-raw-rgb; video/x-raw-yuv"); + } else { + srccaps = gst_ffmpeg_codectype_to_audio_caps (NULL, + in_plugin->id, FALSE, in_plugin); + } + if (!srccaps) { + GST_DEBUG ("Couldn't get source caps for decoder '%s'", in_plugin->name); + srccaps = gst_caps_from_string ("unknown/unknown"); + } + /* pad templates */ sinktempl = gst_pad_template_new ("sink", GST_PAD_SINK, - GST_PAD_ALWAYS, params->sinkcaps); - srctempl = gst_pad_template_new ("src", GST_PAD_SRC, - GST_PAD_ALWAYS, params->srccaps); + GST_PAD_ALWAYS, sinkcaps); + srctempl = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, srccaps); gst_element_class_add_pad_template (element_class, srctempl); gst_element_class_add_pad_template (element_class, sinktempl); - klass->in_plugin = params->in_plugin; + klass->in_plugin = in_plugin; klass->srctempl = srctempl; klass->sinktempl = sinktempl; } @@ -2761,7 +2780,6 @@ gst_ffmpegdec_register (GstPlugin * plugin) while (in_plugin) { GstFFMpegDecClassParams *params; - GstCaps *srccaps = NULL, *sinkcaps = NULL; gchar *type_name; gchar *plugin_name; @@ -2822,25 +2840,6 @@ gst_ffmpegdec_register (GstPlugin * plugin) goto next; } - /* first make sure we've got a supported type */ - sinkcaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL, FALSE); - if (!sinkcaps) { - GST_DEBUG ("Couldn't get sink caps for decoder '%s', skipping codec", - in_plugin->name); - goto next; - } - if (in_plugin->type == CODEC_TYPE_VIDEO) { - srccaps = gst_caps_from_string ("video/x-raw-rgb; video/x-raw-yuv"); - } else { - srccaps = gst_ffmpeg_codectype_to_audio_caps (NULL, - in_plugin->id, FALSE, in_plugin); - } - if (!srccaps) { - GST_DEBUG ("Couldn't get source caps for decoder '%s', skipping codec", - in_plugin->name); - goto next; - } - /* construct the type */ plugin_name = g_strdup ((gchar *) in_plugin->name); g_strdelimit (plugin_name, NULL, '_'); @@ -2852,8 +2851,6 @@ gst_ffmpegdec_register (GstPlugin * plugin) 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); @@ -2902,10 +2899,6 @@ gst_ffmpegdec_register (GstPlugin * plugin) g_free (type_name); next: - if (sinkcaps) - gst_caps_unref (sinkcaps); - if (srccaps) - gst_caps_unref (srccaps); in_plugin = av_codec_next (in_plugin); } |