mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +00:00
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.
This commit is contained in:
parent
a7dd30d8eb
commit
e8c689fe94
1 changed files with 28 additions and 50 deletions
|
@ -101,12 +101,6 @@ struct _GstFFMpegDemux
|
||||||
GStaticRecMutex *task_lock;
|
GStaticRecMutex *task_lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _GstFFMpegDemuxClassParams
|
|
||||||
{
|
|
||||||
AVInputFormat *in_plugin;
|
|
||||||
GstCaps *sinkcaps, *videosrccaps, *audiosrccaps;
|
|
||||||
} GstFFMpegDemuxClassParams;
|
|
||||||
|
|
||||||
typedef struct _GstFFMpegDemuxClass GstFFMpegDemuxClass;
|
typedef struct _GstFFMpegDemuxClass GstFFMpegDemuxClass;
|
||||||
|
|
||||||
struct _GstFFMpegDemuxClass
|
struct _GstFFMpegDemuxClass
|
||||||
|
@ -186,20 +180,29 @@ static void
|
||||||
gst_ffmpegdemux_base_init (GstFFMpegDemuxClass * klass)
|
gst_ffmpegdemux_base_init (GstFFMpegDemuxClass * klass)
|
||||||
{
|
{
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
||||||
GstFFMpegDemuxClassParams *params;
|
AVInputFormat *in_plugin;
|
||||||
|
gchar *p, *name;
|
||||||
GstElementDetails details;
|
GstElementDetails details;
|
||||||
|
GstCaps *sinkcaps;
|
||||||
GstPadTemplate *sinktempl, *audiosrctempl, *videosrctempl;
|
GstPadTemplate *sinktempl, *audiosrctempl, *videosrctempl;
|
||||||
|
|
||||||
params = (GstFFMpegDemuxClassParams *)
|
in_plugin = (AVInputFormat *)
|
||||||
g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), GST_FFDEMUX_PARAMS_QDATA);
|
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 */
|
/* construct the element details struct */
|
||||||
details.longname = g_strdup_printf ("FFmpeg %s demuxer",
|
details.longname = g_strdup_printf ("FFmpeg %s demuxer",
|
||||||
params->in_plugin->long_name);
|
in_plugin->long_name);
|
||||||
details.klass = "Codec/Demuxer";
|
details.klass = "Codec/Demuxer";
|
||||||
details.description = g_strdup_printf ("FFmpeg %s 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>, "
|
details.author = "Wim Taymans <wim@fluendo.com>, "
|
||||||
"Ronald Bultje <rbultje@ronald.bitfreak.net>, "
|
"Ronald Bultje <rbultje@ronald.bitfreak.net>, "
|
||||||
"Edward Hervey <bilboed@bilboed.com>";
|
"Edward Hervey <bilboed@bilboed.com>";
|
||||||
|
@ -208,22 +211,19 @@ gst_ffmpegdemux_base_init (GstFFMpegDemuxClass * klass)
|
||||||
g_free (details.description);
|
g_free (details.description);
|
||||||
|
|
||||||
/* pad templates */
|
/* pad templates */
|
||||||
gst_caps_ref (params->sinkcaps);
|
sinkcaps = gst_ffmpeg_formatid_to_caps (name);
|
||||||
sinktempl = gst_pad_template_new ("sink",
|
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",
|
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",
|
audiosrctempl = gst_pad_template_new ("audio_%02d",
|
||||||
GST_PAD_SRC, GST_PAD_SOMETIMES, params->audiosrccaps);
|
GST_PAD_SRC, GST_PAD_SOMETIMES, GST_CAPS_ANY);
|
||||||
|
|
||||||
params->videosrccaps = NULL;
|
|
||||||
params->audiosrccaps = NULL;
|
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class, videosrctempl);
|
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, audiosrctempl);
|
||||||
gst_element_class_add_pad_template (element_class, sinktempl);
|
gst_element_class_add_pad_template (element_class, sinktempl);
|
||||||
|
|
||||||
klass->in_plugin = params->in_plugin;
|
klass->in_plugin = in_plugin;
|
||||||
klass->videosrctempl = videosrctempl;
|
klass->videosrctempl = videosrctempl;
|
||||||
klass->audiosrctempl = audiosrctempl;
|
klass->audiosrctempl = audiosrctempl;
|
||||||
klass->sinktempl = sinktempl;
|
klass->sinktempl = sinktempl;
|
||||||
|
@ -1258,10 +1258,10 @@ static void
|
||||||
gst_ffmpegdemux_type_find (GstTypeFind * tf, gpointer priv)
|
gst_ffmpegdemux_type_find (GstTypeFind * tf, gpointer priv)
|
||||||
{
|
{
|
||||||
guint8 *data;
|
guint8 *data;
|
||||||
GstFFMpegDemuxClassParams *params = (GstFFMpegDemuxClassParams *) priv;
|
AVInputFormat *in_plugin = (AVInputFormat *) priv;
|
||||||
AVInputFormat *in_plugin = params->in_plugin;
|
|
||||||
gint res = 0;
|
gint res = 0;
|
||||||
guint64 length;
|
guint64 length;
|
||||||
|
GstCaps *sinkcaps;
|
||||||
|
|
||||||
/* We want GST_FFMPEG_TYPE_FIND_SIZE bytes, but if the file is shorter than
|
/* We want GST_FFMPEG_TYPE_FIND_SIZE bytes, but if the file is shorter than
|
||||||
* that we'll give it a try... */
|
* 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"))
|
if (g_str_has_prefix (in_plugin->name, "mpegts"))
|
||||||
res = MIN (res, GST_TYPE_FIND_POSSIBLE);
|
res = MIN (res, GST_TYPE_FIND_POSSIBLE);
|
||||||
|
|
||||||
GST_LOG ("ffmpeg typefinder '%s' suggests %" GST_PTR_FORMAT ", p=%u%%",
|
sinkcaps = gst_ffmpeg_formatid_to_caps (in_plugin->name);
|
||||||
in_plugin->name, params->sinkcaps, res);
|
|
||||||
|
|
||||||
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;
|
GType type;
|
||||||
AVInputFormat *in_plugin;
|
AVInputFormat *in_plugin;
|
||||||
GstFFMpegDemuxClassParams *params;
|
|
||||||
gchar **extensions;
|
gchar **extensions;
|
||||||
GTypeInfo typeinfo = {
|
GTypeInfo typeinfo = {
|
||||||
sizeof (GstFFMpegDemuxClass),
|
sizeof (GstFFMpegDemuxClass),
|
||||||
|
@ -1856,7 +1857,6 @@ gst_ffmpegdemux_register (GstPlugin * plugin)
|
||||||
while (in_plugin) {
|
while (in_plugin) {
|
||||||
gchar *type_name, *typefind_name;
|
gchar *type_name, *typefind_name;
|
||||||
gchar *p, *name = NULL;
|
gchar *p, *name = NULL;
|
||||||
GstCaps *sinkcaps, *audiosrccaps, *videosrccaps;
|
|
||||||
gint rank;
|
gint rank;
|
||||||
gboolean register_typefind_func = TRUE;
|
gboolean register_typefind_func = TRUE;
|
||||||
|
|
||||||
|
@ -1971,42 +1971,20 @@ gst_ffmpegdemux_register (GstPlugin * plugin)
|
||||||
p++;
|
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 */
|
/* construct the type */
|
||||||
type_name = g_strdup_printf ("ffdemux_%s", name);
|
type_name = g_strdup_printf ("ffdemux_%s", name);
|
||||||
|
|
||||||
/* if it's already registered, drop it */
|
/* if it's already registered, drop it */
|
||||||
if (g_type_from_name (type_name)) {
|
if (g_type_from_name (type_name)) {
|
||||||
gst_caps_unref (videosrccaps);
|
|
||||||
gst_caps_unref (audiosrccaps);
|
|
||||||
g_free (type_name);
|
g_free (type_name);
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
||||||
typefind_name = g_strdup_printf ("fftype_%s", name);
|
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 */
|
/* create the type now */
|
||||||
type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0);
|
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)
|
if (in_plugin->extensions)
|
||||||
extensions = g_strsplit (in_plugin->extensions, " ", 0);
|
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) ||
|
if (!gst_element_register (plugin, type_name, rank, type) ||
|
||||||
(register_typefind_func == TRUE &&
|
(register_typefind_func == TRUE &&
|
||||||
!gst_type_find_register (plugin, typefind_name, rank,
|
!gst_type_find_register (plugin, typefind_name, rank,
|
||||||
gst_ffmpegdemux_type_find, extensions, sinkcaps, params,
|
gst_ffmpegdemux_type_find, extensions, NULL, in_plugin,
|
||||||
NULL))) {
|
NULL))) {
|
||||||
g_warning ("Register of type ffdemux_%s failed", name);
|
g_warning ("Register of type ffdemux_%s failed", name);
|
||||||
g_free (type_name);
|
g_free (type_name);
|
||||||
|
|
Loading…
Reference in a new issue