Negotiation
-----------

Capabilities negotiation is the process of deciding on an adequate
format for dataflow within a GStreamer pipeline. Ideally, negotiation
(also known as "capsnego") transfers information from those parts of the
pipeline that have information to those parts of the pipeline that are
flexible, constrained by those parts of the pipeline that are not
flexible.


Basic rules
~~~~~~~~~~~

The simple rules must be followed:

 1) downstream suggests formats
 2) upstream decides on format

There are 4 queries/events used in caps negotiation:

 1) GST_QUERY_CAPS        : get possible formats
 2) GST_QUERY_ACCEPT_CAPS : check if format is possible
 3) GST_EVENT_CAPS        : configure format (downstream)
 4) GST_EVENT_RECONFIGURE : inform upstream of possibly new caps


Queries
-------

A pad can ask the peer pad for its supported GstCaps. It does this with
the CAPS query. The list of supported caps can be used to choose an
appropriate GstCaps for the data transfer.
The CAPS query works recursively, elements should take their peers into
consideration when constructing the possible caps. Because the result caps
can be very large, the filter can be used to restrict the caps. Only the
caps that match the filter will be returned as the result caps. The
order of the filter caps gives the order of preference of the caller and
should be taken into account for the returned caps.

 (in) "filter", GST_TYPE_CAPS (default NULL)
       - a GstCaps to filter the results against

 (out) "caps", GST_TYPE_CAPS (default NULL)
       - the result caps



A pad can ask the peer pad if it supports a given caps. It does this with
the ACCEPT_CAPS query. The caps must be fixed.
The ACCEPT_CAPS query is not required to work recursively, it can simply
return TRUE if a subsequent CAPS event with those caps would return
success.

 (in) "caps", GST_TYPE_CAPS
       - a GstCaps to check, must be fixed

 (out) "result", G_TYPE_BOOLEAN (default FALSE)
       - TRUE if the caps are accepted


Events
~~~~~~

When a media format is negotiated, peer elements are notified of the GstCaps
with the CAPS event. The caps must be fixed.

    "caps", GST_TYPE_CAPS
       - the negotiated GstCaps, must be fixed


Operation
~~~~~~~~~

GStreamer's two scheduling modes, push mode and pull mode, lend
themselves to different mechanisms to achieve this goal. As it is more
common we describe push mode negotiation first.


Push-mode negotiation
~~~~~~~~~~~~~~~~~~~~~

Push-mode negotiation happens when elements want to push buffers and
need to decide on the format. This is called downstream negotiation
because the upstream element decides the format for the downstream
element. This is the most common case.

Negotiation can also happen when a downstream element wants to receive 
another data format from an upstream element. This is called upstream
negotiation.

The basics of negotiation are as follows:

 - GstCaps (see part-caps.txt) are refcounted before they are pushed as
   an event to describe the contents of the following buffer.

 - An element should reconfigure itself to the new format received as a CAPS
   event before processing the following buffers. If the data type in the
   caps event is not acceptable, the element should refuse the event. The
   element should also refuse the next buffers by returning an appropriate
   GST_FLOW_NOT_NEGOTIATED return value from the chain function.

 - Downstream elements can request a format change of the stream by sending a
   RECONFIGURE event upstream. Upstream elements will renegotiate a new format
   when they receive a RECONFIGURE event.

The general flow for a source pad starting the negotiation.

             src              sink
              |                 |
              |  querycaps?     |
              |---------------->|
              |     caps        |
 select caps  |< - - - - - - - -|
 from the     |                 |
 candidates   |                 |
              |                 |-.
              |  accepts?       | |
  type A      |---------------->| | optional
              |      yes        | |
              |< - - - - - - - -| |
              |                 |-'
              |  send_event()   |
 send CAPS    |---------------->| Receive type A, reconfigure to
 event A      |                 | process type A.
              |                 |
              |  push           |
 push buffer  |---------------->| Process buffer of type A
              |                 |

 One possible implementation in pseudo code:

 [element wants to create a buffer]
 if not format
   # see what we can do
   ourcaps = gst_pad_query_caps (srcpad)
   # see what the peer can do filtered against our caps
   candidates = gst_pad_peer_query_caps (srcpad, ourcaps)

   foreach candidate in candidates
     # make sure the caps is fixed
     fixedcaps = gst_pad_fixate_caps (srcpad, candidate)

     # see if the peer accepts it
     if gst_pad_peer_accept_caps (srcpad, fixedcaps)
       # store the caps as the negotiated caps, this will
       # call the setcaps function on the pad
       gst_pad_push_event (srcpad, gst_event_new_caps (fixedcaps))
       break
     endif
   done
 endif

 #negotiate allocator/bufferpool with the ALLOCATION query

 buffer = gst_buffer_new_allocate (NULL, size, 0);
 # fill buffer and push


The general flow for a sink pad starting a renegotiation.

             src              sink
              |                 |
              |  accepts?       |
              |<----------------| type B
              |      yes        |
              |- - - - - - - - >|-.
              |                 | | suggest B caps next
              |                 |<'
              |                 |
              |   push_event()  |
  mark      .-|<----------------| send RECONFIGURE event
 renegotiate| |                 |
            '>|                 |
              |  querycaps()    |
 renegotiate  |---------------->| 
              |  suggest B      |
              |< - - - - - - - -|
              |                 |
              |  send_event()   |
 send CAPS    |---------------->| Receive type B, reconfigure to
 event B      |                 | process type B.
              |                 |
              |  push           |
 push buffer  |---------------->| Process buffer of type B
              |                 |


Use case:


