<chapter id="chapter-negotiation" xreflabel="Caps negotiation">
  <title>Caps negotiation</title>
  <para>
    Caps negotiation is the act of finding a media format (GstCaps) between
    elements that they can handle. This process in &GStreamer; can in most
    cases find an optimal solution for the complete pipeline. In this section
    we explain how this works.
  </para>

  <sect1 id="section-nego-basics">
    <title>Caps negotiation basics</title>
    <para>
      In &GStreamer;, negotiation of the media format always follows the
      following simple rules:
    </para>
    <itemizedlist>
      <listitem>
        <para>
          A downstream element suggest a format on its sinkpad and places the
          suggestion in the result of the CAPS query performed on the sinkpad.
          See also <xref linkend="section-nego-getcaps"/>.
        </para>
      </listitem>
      <listitem>
        <para>
          An upstream element decides on a format. It sends the selected media
          format downstream on its source pad with a CAPS event. Downstream
          elements reconfigure themselves to handle the media type in the CAPS
          event on the sinkpad.
        </para>
      </listitem>
      <listitem>
        <para>
          A downstream element can inform upstream that it would like to
          suggest a new format by sending a RECONFIGURE event upstream. The
          RECONFIGURE event simply instructs an upstream element to restart
          the negotiation phase. Because the element that sent out the
          RECONFIGURE event is now suggesting another format, the format
          in the pipeline might change.
        </para>
      </listitem>
    </itemizedlist>
    <para>
      In addition to the CAPS and RECONFIGURE event and the CAPS query, there
      is an ACCEPT_CAPS query to quickly check if a certain caps can
      be accepted by an element.
    </para>
    <para>
      All negotiation follows these simple rules. Let's take a look at some
      typical uses cases and how negotiation happens.
    </para>
  </sect1>

  <sect1 id="section-nego-usecases">
    <title>Caps negotiation use cases</title>
    <para>
      In what follows we will look at some use cases for push-mode scheduling.
      The pull-mode scheduling negotiation phase is discussed in
      <xref linkend="section-nego-pullmode"/> and is actually similar as we
      will see. 
    </para>
    <para>
      Since the sink pads only suggest formats and the source pads need to
      decide, the most complicated work is done in the source pads.
      We can identify 3 caps negotiation use cases for the source pads:
    </para>
    <itemizedlist>
      <listitem>
        <para>
          Fixed negotiation. An element can output one format only.
          See <xref linkend="section-nego-fixed"/>.
        </para>
      </listitem>
      <listitem>
        <para>
          Transform negotiation. There is a (fixed) transform between the
          input and output format of the element, usually based on some
          element property. The caps that the element will produce depend
          on the upstream caps and the caps that the element can accept
          depend on the downstream caps.
          See <xref linkend="section-nego-transform"/>.
        </para>
      </listitem>
      <listitem>
        <para>
          Dynamic negotiation. An element can output many formats.
          See <xref linkend="section-nego-dynamic"/>.
        </para>
      </listitem>
    </itemizedlist>

    <sect2 id="section-nego-fixed">
      <title>Fixed negotiation</title>
      <para>
        In this case, the source pad can only produce a fixed format. Usually
        this format is encoded inside the media. No downstream element can
        ask for a different format, the only way that the source pad will
        renegotiate is when the element decides to change the caps itself.
      </para>
      <para>
        Elements that could implement fixed caps (on their source pads) are,
        in general, all elements that are not renegotiable. Examples include:
      </para>
      <itemizedlist>
        <listitem>
          <para>
            A typefinder, since the type found is part of the actual data stream
            and can thus not be re-negotiated. The typefinder will look at the
            stream of bytes, figure out the type, send a CAPS event with the
            caps and then push buffers of the type.
          </para>
        </listitem>
        <listitem>
          <para>
            Pretty much all demuxers, since the contained elementary data
            streams are defined in the file headers, and thus not
            renegotiable.
          </para>
        </listitem>
        <listitem>
          <para>
            Some decoders, where the format is embedded in the data stream
            and not part of the peercaps <emphasis>and</emphasis> where the
            decoder itself is not reconfigurable, too.
          </para>
        </listitem>
        <listitem>
          <para>
            Some sources that produce a fixed format.
          </para>
        </listitem>
      </itemizedlist>
      <para>
        <function>gst_pad_use_fixed_caps()</function> is used on the source
        pad with fixed caps. As long as the pad is not negotiated, the default
        CAPS query will return the caps presented in the padtemplate. As soon
        as the pad is negotiated, the CAPS query will return the negotiated
        caps (and nothing else). These are the relevant code snippets for fixed
        caps source pads.
      </para>
      <programlisting>
<![CDATA[
[..]
  pad = gst_pad_new_from_static_template (..);
  gst_pad_use_fixed_caps (pad);
[..]
]]>
      </programlisting>
      <para>
        The fixed caps can then be set on the pad by calling
        <function>gst_pad_set_caps ()</function>.
      </para>
      <programlisting>
<![CDATA[
[..]
    caps = gst_caps_new_simple ("audio/x-raw",
        "format", G_TYPE_STRING, GST_AUDIO_NE(F32),
        "rate", G_TYPE_INT, <samplerate>,
        "channels", G_TYPE_INT, <num-channels>, NULL);
    if (!gst_pad_set_caps (pad, caps)) {
      GST_ELEMENT_ERROR (element, CORE, NEGOTIATION, (NULL),
          ("Some debug information here"));
      return GST_FLOW_ERROR;
    }
[..]
]]>
      </programlisting>
      <para>
        These types of elements also don't have a relation between the input
        format and the output format, the input caps simply don't contain the
        information needed to produce the output caps.
      </para>
      <para>
        All other elements that need to be configured for the format should
        implement full caps negotiation, which will be explained in the next
        few sections.
      </para>
    </sect2>

    <sect2 id="section-nego-transform">
      <title>Transform negotiation</title>
      <para>
        In this negotiation technique, there is a fixed transform between
        the element input caps and the output caps. This transformation
        could be parameterized by element properties but not by the
        content of the stream (see <xref linkend="section-nego-fixed"/>
        for that use-case).
      </para>
      <para>
        The caps that the element can accept depend on the (fixed
        transformation) downstream caps. The caps that the element can
        produce depend on the (fixed transformation of) the upstream
        caps.
      </para>
      <para>
        This type of element can usually set caps on its source pad from
        the <function>_event()</function> function on the sink pad when
        it received the CAPS event. This means that the caps transform
        function transforms a fixed caps into another fixed caps.
        Examples of elements include:
      </para>
      <itemizedlist>
        <listitem>
          <para>
            Videobox. It adds configurable border around a video frame
            depending on object properties.
          </para>
        </listitem>
        <listitem>
          <para>
            Identity elements. All elements that don't change the format
            of the data, only the content. Video and audio effects are an
            example. Other examples include elements that inspect the
            stream.
          </para>
        </listitem>
        <listitem>
          <para>
            Some decoders and encoders, where the output format is defined
            by input format, like mulawdec and mulawenc. These decoders
            usually have no headers that define the content of the stream.
            They are usually more like conversion elements.
          </para>
        </listitem>
      </itemizedlist>
      <para>
        Below is an example of a negotiation steps of a typical transform 
        element. In the sink pad CAPS event handler, we compute the caps
        for the source pad and set those.
      </para>
      <programlisting>
<![CDATA[
  [...]

static gboolean
gst_my_filter_setcaps (GstMyFilter *filter,
		       GstCaps *caps)
{
  GstStructure *structure;
  int rate, channels;
  gboolean ret;
  GstCaps *outcaps;

  structure = gst_caps_get_structure (caps, 0);
  ret = gst_structure_get_int (structure, "rate", &rate);
  ret = ret && gst_structure_get_int (structure, "channels", &channels);
  if (!ret)
    return FALSE;

  outcaps = gst_caps_new_simple ("audio/x-raw",
      "format", G_TYPE_STRING, GST_AUDIO_NE(S16),
      "rate", G_TYPE_INT, samplerate,
      "channels", G_TYPE_INT, channels, NULL);
  ret = gst_pad_set_caps (filter->srcpad, outcaps);
  gst_caps_unref (outcaps);

  return ret;
}

static gboolean
gst_my_filter_sink_event (GstPad    *pad,
		          GstObject *parent,
		          GstEvent  *event)
{
  gboolean ret;
  GstMyFilter *filter = GST_MY_FILTER (parent);

  switch (GST_EVENT_TYPE (event)) {
    case GST_EVENT_CAPS:
    {
      GstCaps *caps;

      gst_event_parse_caps (event, &caps);
      ret = gst_my_filter_setcaps (filter, caps);
      break;
    }
    default:
      ret = gst_pad_event_default (pad, parent, event);
      break;
  }
  return ret;
}

  [...]
]]>
      </programlisting>
    </sect2>

    <sect2 id="section-nego-dynamic">
      <title>Dynamic negotiation</title>
      <para>
        A last negotiation method is the most complex and powerful dynamic
        negotiation.
      </para>
      <para>
        Like with the transform negotiation in 
        <xref linkend="section-nego-transform"/>, dynamic negotiation will
        perform a transformation on the downstream/upstream caps. Unlike the
        transform negotiation, this transform will convert fixed caps to
        unfixed caps. This means that the sink pad input caps can be converted
        into unfixed (multiple) formats. The source pad will have to choose a
        format from all the possibilities. It would usually like to choose a
        format that requires the least amount of effort to produce but it does
        not have to be. The selection of the format should also depend on the
        caps that can be accepted downstream (see a QUERY_CAPS function in
        <xref linkend="section-nego-getcaps"/>).
      </para>
      <para>
        A typical flow goes like this:
      </para>
      <itemizedlist>
        <listitem>
          <para>
            Caps are received on the sink pad of the element.
          </para>
        </listitem>
        <listitem>
          <para>
            If the element prefers to operate in passthrough mode, check
            if downstream accepts the caps with the ACCEPT_CAPS query. If it
            does, we can complete negotiation and we can operate in
            passthrough mode.
          </para>
        </listitem>
        <listitem>
          <para>
            Calculate the possible caps for the source pad.
          </para>
        </listitem>
        <listitem>
          <para>
            Query the downstream peer pad for the list of possible
            caps.
          </para>
        </listitem>
        <listitem>
          <para>
            Select from the downstream list the first caps that you can
            transform to and set this as the output caps. You might have to
            fixate the caps to some reasonable defaults to construct
            fixed caps.
          </para>
        </listitem>
      </itemizedlist>
      <para>
        Examples of this type of elements include:
      </para>
      <itemizedlist>
        <listitem>
          <para>
            Converter elements such as videoconvert, audioconvert, audioresample,
            videoscale, ...
          </para>
        </listitem>
        <listitem>
          <para>
            Source elements such as audiotestsrc, videotestsrc, v4l2src,
            pulsesrc, ...
          </para>
        </listitem>
      </itemizedlist>
      <para>
        Let's look at the example of an element that can convert between
        samplerates, so where input and output samplerate don't have to be
        the same:
      </para>
      <programlisting>
