@TEMPLATE encoder_tmpl.c
Simple Encoder
==============
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
This is an example of a simple encoder loop. It takes an input file in
YV12 format, passes it through the encoder, and writes the compressed
frames to disk in IVF format. 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 encoders, you only have to include `vpx_encoder.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.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
@DEFAULT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES


Getting The Default Configuration
---------------------------------
Encoders have the notion of "usage profiles." For example, an encoder
may want to publish default configurations for both a video
conferencing appliction and a best quality offline encoder. These
obviously have very different default settings. Consult the
documentation for your codec to see if it provides any default
configurations. All codecs provide a default configuration, number 0,
which is valid for material in the vacinity of QCIF/QVGA.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_DEF_CFG
@DEFAULT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_DEF_CFG


Updating The Configuration
---------------------------------
Almost all applications will want to update the default configuration
with settings specific to their usage. Here we set the width and height
of the video file to that specified on the command line. We also scale
the default bitrate based on the ratio between the default resolution
and the resolution specified on the command line.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG
@DEFAULT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG


Initializing The Codec
----------------------
The encoder is initialized by the following code.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT
@DEFAULT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT


Encoding A Frame
----------------
The frame is read as a continuous block (size width * height * 3 / 2)
from the input file. If a frame was read (the input file has not hit
EOF) then the frame is passed to the encoder. Otherwise, a NULL
is passed, indicating the End-Of-Stream condition to the encoder. The
`frame_cnt` is reused as the presentation time stamp (PTS) and each
frame is shown for one frame-time in duration. The flags parameter is
unused in this example. The deadline is set to VPX_DL_REALTIME to
make the example run as quickly as possible.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME
@DEFAULT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME

Processing The Encoded Data
---------------------------
Each packet of type `VPX_CODEC_CX_FRAME_PKT` contains the encoded data
for this frame. We write a IVF frame header, followed by the raw data.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
@DEFAULT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME


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