Query
-----

NOTE: this is implemented as proposed

Purpose
~~~~~~~

Queries are used to get information about the stream. 
A query is started on a specific pad and travels up or downstream.

Types of queries
~~~~~~~~~~~~~~~~

  - get length of stream
  - get position in stream
  - get seeking capabilities
  - get latency
  - convert one value to another
  - query supported formats
  - query internal links.

Current implementation
~~~~~~~~~~~~~~~~~~~~~~

  The current implementation of query requires pads to implement the 
  following functions:

     gboolean                (*GstPadConvertFunction)        (GstPad *pad,
                                                              GstFormat src_format,  gint64  src_value,
                                                              GstFormat *dest_format, gint64 *dest_value);
     gboolean                (*GstPadQueryFunction)          (GstPad *pad, GstQueryType type,
                                                              GstFormat *format, gint64  *value);
     GList*                  (*GstPadIntLinkFunction)        (GstPad *pad);
     const GstFormat*        (*GstPadFormatsFunction)        (GstPad *pad);
     const GstEventMask*     (*GstPadEventMaskFunction)      (GstPad *pad);
     const GstQueryType*     (*GstPadQueryTypeFunction)      (GstPad *pad);

  Most of these functions are not very extensible in particular,
  the queryfunction can only return one value.


Requirements
~~~~~~~~~~~~

  - multiple return values, grouped together when they make sense.
  - one pad function to perform the query
  - extensible queries.

Proposition
~~~~~~~~~~~

  - define GstQuery extending GstMiniObject and containing a GstStructure (see GstMessage)
  - define standard query types (see proposed types)
  - define methods to create a parse the results in the GstQuery.
  - define pad method:

     gboolean                (*GstPadQueryFunction)          (GstPad *pad, GstQuery *query);

    pad returns result in query structure and TRUE as result or FALSE when
    query is not supported.

Proposed types
~~~~~~~~~~~~~~

 - GST_QUERY_SEEKING:
   
     get info on how seeking can be done 
       - getrange, with/without offset/size
       - ranges where seeking is efficient (for caching network sources)
       - flags describing seeking behaviour (forward, backward, segments,
	             play backwards, ...)

 - GST_QUERY_POSITION:
  
     get info on current position of the stream in stream_time.

 - GST_QUERY_DURATION:

     get info on the total duration of the stream.
 
 - GST_QUERY_LATENCY:

     get amount of latency introduced in the pipeline. 

 - GST_QUERY_SEGMENT:

     get info about the currently configured playback segment.

 - GST_QUERY_CONVERT:

     convert format/value to another format/value pair.

 - GST_QUERY_FORMATS:

     return list of supported formats that can be used for GST_QUERY_CONVERT.