videotestsrc ! xvimagesink

  1) Who decides what format to use?
   - src pad always decides, by convention. sinkpad can suggest a format
     by putting it high in the caps query result GstCaps. 
   - since the src decides, it can always choose something that it can do,
     so this step can only fail if the sinkpad stated it could accept
     something while later on it couldn't.

  2) When does negotiation happen?
   - before srcpad does a push, it figures out a type as stated in 1), then 
     it pushes a caps event with the type. The sink checks the media type and
     configures itself for this type.
   - the source then usually does an ALLOCATION query to negotiate a bufferpool
     with the sink. It then allocates a buffer from the pool and pushes it to
     the sink. since the sink accepted the caps, it can create a pool for the
     format.
   - since the sink stated in 1) it could accept the type, it will be able to
     handle it.
     
  3) How can sink request another format?
   - sink asks if new format is possible for the source.
   - sink pushes RECONFIGURE event upstream
   - src receives the RECONFIGURE event and marks renegotiation
   - On the next buffer push, the source renegotiates the caps and the
     bufferpool. The sink will put the new new preferred format high in the list
     of caps it returns from its caps query.

videotestsrc ! queue ! xvimagesink

  - queue proxies all accept and caps queries to the other peer pad.
  - queue proxies the bufferpool
  - queue proxies the RECONFIGURE event
  - queue stores CAPS event in the queue. This means that the queue can contain
    buffers with different types.

   
Pull-mode negotiation
~~~~~~~~~~~~~~~~~~~~~

Rationale
^^^^^^^^^

A pipeline in pull mode has different negotiation needs than one
activated in push mode. Push mode is optimized for two use cases:

 * Playback of media files, in which the demuxers and the decoders are
   the points from which format information should disseminate to the
   rest of the pipeline; and

 * Recording from live sources, in which users are accustomed to putting
   a capsfilter directly after the source element; thus the caps
   information flow proceeds from the user, through the potential caps
   of the source, to the sinks of the pipeline.

In contrast, pull mode has other typical use cases:

 * Playback from a lossy source, such as RTP, in which more knowledge
   about the latency of the pipeline can increase quality; or

 * Audio synthesis, in which audio APIs are tuned to producing only the
   necessary number of samples, typically driven by a hardware interrupt
   to fill a DMA buffer or a Jack[0] port buffer.

 * Low-latency effects processing, whereby filters should be applied as
   data is transferred from a ring buffer to a sink instead of
   beforehand. For example, instead of using the internal alsasink
   ringbuffer thread in push-mode wavsrc ! volume ! alsasink, placing
   the volume inside the sound card writer thread via wavsrc !
   audioringbuffer ! volume ! alsasink.

[0] http://jackit.sf.net

The problem with pull mode is that the sink has to know the format in
order to know how many bytes to pull via gst_pad_pull_range(). This
means that before pulling, the sink must initiate negotation to decide
on a format.

Recalling the principles of capsnego, whereby information must flow from
those that have it to those that do not, we see that the two named use
cases have different negotiation requirements:

 * RTP and low-latency playback are both like the normal playback case,
   in which information flows downstream.

 * In audio synthesis, the part of the pipeline that has the most
   information is the sink, constrained by the capabilities of the graph
   that feeds it. However the caps are not completely specified; at some
   point the user has to intervene to choose the sample rate, at least.
   This can be done externally to gstreamer, as in the jack elements, or
   internally via a capsfilter, as is customary with live sources.

Given that sinks potentially need the input of sources, as in the RTP
case and at least as a filter in the synthesis case, there must be a
negotiation phase before the pull thread is activated. Also, given the
low latency offered by pull mode, we want to avoid capsnego from within
the pulling thread, in case it causes us to miss our scheduling
deadlines.

The pull thread is usually started in the PAUSED->PLAYING state change. We must
be able to complete the negotiation before this state change happens.

The time to do capsnego, then, is after the SCHEDULING query has succeeded,
but before the sink has spawned the pulling thread.


Mechanism
^^^^^^^^^

The sink determines that the upstream elements support pull based scheduling by
doing a SCHEDULING query.

The sink initiates the negotiation process by intersecting the results
of gst_pad_query_caps() on its sink pad and its peer src pad. This is the
operation performed by gst_pad_get_allowed_caps(). In the simple
passthrough case, the peer pad's caps query should return the
intersection of calling get_allowed_caps() on all of its sink pads. In
this way the sink element knows the capabilities of the entire pipeline.

The sink element then fixates the resulting caps, if necessary,
resulting in the flow caps.  From now on, the caps query of the sinkpad
will only return these fixed caps meaning that upstream elements
will only be able to produce this format.

If the sink element could not set caps on its sink pad, it should post
an error message on the bus indicating that negotiation was not
possible.

When negotiation succeeded, the sinkpad and all upstream internally linked pads
are activated in pull mode. Typically, this operation will trigger negotiation
on the downstream elements, which will now be forced to negotiation to the
final fixed desired caps of the sinkpad.

After these steps, the sink element returns ASYNC from the state change
function. The state will commit to PAUSED when the first buffer is received in
the sink. This is needed to provide a consistent API to the applications that
expect ASYNC return values from sinks but it also allows us to perform the
remainder of the negotiation outside of the context of the pulling thread.


Patterns
~~~~~~~~

We can identify 3 patterns in negotiation:

 1) Fixed : Can't choose the output format
      - Caps encoded in the stream
      - A video/audio decoder
      - usually uses gst_pad_use_fixed_caps()

 2) Transform
      - Caps not modified (passthrough)
      - can do caps transform based on element property
      - fixed caps get transformed into fixed caps
      - videobox

 3) Dynamic : can choose output format 
      - A converter element
      - depends on downstream caps, needs to do a CAPS query to find
        transform.
      - usually prefers to use the identity transform
      - fixed caps can be transformed into unfixed caps.
