summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2009-11-02 08:47:12 +0100
committerEdward Hervey <bilboed@bilboed.com>2009-11-02 09:06:05 +0100
commite8c689fe9403bc5e036559f13388a33475802e09 (patch)
tree868be33ca3ed57a132980d9d3d5a9b60d827678c
parenta7dd30d8ebafd1d4d38588e9c4c40c3ecea6adb6 (diff)
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.
-rw-r--r--ext/ffmpeg/gstffmpegdemux.c76
1 files changed, 27 insertions, 49 deletions
diff --git a/ext/ffmpeg/gstffmpegdemux.c b/ext/ffmpeg/gstffmpegdemux.c
index 6a8438f..80880be 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 <wim@fluendo.com>, "
"Ronald Bultje <rbultje@ronald.bitfreak.net>, "
"Edward Hervey <bilboed@bilboed.com>";
@@ -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);
+ sinkcaps = gst_ffmpeg_formatid_to_caps (in_plugin->name);
+
GST_LOG ("ffmpeg typefinder '%s' suggests %" GST_PTR_FORMAT ", p=%u%%",
- in_plugin->name, params->sinkcaps, res);
+ in_plugin->name, sinkcaps, res);
- gst_type_find_suggest (tf, res, params->sinkcaps);
+ 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);