1 @TEMPLATE encoder_tmpl.c
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
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
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
29 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
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
43 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_DEF_CFG
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
55 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG
58 Initializing The Codec
59 ----------------------
60 The encoder is initialized by the following code.
61 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT
63 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT
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
78 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME
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
86 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
91 The `vpx_codec_destroy` call frees any memory allocated by the codec.
92 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
94 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
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
105 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC