/*!\page usage Usage

    The vpx multi-format codec SDK provides a unified interface amongst its
    supported codecs. This abstraction allows applications using this SDK to
    easily support multiple video formats with minimal code duplication or
    "special casing." This section describes the interface common to all codecs.
    For codec-specific details, see the \ref codecs page.

    The following sections are common to all codecs:
    - \ref usage_types
    - \ref usage_features
    - \ref usage_init
    - \ref usage_errors

    Fore more information on decoder and encoder specific usage, see the
    following pages:
    \if decoder
    - \subpage usage_decode
    \endif
    \if decoder
    - \subpage usage_encode
    \endif

    \section usage_types Important Data Types
    There are two important data structures to consider in this interface.

    \subsection usage_ctxs Contexts
    A context is a storage area allocated by the calling application that the
    codec may write into to store details about a single instance of that codec.
    Most of the context is implementation specific, and thus opaque to the
    application. The context structure as seen by the application is of fixed
    size, and thus can be allocated with automatic storage or dynamically
    on the heap.

    Most operations require an initialized codec context. Codec context
    instances are codec specific. That is, the codec to be used for the encoded
    video must be known at initialization time. See #vpx_codec_ctx_t for further
    information.

    \subsection usage_ifaces Interfaces
    A codec interface is an opaque structure that controls how function calls
    into the generic interface are dispatched to their codec-specific
    implementations. Applications \ref MUSTNOT attempt to examine or override
    this storage, as it contains internal implementation details likely to
    change from release to release.

    Each supported codec will expose an interface structure to the application
    as an <code>extern</code> reference to a structure of the incomplete type
    #vpx_codec_iface_t.

    \section usage_features Features
    Several "features" are defined that are optionally implemented by codec
    algorithms. Indeed, the same algorithm may support different features on
    different platforms. The purpose of defining these features is that when
    they are implemented, they conform to a common interface. The features, or
    capabilities, of an algorithm can be queried from it's interface by using
    the vpx_codec_get_caps() method. Attempts to invoke features not supported
    by an algorithm will generally result in #VPX_CODEC_INCAPABLE.

    Currently defined features available in both encoders and decoders include:
    - \subpage usage_xma

    \if decoder
    Currently defined decoder features include:
    - \ref usage_cb
    - \ref usage_postproc
    \endif

    \section usage_init Initialization
    To initialize a codec instance, the address of the codec context
    and interface structures are passed to an initialization function. Depending
    on the \ref usage_features that the codec supports, the codec could be
    initialized in different modes. Most notably, the application may choose to
    use \ref usage_xma mode to gain fine grained control over how and where
    memory is allocated for the codec.

    To prevent cases of confusion where the ABI of the library changes,
    the ABI is versioned. The ABI version number must be passed at
    initialization time to ensure the application is using a header file that
    matches the library. The current ABI version number is stored in the
    preprocessor macros #VPX_CODEC_ABI_VERSION, #VPX_ENCODER_ABI_VERSION, and
    #VPX_DECODER_ABI_VERSION. For convenience, each initialization function has
    a wrapper macro that inserts the correct version number. These macros are
    named like the initialization methods, but without the _ver suffix.


    The available initialization methods are:
    \if encoder - #vpx_codec_enc_init (calls vpx_codec_enc_init_ver()) \endif
    \if multi-encoder - #vpx_codec_enc_init_multi (calls vpx_codec_enc_init_multi_ver()) \endif
    \if decoder - #vpx_codec_dec_init (calls vpx_codec_dec_init_ver()) \endif



    \section usage_errors Error Handling
    Almost all codec functions return an error status of type #vpx_codec_err_t.
    The semantics of how each error condition should be processed is clearly
    defined in the definitions of each enumerated value. Error values can be
    converted into ASCII strings with the vpx_codec_error() and
    vpx_codec_err_to_string() methods. The difference between these two methods is
    that vpx_codec_error() returns the error state from an initialized context,
    whereas vpx_codec_err_to_string() can be used in cases where an error occurs
    outside any context. The enumerated value returned from the last call can be
    retrieved from the <code>err</code> member of the decoder context as well.
    Finally, more detailed error information may be able to be obtained by using
    the vpx_codec_error_detail() method. Not all errors produce detailed error
    information.

    In addition to error information, the codec library's build configuration
    is available at runtime on some platforms. This information can be returned
    by calling vpx_codec_build_config(), and is formatted as a base64 coded string
    (comprised of characters in the set [a-z_a-Z0-9+/]). This information is not
    useful to an application at runtime, but may be of use to vpx for support.


    \section usage_deadline Deadline
    Both the encoding and decoding functions have a <code>deadline</code>
    parameter. This parameter indicates the amount of time, in microseconds
    (us), that the application wants the codec to spend processing before
    returning. This is a soft deadline -- that is, the semantics of the
    requested operation take precedence over meeting the deadline. If, for
    example, an application sets a <code>deadline</code> of 1000us, and the
    frame takes 2000us to decode, the call to vpx_codec_decode() will return
    after 2000us. In this case the deadline is not met, but the semantics of the
    function are preserved. If, for the same frame, an application instead sets
    a <code>deadline</code> of 5000us, the decoder will see that it has 3000us
    remaining in its time slice when decoding completes. It could then choose to
    run a set of \ref usage_postproc filters, and perhaps would return after
    4000us (instead of the allocated 5000us). In this case the deadline is met,
    and the semantics of the call are preserved, as before.

    The special value <code>0</code> is reserved to represent an infinite
    deadline. In this case, the codec will perform as much processing as
    possible to yield the highest quality frame.

    By convention, the value <code>1</code> is used to mean "return as fast as
    possible."

*/


/*! \page usage_xma External Memory Allocation
    Applications that wish to have fine grained control over how and where
    decoders allocate memory \ref MAY make use of the eXternal Memory Allocation
    (XMA) interface. Not all codecs support the XMA \ref usage_features.

    To use a decoder in XMA mode, the decoder \ref MUST be initialized with the
    vpx_codec_xma_init_ver() function. The amount of memory a decoder needs to
    allocate is heavily dependent on the size of the encoded video frames. The
    size of the video must be known before requesting the decoder's memory map.
    This stream information can be obtained with the vpx_codec_peek_stream_info()
    function, which does not require a constructed decoder context. If the exact
    stream is not known, a stream info structure can be created that reflects
    the maximum size that the decoder instance is required to support.

    Once the decoder instance has been initialized and the stream information
    determined, the application calls the vpx_codec_get_mem_map() iterator
    repeatedly to get a list of the memory segments requested by the decoder.
    The iterator value should be initialized to NULL to request the first
    element, and the function will return #VPX_CODEC_LIST_END to signal the end of
    the list.

    After each segment is identified, it must be passed to the codec through the
    vpx_codec_set_mem_map() function. Segments \ref MUST be passed in the same
    order as they are returned from vpx_codec_get_mem_map(), but there is no
    requirement that vpx_codec_get_mem_map() must finish iterating before
    vpx_codec_set_mem_map() is called. For instance, some applications may choose
    to get a list of all requests, construct an optimal heap, and then set all
    maps at once with one call. Other applications may set one map at a time,
    allocating it immediately after it is returned from vpx_codec_get_mem_map().

    After all segments have been set using vpx_codec_set_mem_map(), the codec may
    be used as it would be in normal internal allocation mode.

    \section usage_xma_seg_id Segment Identifiers
    Each requested segment is identified by an identifier unique to
    that decoder type. Some of these identifiers are private, while others are
    enumerated for application use. Identifiers not enumerated publicly are
    subject to change. Identifiers are non-consecutive.

    \section usage_xma_seg_szalign Segment Size and Alignment
    The sz (size) and align (alignment) parameters describe the required size
    and alignment of the requested segment. Alignment will always be a power of
    two. Applications \ref MUST honor the alignment requested. Failure to do so
    could result in program crashes or may incur a speed penalty.

    \section usage_xma_seg_flags Segment Flags
    The flags member of the segment structure indicates any requirements or
    desires of the codec for the particular segment. The #VPX_CODEC_MEM_ZERO flag
    indicates that the segment \ref MUST be zeroed by the application prior to
    passing it to the application. The #VPX_CODEC_MEM_WRONLY flag indicates that
    the segment will only be written into by the decoder, not read. If this flag
    is not set, the application \ref MUST insure that the memory segment is
    readable. On some platforms, framebuffer memory is writable but not
    readable, for example. The #VPX_CODEC_MEM_FAST flag indicates that the segment
    will be frequently accessed, and that it should be placed into fast memory,
    if any is available. The application \ref MAY choose to place other segments
    in fast memory as well, but the most critical segments will be identified by
    this flag.

    \section usage_xma_seg_basedtor Segment Base Address and Destructor
    For each requested memory segment, the application must determine the
    address of a memory segment that meets the requirements of the codec. This
    address is set in the <code>base</code> member of the #vpx_codec_mmap
    structure. If the application requires processing when the segment is no
    longer used by the codec (for instance to deallocate it or close an
    associated file descriptor) the <code>dtor</code> and <code>priv</code>
    members can be set.
*/
