Home | History | Annotate | Download | only in examples
      1 @TEMPLATE encoder_tmpl.c
      2 Simple Encoder
      3 ==============
      4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
      5 This is an example of a simple encoder loop. It takes an input file in
      6 YV12 format, passes it through the encoder, and writes the compressed
      7 frames to disk in IVF format. Other decoder examples build upon this
      8 one.
      9 
     10 The details of the IVF format have been elided from this example for
     11 simplicity of presentation, as IVF files will not generally be used by
     12 your application. In general, an IVF file consists of a file header,
     13 followed by a variable number of frames. Each frame consists of a frame
     14 header followed by a variable length payload. The length of the payload
     15 is specified in the first four bytes of the frame header. The payload is
     16 the raw compressed data.
     17 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
     18 
     19 
     20 Standard Includes
     21 -----------------
     22 For encoders, you only have to include `vpx_encoder.h` and then any
     23 header files for the specific codecs you use. In this case, we're using
     24 vp8. The `VPX_CODEC_DISABLE_COMPAT` macro can be defined to ensure
     25 strict compliance with the latest SDK by disabling some backwards
     26 compatibility features. Defining this macro is encouraged.
     27 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
     28 @DEFAULT
     29 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
     30 
     31 
     32 Getting The Default Configuration
     33 ---------------------------------
     34 Encoders have the notion of "usage profiles." For example, an encoder
     35 may want to publish default configurations for both a video
     36 conferencing appliction and a best quality offline encoder. These
     37 obviously have very different default settings. Consult the
     38 documentation for your codec to see if it provides any default
     39 configurations. All codecs provide a default configuration, number 0,
     40 which is valid for material in the vacinity of QCIF/QVGA.
     41 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_DEF_CFG
     42 @DEFAULT
     43 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_DEF_CFG
     44 
     45 
     46 Updating The Configuration
     47 ---------------------------------
     48 Almost all applications will want to update the default configuration
     49 with settings specific to their usage. Here we set the width and height
     50 of the video file to that specified on the command line. We also scale
     51 the default bitrate based on the ratio between the default resolution
     52 and the resolution specified on the command line.
     53 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG
     54 @DEFAULT
     55 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG
     56 
     57 
     58 Initializing The Codec
     59 ----------------------
     60 The encoder is initialized by the following code.
     61 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT
     62 @DEFAULT
     63 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT
     64 
     65 
     66 Encoding A Frame
     67 ----------------
     68 The frame is read as a continuous block (size width * height * 3 / 2)
     69 from the input file. If a frame was read (the input file has not hit
     70 EOF) then the frame is passed to the encoder. Otherwise, a NULL
     71 is passed, indicating the End-Of-Stream condition to the encoder. The
     72 `frame_cnt` is reused as the presentation time stamp (PTS) and each
     73 frame is shown for one frame-time in duration. The flags parameter is
     74 unused in this example. The deadline is set to VPX_DL_REALTIME to
     75 make the example run as quickly as possible.
     76 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME
     77 @DEFAULT
     78 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME
     79 
     80 Processing The Encoded Data
     81 ---------------------------
     82 Each packet of type `VPX_CODEC_CX_FRAME_PKT` contains the encoded data
     83 for this frame. We write a IVF frame header, followed by the raw data.
     84 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
     85 @DEFAULT
     86 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
     87 
     88 
     89 Cleanup
     90 -------
     91 The `vpx_codec_destroy` call frees any memory allocated by the codec.
     92 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
     93 @DEFAULT
     94 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
     95 
     96 
     97 Error Handling
     98 --------------
     99 This example does not special case any error return codes. If there was
    100 an error, a descriptive message is printed and the program exits. With
    101 few exeptions, vpx_codec functions return an enumerated error status,
    102 with the value `0` indicating success.
    103 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC
    104 @DEFAULT
    105 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC
    106