+2004-02-05 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * gst/gstcaps.h:
+ * gst/gstelement.c: (gst_element_base_class_init),
+ (gst_element_class_set_details), (gst_element_clear_pad_caps):
+ * gst/gstpad.c: (gst_pad_link_intersect), (gst_pad_link_fixate),
+ (gst_pad_try_set_caps), (gst_pad_can_link_filtered),
+ (gst_real_pad_dispose):
+ * gst/gststructure.c: (gst_structure_free),
+ (gst_structure_from_string):
+ revert patch that breaks applications, reapply after release
+ to get this fixed properly
+
2004-02-05 Benjamin Otte <in7y118@public.uni-hamburg.de>
* gst/gsttag.c: (_gst_tag_initialize):
-Subproject commit 90e64b98d566fd8df793cfc0a9b08b8e5fb356d3
+Subproject commit 90097339543fb0a705447b599d7a36138cba4232
</para>
-<!-- ##### SIGNAL GstBin::element-added ##### -->
-<para>
-
-</para>
-
-@gstbin: the object which received the signal.
-@arg1: the element that was added to the bin
-
-<!-- ##### SIGNAL GstBin::element-removed ##### -->
-<para>
-
-</para>
-
-@gstbin: the object which received the signal.
-@arg1: the element that was removed from the bin
-
-<!-- ##### SIGNAL GstBin::iterate ##### -->
-<para>
-This signal is emitted when a bin iterates, either automatically or
-due to a #gst_bin_iterate() call. The return value is used to
-determine if the object method handler processed any data.
-In most normal cases, a user-provided signal handler should return
-FALSE.
-</para>
-
-@gstbin: the object which received the signal.
-@Returns: TRUE if the state of the bin was advanced.
-
<!-- ##### USER_FUNCTION GstBinPrePostIterateFunction ##### -->
<para>
The signature of the callback for the post and pre iterate function as set with
@clock:
+<!-- ##### SIGNAL GstBin::element-added ##### -->
+<para>
+
+</para>
+
+@gstbin: the object which received the signal.
+@arg1: the element that was added to the bin
+
+<!-- ##### SIGNAL GstBin::element-removed ##### -->
+<para>
+
+</para>
+
+@gstbin: the object which received the signal.
+@arg1: the element that was removed from the bin
+
+<!-- ##### SIGNAL GstBin::iterate ##### -->
+<para>
+This signal is emitted when a bin iterates, either automatically or
+due to a #gst_bin_iterate() call. The return value is used to
+determine if the object method handler processed any data.
+In most normal cases, a user-provided signal handler should return
+FALSE.
+</para>
+
+@gstbin: the object which received the signal.
+@Returns: TRUE if the state of the bin was advanced.
+
</para>
-<!-- ##### ARG GstClock:event-diff ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GstClock:max-diff ##### -->
-<para>
-Maximum allowed diff for clock sync requests against the real time.
-</para>
-
-<!-- ##### ARG GstClock:stats ##### -->
-<para>
-Boolean property to activate stat generation on the clock.
-</para>
-
<!-- ##### FUNCTION gst_clock_set_speed ##### -->
<para>
@id:
+<!-- ##### ARG GstClock:event-diff ##### -->
+<para>
+
+</para>
+
+<!-- ##### ARG GstClock:max-diff ##### -->
+<para>
+Maximum allowed diff for clock sync requests against the real time.
+</para>
+
+<!-- ##### ARG GstClock:stats ##### -->
+<para>
+Boolean property to activate stat generation on the clock.
+</para>
+
</para>
-<!-- ##### SIGNAL GstElement::eos ##### -->
-<para>
-Signal emited when the element goes to PAUSED due to an end-of-stream
-condition.
-</para>
-
-@gstelement: the object which received the signal.
-
-<!-- ##### SIGNAL GstElement::error ##### -->
-<para>
-This signal is emitted when an element has encountered an error that caused
-it to fail performing its function.
-</para>
-
-@gstelement: the object which received the signal.
-@arg1: the original #GstElement that generated the error.
-@arg2: a #GError containing the translated error message.
-@arg3: a debug string providing additional untranslated debug information, or NULL.
-
-<!-- ##### SIGNAL GstElement::found-tag ##### -->
-<para>
-
-</para>
-
-@gstelement: the object which received the signal.
-@arg1:
-@arg2:
-
-<!-- ##### SIGNAL GstElement::new-pad ##### -->
-<para>
-Is triggered whenever a new pad is added to an element.
-</para>
-
-@gstelement: the object which received the signal.
-@arg1: the new pad that was added
-
-<!-- ##### SIGNAL GstElement::pad-removed ##### -->
-<para>
-Is triggered whenever a pad has been removed from the element.
-</para>
-
-@gstelement: the object which received the signal.
-@arg1: The pad that was removed.
-
-<!-- ##### SIGNAL GstElement::state-change ##### -->
-<para>
-Is triggered whenever the state of an element changes.
-</para>
-
-@gstelement: the object which received the signal.
-@arg1: the new state of the object
-@arg2:
-
<!-- ##### MACRO gst_element_get_name ##### -->
<para>
Gets the name of the element.
@...: list of query types.
+<!-- ##### SIGNAL GstElement::eos ##### -->
+<para>
+Signal emited when the element goes to PAUSED due to an end-of-stream
+condition.
+</para>
+
+@gstelement: the object which received the signal.
+
+<!-- ##### SIGNAL GstElement::error ##### -->
+<para>
+This signal is emitted when an element has encountered an error that caused
+it to fail performing its function.
+</para>
+
+@gstelement: the object which received the signal.
+@arg1: the original #GstElement that generated the error.
+@arg2: a #GError containing the translated error message.
+@arg3: a debug string providing additional untranslated debug information, or NULL.
+
+<!-- ##### SIGNAL GstElement::found-tag ##### -->
+<para>
+
+</para>
+
+@gstelement: the object which received the signal.
+@arg1:
+@arg2:
+
+<!-- ##### SIGNAL GstElement::new-pad ##### -->
+<para>
+Is triggered whenever a new pad is added to an element.
+</para>
+
+@gstelement: the object which received the signal.
+@arg1: the new pad that was added
+
+<!-- ##### SIGNAL GstElement::pad-removed ##### -->
+<para>
+Is triggered whenever a pad has been removed from the element.
+</para>
+
+@gstelement: the object which received the signal.
+@arg1: The pad that was removed.
+
+<!-- ##### SIGNAL GstElement::state-change ##### -->
+<para>
+Is triggered whenever the state of an element changes.
+</para>
+
+@gstelement: the object which received the signal.
+@arg1: the new state of the object
+@arg2:
+
</para>
-<!-- ##### SIGNAL GstIndex::entry-added ##### -->
-<para>
-Is emited when a new entry is added to the index.
-</para>
-
-@gstindex: the object which received the signal.
-@arg1: The entry added to the index.
-
-<!-- ##### ARG GstIndex:resolver ##### -->
-<para>
-
-</para>
-
<!-- ##### FUNCTION gst_index_new ##### -->
<para>
@id:
+<!-- ##### SIGNAL GstIndex::entry-added ##### -->
+<para>
+Is emited when a new entry is added to the index.
+</para>
+
+@gstindex: the object which received the signal.
+@arg1: The entry added to the index.
+
+<!-- ##### ARG GstIndex:resolver ##### -->
+<para>
+
+</para>
+
</para>
-<!-- ##### SIGNAL GstObject::deep-notify ##### -->
-<para>
-The deep notify signal is used to be notified of property changes.
-it is typically attached to the toplevel bin to receive notifications
-from all the elements contained in that bin.
-</para>
-
-@gstobject: the object which received the signal.
-@arg1: the object that originated the signal
-@arg2: the property that changed
-
-<!-- ##### SIGNAL GstObject::object-saved ##### -->
-<para>
-Is trigered whenever a new object is saved to XML. You can connect to
-this signal to insert custom XML tags into the core XML.
-</para>
-
-@gstobject: the object which received the signal.
-@arg1: the xmlNodePtr of the parent node
-
-<!-- ##### SIGNAL GstObject::parent-set ##### -->
-<para>
-Is emitted when the parent of an object is set.
-</para>
-
-@gstobject: the object which received the signal.
-@arg1: the new parent
-
-<!-- ##### SIGNAL GstObject::parent-unset ##### -->
-<para>
-Is emitted when the parent of an object is unset.
-</para>
-
-@gstobject: the object which received the signal.
-@arg1: the old parent
-
-<!-- ##### ARG GstObject:name ##### -->
-<para>
-The name of the object
-</para>
-
<!-- ##### MACRO GST_FLAGS ##### -->
<para>
This macro returns the entire set of flags for the object.
@Returns:
+<!-- ##### SIGNAL GstObject::deep-notify ##### -->
+<para>
+The deep notify signal is used to be notified of property changes.
+it is typically attached to the toplevel bin to receive notifications
+from all the elements contained in that bin.
+</para>
+
+@gstobject: the object which received the signal.
+@arg1: the object that originated the signal
+@arg2: the property that changed
+
+<!-- ##### SIGNAL GstObject::object-saved ##### -->
+<para>
+Is trigered whenever a new object is saved to XML. You can connect to
+this signal to insert custom XML tags into the core XML.
+</para>
+
+@gstobject: the object which received the signal.
+@arg1: the xmlNodePtr of the parent node
+
+<!-- ##### SIGNAL GstObject::parent-set ##### -->
+<para>
+Is emitted when the parent of an object is set.
+</para>
+
+@gstobject: the object which received the signal.
+@arg1: the new parent
+
+<!-- ##### SIGNAL GstObject::parent-unset ##### -->
+<para>
+Is emitted when the parent of an object is unset.
+</para>
+
+@gstobject: the object which received the signal.
+@arg1: the old parent
+
+<!-- ##### ARG GstObject:name ##### -->
+<para>
+The name of the object
+</para>
+
</para>
-<!-- ##### SIGNAL GstPadTemplate::pad-created ##### -->
-<para>
-This signal is fired when an element creates a pad from this
-template.
-</para>
-
-@gstpadtemplate: the object which received the signal.
-@arg1: The pad that was created.
-
<!-- ##### ENUM GstPadTemplateFlags ##### -->
<para>
Flags for the padtemplate
@Returns:
+<!-- ##### SIGNAL GstPadTemplate::pad-created ##### -->
+<para>
+This signal is fired when an element creates a pad from this
+template.
+</para>
+
+@gstpadtemplate: the object which received the signal.
+@arg1: The pad that was created.
+
</para>
-<!-- ##### SIGNAL GstXML::object-loaded ##### -->
-<para>
-
-</para>
-
-@:
-@:
-@:
-
-
<!-- ##### USER_FUNCTION GstXMLRegistryAddPathList ##### -->
<para>
</para>
-<!-- ##### SIGNAL GstThread::shutdown ##### -->
+<!-- ##### FUNCTION gst_thread_new ##### -->
<para>
</para>
-@gstthread: the object which received the signal.
+@name:
+@Returns:
-<!-- ##### ARG GstThread:priority ##### -->
-<para>
-The thread priority
-</para>
-<!-- ##### FUNCTION gst_thread_new ##### -->
+<!-- ##### SIGNAL GstThread::shutdown ##### -->
<para>
</para>
-@name:
-@Returns:
+@gstthread: the object which received the signal.
+<!-- ##### ARG GstThread:priority ##### -->
+<para>
+The thread priority
+</para>
@Returns:
+<!-- ##### SIGNAL GstXML::object-loaded ##### -->
+<para>
+
+</para>
+
+@:
+@:
+@:
+
+@gstxml: the object which received the signal.
+@arg1:
+@arg2:
+
+<!-- ##### SIGNAL GstXML::object-loaded ##### -->
+<para>
+
+</para>
+
+@gstxml: the object which received the signal.
+@arg1:
+@arg2:
+
--- /dev/null
+<chapter id="chapter-clocks">
+ <title>Clocks in GStreamer</title>
+ <para>
+ </para>
+</chapter>
--- /dev/null
+<chapter id="chapter-bins">
+ <title>Bins</title>
+ <para>
+ A bin is a container element. You can add elements to a bin. Since a bin is
+ an element itself, it can also be added to another bin.
+ </para>
+ <para>
+ Bins allow you to combine a group of linked elements into one logical element. You do
+ not deal with the individual elements anymore but with just one element, the bin.
+ We will see that this is extremely powerful when you are going to construct
+ complex pipelines since it allows you to break up the pipeline in smaller chunks.
+ </para>
+ <para>
+ The bin will also manage the elements contained in it. It will figure out how
+ the data will flow in the bin and generate an optimal plan for that data flow. Plan
+ generation is one of the most complicated procedures in GStreamer.
+ </para>
+
+ <figure float="1" id="section-bin-img">
+ <title>Visualisation of a bin with some elements in it</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/bin-element.ℑ" format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ There are two specialized bins available to the GStreamer programmer:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ a pipeline: a generic container that allows scheduling of the
+ containing elements. The toplevel bin has to be a pipeline.
+ Every application thus needs at least one of these.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ a thread: a bin that will be run in a separate execution thread.
+ You will have to use this bin if you have to carefully
+ synchronize audio and video, or for buffering. You will learn
+ more about threads in <xref linkend="chapter-threads"/>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+</chapter>
--- /dev/null
+<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>
+</chapter>
--- /dev/null
+<chapter id="chapter-components">
+ <title>Components</title>
+
+ <para>
+ FIXME: This chapter is way out of date.
+ </para>
+
+ <para>
+ <application>GStreamer</application> includes components that people can include
+ in their programs.
+ </para>
+
+ <sect1 id="section-components-gst-play">
+ <title>GstPlay</title>
+ <para>
+ GstPlay is a GtkWidget with a simple API to play, pause and stop a media file.
+ </para>
+
+ </sect1>
+
+ <sect1 id="section-components-gst-media-play">
+ <title>GstMediaPlay</title>
+ <para>
+ GstMediaPlay is a complete player widget.
+ </para>
+
+ </sect1>
+
+ <sect1 id="section-components-gst-editor">
+ <title>GstEditor</title>
+ <para>
+ GstEditor is a set of widgets to display a graphical representation of a
+ pipeline.
+ </para>
+ </sect1>
+
+</chapter>
--- /dev/null
+<chapter id="chapter-xml">
+ <title>XML in <application>GStreamer</application></title>
+ <para>
+ <application>GStreamer</application> uses XML to store and load
+ its pipeline definitions. XML is also used internally to manage the
+ plugin registry. The plugin registry is a file that contains the definition
+ of all the plugins <application>GStreamer</application> knows about to have
+ quick access to the specifics of the plugins.
+ </para>
+
+ <para>
+ We will show you how you can save a pipeline to XML and how you can reload that
+ XML file again for later use.
+ </para>
+
+ <sect1 id="section-xml-write">
+ <title>Turning GstElements into XML</title>
+
+ <para>
+ We create a simple pipeline and write it to stdout with
+ gst_xml_write_file (). The following code constructs an MP3 player
+ pipeline with two threads and then writes out the XML both to stdout
+ and to a file. Use this program with one argument: the MP3 file on disk.
+ </para>
+
+ <programlisting>
+/* example-begin xml-mp3.c */
+#include <stdlib.h>
+#include <gst/gst.h>
+
+gboolean playing;
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *filesrc, *osssink, *queue, *queue2, *decode;
+ GstElement *bin;
+ GstElement *thread, *thread2;
+
+ gst_init (&argc,&argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <mp3 filename>\n", argv[0]);
+ exit (-1);
+ }
+
+ /* create a new thread to hold the elements */
+ thread = gst_element_factory_make ("thread", "thread");
+ g_assert (thread != NULL);
+ thread2 = gst_element_factory_make ("thread", "thread2");
+ g_assert (thread2 != NULL);
+
+ /* create a new bin to hold the elements */
+ bin = gst_bin_new ("bin");
+ g_assert (bin != NULL);
+
+ /* create a disk reader */
+ filesrc = gst_element_factory_make ("filesrc", "disk_source");
+ g_assert (filesrc != NULL);
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+
+ queue = gst_element_factory_make ("queue", "queue");
+ queue2 = gst_element_factory_make ("queue", "queue2");
+
+ /* and an audio sink */
+ osssink = gst_element_factory_make ("osssink", "play_audio");
+ g_assert (osssink != NULL);
+
+ decode = gst_element_factory_make ("mad", "decode");
+ g_assert (decode != NULL);
+
+ /* add objects to the main bin */
+ gst_bin_add_many (GST_BIN (bin), filesrc, queue, NULL);
+
+ gst_bin_add_many (GST_BIN (thread), decode, queue2, NULL);
+
+ gst_bin_add (GST_BIN (thread2), osssink);
+
+ gst_element_link_many (filesrc, queue, decode, queue2, osssink, NULL);
+
+ gst_bin_add_many (GST_BIN (bin), thread, thread2, NULL);
+
+ /* write the bin to stdout */
+ gst_xml_write_file (GST_ELEMENT (bin), stdout);
+
+ /* write the bin to a file */
+ gst_xml_write_file (GST_ELEMENT (bin), fopen ("xmlTest.gst", "w"));
+
+ exit (0);
+}
+/* example-end xml-mp3.c */
+ </programlisting>
+ <para>
+ The most important line is:
+ </para>
+ <programlisting>
+ gst_xml_write_file (GST_ELEMENT (bin), stdout);
+ </programlisting>
+ <para>
+ gst_xml_write_file () will turn the given element into an xmlDocPtr that
+ is then formatted and saved to a file. To save to disk, pass the result
+ of a fopen(2) as the second argument.
+ </para>
+ <para>
+ The complete element hierarchy will be saved along with the inter element
+ pad links and the element parameters. Future <application>GStreamer</application>
+ versions will also allow you to store the signals in the XML file.
+ </para>
+ </sect1>
+
+ <sect1 id="section-xml-load">
+ <title>Loading a GstElement from an XML file</title>
+ <para>
+ Before an XML file can be loaded, you must create a GstXML object.
+ A saved XML file can then be loaded with the
+ gst_xml_parse_file (xml, filename, rootelement) method.
+ The root element can optionally left NULL. The following code example loads
+ the previously created XML file and runs it.
+ </para>
+ <programlisting>
+#include <stdlib.h>
+#include <gst/gst.h>
+
+int
+main(int argc, char *argv[])
+{
+ GstXML *xml;
+ GstElement *bin;
+ gboolean ret;
+
+ gst_init (&argc, &argv);
+
+ xml = gst_xml_new ();
+
+ ret = gst_xml_parse_file(xml, "xmlTest.gst", NULL);
+ g_assert (ret == TRUE);
+
+ bin = gst_xml_get_element (xml, "bin");
+ g_assert (bin != NULL);
+
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ while (gst_bin_iterate(GST_BIN(bin)));
+
+ gst_element_set_state (bin, GST_STATE_NULL);
+
+ exit (0);
+}
+ </programlisting>
+ <para>
+ gst_xml_get_element (xml, "name") can be used to get a specific element
+ from the XML file.
+ </para>
+ <para>
+ gst_xml_get_topelements (xml) can be used to get a list of all toplevel elements
+ in the XML file.
+ </para>
+ <para>
+ In addition to loading a file, you can also load a from a xmlDocPtr and
+ an in memory buffer using gst_xml_parse_doc and gst_xml_parse_memory
+ respectively. Both of these methods return a gboolean indicating
+ success or failure of the requested action.
+ </para>
+ </sect1>
+ <sect1 id="section-xml-custom">
+ <title>Adding custom XML tags into the core XML data</title>
+
+ <para>
+ It is possible to add custom XML tags to the core XML created with
+ gst_xml_write. This feature can be used by an application to add more
+ information to the save plugins. The editor will for example insert
+ the position of the elements on the screen using the custom XML tags.
+ </para>
+ <para>
+ It is strongly suggested to save and load the custom XML tags using
+ a namespace. This will solve the problem of having your XML tags
+ interfere with the core XML tags.
+ </para>
+ <para>
+ To insert a hook into the element saving procedure you can link
+ a signal to the GstElement using the following piece of code:
+ </para>
+ <programlisting>
+xmlNsPtr ns;
+
+ ...
+ ns = xmlNewNs (NULL, "http://gstreamer.net/gst-test/1.0/", "test");
+ ...
+ thread = gst_element_factory_make ("thread", "thread");
+ g_signal_connect (G_OBJECT (thread), "object_saved",
+ G_CALLBACK (object_saved), g_strdup ("decoder thread"));
+ ...
+ </programlisting>
+ <para>
+ When the thread is saved, the object_save method will be called. Our example
+ will insert a comment tag:
+ </para>
+ <programlisting>
+static void
+object_saved (GstObject *object, xmlNodePtr parent, gpointer data)
+{
+ xmlNodePtr child;
+
+ child = xmlNewChild (parent, ns, "comment", NULL);
+ xmlNewChild (child, ns, "text", (gchar *)data);
+}
+ </programlisting>
+ <para>
+ Adding the custom tag code to the above example you will get an XML file
+ with the custom tags in it. Here's an excerpt:
+ </para>
+ <programlisting>
+ ...
+ <gst:element>
+ <gst:name>thread</gst:name>
+ <gst:type>thread</gst:type>
+ <gst:version>0.1.0</gst:version>
+ ...
+ </gst:children>
+ <test:comment>
+ <test:text>decoder thread</test:text>
+ </test:comment>
+ </gst:element>
+ ...
+ </programlisting>
+ <para>
+ To retrieve the custom XML again, you need to attach a signal to
+ the GstXML object used to load the XML data. You can then parse your
+ custom XML from the XML tree whenever an object is loaded.
+ </para>
+
+ <para>
+ We can extend our previous example with the following piece of
+ code.
+ </para>
+
+ <programlisting>
+ xml = gst_xml_new ();
+
+ g_signal_connect (G_OBJECT (xml), "object_loaded",
+ G_CALLBACK (xml_loaded), xml);
+
+ ret = gst_xml_parse_file (xml, "xmlTest.gst", NULL);
+ g_assert (ret == TRUE);
+ </programlisting>
+
+ <para>
+ Whenever a new object has been loaded, the xml_loaded function will
+ be called. This function looks like:
+ </para>
+ <programlisting>
+static void
+xml_loaded (GstXML *xml, GstObject *object, xmlNodePtr self, gpointer data)
+{
+ xmlNodePtr children = self->xmlChildrenNode;
+
+ while (children) {
+ if (!strcmp (children->name, "comment")) {
+ xmlNodePtr nodes = children->xmlChildrenNode;
+
+ while (nodes) {
+ if (!strcmp (nodes->name, "text")) {
+ gchar *name = g_strdup (xmlNodeGetContent (nodes));
+ g_print ("object %s loaded with comment '%s'\n",
+ gst_object_get_name (object), name);
+ }
+ nodes = nodes->next;
+ }
+ }
+ children = children->next;
+ }
+}
+ </programlisting>
+ <para>
+ As you can see, you'll get a handle to the GstXML object, the
+ newly loaded GstObject and the xmlNodePtr that was used to create
+ this object. In the above example we look for our special tag inside
+ the XML tree that was used to load the object and we print our
+ comment to the console.
+ </para>
+ </sect1>
+
+</chapter>
--- /dev/null
+<chapter id="chapter-intro">
+ <title>Introduction</title>
+ <para>
+ This chapter gives you an overview of the technologies described in this
+ book.
+ </para>
+
+ <sect1 id="section-intro-what">
+ <title>What is GStreamer?</title>
+ <para>
+ GStreamer is a framework for creating streaming media applications.
+ The fundamental design comes from the video pipeline at Oregon Graduate
+ Institute, as well as some ideas from DirectShow.
+ </para>
+
+ <para>
+ GStreamer's development framework makes it possible to write any type of
+ streaming multimedia application. The GStreamer framework is designed
+ to make it easy to write applications that handle audio or video or both.
+ It isn't restricted to audio and video, and can process any kind of
+ data flow.
+ The pipeline design is made to have little overhead above what the
+ applied filters induce. This makes GStreamer a good framework for designing
+ even high-end audio applications which put high demands on latency.
+ </para>
+
+ <para>
+ One of the the most obvious uses of GStreamer is using it to build
+ a media player. GStreamer already includes components for building a
+ media player that can support a very wide variety of formats, including
+ MP3, Ogg Vorbis, MPEG1, MPEG2, AVI, Quicktime, mod, and more. GStreamer,
+ however, is much more than just another media player. Its main advantages
+ are that the pluggable components can be mixed and matched into arbitrary
+ pipelines so that it's possible to write a full-fledged video or audio
+ editing application.
+ </para>
+
+ <para>
+ The framework is based on plugins that will provide the various codec
+ and other functionality. The plugins can be linked and arranged in
+ a pipeline. This pipeline defines the flow of the data. Pipelines can
+ also be edited with a GUI editor and saved as XML so that pipeline
+ libraries can be made with a minimum of effort.
+ </para>
+
+ <para>
+ The GStreamer core function is to provide a framework for plugins, data flow
+ and media type handling/negotiation.
+ It also provides an API to write applications using the various plugins.
+ </para>
+
+ <para>
+ This book is about GStreamer from a developer's point of view; it describes
+ how to write a GStreamer application using the GStreamer libraries and tools.
+ For an explanation about writing plugins, we suggest the Plugin Writers Guide.
+ </para>
+
+ </sect1>
+</chapter>
#define GST_TYPE_CAPS gst_caps_get_type()
-#ifndef GST_DISABLE_DEPRECATED
-#define GST_DEBUG_CAPS(string, caps) \
- GST_DEBUG ( string "%s: " GST_PTR_FORMAT, caps)
-#endif
+/* FIXME Company should decide the best way to do this */
+#define GST_DEBUG_CAPS(string, caps) do { \
+ char *s = gst_caps_to_string(caps); \
+ GST_DEBUG ( "%s: %s", (string), s); \
+ g_free(s); \
+}while(0)
void _gst_caps_initialize (void);
};
extern void __gst_element_details_clear (GstElementDetails *dp);
-extern void __gst_element_details_copy (GstElementDetails *dest,
+extern void __gst_element_details_set (GstElementDetails *dest,
const GstElementDetails *src);
static void gst_element_class_init (GstElementClass *klass);
gobject_class->set_property = GST_DEBUG_FUNCPTR(gst_element_real_set_property);
gobject_class->get_property = GST_DEBUG_FUNCPTR(gst_element_real_get_property);
- memset (&element_class->details, 0, sizeof (GstElementDetails));
element_class->padtemplates = NULL;
}
g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
g_return_if_fail (GST_IS_ELEMENT_DETAILS (details));
- __gst_element_details_copy (&klass->details, details);
+ __gst_element_details_set (&klass->details, details);
}
/**
GstPad *pad = GST_PAD (pads->data);
gst_pad_unnegotiate (pad);
- if (GST_IS_REAL_PAD (pad)){
- gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), NULL);
- }
pads = g_list_next (pads);
}
#define GST_CAT_DEFAULT GST_CAT_PADS
+/* FIXME */
+#define gst_caps_debug(a,b) GST_DEBUG_CAPS(b,a)
+
enum {
TEMPL_PAD_CREATED,
GST_DEBUG ("intersecting link from %s:%s to %s:%s",
GST_DEBUG_PAD_NAME (link->srcpad), GST_DEBUG_PAD_NAME (link->sinkpad));
- GST_DEBUG ("srccaps " GST_PTR_FORMAT, link->srccaps);
- GST_DEBUG ("sinkcaps " GST_PTR_FORMAT, link->sinkcaps);
- GST_DEBUG ("filtercaps " GST_PTR_FORMAT, link->filtercaps);
+ GST_DEBUG_CAPS ("srccaps", link->srccaps);
+ GST_DEBUG_CAPS ("sinkcaps", link->sinkcaps);
+ GST_DEBUG_CAPS ("filtercaps", link->filtercaps);
pad_intersection = gst_caps_intersect (link->srccaps, link->sinkcaps);
if (link->filtercaps) {
- GST_DEBUG ("unfiltered intersection " GST_PTR_FORMAT, pad_intersection);
+ GST_DEBUG_CAPS ("unfiltered intersection", pad_intersection);
link->caps = gst_caps_intersect (pad_intersection, link->filtercaps);
gst_caps_free (pad_intersection);
} else {
link->caps = pad_intersection;
}
- GST_DEBUG ("intersection " GST_PTR_FORMAT, link->caps);
+ GST_DEBUG_CAPS ("intersection", link->caps);
}
static gboolean
g_return_if_fail (caps != NULL);
g_return_if_fail (!gst_caps_is_empty(caps));
- GST_DEBUG ("trying to fixate caps " GST_PTR_FORMAT, caps);
+ GST_DEBUG_CAPS ("trying to fixate caps", caps);
while (!gst_caps_is_fixed (caps)) {
int i;
case 0:
g_signal_emit (G_OBJECT (link->srcpad),
gst_real_pad_signals[REAL_FIXATE], 0, caps, &newcaps);
- GST_DEBUG ("app srcpad signal fixated to " GST_PTR_FORMAT, newcaps);
+ GST_DEBUG_CAPS ("app srcpad signal fixated to", newcaps);
break;
case 1:
g_signal_emit (G_OBJECT (link->sinkpad),
gst_real_pad_signals[REAL_FIXATE], 0, caps, &newcaps);
- GST_DEBUG ("app sinkpad signal fixated to " GST_PTR_FORMAT, newcaps);
+ GST_DEBUG_CAPS ("app sinkpad signal fixated to", newcaps);
break;
case 2:
if (GST_RPAD_FIXATEFUNC(link->srcpad)) {
newcaps = GST_RPAD_FIXATEFUNC(link->srcpad) (
GST_PAD (link->srcpad), caps);
- GST_DEBUG ("srcpad fixated to " GST_PTR_FORMAT, newcaps);
+ GST_DEBUG_CAPS ("srcpad fixated to", newcaps);
}
break;
case 3:
if (GST_RPAD_FIXATEFUNC(link->sinkpad)) {
newcaps = GST_RPAD_FIXATEFUNC(link->sinkpad) (
GST_PAD (link->sinkpad), caps);
- GST_DEBUG ("sinkpad fixated to " GST_PTR_FORMAT, newcaps);
+ GST_DEBUG_CAPS ("sinkpad fixated to", newcaps);
}
break;
case 4:
newcaps = _gst_pad_default_fixate_func (
GST_PAD(link->srcpad), caps);
- GST_DEBUG ("core fixated to GST_PTR_FORMAT", newcaps);
+ GST_DEBUG_CAPS ("core fixated to", newcaps);
break;
}
if (newcaps) {
g_warning ("trying to set non fixed caps on pad %s:%s, not allowed",
GST_DEBUG_PAD_NAME (pad));
- GST_DEBUG ("unfixed caps " GST_PTR_FORMAT, caps);
+ gst_caps_debug (caps, "unfixed caps");
return GST_PAD_LINK_REFUSED;
}
if (filtercaps) link->filtercaps = gst_caps_copy (filtercaps);
gst_pad_link_intersect (link);
- if (gst_caps_is_empty (link->caps)) {
- gst_pad_link_free (link);
+ if (gst_caps_is_empty (link->caps))
return FALSE;
- }
- gst_pad_link_free (link);
return TRUE;
}
gst_element_remove_pad (GST_ELEMENT (GST_OBJECT_PARENT (pad)), pad);
}
- if (GST_RPAD_EXPLICIT_CAPS (pad)) {
- GST_ERROR_OBJECT (pad, "still explicit caps %"GST_PTR_FORMAT" set", GST_RPAD_EXPLICIT_CAPS (pad));
- g_warning ("pad %p has still explicit caps set", pad);
- gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), NULL);
- }
G_OBJECT_CLASS (real_pad_parent_class)->dispose (object);
}
GstStructureField *field;
int i;
+ return;
+
g_return_if_fail(structure != NULL);
for(i=0;i<structure->fields->len;i++){
char *w;
char *r;
char save;
- GstStructure *structure = NULL;
+ GstStructure *structure;
GstStructureField field = { 0 };
+ gboolean res;
g_return_val_if_fail(string != NULL, NULL);
r = copy;
name = r;
- if (!_gst_structure_parse_string (r, &w, &r))
- goto error;
+ res = _gst_structure_parse_string (r, &w, &r);
+ if (!res) return NULL;
while (g_ascii_isspace(*r)) r++;
- if(*r != 0 && *r != ';' && *r != ',') goto error;
+ if(*r != 0 && *r != ';' && *r != ',') return NULL;
save = *w;
*w = 0;
*w = save;
while (*r && (*r != ';')){
- if(*r != ',')
- goto error;
+ if(*r != ',') {
+ return NULL;
+ }
r++;
while (*r && g_ascii_isspace(*r)) r++;
memset(&field,0,sizeof(field));
- if (!_gst_structure_parse_field (r, &r, &field))
- goto error;
+ res = _gst_structure_parse_field (r, &r, &field);
+ if (!res) {
+ gst_structure_free (structure);
+ return NULL;
+ }
gst_structure_set_field(structure, &field);
while (*r && g_ascii_isspace(*r)) r++;
}
if (end) *end = (char *)string + (r - copy);
-
- g_free (copy);
return structure;
-
-error:
- if (structure)
- gst_structure_free (structure);
- g_free (copy);
- return NULL;
}
static void
msgstr ""
"Project-Id-Version: GStreamer\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-01-31 23:31+0100\n"
+"POT-Creation-Date: 2004-02-05 19:44+0100\n"
"PO-Revision-Date: 2004-01-13 16:52+0100\n"
"Last-Translator: Julien Moutte <julien@moutte.net>\n"
"Language-Team: French <fr@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: gst/gst.c:118
+#: gst/gst.c:120
msgid "Print the GStreamer version"
msgstr "Afficher la version de GStreamer"
-#: gst/gst.c:119
+#: gst/gst.c:121
msgid "Make all warnings fatal"
msgstr "Rendre tout les avertissements bloquants"
-#: gst/gst.c:121
+#: gst/gst.c:123
msgid ""
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
msgstr ""
"Niveau de deboguage par defaut de 1 (que les erreurs) a 5 (tout) ou 0 pour "
"n'avoir aucun affichage"
-#: gst/gst.c:121
+#: gst/gst.c:123
msgid "LEVEL"
msgstr "NIVEAU"
-#: gst/gst.c:122
+#: gst/gst.c:124
+#, fuzzy
msgid ""
"Comma-separated list of category_name:level pairs to set specific levels for "
-"the individual categories.\n"
-"Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
msgstr ""
"Liste séparée par des virgules de paires nom_catégorie:niveau definissant "
"des niveaux spécifiques pour chaque catégorie.\n"
"Exemple: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
-#: gst/gst.c:122
+#: gst/gst.c:124
msgid "CATEGORIES"
msgstr "CATEGORIES"
-#: gst/gst.c:123
+#: gst/gst.c:125
msgid "Disable color debugging output"
msgstr "Désactiver la couleur dans la sortie de deboguage"
-#: gst/gst.c:124
+#: gst/gst.c:126
msgid "Disable debugging"
msgstr "Désactiver la sortie de deboguage"
-#: gst/gst.c:125
+#: gst/gst.c:127
msgid "Print available debug categories and exit"
msgstr "Afficher les catégories de deboguage disponibles et quitter"
-#: gst/gst.c:127
+#: gst/gst.c:129
msgid "Disable accelerated CPU instructions"
msgstr "Désactiver les instructions accélerées du processeur"
-#: gst/gst.c:128
+#: gst/gst.c:130
msgid "Enable verbose plugin loading diagnostics"
msgstr "Activer un diagnostique détaillé du chargement des plugins"
-#: gst/gst.c:129
+#: gst/gst.c:131
msgid "path list for loading plugins (separated by '"
msgstr "liste de chemins pour le chargement des plugins (séparés par '"
-#: gst/gst.c:129
+#: gst/gst.c:131
msgid "')"
msgstr "')"
-#: gst/gst.c:129
+#: gst/gst.c:131
msgid "PATHS"
msgstr "CHEMINS"
-#: gst/gst.c:130
+#: gst/gst.c:132
msgid ""
"Comma-separated list of plugins to preload in addition to the list stored in "
"env variable GST_PLUGIN_PATH"
"Liste séparée par des virgules de plugins a precharger en plus de la liste "
"contenue dans la variable d'environnement GST_PLUGIN_PATH"
-#: gst/gst.c:130
+#: gst/gst.c:132
msgid "PLUGINS"
msgstr "PLUGINS"
-#: gst/gst.c:131
+#: gst/gst.c:133
msgid "Disable trapping of segmentation faults during plugin loading"
msgstr ""
"Désactiver la detection des erreurs de segmentation pendant le chargement "
"des plugins"
-#: gst/gst.c:132
+#: gst/gst.c:134
msgid "Scheduler to use ('"
msgstr "Planificateur a utiliser ('"
-#: gst/gst.c:132
+#: gst/gst.c:134
msgid "' is the default)"
msgstr "' est la valeur par defaut)"
-#: gst/gst.c:132
+#: gst/gst.c:134
msgid "SCHEDULER"
msgstr "PLANIFICATEUR"
-#: gst/gst.c:133
+#: gst/gst.c:135
msgid "Registry to use"
msgstr "Registre a utiliser"
-#: gst/gst.c:133
+#: gst/gst.c:135
msgid "REGISTRY"
msgstr "REGISTRE"
-#: gst/gstelement.c:239
+#: gst/gstelement.c:240
#, fuzzy, c-format
-msgid "ERROR: from element %s: %s.\n"
+msgid "ERROR: from element %s: %s\n"
msgstr ""
"ERREUR: impossible d'interpreter l'argument de la ligne de commande numero %"
"d: %s.\n"
-#: gst/gstelement.c:241
+#: gst/gstelement.c:242
#, c-format
msgid ""
"Additional debug info:\n"
msgstr ""
#: gst/gsterror.c:152
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+
+#: gst/gsterror.c:154
#, fuzzy
msgid "Could not decode stream."
msgstr "Echoué a déterminer le type du flux"
-#: gst/gsterror.c:154
+#: gst/gsterror.c:156
#, fuzzy
msgid "Could not encode stream."
msgstr "Echoué a déterminer le type du flux"
-#: gst/gsterror.c:156
+#: gst/gsterror.c:158
#, fuzzy
msgid "Could not demultiplex stream."
msgstr "Echoué a déterminer le type du flux"
-#: gst/gsterror.c:158
+#: gst/gsterror.c:160
#, fuzzy
msgid "Could not multiplex stream."
msgstr "Echoué a déterminer le type du flux"
-#: gst/gsterror.c:160
+#: gst/gsterror.c:162
msgid "Stream is of the wrong format."
msgstr ""
-#: gst/gsterror.c:207
+#: gst/gsterror.c:209
#, c-format
msgid "No error message for domain %s."
msgstr ""
-#: gst/gsterror.c:212
+#: gst/gsterror.c:214
#, c-format
msgid "No standard error message for domain %s and code %d."
msgstr ""
msgstr "personne(s) qui interprète(nt)"
#: gst/gsttag.c:147
-#, fuzzy
-msgid "application"
-msgstr "emplacement"
-
-#: gst/gsttag.c:148
-msgid "application that wrote the stream"
-msgstr ""
-
-#: gst/gsttag.c:152
msgid "duration"
msgstr "durèe"
-#: gst/gsttag.c:153
+#: gst/gsttag.c:148
msgid "length in GStreamer time units (nanoseconds)"
msgstr "longueur en unité de temps GStreamer (nanosecondes)"
-#: gst/gsttag.c:157
+#: gst/gsttag.c:152
msgid "codec"
msgstr "codec"
-#: gst/gsttag.c:158
+#: gst/gsttag.c:153
msgid "codec the data is stored in"
msgstr "codec avec lequel la donnée fut enregistrée"
-#: gst/gsttag.c:162
+#: gst/gsttag.c:157
msgid "bitrate"
msgstr "bitrate"
-#: gst/gsttag.c:163
+#: gst/gsttag.c:158
msgid "exact or average bitrate in bits/s"
msgstr "bitrate exact ou moyen en bits par seconde"
-#: gst/gsttag.c:167
+#: gst/gsttag.c:162
#, fuzzy
msgid "nominal bitrate"
msgstr "bitrate minimum"
-#: gst/gsttag.c:168
+#: gst/gsttag.c:163
#, fuzzy
msgid "nominal bitrate in bits/s"
msgstr "bitrate minimum en bits par seconde"
-#: gst/gsttag.c:172
+#: gst/gsttag.c:167
msgid "minimum bitrate"
msgstr "bitrate minimum"
-#: gst/gsttag.c:173
+#: gst/gsttag.c:168
msgid "minimum bitrate in bits/s"
msgstr "bitrate minimum en bits par seconde"
-#: gst/gsttag.c:177
+#: gst/gsttag.c:172
msgid "maximum bitrate"
msgstr "bitrate maximum"
-#: gst/gsttag.c:178
+#: gst/gsttag.c:173
msgid "maximum bitrate in bits/s"
msgstr "bitrate maximum en bits par seconde"
-#: gst/gsttag.c:182
+#: gst/gsttag.c:177
#, fuzzy
msgid "encoder"
msgstr "codec"
-#: gst/gsttag.c:183
+#: gst/gsttag.c:178
#, fuzzy
msgid "encoder used to encode this stream"
msgstr "Echoué a déterminer le type du flux"
-#: gst/gsttag.c:187
+#: gst/gsttag.c:182
#, fuzzy
msgid "encoder version"
msgstr "version"
-#: gst/gsttag.c:188
+#: gst/gsttag.c:183
msgid "version of the encoder used to encode this stream"
msgstr ""
-#: gst/gsttag.c:192
+#: gst/gsttag.c:187
msgid "serial"
msgstr ""
-#: gst/gsttag.c:193
+#: gst/gsttag.c:188
msgid "serial number of track"
msgstr ""
-#: gst/gsttag.c:197
+#: gst/gsttag.c:192
msgid "replaygain track gain"
msgstr ""
-#: gst/gsttag.c:198
+#: gst/gsttag.c:193
msgid "track gain in db"
msgstr ""
-#: gst/gsttag.c:202
+#: gst/gsttag.c:197
msgid "replaygain track peak"
msgstr ""
-#: gst/gsttag.c:203
+#: gst/gsttag.c:198
msgid "peak of the track"
msgstr ""
-#: gst/gsttag.c:207
+#: gst/gsttag.c:202
msgid "replaygain album gain"
msgstr ""
-#: gst/gsttag.c:208
+#: gst/gsttag.c:203
#, fuzzy
msgid "album gain in db"
msgstr "album contenant cette donnée"
-#: gst/gsttag.c:212
+#: gst/gsttag.c:207
msgid "replaygain album peak"
msgstr ""
-#: gst/gsttag.c:213
+#: gst/gsttag.c:208
msgid "peak of the album"
msgstr ""
-#: gst/gsttag.c:251
+#: gst/gsttag.c:246
msgid ", "
msgstr ", "
-#: gst/elements/gstfilesink.c:237 gst/elements/gstfilesrc.c:723
+#: gst/elements/gstfilesink.c:248 gst/elements/gstfilesrc.c:674
msgid "No filename specified."
msgstr ""
-#: gst/elements/gstfilesink.c:244
+#: gst/elements/gstfilesink.c:255
#, c-format
msgid "Could not open file \"%s\" for writing."
msgstr ""
-#: gst/elements/gstfilesink.c:264
+#: gst/elements/gstfilesink.c:275
#, c-format
msgid "Error closing file \"%s\"."
msgstr ""
-#: gst/elements/gstfilesink.c:331 gst/elements/gstfilesink.c:363
-#: gst/elements/gstfilesink.c:415
+#: gst/elements/gstfilesink.c:342 gst/elements/gstfilesink.c:374
+#: gst/elements/gstfilesink.c:426
#, c-format
msgid "Error while writing to file \"%s\"."
msgstr ""
-#: gst/elements/gstfilesrc.c:730
+#: gst/elements/gstfilesrc.c:681
msgid "No file specified for reading."
msgstr ""
-#: gst/elements/gstfilesrc.c:745 gst/elements/gstmultidisksrc.c:244
+#: gst/elements/gstfilesrc.c:696 gst/elements/gstmultidisksrc.c:244
#, fuzzy, c-format
msgid "Could not open file \"%s\" for reading."
msgstr "Echoué a déterminer le type du flux"
-#: gst/elements/gstfilesrc.c:756
+#: gst/elements/gstfilesrc.c:707
#, c-format
msgid "File \"%s\" isn't a regular file."
msgstr ""
-#: gst/elements/gstidentity.c:170
+#: gst/elements/gstidentity.c:171
msgid "Failed after iterations as requested."
msgstr ""
msgid "no property \"%s\" in element \"%s\""
msgstr "pas de proprieté \"%s\" dans l'element \"%s\""
-#: gst/parse/grammar.y:327
+#: gst/parse/grammar.y:331
#, c-format
msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
msgstr ""
"impossible de definir la proprieté \"%s\" dans l'element \"%s\" comme \"%s\""
-#: gst/parse/grammar.y:332
+#: gst/parse/grammar.y:336
#, c-format
msgid ""
"could not convert \"%s\" so that it fits property \"%s\" in element \"%s\""
"impossible de convertir \"%s\" de manière a correspondre avec la proprieté "
"\"%s\" dans l'element \"%s\" "
-#: gst/parse/grammar.y:511
+#: gst/parse/grammar.y:515
#, c-format
msgid "could not link %s to %s"
msgstr "impossible de connecter %s a %s"
-#: gst/parse/grammar.y:556
+#: gst/parse/grammar.y:560
#, c-format
msgid "no element \"%s\""
msgstr "pas d'element \"%s\""
-#: gst/parse/grammar.y:607
+#: gst/parse/grammar.y:611
#, c-format
msgid "could not parse caps \"%s\""
msgstr "impossible d'interpreter les capacités \"%s\""
-#: gst/parse/grammar.y:629 gst/parse/grammar.y:683 gst/parse/grammar.y:699
-#: gst/parse/grammar.y:757
+#: gst/parse/grammar.y:633 gst/parse/grammar.y:687 gst/parse/grammar.y:703
+#: gst/parse/grammar.y:761
msgid "link without source element"
msgstr "lien sans element source"
-#: gst/parse/grammar.y:635 gst/parse/grammar.y:680 gst/parse/grammar.y:766
+#: gst/parse/grammar.y:639 gst/parse/grammar.y:684 gst/parse/grammar.y:770
msgid "link without sink element"
msgstr "lien sans element destination"
-#: gst/parse/grammar.y:717
+#: gst/parse/grammar.y:721
#, c-format
msgid "no source element for URI \"%s\""
msgstr "pas d'element source pour l'URI \"%s\""
-#: gst/parse/grammar.y:727
+#: gst/parse/grammar.y:731
#, c-format
msgid "no element to link URI \"%s\" to"
msgstr "pas d'element avec lequel lier l'URI \"%s\""
-#: gst/parse/grammar.y:735
+#: gst/parse/grammar.y:739
#, c-format
msgid "no sink element for URI \"%s\""
msgstr "pas d'element destination pour l'URI \"%s\""
-#: gst/parse/grammar.y:739
+#: gst/parse/grammar.y:743
#, c-format
msgid "could not link sink element for URI \"%s\""
msgstr "impossible de lier un element destination pour l'URI \"%s\""
-#: gst/parse/grammar.y:751
+#: gst/parse/grammar.y:755
msgid "empty pipeline not allowed"
msgstr "tube vide non autorisé"
-#: tools/gst-launch.c:83
+#: tools/gst-inspect.c:909
+msgid "Show plugin details"
+msgstr ""
+
+#: tools/gst-inspect.c:911
+msgid "Show scheduler details"
+msgstr ""
+
+#: tools/gst-launch.c:79
msgid "Execution ended after %"
msgstr "L'execution s'est terminé après %"
-#: tools/gst-launch.c:83
+#: tools/gst-launch.c:79
msgid " iterations (sum %"
msgstr "itérations (somme %"
-#: tools/gst-launch.c:83
+#: tools/gst-launch.c:79
msgid " ns, average %"
msgstr "ns, moyenne %"
-#: tools/gst-launch.c:83
+#: tools/gst-launch.c:79
msgid " ns, min %"
msgstr "ns, min %"
-#: tools/gst-launch.c:83
+#: tools/gst-launch.c:79
msgid " ns, max %"
msgstr "ns, max %"
-#: tools/gst-launch.c:83
+#: tools/gst-launch.c:79
msgid " ns).\n"
msgstr "ns).\n"
-#: tools/gst-launch.c:103
+#: tools/gst-launch.c:99
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
msgstr ""
"Utilisation: gst-xmllaunch <fichier.xml> [ element.property=valeur ... ]\n"
-#: tools/gst-launch.c:111
+#: tools/gst-launch.c:107
#, c-format
msgid "ERROR: parse of xml file '%s' failed.\n"
msgstr "ERREUR: l'interpretation du fichier xml '%s' a echoué.\n"
-#: tools/gst-launch.c:117
+#: tools/gst-launch.c:113
#, c-format
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
msgstr "ERREUR: pas d'element tube de plus haut niveau dans le fichier '%s'.\n"
-#: tools/gst-launch.c:122
+#: tools/gst-launch.c:118
msgid "WARNING: only one toplevel element is supported at this time."
msgstr ""
"AVERTISSEMENT: actuellement seul un element tube de plus haut niveau est "
"supporté."
-#: tools/gst-launch.c:132
+#: tools/gst-launch.c:128
#, c-format
msgid "ERROR: could not parse command line argument %d: %s.\n"
msgstr ""
"ERREUR: impossible d'interpreter l'argument de la ligne de commande numero %"
"d: %s.\n"
-#: tools/gst-launch.c:142
+#: tools/gst-launch.c:138
#, c-format
msgid "WARNING: element named '%s' not found.\n"
msgstr "AVERTISSEMENT: l'element nommé '%s' est introuvable.\n"
-#: tools/gst-launch.c:277
+#: tools/gst-launch.c:273
#, c-format
msgid "FOUND TAG : found by element \"%s\".\n"
msgstr "TAG DECOUVERT : decouvert par l'element \"%s\".\n"
-#: tools/gst-launch.c:354
+#: tools/gst-launch.c:350
msgid "Output tags (also known as metadata)"
msgstr "tags de sortie (aussi connus sous le nom de metadata)"
-#: tools/gst-launch.c:356
+#: tools/gst-launch.c:352
msgid "Output status information and property notifications"
msgstr ""
"Afficher des informations sur le status et les notifications de proprietés"
-#: tools/gst-launch.c:358
+#: tools/gst-launch.c:354
msgid "Do not output status information of TYPE"
msgstr "Ne pas afficher d'informations sur les status de TYPE"
-#: tools/gst-launch.c:358
+#: tools/gst-launch.c:354
msgid "TYPE1,TYPE2,..."
msgstr "TYPE1,TYPE2,..."
-#: tools/gst-launch.c:361
+#: tools/gst-launch.c:357
msgid "Save xml representation of pipeline to FILE and exit"
msgstr "Sauvegarder la representation xml du tube dans FICHIER et quitter"
-#: tools/gst-launch.c:361
+#: tools/gst-launch.c:357
msgid "FILE"
msgstr "FICHIER"
-#: tools/gst-launch.c:364
+#: tools/gst-launch.c:360
msgid "Do not install a fault handler"
msgstr "Ne pas installer un gestionaire de dysfonctionement"
-#: tools/gst-launch.c:366
+#: tools/gst-launch.c:362
msgid "Print alloc trace (if enabled at compile time)"
msgstr "Imprimer les traces d'allocations (si activées lors de la compilation)"
-#: tools/gst-launch.c:368
+#: tools/gst-launch.c:364
msgid "Number of times to iterate pipeline"
msgstr "Nombres d'iterations du tube a accomplir"
-#: tools/gst-launch.c:433
+#: tools/gst-launch.c:429
#, c-format
msgid "ERROR: pipeline could not be constructed: %s.\n"
msgstr "ERREUR: le tube n'a pas pu etre construit: %s.\n"
-#: tools/gst-launch.c:437
+#: tools/gst-launch.c:433
msgid "ERROR: pipeline could not be constructed.\n"
msgstr "ERREUR: le tube n'a pas pu etre construit.\n"
-#: tools/gst-launch.c:441
+#: tools/gst-launch.c:437
#, c-format
msgid "WARNING: erroneous pipeline: %s\n"
msgstr "AVERTISSEMENT: tube erroné: %s\n"
-#: tools/gst-launch.c:442
+#: tools/gst-launch.c:438
msgid " Trying to run anyway.\n"
msgstr " Tentative d'execution malgrè tout.\n"
-#: tools/gst-launch.c:466
+#: tools/gst-launch.c:462
msgid "ERROR: the 'pipeline' element wasn't found.\n"
msgstr "ERREUR: l'element 'tube' est introuvable.\n"
-#: tools/gst-launch.c:473
+#: tools/gst-launch.c:469
msgid "RUNNING pipeline ...\n"
msgstr "EXECUTION du tube en cours ...\n"
-#: tools/gst-launch.c:475
+#: tools/gst-launch.c:471
msgid "ERROR: pipeline doesn't want to play.\n"
msgstr "ERREUR: le tube refuse de s'executer.\n"
+#, fuzzy
+#~ msgid "application"
+#~ msgstr "emplacement"
+
#~ msgid "Failed to change state"
#~ msgstr "Echoué a changer d'état"
msgstr ""
"Project-Id-Version: GStreamer\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-02-04 23:10+0100\n"
+"POT-Creation-Date: 2004-02-05 19:44+0100\n"
"PO-Revision-Date: 2004-01-13 12:03+0100\n"
"Last-Translator: Thomas Vander Stichele <thomas@apestaart.org>\n"
"Language-Team: Dutch <nl@li.org>\n"
msgid "REGISTRY"
msgstr "REGISTER"
-#: gst/gstelement.c:241
+#: gst/gstelement.c:240
#, c-format
msgid "ERROR: from element %s: %s\n"
msgstr "FOUT: van element %s: %s\n"
-#: gst/gstelement.c:243
+#: gst/gstelement.c:242
#, c-format
msgid ""
"Additional debug info:\n"
msgstr "perso(o)n(en) die het stuk uitvoeren"
#: gst/gsttag.c:147
-msgid "application"
-msgstr "applicatie"
-
-#: gst/gsttag.c:148
-msgid "application that wrote the stream"
-msgstr "applicatie die de stroom geschreven heeft"
-
-#: gst/gsttag.c:152
msgid "duration"
msgstr "duur"
-#: gst/gsttag.c:153
+#: gst/gsttag.c:148
msgid "length in GStreamer time units (nanoseconds)"
msgstr "lengte in GStreamer tijdseenheden (nanoseconden)"
-#: gst/gsttag.c:157
+#: gst/gsttag.c:152
msgid "codec"
msgstr "codec"
-#: gst/gsttag.c:158
+#: gst/gsttag.c:153
msgid "codec the data is stored in"
msgstr "codec waarin het stuk is opgeslagen"
-#: gst/gsttag.c:162
+#: gst/gsttag.c:157
msgid "bitrate"
msgstr "bitsnelheid"
-#: gst/gsttag.c:163
+#: gst/gsttag.c:158
msgid "exact or average bitrate in bits/s"
msgstr "exacte of gemiddelde bitsnelheid in bits/s"
-#: gst/gsttag.c:167
+#: gst/gsttag.c:162
msgid "nominal bitrate"
msgstr "nominale bitsnelheid"
-#: gst/gsttag.c:168
+#: gst/gsttag.c:163
msgid "nominal bitrate in bits/s"
msgstr "nominale bitsnelheid in bits per seconde"
-#: gst/gsttag.c:172
+#: gst/gsttag.c:167
msgid "minimum bitrate"
msgstr "minimum bitsnelheid"
-#: gst/gsttag.c:173
+#: gst/gsttag.c:168
msgid "minimum bitrate in bits/s"
msgstr "minimum bitsnelheid in bits per seconde"
-#: gst/gsttag.c:177
+#: gst/gsttag.c:172
msgid "maximum bitrate"
msgstr "maximum bitsnelheid"
-#: gst/gsttag.c:178
+#: gst/gsttag.c:173
msgid "maximum bitrate in bits/s"
msgstr "maximum bitsnelheid in bits per seconde"
-#: gst/gsttag.c:182
+#: gst/gsttag.c:177
msgid "encoder"
msgstr "encoder"
-#: gst/gsttag.c:183
+#: gst/gsttag.c:178
msgid "encoder used to encode this stream"
msgstr "encoder gebruikt om deze stroom te encoderen"
-#: gst/gsttag.c:187
+#: gst/gsttag.c:182
msgid "encoder version"
msgstr "encoder versie"
-#: gst/gsttag.c:188
+#: gst/gsttag.c:183
msgid "version of the encoder used to encode this stream"
msgstr "versie van de encoder gebruikt om deze stroom te encoderen"
-#: gst/gsttag.c:192
+#: gst/gsttag.c:187
msgid "serial"
msgstr "volgnummer"
-#: gst/gsttag.c:193
+#: gst/gsttag.c:188
msgid "serial number of track"
msgstr "volgnummer van dit nummer"
-#: gst/gsttag.c:197
+#: gst/gsttag.c:192
msgid "replaygain track gain"
msgstr ""
-#: gst/gsttag.c:198
+#: gst/gsttag.c:193
msgid "track gain in db"
msgstr ""
-#: gst/gsttag.c:202
+#: gst/gsttag.c:197
msgid "replaygain track peak"
msgstr ""
-#: gst/gsttag.c:203
+#: gst/gsttag.c:198
msgid "peak of the track"
msgstr ""
-#: gst/gsttag.c:207
+#: gst/gsttag.c:202
msgid "replaygain album gain"
msgstr ""
-#: gst/gsttag.c:208
+#: gst/gsttag.c:203
msgid "album gain in db"
msgstr ""
-#: gst/gsttag.c:212
+#: gst/gsttag.c:207
msgid "replaygain album peak"
msgstr ""
-#: gst/gsttag.c:213
+#: gst/gsttag.c:208
msgid "peak of the album"
msgstr ""
-#: gst/gsttag.c:251
+#: gst/gsttag.c:246
msgid ", "
msgstr ", "
#: tools/gst-launch.c:471
msgid "ERROR: pipeline doesn't want to play.\n"
msgstr "FOUT: pijplijn wil niet spelen.\n"
+
+#~ msgid "application"
+#~ msgstr "applicatie"
+
+#~ msgid "application that wrote the stream"
+#~ msgstr "applicatie die de stroom geschreven heeft"