| /*!\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 | 
 |  | 
 |     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 #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. | 
 |  | 
 |     \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. | 
 |  | 
 |     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 | 
 |     \li #vpx_codec_enc_init (calls vpx_codec_enc_init_ver()) | 
 |     \li #vpx_codec_enc_init_multi (calls vpx_codec_enc_init_multi_ver()) | 
 |     \endif | 
 |     \if decoder | 
 |     \li #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." | 
 |  | 
 | */ |