| OLD | NEW |
| (Empty) |
| 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 | |
| OLD | NEW |