/*! \page usage_decode Decoding

    The aom_codec_decode() function is at the core of the decode loop. It
    processes packets of compressed data passed by the application, producing
    decoded images. The decoder expects packets to comprise exactly one image
    frame of data. Packets \ref MUST be passed in decode order. If the
    application wishes to associate some data with the frame, the
    <code>user_priv</code> member may be set. The <code>deadline</code>
    parameter controls the amount of time in microseconds the decoder should
    spend working on the frame. This is typically used to support adaptive
    \ref usage_postproc based on the amount of free CPU time. For more
    information on the <code>deadline</code> parameter, see \ref usage_deadline.

    \ref samples


    \section usage_cb Callback Based Decoding
    There are two methods for the application to access decoded frame data. Some
    codecs support asynchronous (callback-based) decoding \ref usage_features
    that allow the application to register a callback to be invoked by the
    decoder when decoded data becomes available. Decoders are not required to
    support this feature, however. Like all \ref usage_features, support can be
    determined by calling aom_codec_get_caps(). Callbacks are available in both
    frame-based and slice-based variants. Frame based callbacks conform to the
    signature of #aom_codec_put_frame_cb_fn_t and are invoked once the entire
    frame has been decoded. Slice based callbacks conform to the signature of
    #aom_codec_put_slice_cb_fn_t and are invoked after a subsection of the frame
    is decoded. For example, a slice callback could be issued for each
    macroblock row. However, the number and size of slices to return is
    implementation specific. Also, the image data passed in a slice callback is
    not necessarily in the same memory segment as the data will be when it is
    assembled into a full frame. For this reason, the application \ref MUST
    examine the rectangles that describe what data is valid to access and what
    data has been updated in this call. For all their additional complexity,
    slice based decoding callbacks provide substantial speed gains to the
    overall application in some cases, due to improved cache behavior.


    \section usage_frame_iter Frame Iterator Based Decoding
    If the codec does not support callback based decoding, or the application
    chooses not to make use of that feature, decoded frames are made available
    through the aom_codec_get_frame() iterator. The application initializes the
    iterator storage (of type #aom_codec_iter_t) to NULL, then calls
    aom_codec_get_frame repeatedly until it returns NULL, indicating that all
    images have been returned. This process may result in zero, one, or many
    frames that are ready for display, depending on the codec.


    \section usage_postproc Postprocessing
    Postprocessing is a process that is applied after a frame is decoded to
    enhance the image's appearance by removing artifacts introduced in the
    compression process. It is not required to properly decode the frame, and
    is generally done only when there is enough spare CPU time to execute
    the required filters. Codecs may support a number of different
    postprocessing filters, and the available filters may differ from platform
    to platform. Embedded devices often do not have enough CPU to implement
    postprocessing in software. The filter selection is generally handled
    automatically by the codec, depending on the amount of time remaining before
    hitting the user-specified \ref usage_deadline after decoding the frame.


*/
