<chapter id="chapter-buffering">
  <title>Buffering</title>
  <para>
    The purpose of buffering is to accumulate enough data in a pipeline so that
    playback can occur smoothly and without interruptions. It is typically done
    when reading from a (slow) and non-live network source but can also be
    used for live sources.
  </para>
  <para>
    &GStreamer; provides support for the following use cases:
    <itemizedlist>
      <listitem>
        <para>
          Buffering up to a specific amount of data, in memory, before starting
          playback so that network fluctuations are minimized.
          See <xref linkend="section-buffering-stream"/>.
        </para>
      </listitem>
      <listitem>
        <para>
          Download of the network file to a local disk with fast seeking in the
          downloaded data. This is similar to the quicktime/youtube players.
          See <xref linkend="section-buffering-download"/>.
        </para>
      </listitem>
      <listitem>
        <para>
          Caching of (semi)-live streams to a local, on disk, ringbuffer with
          seeking in the cached area. This is similar to tivo-like timeshifting.
          See <xref linkend="section-buffering-timeshift"/>.
        </para>
      </listitem>
    </itemizedlist>
  </para>
  <para>
    &GStreamer; can provide the application with progress reports about the
    current buffering state as well as let the application decide on how
    to buffer and when the buffering stops.
  </para>
  <para>
    In the most simple case, the application has to listen for BUFFERING
    messages on the bus. If the percent indicator inside the BUFFERING message
    is smaller than 100, the pipeline is buffering. When a message is
    received with 100 percent, buffering is complete. In the buffering state,
    the application should keep the pipeline in the PAUSED state. When buffering
    completes, it can put the pipeline (back) in the PLAYING state.
  </para>
  <para>
    What follows is an example of how the message handler could deal with
    the BUFFERING messages. We will see more advanced methods in
    <xref linkend="section-buffering-strategies"/>.
  </para>
  <programlisting>
<![CDATA[
  [...]

  switch (GST_MESSAGE_TYPE (message)) {
    case GST_MESSAGE_BUFFERING:{
      gint percent;

      /* no state management needed for live pipelines */
      if (is_live)
        break;

      gst_message_parse_buffering (message, &percent);

      if (percent == 100) {
        /* a 100% message means buffering is done */
        buffering = FALSE;
        /* if the desired state is playing, go back */
        if (target_state == GST_STATE_PLAYING) {
          gst_element_set_state (pipeline, GST_STATE_PLAYING);
        }
      } else {
        /* buffering busy */
        if (!buffering && target_state == GST_STATE_PLAYING) {
          /* we were not buffering but PLAYING, PAUSE  the pipeline. */
          gst_element_set_state (pipeline, GST_STATE_PAUSED);
        }
        buffering = TRUE;
      }
      break;
    case ...

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

  <sect1 id="section-buffering-stream">
    <title>Stream buffering </title>
    <programlisting>
      +---------+     +---------+     +-------+
      | httpsrc |     | buffer  |     | demux |
      |        src - sink      src - sink     ....
      +---------+     +---------+     +-------+
    </programlisting>
    <para>
      In this case we are reading from a slow network source into a buffer
      element (such as queue2).
    </para>
    <para>
      The buffer element has a low and high watermark expressed in bytes. The
      buffer uses the watermarks as follows:
    </para>
    <itemizedlist>
      <listitem>
        <para>
          The buffer element will post BUFFERING messages until the high
          watermark is hit. This instructs the application to keep the pipeline
          PAUSED, which will eventually block the srcpad from pushing while
          data is prerolled in the sinks.
        </para>
      </listitem>
      <listitem>
        <para>
          When the high watermark is hit, a BUFFERING message with 100% will be
          posted, which instructs the application to continue playback.
        </para>
      </listitem>
      <listitem>
        <para>
          When during playback, the low watermark is hit, the queue will start
          posting BUFFERING messages again, making the application PAUSE the
          pipeline again until the high watermark is hit again. This is called
          the rebuffering stage.
        </para>
      </listitem>
      <listitem>
        <para>
          During playback, the queue level will fluctuate between the high and
          the low watermark as a way to compensate for network irregularities.
        </para>
      </listitem>
   </itemizedlist>
   <para>
     This buffering method is usable when the demuxer operates in push mode.
     Seeking in the stream requires the seek to happen in the network source.
     It is mostly desirable when the total duration of the file is not known,
     such as in live streaming or when efficient seeking is not
     possible/required.
   </para>
   <para>
     The problem is configuring a good low and high watermark. Here are some
     ideas:
   </para>
   <itemizedlist>
      <listitem>
        <para>
          It is possible to measure the network bandwidth and configure the
          low/high watermarks in such a way that buffering takes a fixed
          amount of time.
        </para>
        <para>
          The queue2 element in &GStreamer; core has the max-size-time property
          that, together with the use-rate-estimate property, does exactly
          that. Also the playbin buffer-duration property uses the rate estimate
          to scale the amount of data that is buffered.
        </para>
      </listitem>
      <listitem>
        <para>
          Based on the codec bitrate, it is also possible to set the watermarks
          in such a way that a fixed amount of data is buffered before playback
          starts. Normally, the buffering element doesn't know about the
          bitrate of the stream but it can get this with a query.
        </para>
      </listitem>
      <listitem>
        <para>
          Start with a fixed amount of bytes, measure the time between
          rebuffering and increase the queue size until the time between
          rebuffering is within the application's chosen limits.
        </para>
      </listitem>
   </itemizedlist>
   <para>
     The buffering element can be inserted anywhere in the pipeline. You could,
     for example, insert the buffering element before a decoder. This would
     make it possible to set the low/high watermarks based on time.
   </para>
   <para>
     The buffering flag on playbin, performs buffering on the parsed data.
     Another advantage of doing the buffering at a later stage is that you can
     let the demuxer operate in pull mode. When reading data from a slow
     network drive (with filesrc) this can be an interesting way to buffer.
   </para>
  </sect1>

  <sect1 id="section-buffering-download">
    <title>Download buffering </title>
    <programlisting>
      +---------+     +---------+     +-------+
      | httpsrc |     | buffer  |     | demux |
      |        src - sink      src - sink     ....
      +---------+     +----|----+     +-------+
                           V
                          file
    </programlisting>
    <para>
      If we know the server is streaming a fixed length file to the client,
      the application can choose to download the entire file on disk. The
      buffer element will provide a push or pull based srcpad to the demuxer
      to navigate in the downloaded file.
    </para>
    <para>
      This mode is only suitable when the client can determine the length of
      the file on the server.
    </para>
    <para>
      In this case, buffering messages will be emitted as usual when the
      requested range is not within the downloaded area + buffersize. The
      buffering message will also contain an indication that incremental
      download is being performed. This flag can be used to let the application
      control the buffering in a more intelligent way, using the BUFFERING
      query, for example. See <xref linkend="section-buffering-strategies"/>.
    </para>
  </sect1>

  <sect1 id="section-buffering-timeshift">
    <title>Timeshift buffering </title>
    <programlisting>
      +---------+     +---------+     +-------+
      | httpsrc |     | buffer  |     | demux |
      |        src - sink      src - sink     ....
      +---------+     +----|----+     +-------+
                           V
                       file-ringbuffer
    </programlisting>
    <para>
      In this mode, a fixed size ringbuffer is kept to download the server
      content.  This allows for seeking in the buffered data. Depending on the
      size of the ringbuffer one can seek further back in time.
    </para>
    <para>
      This mode is suitable for all live streams. As with the incremental
      download mode, buffering messages are emitted along with an indication
      that timeshifting download is in progress.
    </para>
  </sect1>

  <sect1 id="section-buffering-live">
    <title>Live buffering </title>
    <para>
      In live pipelines we usually introduce some fixed latency between the
      capture and the playback elements. This latency can be introduced by
      a queue (such as a jitterbuffer) or by other means (in the audiosink).
    </para>
    <para>
      Buffering messages can be emitted in those live pipelines as well and
      serve as an indication to the user of the latency buffering. The
      application usually does not react to these buffering messages with a
      state change.
    </para>
  </sect1>

  <sect1 id="section-buffering-strategies">
    <title>Buffering strategies </title>
    <para>
      What follows are some ideas for implementing different buffering
      strategies based on the buffering messages and buffering query.
    </para>

    <sect2 id="section-buffering-norebuffer">
      <title>No-rebuffer strategy </title>
      <para>
        We would like to buffer enough data in the pipeline so that playback
        continues without interruptions. What we need to know to implement
        this is know the total remaining playback time in the file and the
        total remaining download time. If the buffering time is less than the
        playback time, we can start playback without interruptions.
      </para>
      <para>
        We have all this information available with the DURATION, POSITION and
        BUFFERING queries. We need to periodically execute the buffering query
        to get the current buffering status. We also need to have a large
        enough buffer to hold the complete file, worst case. It is best to
        use this buffering strategy with download buffering (see
        <xref linkend="section-buffering-download"/>).
      </para>
      <para>
        This is what the code would look like:
      </para>
      <programlisting>
<!-- example-begin norebuffer.c a -->
<![CDATA[
#include <gst/gst.h>

GstState target_state;
static gboolean is_live;
static gboolean is_buffering;

static gboolean
buffer_timeout (gpointer data)
{
  GstElement *pipeline = data;
  GstQuery *query;
  gboolean busy;
  gint percent;
  gint64 estimated_total;
  gint64 position, duration;
  guint64 play_left;

  query = gst_query_new_buffering (GST_FORMAT_TIME);

  if (!gst_element_query (pipeline, query))
    return TRUE;

  gst_query_parse_buffering_percent (query, &busy, &percent);
  gst_query_parse_buffering_range (query, NULL, NULL, NULL, &estimated_total);

  if (estimated_total == -1)
    estimated_total = 0;

  /* calculate the remaining playback time */
  if (!gst_element_query_position (pipeline, GST_FORMAT_TIME, &position))
    position = -1;
  if (!gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration))
    duration = -1;

  if (duration != -1 && position != -1)
    play_left = GST_TIME_AS_MSECONDS (duration - position);
  else
    play_left = 0;

  g_message ("play_left %" G_GUINT64_FORMAT", estimated_total %" G_GUINT64_FORMAT
      ", percent %d", play_left, estimated_total, percent);

  /* we are buffering or the estimated download time is bigger than the
   * remaining playback time. We keep buffering. */
  is_buffering = (busy || estimated_total * 1.1 > play_left);

  if (!is_buffering)
    gst_element_set_state (pipeline, target_state);

  return is_buffering;
}

static void
on_message_buffering (GstBus *bus, GstMessage *message, gpointer user_data)
{
  GstElement *pipeline = user_data;
  gint percent;

  /* no state management needed for live pipelines */
  if (is_live)
    return;

  gst_message_parse_buffering (message, &percent);

  if (percent < 100) {
    /* buffering busy */
    if (!is_buffering) {
      is_buffering = TRUE;
      if (target_state == GST_STATE_PLAYING) {
        /* we were not buffering but PLAYING, PAUSE  the pipeline. */
        gst_element_set_state (pipeline, GST_STATE_PAUSED);
      }
    }
  }
}

static void
on_message_async_done (GstBus *bus, GstMessage *message, gpointer user_data)
{
  GstElement *pipeline = user_data;

  if (!is_buffering)
    gst_element_set_state (pipeline, target_state);
  else
    g_timeout_add (500, buffer_timeout, pipeline);
}

gint
main (gint   argc,
      gchar *argv[])
{
  GstElement *pipeline;
  GMainLoop *loop;
  GstBus *bus;
  GstStateChangeReturn ret;

  /* init GStreamer */
  gst_init (&amp;argc, &amp;argv);
  loop = g_main_loop_new (NULL, FALSE);

  /* make sure we have a URI */
  if (argc != 2) {
    g_print ("Usage: %s &lt;URI&gt;\n", argv[0]);
    return -1;
  }

  /* set up */
  pipeline = gst_element_factory_make ("playbin", "pipeline");
  g_object_set (G_OBJECT (pipeline), "uri", argv[1], NULL);
  g_object_set (G_OBJECT (pipeline), "flags", 0x697 , NULL);

  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_signal_watch (bus);

  g_signal_connect (bus, "message::buffering",
    (GCallback) on_message_buffering, pipeline);
  g_signal_connect (bus, "message::async-done",
    (GCallback) on_message_async_done, pipeline);
  gst_object_unref (bus);

  is_buffering = FALSE;
  target_state = GST_STATE_PLAYING;
  ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);

  switch (ret) {
    case GST_STATE_CHANGE_SUCCESS:
      is_live = FALSE;
      break;

    case GST_STATE_CHANGE_FAILURE:
      g_warning ("failed to PAUSE");
      return -1;

    case GST_STATE_CHANGE_NO_PREROLL:
      is_live = TRUE;
      break;

    default:
      break;
  }

  /* now run */
  g_main_loop_run (loop);

  /* also clean up */
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (GST_OBJECT (pipeline));
  g_main_loop_unref (loop);

  return 0;
}
]]>
<!-- example-end norebuffer.c a -->
      </programlisting>
      <para>
        See how we set the pipeline to the PAUSED state first. We will receive
        buffering messages during the preroll state when buffering is needed.
        When we are prerolled (on_message_async_done) we see if buffering is
        going on, if not, we start playback. If buffering was going on, we start
        a timeout to poll the buffering state. If the estimated time to download
        is less than the remaining playback time, we start playback.
      </para>
    </sect2>
  </sect1>
</chapter>
