/*!\page usage Usage

    The aom 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

    For more information on decoder and encoder specific usage, see the
    following pages:
    \if decoder
    \li \subpage usage_decode
    \endif
    \if encoder
    \li \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 #aom_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
    #aom_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 aom_codec_get_caps() method. Attempts to invoke features not supported
    by an algorithm will generally result in #AOM_CODEC_INCAPABLE.

    \if decoder
    Currently defined decoder features include:
    \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.

    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 #AOM_CODEC_ABI_VERSION, #AOM_ENCODER_ABI_VERSION, and
    #AOM_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
    \li #aom_codec_enc_init (calls aom_codec_enc_init_ver())
    \endif
    \if decoder
    \li #aom_codec_dec_init (calls aom_codec_dec_init_ver())
    \endif


    \section usage_errors Error Handling
    Almost all codec functions return an error status of type #aom_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 aom_codec_error() and
    aom_codec_err_to_string() methods. The difference between these two methods is
    that aom_codec_error() returns the error state from an initialized context,
    whereas aom_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 aom_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 aom_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 aom for support.

*/
