|  | @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 |