pwg: add section about query function
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 16 Oct 2012 09:20:59 +0000 (11:20 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 16 Oct 2012 09:23:13 +0000 (11:23 +0200)
docs/pwg/building-boiler.xml
docs/pwg/building-queryfn.xml [new file with mode: 0644]
docs/pwg/pwg.xml

index 7cba279..77d78ce 100644 (file)
@@ -378,6 +378,7 @@ gst_my_filter_init (GstMyFilter * filter)
       correct template would look like this:
     </para>
     <programlisting>
+<![CDATA[
 static GstStaticPadTemplate sink_factory =
 GST_STATIC_PAD_TEMPLATE (
   "sink",
@@ -390,6 +391,7 @@ GST_STATIC_PAD_TEMPLATE (
       "rate = (int) [ 8000, 96000 ]"
   )
 );
+]]>
     </programlisting>
     <para>
       Values surrounded by curly brackets (<quote>{</quote> and
@@ -428,7 +430,9 @@ GST_STATIC_PAD_TEMPLATE (
       Also, in this function, any supported element type in the plugin should
       be registered.
     </para>
-    <programlisting><!-- example-begin register.func -->
+    <programlisting>
+<!-- example-begin register.func -->
+<![CDATA[
 static gboolean
 plugin_init (GstPlugin *plugin)
 {
@@ -448,7 +452,9 @@ GST_PLUGIN_DEFINE (
   "GStreamer",
   "http://gstreamer.net/"
 )
-    <!-- example-end register.func --></programlisting>
+]]>
+<!-- example-end register.func -->
+    </programlisting>
     <para>
       Note that the information returned by the plugin_init() function will be
       cached in a central registry. For this reason, it is important that the
diff --git a/docs/pwg/building-queryfn.xml b/docs/pwg/building-queryfn.xml
new file mode 100644 (file)
index 0000000..ad2e943
--- /dev/null
@@ -0,0 +1,72 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-queryfn">
+  <title>The query function</title>
+  <para>
+    Through the query function, your element will receive queries that it
+    has to reply to. These are queries like position, duration but also
+    about the supported formats and scheduling modes your element supports.
+    Queries can travel both upstream and downstream, so you can receive them
+    on sink pads as well as source pads. 
+  </para>
+  <para>
+    Below follows a very simple query function that we install on the source
+    pad of our element.
+  </para>
+  <programlisting>
+<![CDATA[
+static gboolean gst_my_filter_src_query (GstPad    *pad,
+                                         GstObject *parent,
+                                         GstQuery  *query);
+
+[..]
+
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+[..]
+  /* configure event function on the pad before adding
+   * the pad to the element */
+  gst_pad_set_event_function (filter->srcpad,
+      gst_my_filter_src_event);
+[..]
+}
+
+static gboolean
+gst_my_filter_src_query (GstPad    *pad,
+                        GstObject *parent,
+                        GstQuery  *query)
+{
+  gboolean ret;
+  GstMyFilter *filter = GST_MY_FILTER (parent);
+
+  switch (GST_QUERY_TYPE (query)) {
+    case GST_QUERY_POSITION:
+      /* we should report the current position */
+      [...]
+      break;
+    case GST_QUERY_DURATION:
+      /* we should report the duration here */
+      [...]
+      break;
+    case GST_QUERY_CAPS:
+      /* we should report the supported caps here */
+      [...]
+      break;
+    default:
+      /* just call the default handler */
+      ret = gst_pad_query_default (pad, parent, query);
+      break;
+  }
+  return ret;
+}
+]]>
+  </programlisting>
+  <para>
+    It is a good idea to call the default query handler
+    <function>gst_pad_query_default ()</function> for unknown queries.
+    Depending on the query type, the default handler will forward 
+    the query or simply unref it.
+  </para>
+</chapter>
index e504e50..4f79709 100644 (file)
@@ -18,6 +18,7 @@
 <!ENTITY BUILDING_PADS        SYSTEM "building-pads.xml">
 <!ENTITY BUILDING_CHAINFN     SYSTEM "building-chainfn.xml">
 <!ENTITY BUILDING_EVENTFN     SYSTEM "building-eventfn.xml">
+<!ENTITY BUILDING_QUERYFN     SYSTEM "building-queryfn.xml">
 <!ENTITY BUILDING_STATE       SYSTEM "building-state.xml">
 <!ENTITY BUILDING_PROPS       SYSTEM "building-props.xml">
 <!ENTITY BUILDING_SIGNALS     SYSTEM "building-signals.xml">
     &BUILDING_PADS;
     &BUILDING_CHAINFN;
     &BUILDING_EVENTFN;
+    &BUILDING_QUERYFN;
     &BUILDING_STATE;
     &BUILDING_PROPS;
     &BUILDING_SIGNALS;