-/*****************************************************************************
- * module_Need: return the best module function, given a capability list.
- *****************************************************************************
- * This function returns the module that best fits the asked capabilities.
- *****************************************************************************/
-module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability,
- const char *psz_name, vlc_bool_t b_strict )
+module_t *module_hold (module_t *m)
+{
+ vlc_hold (&m->vlc_gc_data);
+ return m;
+}
+
+void module_release (module_t *m)
+{
+ vlc_release (&m->vlc_gc_data);
+}
+
+/**
+ * Frees the flat list of VLC modules.
+ * @param list list obtained by module_list_get
+ * @param length number of items on the list
+ * @return nothing.
+ */
+void module_list_free (module_t **list)
+{
+ if (list == NULL)
+ return;
+
+ for (size_t i = 0; list[i] != NULL; i++)
+ module_release (list[i]);
+ free (list);
+}
+
+/**
+ * Gets the flat list of VLC modules.
+ * @param n [OUT] pointer to the number of modules or NULL
+ * @return NULL-terminated table of module pointers
+ * (release with module_list_free()), or NULL in case of error.
+ */
+module_t **module_list_get (size_t *n)
+{
+ /* TODO: this whole module lookup is quite inefficient */
+ /* Remove this and improve module_need */
+ module_t **tab = NULL;
+ size_t i = 0;
+
+ for (module_t *mod = p_module_bank->head; mod; mod = mod->next)
+ {
+ module_t **nt;
+ nt = realloc (tab, (i + 2 + mod->submodule_count) * sizeof (*tab));
+ if (nt == NULL)
+ {
+ module_list_free (tab);
+ return NULL;
+ }
+
+ tab = nt;
+ tab[i++] = module_hold (mod);
+ for (module_t *subm = mod->submodule; subm; subm = subm->next)
+ tab[i++] = module_hold (subm);
+ tab[i] = NULL;
+ }
+ if (n != NULL)
+ *n = i;
+ return tab;
+}
+
+/**
+ * module Need
+ *
+ * Return the best module function, given a capability list.
+ *
+ * If the p_this object doesn't have it's psz_object_name set, then
+ * psz_object_name will be set to the module's name, unless the user
+ * provided an alias using the "module name@alias" syntax in which case
+ * psz_object_name will be set to the alias.
+ *
+ * \param p_this the vlc object
+ * \param psz_capability list of capabilities needed
+ * \param psz_name name of the module asked
+ * \param b_strict TRUE yto use the strict mode
+ * \return the module or NULL in case of a failure
+ */
+module_t * __module_need( vlc_object_t *p_this, const char *psz_capability,
+ const char *psz_name, bool b_strict )