<![CDATA[
static gboolean
gst_my_filter_setcaps (GstMyFilter *filter,
		       GstCaps *caps)
{
  if (gst_pad_set_caps (filter->sinkpad, caps)) {
    filter->passthrough = TRUE;
  } else {
    GstCaps *othercaps, *newcaps;
    GstStructure *s = gst_caps_get_structure (caps, 0), *others;

    /* no passthrough, setup internal conversion */
    gst_structure_get_int (s, "channels", &filter->channels);
    othercaps = gst_pad_get_allowed_caps (filter->srcpad);
    others = gst_caps_get_structure (othercaps, 0);
    gst_structure_set (others,
      "channels", G_TYPE_INT, filter->channels, NULL);

    /* now, the samplerate value can optionally have multiple values, so
     * we "fixate" it, which means that one fixed value is chosen */
    newcaps = gst_caps_copy_nth (othercaps, 0);
    gst_caps_unref (othercaps);
    gst_pad_fixate_caps (filter->srcpad, newcaps);
    if (!gst_pad_set_caps (filter->srcpad, newcaps))
      return FALSE;

    /* we are now set up, configure internally */
    filter->passthrough = FALSE;
    gst_structure_get_int (s, "rate", &filter->from_samplerate);
    others = gst_caps_get_structure (newcaps, 0);
    gst_structure_get_int (others, "rate", &filter->to_samplerate);
  }

  return TRUE;
}

static gboolean
gst_my_filter_sink_event (GstPad    *pad,
		          GstObject *parent,
		          GstEvent  *event)
{
  gboolean ret;
  GstMyFilter *filter = GST_MY_FILTER (parent);

  switch (GST_EVENT_TYPE (event)) {
    case GST_EVENT_CAPS:
    {
      GstCaps *caps;

      gst_event_parse_caps (event, &caps);
      ret = gst_my_filter_setcaps (filter, caps);
      break;
    }
    default:
      ret = gst_pad_event_default (pad, parent, event);
      break;
  }
  return ret;
}

static GstFlowReturn
gst_my_filter_chain (GstPad    *pad,
		     GstObject *parent,
		     GstBuffer *buf)
{
  GstMyFilter *filter = GST_MY_FILTER (parent);
  GstBuffer *out;

  /* push on if in passthrough mode */
  if (filter->passthrough)
    return gst_pad_push (filter->srcpad, buf);

  /* convert, push */
  out = gst_my_filter_convert (filter, buf);
  gst_buffer_unref (buf);

  return gst_pad_push (filter->srcpad, out);
}
]]>
      </programlisting>
    </sect2>
  </sect1>

  <sect1 id="section-nego-upstream" xreflabel="Upstream caps (re)negotiation">
    <title>Upstream caps (re)negotiation</title>
    <para>
      Upstream negotiation's primary use is to renegotiate (part of) an
      already-negotiated pipeline to a new format. Some practical examples
      include to select a different video size because the size of the video
      window changed, and the video output itself is not capable of rescaling,
      or because the audio channel configuration changed.
    </para>
    <para>
      Upstream caps renegotiation is requested by sending a GST_EVENT_RECONFIGURE
      event upstream. The idea is that it will instruct the upstream element
      to reconfigure its caps by doing a new query for the allowed caps and then
      choosing a new caps. The element that sends out the RECONFIGURE event
      would influence the selection of the new caps by returning the new
      prefered caps from its GST_QUERY_CAPS query function. The RECONFIGURE
      event will set the GST_PAD_FLAG_NEED_RECONFIGURE on all pads that it
      travels over.
    </para>
    <para>
      It is important to note here that different elements actually have
      different responsibilities here:
    </para>
    <itemizedlist>
      <listitem>
        <para>
          Elements that want to propose a new format upstream need to first
          check if the new caps are acceptable upstream with an ACCEPT_CAPS
          query. Then they would send a RECONFIGURE event and be prepared to
          answer the CAPS query with the new prefered format. It should be
          noted that when there is no upstream element that can (or wants)
          to renegotiate, the element needs to deal with the currently
          configured format.
        </para>
      </listitem>
      <listitem>
        <para>
          Elements that operate in transform negotiation according to
          <xref linkend="section-nego-transform"/> pass the RECONFIGURE
          event upstream. Because these elements simply do a fixed transform
          based on the upstream caps, they need to send the event upstream
          so that it can select a new format.
        </para>
      </listitem>
      <listitem>
        <para>
          Elements that operate in fixed negotiation 
          (<xref linkend="section-nego-fixed"/>) drop the RECONFIGURE event.
          These elements can't reconfigure and their output caps don't depend
          on the upstream caps so the event can be dropped.
        </para>
      </listitem>
      <listitem>
        <para>
          Elements that can be reconfigured on the source pad (source pads
          implementing dynamic negotiation in
          <xref linkend="section-nego-dynamic"/>) should check its
          NEED_RECONFIGURE flag with
          <function>gst_pad_check_reconfigure ()</function> and it should
          start renegotiation when the function returns TRUE.
        </para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="section-nego-getcaps" xreflabel="Implementing a CAPS query function">
    <title>Implementing a CAPS query function</title>
    <para>
      A <function>_query ()</function>-function with the GST_QUERY_CAPS query
      type is called when a peer element would like to know which formats
      this pad supports, and in what order of preference. The return value
      should be all formats that this elements supports, taking into account
      limitations of peer elements further downstream or upstream, sorted by
      order of preference, highest preference first.
    </para>
    <para>
    </para>
    <programlisting>
