Filter design
=============

This document explains guidelines that should be observed (or ignored with
good reason) when writing filters for libavfilter.

In this document, the word “frame” indicates either a video frame or a group
of audio samples, as stored in an AVFilterBuffer structure.


Format negotiation
==================

  The query_formats method should set, for each input and each output links,
  the list of supported formats.

  For video links, that means pixel format. For audio links, that means
  channel layout, sample format (the sample packing is implied by the sample
  format) and sample rate.

  The lists are not just lists, they are references to shared objects. When
  the negotiation mechanism computes the intersection of the formats
  supported at each end of a link, all references to both lists are replaced
  with a reference to the intersection. And when a single format is
  eventually chosen for a link amongst the remaining list, again, all
  references to the list are updated.

  That means that if a filter requires that its input and output have the
  same format amongst a supported list, all it has to do is use a reference
  to the same list of formats.

  query_formats can leave some formats unset and return AVERROR(EAGAIN) to
  cause the negotiation mechanism to try again later. That can be used by
  filters with complex requirements to use the format negotiated on one link
  to set the formats supported on another.


Buffer references ownership and permissions
===========================================

  Principle
  ---------

    Audio and video data are voluminous; the buffer and buffer reference
    mechanism is intended to avoid, as much as possible, expensive copies of
    that data while still allowing the filters to produce correct results.

    The data is stored in buffers represented by AVFilterBuffer structures.
    They must not be accessed directly, but through references stored in
    AVFilterBufferRef structures. Several references can point to the
    same buffer; the buffer is automatically deallocated once all
    corresponding references have been destroyed.

    The characteristics of the data (resolution, sample rate, etc.) are
    stored in the reference; different references for the same buffer can
    show different characteristics. In particular, a video reference can
    point to only a part of a video buffer.

    A reference is usually obtained as input to the start_frame or
    filter_frame method or requested using the ff_get_video_buffer or
    ff_get_audio_buffer functions. A new reference on an existing buffer can
    be created with the avfilter_ref_buffer. A reference is destroyed using
    the avfilter_unref_bufferp function.

  Reference ownership
  -------------------

    At any time, a reference “belongs” to a particular piece of code,
    usually a filter. With a few caveats that will be explained below, only
    that piece of code is allowed to access it. It is also responsible for
    destroying it, although this is sometimes done automatically (see the
    section on link reference fields).

    Here are the (fairly obvious) rules for reference ownership:

    * A reference received by the filter_frame method (or its start_frame
      deprecated version) belongs to the corresponding filter.

      Special exception: for video references: the reference may be used
      internally for automatic copying and must not be destroyed before
      end_frame; it can be given away to ff_start_frame.

    * A reference passed to ff_filter_frame (or the deprecated
      ff_start_frame) is given away and must no longer be used.

    * A reference created with avfilter_ref_buffer belongs to the code that
      created it.

    * A reference obtained with ff_get_video_buffer or ff_get_audio_buffer
      belongs to the code that requested it.

    * A reference given as return value by the get_video_buffer or
      get_audio_buffer method is given away and must no longer be used.

  Link reference fields
  ---------------------

    The AVFilterLink structure has a few AVFilterBufferRef fields. The
    cur_buf and out_buf were used with the deprecated
    start_frame/draw_slice/end_frame API and should no longer be used.
    src_buf and partial_buf are used by libavfilter internally
    and must not be accessed by filters.

  Reference permissions
  ---------------------

    The AVFilterBufferRef structure has a perms field that describes what
    the code that owns the reference is allowed to do to the buffer data.
    Different references for the same buffer can have different permissions.

    For video filters that implement the deprecated
    start_frame/draw_slice/end_frame API, the permissions only apply to the
    parts of the buffer that have already been covered by the draw_slice
    method.

    The value is a binary OR of the following constants:

    * AV_PERM_READ: the owner can read the buffer data; this is essentially
      always true and is there for self-documentation.

    * AV_PERM_WRITE: the owner can modify the buffer data.

    * AV_PERM_PRESERVE: the owner can rely on the fact that the buffer data
      will not be modified by previous filters.

    * AV_PERM_REUSE: the owner can output the buffer several times, without
      modifying the data in between.

    * AV_PERM_REUSE2: the owner can output the buffer several times and
      modify the data in between (useless without the WRITE permissions).

    * AV_PERM_ALIGN: the owner can access the data using fast operations
      that require data alignment.

    The READ, WRITE and PRESERVE permissions are about sharing the same
    buffer between several filters to avoid expensive copies without them
    doing conflicting changes on the data.

    The REUSE and REUSE2 permissions are about special memory for direct
    rendering. For example a buffer directly allocated in video memory must
    not modified once it is displayed on screen, or it will cause tearing;
    it will therefore not have the REUSE2 permission.

    The ALIGN permission is about extracting part of the buffer, for
    copy-less padding or cropping for example.


    References received on input pads are guaranteed to have all the
    permissions stated in the min_perms field and none of the permissions
    stated in the rej_perms.

    References obtained by ff_get_video_buffer and ff_get_audio_buffer are
    guaranteed to have at least all the permissions requested as argument.

    References created by avfilter_ref_buffer have the same permissions as
    the original reference minus the ones explicitly masked; the mask is
    usually ~0 to keep the same permissions.

    Filters should remove permissions on reference they give to output
    whenever necessary. It can be automatically done by setting the
    rej_perms field on the output pad.

    Here are a few guidelines corresponding to common situations:

    * Filters that modify and forward their frame (like drawtext) need the
      WRITE permission.

    * Filters that read their input to produce a new frame on output (like
      scale) need the READ permission on input and must request a buffer
      with the WRITE permission.

    * Filters that intend to keep a reference after the filtering process
      is finished (after filter_frame returns) must have the PRESERVE
      permission on it and remove the WRITE permission if they create a new
      reference to give it away.

    * Filters that intend to modify a reference they have kept after the end
      of the filtering process need the REUSE2 permission and must remove
      the PRESERVE permission if they create a new reference to give it
      away.


