2010-05-18 17:58:33 +02:00
|
|
|
@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
|
2011-03-01 02:06:56 +01:00
|
|
|
`vpx_codec_vp8_dx()` with a pointer to the interface exposed by the
|
2010-05-18 17:58:33 +02:00
|
|
|
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
|