manual: add dynamic capsfilter example
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 4 Oct 2012 09:50:58 +0000 (11:50 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 4 Oct 2012 09:50:58 +0000 (11:50 +0200)
docs/manual/advanced-dataaccess.xml
tests/examples/manual/Makefile.am

index 774f067..28fc56c 100644 (file)
@@ -1050,14 +1050,99 @@ main (int argc, char *argv[])
       </para>
       <para>
         Below is an example of how you can change the caps of a pipeline
-        while in the PLAYING state.
+        while in the PLAYING state:
       </para>
       <programlisting>
 <!-- example-begin dynformat.c -->
 <![CDATA[
+#include <stdlib.h>
+
+#include <gst/gst.h>
+
+#define MAX_ROUND 100
+
+int
+main (int argc, char **argv)
+{
+  GstElement *pipe, *filter;
+  GstCaps *caps;
+  gint width, height;
+  gint xdir, ydir;
+  gint round;
+  GstMessage *message;
+
+  gst_init (&argc, &argv);
+
+  pipe = gst_parse_launch_full ("videotestsrc ! capsfilter name=filter ! "
+             "ximagesink", NULL, GST_PARSE_FLAG_NONE, NULL);
+  g_assert (pipe != NULL);
+
+  filter = gst_bin_get_by_name (GST_BIN (pipe), "filter");
+  g_assert (filter);
+
+  width = 320;
+  height = 240;
+  xdir = ydir = -10;
+
+  for (round = 0; round < MAX_ROUND; round++) {
+    gchar *capsstr;
+    g_print ("resize to %dx%d (%d/%d)   \r", width, height, round, MAX_ROUND);
+
+    /* we prefer our fixed width and height but allow other dimensions to pass
+     * as well */
+    capsstr = g_strdup_printf ("video/x-raw, width=(int)%d, height=(int)%d",
+        width, height);
+
+    caps = gst_caps_from_string (capsstr);
+    g_free (capsstr);
+    g_object_set (filter, "caps", caps, NULL);
+    gst_caps_unref (caps);
+
+    if (round == 0)
+      gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+    width += xdir;
+    if (width >= 320)
+      xdir = -10;
+    else if (width < 200)
+      xdir = 10;
+
+    height += ydir;
+    if (height >= 240)
+      ydir = -10;
+    else if (height < 150)
+      ydir = 10;
+
+    message =
+        gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR,
+        50 * GST_MSECOND);
+    if (message) {
+      g_print ("got error           \n");
+
+      gst_message_unref (message);
+    }
+  }
+  g_print ("done                    \n");
+
+  gst_object_unref (filter);
+  gst_element_set_state (pipe, GST_STATE_NULL);
+  gst_object_unref (pipe);
+
+  return 0;
+}
 ]]>
 <!-- example-end dynformat.c -->
       </programlisting>
+      <para>
+        Note how we use <function>gst_bus_poll()</function> with a
+        small timeout to get messages and also introduce a short
+        sleep.
+      </para>
+      <para>
+        It is possible to set multiple caps for the capsfilter separated
+        with a ;. The capsfilter will try to renegotiate to the first
+        possible format from the list.
+      </para>
     </sect2>
   </sect1>
 
index 2d44bae..6e79e67 100644 (file)
@@ -39,6 +39,7 @@ EXAMPLES = \
        probe \
        appsrc \
        appsink \
+       dynformat \
        playbin \
        decodebin
 
@@ -55,6 +56,7 @@ BUILT_SOURCES = \
        probe.c \
        appsrc.c \
        appsink.c \
+       dynformat.c \
        playbin.c decodebin.c
 
 CLEANFILES = core core.* test-registry.* *.gcno *.gcda $(BUILT_SOURCES)
@@ -99,6 +101,9 @@ appsrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
 appsink.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
        $(PERL_PATH) $(srcdir)/extract.pl $@ $<
 
+dynformat.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+       $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
 playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
        $(PERL_PATH) $(srcdir)/extract.pl $@ $<