From 02bde78085ad1836c6997f7affa030f616e2afe4 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Fri, 16 Sep 2005 03:46:14 +0000 Subject: [PATCH] check/gst/gstplugin.c: More testing Original commit message from CVS: * check/gst/gstplugin.c: (register_check_elements), (GST_START_TEST), (peek), (suggest), (gst_plugin_suite): More testing * gst/elements/gsttypefindelement.c: Fix refcounting. * gst/gsttypefind.c: * gst/gsttypefindfactory.c: * gst/gsttypefindfactory.h: --- ChangeLog | 10 +++++++ check/gst/gstplugin.c | 53 +++++++++++++++++++++++++++++++++++ common | 2 +- gst/elements/gsttypefindelement.c | 2 +- gst/gsttypefind.c | 18 ++++-------- gst/gsttypefindfactory.c | 53 ++++++++++++++--------------------- gst/gsttypefindfactory.h | 6 ++-- plugins/elements/gsttypefindelement.c | 2 +- tests/check/gst/gstplugin.c | 53 +++++++++++++++++++++++++++++++++++ 9 files changed, 149 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index d62cfa9..fbbb813 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2005-09-15 David Schleef + * check/gst/gstplugin.c: (register_check_elements), + (GST_START_TEST), (peek), (suggest), (gst_plugin_suite): + More testing + * gst/elements/gsttypefindelement.c: Fix refcounting. + * gst/gsttypefind.c: + * gst/gsttypefindfactory.c: + * gst/gsttypefindfactory.h: + +2005-09-15 David Schleef + * gst/gstindex.c: get refcounting correct. * gst/gstregistry.c: Handle the case where a feature/plugin is not found. diff --git a/check/gst/gstplugin.c b/check/gst/gstplugin.c index 88aa2ca..02495cb 100644 --- a/check/gst/gstplugin.c +++ b/check/gst/gstplugin.c @@ -136,6 +136,58 @@ GST_START_TEST (test_find_feature) GST_END_TEST; +guint8 * +peek (gpointer data, gint64 offset, guint size) +{ + return NULL; +} + +void +suggest (gpointer data, guint probability, const GstCaps * caps) +{ + +} + +GST_START_TEST (test_typefind) +{ + GstPlugin *plugin; + GstPluginFeature *feature; + GstTypeFind typefind = { + peek, + suggest, + NULL, + NULL, + GST_PADDING_INIT + }; + + plugin = gst_default_registry_find_plugin ("typefindfunctions"); + fail_if (plugin == NULL, "Failed to find typefind functions"); + fail_if (plugin->object.refcount != 2, + "Refcount of plugin in registry should be 2"); + fail_if (gst_plugin_is_loaded (plugin), "Expected plugin to be unloaded"); + + feature = gst_registry_find_feature (gst_registry_get_default (), + "audio/x-au", GST_TYPE_TYPE_FIND_FACTORY); + fail_if (feature == NULL, "Failed to find audio/x-aw typefind factory"); + fail_if (feature->plugin != plugin, + "Expected indentity to be from gstelements plugin"); + + fail_if (plugin->object.refcount != 3, + "Refcount of plugin in registry+feature should be 3"); + + gst_type_find_factory_call_function (GST_TYPE_FIND_FACTORY (feature), + &typefind); + + gst_object_unref (feature->plugin); + + fail_if (plugin->object.refcount != 1, + "Refcount of plugin in after list free should be 1"); + + gst_object_unref (plugin); +} + +GST_END_TEST; + Suite * gst_plugin_suite (void) { @@ -150,6 +202,7 @@ gst_plugin_suite (void) tcase_add_test (tc_chain, test_load_gstelements); tcase_add_test (tc_chain, test_registry_get_plugin_list); tcase_add_test (tc_chain, test_find_feature); + tcase_add_test (tc_chain, test_typefind); return s; } diff --git a/common b/common index 019a3be..62cd70d 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 019a3be6a5b7cde92c5daae35fe189c8aebeb5b6 +Subproject commit 62cd70d46eb00c3eb6b973b8a3b5fe6c202dbb29 diff --git a/gst/elements/gsttypefindelement.c b/gst/elements/gsttypefindelement.c index 320b5cc..cd539db 100644 --- a/gst/elements/gsttypefindelement.c +++ b/gst/elements/gsttypefindelement.c @@ -632,7 +632,7 @@ gst_type_find_element_chain (GstPad * pad, GstBuffer * buffer) g_list_prepend (typefind->possibilities, entry); all_factories = g_list_next (all_factories); } - g_list_free (all_factories); + gst_plugin_feature_list_free (all_factories); } /* call every typefind function once */ diff --git a/gst/gsttypefind.c b/gst/gsttypefind.c index 9c7b465..87cd74d 100644 --- a/gst/gsttypefind.c +++ b/gst/gsttypefind.c @@ -62,18 +62,12 @@ gst_type_find_register (GstPlugin * plugin, const gchar * name, guint rank, g_return_val_if_fail (func != NULL, FALSE); GST_INFO ("registering typefind function for %s", name); - factory = - GST_TYPE_FIND_FACTORY (gst_registry_find_feature (gst_registry_get_default - (), name, GST_TYPE_TYPE_FIND_FACTORY)); - if (!factory) { - factory = g_object_new (GST_TYPE_TYPE_FIND_FACTORY, NULL); - GST_DEBUG_OBJECT (factory, "using new typefind factory for %s", name); - g_assert (GST_IS_TYPE_FIND_FACTORY (factory)); - gst_plugin_feature_set_name (GST_PLUGIN_FEATURE (factory), name); - gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); - } else { - GST_DEBUG_OBJECT (factory, "using old typefind factory for %s", name); - } + + factory = g_object_new (GST_TYPE_TYPE_FIND_FACTORY, NULL); + GST_DEBUG_OBJECT (factory, "using new typefind factory for %s", name); + g_assert (GST_IS_TYPE_FIND_FACTORY (factory)); + gst_plugin_feature_set_name (GST_PLUGIN_FEATURE (factory), name); + gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE (factory), rank); if (factory->extensions) diff --git a/gst/gsttypefindfactory.c b/gst/gsttypefindfactory.c index 18b7573..0157093 100644 --- a/gst/gsttypefindfactory.c +++ b/gst/gsttypefindfactory.c @@ -92,8 +92,6 @@ static void gst_type_find_factory_init (GTypeInstance * instance, gpointer g_class); static void gst_type_find_factory_dispose (GObject * object); -static void gst_type_find_load_plugin (GstTypeFind * find, gpointer data); - static GstPluginFeatureClass *parent_class = NULL; GType @@ -123,6 +121,7 @@ gst_type_find_factory_get_type (void) return typefind_type; } + static void gst_type_find_factory_class_init (gpointer g_class, gpointer class_data) { @@ -132,14 +131,15 @@ gst_type_find_factory_class_init (gpointer g_class, gpointer class_data) object_class->dispose = gst_type_find_factory_dispose; } + static void gst_type_find_factory_init (GTypeInstance * instance, gpointer g_class) { GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (instance); factory->user_data = factory; - factory->function = gst_type_find_load_plugin; } + static void gst_type_find_factory_dispose (GObject * object) { @@ -154,28 +154,6 @@ gst_type_find_factory_dispose (GObject * object) factory->extensions = NULL; } } -static void -gst_type_find_load_plugin (GstTypeFind * find, gpointer data) -{ - GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (data); - - GST_DEBUG_OBJECT (factory, "need to load typefind function %s", - GST_PLUGIN_FEATURE_NAME (factory)); - - factory = - GST_TYPE_FIND_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE - (factory))); - if (factory) { - if (factory->function == gst_type_find_load_plugin) { - /* looks like we didn't get a real typefind function */ - g_warning ("could not load valid typefind function for feature '%s'\n", - GST_PLUGIN_FEATURE_NAME (factory)); - } else { - g_assert (factory->function); - gst_type_find_factory_call_function (factory, find); - } - } -} /** * gst_type_find_factory_get_list: @@ -200,8 +178,8 @@ gst_type_find_factory_get_list (void) * * Returns: the #GstCaps associated with this factory */ -const GstCaps * -gst_type_find_factory_get_caps (const GstTypeFindFactory * factory) +GstCaps * +gst_type_find_factory_get_caps (GstTypeFindFactory * factory) { g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), NULL); @@ -220,7 +198,7 @@ gst_type_find_factory_get_caps (const GstTypeFindFactory * factory) * Returns: a NULL-terminated array of extensions associated with this factory */ gchar ** -gst_type_find_factory_get_extensions (const GstTypeFindFactory * factory) +gst_type_find_factory_get_extensions (GstTypeFindFactory * factory) { g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), NULL); @@ -236,16 +214,27 @@ gst_type_find_factory_get_extensions (const GstTypeFindFactory * factory) * Calls the typefinding function associated with this factory. */ void -gst_type_find_factory_call_function (const GstTypeFindFactory * factory, +gst_type_find_factory_call_function (GstTypeFindFactory * factory, GstTypeFind * find) { + GstTypeFindFactory *new_factory; + g_return_if_fail (GST_IS_TYPE_FIND_FACTORY (factory)); g_return_if_fail (find != NULL); g_return_if_fail (find->peek != NULL); g_return_if_fail (find->suggest != NULL); - /* should never happen */ - g_assert (factory->function != NULL); + /* gst_plugin_feature_load will steal our ref */ + gst_object_ref (factory->feature.plugin); + new_factory = + GST_TYPE_FIND_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE + (factory))); + if (new_factory) { + g_assert (new_factory->function != NULL); - factory->function (find, factory->user_data); + new_factory->function (find, new_factory->user_data); + /* FIXME hack. somehow, this refcount gets destroyed */ + gst_object_ref (new_factory->feature.plugin); + //gst_object_unref (new_factory->feature.plugin); + } } diff --git a/gst/gsttypefindfactory.h b/gst/gsttypefindfactory.h index d4424e7..740e007 100644 --- a/gst/gsttypefindfactory.h +++ b/gst/gsttypefindfactory.h @@ -70,9 +70,9 @@ GType gst_type_find_factory_get_type (void); GList * gst_type_find_factory_get_list (void); -gchar ** gst_type_find_factory_get_extensions (const GstTypeFindFactory *factory); -const GstCaps * gst_type_find_factory_get_caps (const GstTypeFindFactory *factory); -void gst_type_find_factory_call_function (const GstTypeFindFactory *factory, +gchar ** gst_type_find_factory_get_extensions (GstTypeFindFactory *factory); +GstCaps * gst_type_find_factory_get_caps (GstTypeFindFactory *factory); +void gst_type_find_factory_call_function (GstTypeFindFactory *factory, GstTypeFind *find); G_END_DECLS diff --git a/plugins/elements/gsttypefindelement.c b/plugins/elements/gsttypefindelement.c index 320b5cc..cd539db 100644 --- a/plugins/elements/gsttypefindelement.c +++ b/plugins/elements/gsttypefindelement.c @@ -632,7 +632,7 @@ gst_type_find_element_chain (GstPad * pad, GstBuffer * buffer) g_list_prepend (typefind->possibilities, entry); all_factories = g_list_next (all_factories); } - g_list_free (all_factories); + gst_plugin_feature_list_free (all_factories); } /* call every typefind function once */ diff --git a/tests/check/gst/gstplugin.c b/tests/check/gst/gstplugin.c index 88aa2ca..02495cb 100644 --- a/tests/check/gst/gstplugin.c +++ b/tests/check/gst/gstplugin.c @@ -136,6 +136,58 @@ GST_START_TEST (test_find_feature) GST_END_TEST; +guint8 * +peek (gpointer data, gint64 offset, guint size) +{ + return NULL; +} + +void +suggest (gpointer data, guint probability, const GstCaps * caps) +{ + +} + +GST_START_TEST (test_typefind) +{ + GstPlugin *plugin; + GstPluginFeature *feature; + GstTypeFind typefind = { + peek, + suggest, + NULL, + NULL, + GST_PADDING_INIT + }; + + plugin = gst_default_registry_find_plugin ("typefindfunctions"); + fail_if (plugin == NULL, "Failed to find typefind functions"); + fail_if (plugin->object.refcount != 2, + "Refcount of plugin in registry should be 2"); + fail_if (gst_plugin_is_loaded (plugin), "Expected plugin to be unloaded"); + + feature = gst_registry_find_feature (gst_registry_get_default (), + "audio/x-au", GST_TYPE_TYPE_FIND_FACTORY); + fail_if (feature == NULL, "Failed to find audio/x-aw typefind factory"); + fail_if (feature->plugin != plugin, + "Expected indentity to be from gstelements plugin"); + + fail_if (plugin->object.refcount != 3, + "Refcount of plugin in registry+feature should be 3"); + + gst_type_find_factory_call_function (GST_TYPE_FIND_FACTORY (feature), + &typefind); + + gst_object_unref (feature->plugin); + + fail_if (plugin->object.refcount != 1, + "Refcount of plugin in after list free should be 1"); + + gst_object_unref (plugin); +} + +GST_END_TEST; + Suite * gst_plugin_suite (void) { @@ -150,6 +202,7 @@ gst_plugin_suite (void) tcase_add_test (tc_chain, test_load_gstelements); tcase_add_test (tc_chain, test_registry_get_plugin_list); tcase_add_test (tc_chain, test_find_feature); + tcase_add_test (tc_chain, test_typefind); return s; } -- 2.7.4