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