@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