Frame scheduling
================

  The purpose of these rules is to ensure that frames flow in the filter
  graph without getting stuck and accumulating somewhere.

  Simple filters that output one frame for each input frame should not have
  to worry about it.

  filter_frame
  ------------

    This method is called when a frame is pushed to the filter's input. It
    can be called at any time except in a reentrant way.

    If the input frame is enough to produce output, then the filter should
    push the output frames on the output link immediately.

    As an exception to the previous rule, if the input frame is enough to
    produce several output frames, then the filter needs output only at
    least one per link. The additional frames can be left buffered in the
    filter; these buffered frames must be flushed immediately if a new input
    produces new output.

    (Example: frame rate-doubling filter: filter_frame must (1) flush the
    second copy of the previous frame, if it is still there, (2) push the
    first copy of the incoming frame, (3) keep the second copy for later.)

    If the input frame is not enough to produce output, the filter must not
    call request_frame to get more. It must just process the frame or queue
    it. The task of requesting more frames is left to the filter's
    request_frame method or the application.

    If a filter has several inputs, the filter must be ready for frames
    arriving randomly on any input. Therefore, any filter with several inputs
    will most likely require some kind of queuing mechanism. It is perfectly
    acceptable to have a limited queue and to drop frames when the inputs
    are too unbalanced.

  request_frame
  -------------

    This method is called when a frame is wanted on an output.

    For an input, it should directly call filter_frame on the corresponding
    output.

    For a filter, if there are queued frames already ready, one of these
    frames should be pushed. If not, the filter should request a frame on
    one of its inputs, repeatedly until at least one frame has been pushed.

    Return values:
    if request_frame could produce a frame, or at least make progress
    towards producing a frame, it should return 0;
    if it could not for temporary reasons, it should return AVERROR(EAGAIN);
    if it could not because there are no more frames, it should return
    AVERROR_EOF.

    The typical implementation of request_frame for a filter with several
    inputs will look like that:

        if (frames_queued) {
            push_one_frame();
            return 0;
        }
        input = input_where_a_frame_is_most_needed();
        ret = ff_request_frame(input);
        if (ret == AVERROR_EOF) {
            process_eof_on_input();
        } else if (ret < 0) {
            return ret;
        }
        return 0;

    Note that, except for filters that can have queued frames, request_frame
    does not push frames: it requests them to its input, and as a reaction,
    the filter_frame method possibly will be called and do the work.

Legacy API
==========

  Until libavfilter 3.23, the filter_frame method was split:

  - for video filters, it was made of start_frame, draw_slice (that could be
    called several times on distinct parts of the frame) and end_frame;

  - for audio filters, it was called filter_samples.