<![CDATA[
static gboolean
gst_my_filter_query (GstPad *pad, GstObject * parent, GstQuery * query)
{
  gboolean ret;
  GstMyFilter *filter = GST_MY_FILTER (parent);

  switch (GST_QUERY_TYPE (query)) {
    case GST_QUERY_CAPS
    {
      GstPad *otherpad;
      GstCaps *temp, *caps, *filt, *tcaps;
      gint i;

      otherpad = (pad == filter->srcpad) ? filter->sinkpad :
                                           filter->srcpad;
      caps = gst_pad_get_allowed_caps (otherpad);

      gst_query_parse_caps (query, &filt);

      /* We support *any* samplerate, indifferent from the samplerate
       * supported by the linked elements on both sides. */
      for (i = 0; i < gst_caps_get_size (caps); i++) {
        GstStructure *structure = gst_caps_get_structure (caps, i);

        gst_structure_remove_field (structure, "rate");
      }

      /* make sure we only return results that intersect our
       * padtemplate */
      tcaps = gst_pad_get_pad_template_caps (pad);
      if (tcaps) {
        temp = gst_caps_intersect (caps, tcaps);
        gst_caps_unref (caps);
        gst_caps_unref (tcaps);
        caps = temp;
      }
      /* filter against the query filter when needed */
      if (filt) {
        temp = gst_caps_intersect (caps, filt);
        gst_caps_unref (caps);
        caps = temp;
      }
      gst_query_set_caps_result (query, caps);
      gst_caps_unref (caps);
      ret = TRUE;
      break;
    }
    default:
      ret = gst_pad_query_default (pad, parent, query);
      break;
  }
  return ret;
}
]]>
    </programlisting>
  </sect1>

  <sect1 id="section-nego-pullmode">
    <title>Pull-mode Caps negotiation</title>
    <para>
      WRITEME, the mechanism of pull-mode negotiation is not yet fully
      understood.
    </para>

    <para>
      Using all the knowledge you've acquired by reading this chapter, you
      should be able to write an element that does correct caps negotiation.
      If in doubt, look at other elements of the same type in our git
      repository to get an idea of how they do what you want to do.
    </para>
  </sect1>
</chapter>
