<html><body bgcolor="#FFFFFF"><div><br></div><div><br>El 20/12/2010, a las 09:58, <a href="mailto:git@videolan.org">git@videolan.org</a> escribió:<br><br></div><div></div><blockquote type="cite"><div><span>vlc | branch: master | Jakub Wieczorek <<a href="mailto:fawek@fawek.net">fawek@fawek.net</a>> | Mon Dec 20 09:47:33 2010 +0100| [3f808957006315d08f2c05ae2ae64212a1a1f0fd] | committer: Jean-Baptiste Kempf </span><br><span></span><br><span>LibVLC Audio/video filters listing API</span><br><span></span><br><span>Signed-off-by: Jean-Baptiste Kempf <<a href="mailto:jb@videolan.org">jb@videolan.org</a>></span><br><span></span><br><blockquote type="cite"><span><a href="http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3f808957006315d08f2c05ae2ae64212a1a1f0fd">http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3f808957006315d08f2c05ae2ae64212a1a1f0fd</a></span><br></blockquote><span>---</span><br><span></span><br><span> include/vlc/libvlc.h |   51 ++++++++++++++++++++++++++++++++++</span><br><span> src/control/core.c   |   74 ++++++++++++++++++++++++++++++++++++++++++++++++++</span><br><span> src/libvlc.sym       |    3 ++</span><br><span> test/libvlc/core.c   |   31 +++++++++++++++++++++</span><br><span> 4 files changed, 159 insertions(+), 0 deletions(-)</span><br><span></span><br><span>diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h</span><br><span>index 9ba4864..614c3b0 100644</span><br><span>--- a/include/vlc/libvlc.h</span><br><span>+++ b/include/vlc/libvlc.h</span><br><span>@@ -429,6 +429,57 @@ VLC_PUBLIC_API libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterat</span><br><span>                                                                libvlc_log_message_t *p_buffer );</span><br><span></span><br><span> /** @} */</span><br><span>+</span><br><span>+/**</span><br><span>+ * Description of a module.</span><br><span>+ */</span><br><span>+typedef struct libvlc_module_description_t</span><br><span>+{</span><br><span>+    char *psz_name;</span><br><span>+    char *psz_shortname;</span><br><span>+    char *psz_longname;</span><br><span>+    char *psz_help;</span><br><span>+    struct libvlc_module_description_t *p_next;</span><br><span>+} libvlc_module_description_t;</span><font class="Apple-style-span" color="#000000"><font class="Apple-style-span" color="#0023A3"><br></font></font></div></blockquote><div><br></div>A linked list? I think we generally (tracks info) use a null terminated table. Could you also drop the Hungarian type prefix in the structure?<div><div><br><blockquote type="cite"><div><span>+libvlc_module_description_t *libvlc_module_description_list_get( libvlc_instance_t *p_instance, const char *capability );</span><br><span>+</span><br><span>+/**</span><br><span>+ * Release a list of module descriptions.</span><br><span>+ *</span><br><span>+ * \param p_list the list to be released</span><br><span>+ */</span><br><span>+VLC_PUBLIC_API</span><br><span>+void libvlc_module_description_list_release( libvlc_module_description_t *p_list );</span><br><span>+</span><br><span>+/**</span><br><span>+ * Returns a list of audio filters that are available.</span><br><span>+ *</span><br><span>+ * \param p_instance libvlc instance</span><br><span>+ *</span><br><span>+ * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release().</span><br><span>+ *         In case of an error, NULL is returned.</span><br><span>+ *</span><br><span>+ * \see libvlc_module_description_t</span><br><span>+ * \see libvlc_module_description_list_release</span><br><span>+ */</span><br><span>+VLC_PUBLIC_API</span><br><span>+libvlc_module_description_t *libvlc_audio_filter_list_get( libvlc_instance_t *p_instance );</span><br><span>+</span><br><span>+/**</span><br><span>+ * Returns a list of video filters that are available.</span><br><span>+ *</span><br><span>+ * \param p_instance libvlc instance</span><br><span>+ *</span><br><span>+ * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release().</span><br><span>+ *         In case of an error, NULL is returned.</span><br><span>+ *</span><br><span>+ * \see libvlc_module_description_t</span><br><span>+ * \see libvlc_module_description_list_release</span><br><span>+ */</span><br><span>+VLC_PUBLIC_API</span><br><span>+libvlc_module_description_t *libvlc_video_filter_list_get( libvlc_instance_t *p_instance );</span><br><span>+</span><br><span> /** @} */</span><br><span> /** @} */</span><br><span></span><br><span>diff --git a/src/control/core.c b/src/control/core.c</span><br><span>index 15e6e72..ee80234 100644</span><br><span>--- a/src/control/core.c</span><br><span>+++ b/src/control/core.c</span><br><span>@@ -26,6 +26,7 @@</span><br><span> #endif</span><br><span></span><br><span> #include "libvlc_internal.h"</span><br><span>+#include <vlc_modules.h></span><br><span> #include <vlc/libvlc.h></span><br><span></span><br><span> #include <vlc_interface.h></span><br><span>@@ -171,3 +172,76 @@ void libvlc_free( void *ptr )</span><br><span> {</span><br><span>     free( ptr );</span><br><span> }</span><br><span>+</span><br><span>+libvlc_module_description_t *libvlc_module_description_list_get( libvlc_instance_t *p_instance, const char *capability )</span><br><span>+{</span><br><span>+    VLC_UNUSED( p_instance );</span><br><span>+    libvlc_module_description_t *p_list = NULL,</span><br><span>+                          *p_actual = NULL,</span><br><span>+                          *p_previous = NULL;</span><br><span>+    module_t **module_list = module_list_get( NULL );</span><br><span>+</span><br><span>+    for (size_t i = 0; module_list[i]; i++)</span><br><span>+    {</span><br><span>+        module_t *p_module = module_list[i];</span><br><span>+</span><br><span>+        if ( !module_provides( p_module, capability ) )</span><br><span>+            continue;</span><br><span>+</span><br><span>+        p_actual = ( libvlc_module_description_t * ) malloc( sizeof( libvlc_module_description_t ) );</span><br><span>+        if ( p_actual == NULL )</span><br><span>+        {</span><br><span>+            libvlc_printerr( "Not enough memory" );</span><br><span>+            libvlc_module_description_list_release( p_list );</span><br><span>+            module_list_free( module_list );</span><br><span>+            return NULL;</span><br><span>+        }</span><br><span>+</span><br><span>+        if ( p_list == NULL )</span><br><span>+            p_list = p_actual;</span><br><span>+</span><br><span>+        const char* name = module_get_object( p_module );</span><br><span>+        const char* shortname = module_get_name( p_module, false );</span><br><span>+        const char* longname = module_get_name( p_module, true );</span><br><span>+        const char* help = module_get_help( p_module );</span><br><span>+        p_actual->psz_name = name ? strdup( name ) : NULL;</span><br><span>+        p_actual->psz_shortname = shortname ? strdup( shortname ) : NULL;</span><br><span>+        p_actual->psz_longname = longname ? strdup( longname ) : NULL;</span><br><span>+        p_actual->psz_help = help ? strdup( help ) : NULL;</span><br><span>+</span><br><span>+        p_actual->p_next = NULL;</span><br><span>+        if ( p_previous )</span><br><span>+            p_previous->p_next = p_actual;</span><br><span>+        p_previous = p_actual;</span><br><span>+    }</span><br><span>+</span><br><span>+    module_list_free( module_list );</span><br><span>+    return p_list;</span><br><span>+}</span><br><span>+</span><br><span>+void libvlc_module_description_list_release( libvlc_module_description_t *p_list )</span><br><span>+{</span><br><span>+    libvlc_module_description_t *p_actual, *p_before;</span><br><span>+    p_actual = p_list;</span><br><span>+</span><br><span>+    while ( p_actual )</span><br><span>+    {</span><br><span>+        free( p_actual->psz_name );</span><br><span>+        free( p_actual->psz_shortname );</span><br><span>+        free( p_actual->psz_longname );</span><br><span>+        free( p_actual->psz_help );</span><br><span>+        p_before = p_actual;</span><br><span>+        p_actual = p_before->p_next;</span><br><span>+        free( p_before );</span><br><span>+    }</span><br><span>+}</span><br><span>+</span><br><span>+libvlc_module_description_t *libvlc_audio_filter_list_get( libvlc_instance_t *p_instance )</span><br><span>+{</span><br><span>+    return libvlc_module_description_list_get( p_instance, "audio filter" );</span><br><span>+}</span><br><span>+</span><br><span>+libvlc_module_description_t *libvlc_video_filter_list_get( libvlc_instance_t *p_instance )</span><br><span>+{</span><br><span>+    return libvlc_module_description_list_get( p_instance, "video filter2" );</span><br><span>+}</span><br><span>diff --git a/src/libvlc.sym b/src/libvlc.sym</span><br><span>index 1a401d1..cdd34ff 100644</span><br><span>--- a/src/libvlc.sym</span><br><span>+++ b/src/libvlc.sym</span><br><span>@@ -233,3 +233,6 @@ libvlc_vlm_show_media</span><br><span> libvlc_vlm_stop_media</span><br><span> libvlc_set_exit_handler</span><br><span> libvlc_wait</span><br><span>+libvlc_audio_filter_list_get</span><br><span>+libvlc_video_filter_list_get</span><br><span>+libvlc_module_description_list_release</span><br><span>diff --git a/test/libvlc/core.c b/test/libvlc/core.c</span><br><span>index 3871e5e..8580631 100644</span><br><span>--- a/test/libvlc/core.c</span><br><span>+++ b/test/libvlc/core.c</span><br><span>@@ -23,6 +23,8 @@</span><br><span></span><br><span> #include "test.h"</span><br><span></span><br><span>+#include <string.h></span><br><span>+</span><br><span> static void test_core (const char ** argv, int argc)</span><br><span> {</span><br><span>     libvlc_instance_t *vlc;</span><br><span>@@ -37,12 +39,41 @@ static void test_core (const char ** argv, int argc)</span><br><span>     libvlc_release (vlc);</span><br><span> }</span><br><span></span><br><span>+static void test_moduledescriptionlist (libvlc_module_description_t *list)</span><br><span>+{</span><br><span>+    libvlc_module_description_t *module = list;</span><br><span>+    while ( module ) {</span><br><span>+        assert (strlen (module->psz_name) );</span><br><span>+        assert (strlen (module->psz_shortname) );</span><br><span>+        assert (module->psz_longname == NULL || strlen (module->psz_longname));</span><br><span>+        assert (module->psz_help == NULL || strlen (module->psz_help));</span><br><span>+        module = module->p_next;</span><br><span>+    }    </span><br><span>+</span><br><span>+    libvlc_module_description_list_release (list);</span><br><span>+}</span><br><span>+</span><br><span>+static void test_audiovideofilterlists (const char ** argv, int argc)</span><br><span>+{</span><br><span>+    libvlc_instance_t *vlc;</span><br><span>+</span><br><span>+    log ("Testing libvlc_(audio|video)_filter_list_get()\n");</span><br><span>+</span><br><span>+    vlc = libvlc_new (argc, argv);</span><br><span>+    assert (vlc != NULL);</span><br><span>+</span><br><span>+    test_moduledescriptionlist (libvlc_audio_filter_list_get (vlc));</span><br><span>+    test_moduledescriptionlist (libvlc_video_filter_list_get (vlc));</span><br><span>+</span><br><span>+    libvlc_release (vlc);</span><br><span>+}</span><br><span></span><br><span> int main (void)</span><br><span> {</span><br><span>     test_init();</span><br><span></span><br><span>     test_core (test_defaults_args, test_defaults_nargs);</span><br><span>+    test_audiovideofilterlists (test_defaults_args, test_defaults_nargs);</span><br><span></span><br><span>     return 0;</span><br><span> }</span><br><span></span><br><span>_______________________________________________</span><br><span>vlc-commits mailing list</span><br><span><a href="mailto:vlc-commits@videolan.org">vlc-commits@videolan.org</a></span><br><span><a href="http://mailman.videolan.org/listinfo/vlc-commits">http://mailman.videolan.org/listinfo/vlc-commits</a></span><br></div></blockquote></div></div></body></html>