|  | @TEMPLATE decoder_tmpl.c | 
|  | Simple Decoder | 
|  | ============== | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION | 
|  | This is an example of a simple decoder loop. It takes an input file | 
|  | containing the compressed data (in IVF format), passes it through the | 
|  | decoder, and writes the decompressed frames to disk. Other decoder | 
|  | examples build upon this one. | 
|  |  | 
|  | The details of the IVF format have been elided from this example for | 
|  | simplicity of presentation, as IVF files will not generally be used by | 
|  | your application. In general, an IVF file consists of a file header, | 
|  | followed by a variable number of frames. Each frame consists of a frame | 
|  | header followed by a variable length payload. The length of the payload | 
|  | is specified in the first four bytes of the frame header. The payload is | 
|  | the raw compressed data. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION | 
|  |  | 
|  |  | 
|  | Standard Includes | 
|  | ----------------- | 
|  | For decoders, you only have to include `vpx_decoder.h` and then any | 
|  | header files for the specific codecs you use. In this case, we're using | 
|  | vp8. The `VPX_CODEC_DISABLE_COMPAT` macro can be defined to ensure | 
|  | strict compliance with the latest SDK by disabling some backwards | 
|  | compatibility features. Defining this macro is encouraged. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES | 
|  | @DEFAULT | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES | 
|  |  | 
|  |  | 
|  | Initializing The Codec | 
|  | ---------------------- | 
|  | The decoder is initialized by the following code. This is an example for | 
|  | the VP8 decoder, but the code is analogous for all algorithms. Replace | 
|  | `vpx_codec_vp8_dx()` with a pointer to the interface exposed by the | 
|  | algorithm you want to use. The `cfg` argument is left as NULL in this | 
|  | example, because we want the algorithm to determine the stream | 
|  | configuration (width/height) and allocate memory automatically. This | 
|  | parameter is generally only used if you need to preallocate memory, | 
|  | particularly in External Memory Allocation mode. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT | 
|  | @DEFAULT | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT | 
|  |  | 
|  |  | 
|  | Decoding A Frame | 
|  | ---------------- | 
|  | Once the frame has been read into memory, it is decoded using the | 
|  | `vpx_codec_decode` function. The call takes a pointer to the data | 
|  | (`frame`) and the length of the data (`frame_sz`). No application data | 
|  | is associated with the frame in this example, so the `user_priv` | 
|  | parameter is NULL. The `deadline` parameter is left at zero for this | 
|  | example. This parameter is generally only used when doing adaptive | 
|  | postprocessing. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE | 
|  | @DEFAULT | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE | 
|  |  | 
|  | Codecs may produce a variable number of output frames for every call to | 
|  | `vpx_codec_decode`. These frames are retrieved by the | 
|  | `vpx_codec_get_frame` iterator function. The iterator variable `iter` is | 
|  | initialized to NULL each time `vpx_codec_decode` is called. | 
|  | `vpx_codec_get_frame` is called in a loop, returning a pointer to a | 
|  | decoded image or NULL to indicate the end of list. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GET_FRAME | 
|  | @DEFAULT | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GET_FRAME | 
|  |  | 
|  |  | 
|  | Processing The Decoded Data | 
|  | --------------------------- | 
|  | In this example, we simply write the encoded data to disk. It is | 
|  | important to honor the image's `stride` values. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX | 
|  | @DEFAULT | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX | 
|  |  | 
|  |  | 
|  | Cleanup | 
|  | ------- | 
|  | The `vpx_codec_destroy` call frees any memory allocated by the codec. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY | 
|  | @DEFAULT | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY | 
|  |  | 
|  |  | 
|  | Error Handling | 
|  | -------------- | 
|  | This example does not special case any error return codes. If there was | 
|  | an error, a descriptive message is printed and the program exits. With | 
|  | few exeptions, vpx_codec functions return an enumerated error status, | 
|  | with the value `0` indicating success. | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC | 
|  | @DEFAULT | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC |