<chapter id="chapter-plugins">
  <title>Plugins</title>
  <!-- FIXME: introduce type definitions before this chapter -->
  <para> 
    A plugin is a shared library that contains at least one of the following
    items:
  </para>

  <itemizedlist>
    <listitem>
      <para>
        one or more element factories
      </para>
    </listitem>
    <listitem>
      <para>
        one or more type definitions
      </para>
    </listitem>
    <listitem>
      <para>
        one or more auto-pluggers
      </para>
    </listitem>
    <listitem>
      <para>
        exported symbols for use in other plugins
      </para>
    </listitem>
  </itemizedlist>

  <para> 
    All plugins should implement one function, <function>plugin_init</function>,
    that creates all the element factories and registers all the type
    definitions contained in the plugin.
    Without this function, a plugin cannot be registered.
  </para> 
  <para> 
    The plugins are maintained in the plugin system. Optionally, the
    type definitions and the element factories can be saved into an XML
    representation so that the plugin system does not have to load all
    available plugins in order to know their definition.
  </para> 
														  
  <para> 
    The basic plugin structure has the following fields:
  </para> 
  <programlisting>
typedef struct _GstPlugin   GstPlugin;

struct _GstPlugin {
  gchar *name;                  /* name of the plugin */
  gchar *longname;              /* long name of plugin */
  gchar *filename;              /* filename it came from */

  GList *types;                 /* list of types provided */
  gint numtypes;
  GList *elements;              /* list of elements provided */
  gint numelements;
  GList *autopluggers;          /* list of autopluggers provided */
  gint numautopluggers;

  gboolean loaded;              /* if the plugin is in memory */
};
  </programlisting>

  <para> 
    You can query a <classname>GList</classname> of available plugins with the
    function <function>gst_registry_pool_plugin_list</function> as this example
    shows:
  </para> 
  <programlisting>
    GList *plugins;
    
    plugins = gst_registry_pool_plugin_list ();

    while (plugins) {
      GstPlugin *plugin = (GstPlugin *)plugins-&gt;data;

      g_print ("plugin: %s\n", gst_plugin_get_name (plugin));

      plugins = g_list_next (plugins);
    }
  </programlisting>
</chapter>
