<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.3"/> <title>WebM VP8 Codec SDK: simple_encoder.c</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">WebM VP8 Codec SDK </div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Generated by Doxygen 1.8.3 --> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li class="current"><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> </ul> </div> <div id="nav-path" class="navpath"> <ul> <li class="navelem"><a class="el" href="samples.html">Sample Code</a></li> </ul> </div> </div><!-- top --> <div class="header"> <div class="headertitle"> <div class="title">simple_encoder.c </div> </div> </div><!--header--> <div class="contents"> <div class="textblock"> <h1>Simple Encoder</h1> <p>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.</p> <p>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.</p> <h2>Standard Includes</h2> <p>For encoders, you only have to include <code>vpx_encoder.h</code> and then any header files for the specific codecs you use. In this case, we’re using vp8. The <code>VPX_CODEC_DISABLE_COMPAT</code> macro can be defined to ensure strict compliance with the latest SDK by disabling some backwards compatibility features. Defining this macro is encouraged.</p> <pre class="c"><span style="color: #339933;">#define VPX_CODEC_DISABLE_COMPAT 1</span> <span style="color: #339933;">#include "vpx/vpx_encoder.h"</span> <span style="color: #339933;">#include "vpx/vp8cx.h"</span> <span style="color: #339933;">#define interface (vpx_codec_vp8_cx())</span></pre> <h2>Getting The Default Configuration</h2> <p>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.</p> <pre class="c"><span style="color: #808080; font-style: italic;">/* Populate encoder configuration */</span> res <span style="color: #339933;">=</span> vpx_codec_enc_config_default<span style="color: #009900;">(</span>interface<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>cfg<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>res<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"Failed to get config: %s<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span> vpx_codec_err_to_string<span style="color: #009900;">(</span>res<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> EXIT_FAILURE<span style="color: #339933;">;</span> <span style="color: #009900;">}</span></pre> <h2>Updating The Configuration</h2> <p>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.</p> <pre class="c"><span style="color: #808080; font-style: italic;">/* Update the default configuration with our settings */</span> cfg.<span style="color: #202020;">rc_target_bitrate</span> <span style="color: #339933;">=</span> width <span style="color: #339933;">*</span> height <span style="color: #339933;">*</span> cfg.<span style="color: #202020;">rc_target_bitrate</span> <span style="color: #339933;">/</span> cfg.<span style="color: #202020;">g_w</span> <span style="color: #339933;">/</span> cfg.<span style="color: #202020;">g_h</span><span style="color: #339933;">;</span> cfg.<span style="color: #202020;">g_w</span> <span style="color: #339933;">=</span> width<span style="color: #339933;">;</span> cfg.<span style="color: #202020;">g_h</span> <span style="color: #339933;">=</span> height<span style="color: #339933;">;</span></pre> <h2>Initializing The Codec</h2> <p>The encoder is initialized by the following code.</p> <pre class="c"><span style="color: #808080; font-style: italic;">/* Initialize codec */</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>vpx_codec_enc_init<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> interface<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>cfg<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> die_codec<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> <span style="color: #ff0000;">"Failed to initialize encoder"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre> <h2>Encoding A Frame</h2> <p>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 <code>frame_cnt</code> 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.</p> <pre class="c">frame_avail <span style="color: #339933;">=</span> read_frame<span style="color: #009900;">(</span>infile<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>raw<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>vpx_codec_encode<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> frame_avail<span style="color: #339933;">?</span> <span style="color: #339933;">&</span>raw <span style="color: #339933;">:</span> NULL<span style="color: #339933;">,</span> frame_cnt<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> flags<span style="color: #339933;">,</span> VPX_DL_REALTIME<span style="color: #009900;">)</span><span style="color: #009900;">)</span> die_codec<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> <span style="color: #ff0000;">"Failed to encode frame"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre> <h2>Processing The Encoded Data</h2> <p>Each packet of type <code>VPX_CODEC_CX_FRAME_PKT</code> contains the encoded data for this frame. We write a IVF frame header, followed by the raw data.</p> <pre class="c"><span style="color: #b1b100;">case</span> VPX_CODEC_CX_FRAME_PKT<span style="color: #339933;">:</span> write_ivf_frame_header<span style="color: #009900;">(</span>outfile<span style="color: #339933;">,</span> pkt<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span><span style="color: #009900;">)</span> fwrite<span style="color: #009900;">(</span>pkt<span style="color: #339933;">-></span>data.<span style="color: #202020;">frame</span>.<span style="color: #202020;">buf</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> pkt<span style="color: #339933;">-></span>data.<span style="color: #202020;">frame</span>.<span style="color: #202020;">sz</span><span style="color: #339933;">,</span> outfile<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span></pre> <h2>Cleanup</h2> <p>The <code>vpx_codec_destroy</code> call frees any memory allocated by the codec.</p> <pre class="c">vpx_img_free<span style="color: #009900;">(</span><span style="color: #339933;">&</span>raw<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>vpx_codec_destroy<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #009900;">)</span><span style="color: #009900;">)</span> die_codec<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> <span style="color: #ff0000;">"Failed to destroy codec"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre> <h2>Error Handling</h2> <p>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 <code>0</code> indicating success.</p> <pre class="c"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span> die_codec<span style="color: #009900;">(</span>vpx_codec_ctx_t <span style="color: #339933;">*</span>ctx<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>s<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>detail <span style="color: #339933;">=</span> vpx_codec_error_detail<span style="color: #009900;">(</span>ctx<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"%s: %s<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span> s<span style="color: #339933;">,</span> vpx_codec_error<span style="color: #009900;">(</span>ctx<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>detail<span style="color: #009900;">)</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">" %s<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span>detail<span style="color: #009900;">)</span><span style="color: #339933;">;</span> exit<span style="color: #009900;">(</span>EXIT_FAILURE<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span></pre> <h1>Putting It All Together</h1> <pre class="c"><span style="color: #808080; font-style: italic;">/* Copyright (c) 2010 The WebM project authors. All Rights Reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file in the root of the source tree. An additional intellectual property rights grant can be found in the file PATENTS. All contributing project authors may be found in the AUTHORS file in the root of the source tree. */</span> <span style="color: #808080; font-style: italic;">/* 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. */</span> <span style="color: #339933;">#include <stdio.h></span> <span style="color: #339933;">#include <stdlib.h></span> <span style="color: #339933;">#include <stdarg.h></span> <span style="color: #339933;">#include <string.h></span> <span style="color: #339933;">#define VPX_CODEC_DISABLE_COMPAT 1</span> <span style="color: #339933;">#include "vpx/vpx_encoder.h"</span> <span style="color: #339933;">#include "vpx/vp8cx.h"</span> <span style="color: #339933;">#define interface (vpx_codec_vp8_cx())</span> <span style="color: #339933;">#define fourcc 0x30385056</span> <span style="color: #339933;">#define IVF_FILE_HDR_SZ (32)</span> <span style="color: #339933;">#define IVF_FRAME_HDR_SZ (12)</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> mem_put_le16<span style="color: #009900;">(</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>mem<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> val<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> mem<span style="color: #009900;">[</span><span style="color: #0000dd;">0</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">;</span> mem<span style="color: #009900;">[</span><span style="color: #0000dd;">1</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">>></span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> mem_put_le32<span style="color: #009900;">(</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>mem<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> val<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> mem<span style="color: #009900;">[</span><span style="color: #0000dd;">0</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">;</span> mem<span style="color: #009900;">[</span><span style="color: #0000dd;">1</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">>></span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span> mem<span style="color: #009900;">[</span><span style="color: #0000dd;">2</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">>></span><span style="color: #0000dd;">16</span><span style="color: #339933;">;</span> mem<span style="color: #009900;">[</span><span style="color: #0000dd;">3</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">>></span><span style="color: #0000dd;">24</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> die<span style="color: #009900;">(</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span> ...<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> va_list ap<span style="color: #339933;">;</span> va_start<span style="color: #009900;">(</span>ap<span style="color: #339933;">,</span> fmt<span style="color: #009900;">)</span><span style="color: #339933;">;</span> vprintf<span style="color: #009900;">(</span>fmt<span style="color: #339933;">,</span> ap<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>fmt<span style="color: #009900;">[</span>strlen<span style="color: #009900;">(</span>fmt<span style="color: #009900;">)</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">]</span> <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #009900;">)</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> exit<span style="color: #009900;">(</span>EXIT_FAILURE<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> die_codec<span style="color: #009900;">(</span>vpx_codec_ctx_t <span style="color: #339933;">*</span>ctx<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>s<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>detail <span style="color: #339933;">=</span> vpx_codec_error_detail<span style="color: #009900;">(</span>ctx<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #666666; font-style: italic;">//</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"%s: %s<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span> s<span style="color: #339933;">,</span> vpx_codec_error<span style="color: #009900;">(</span>ctx<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>detail<span style="color: #009900;">)</span> <span style="color: #666666; font-style: italic;">//</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">" %s<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span>detail<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> exit<span style="color: #009900;">(</span>EXIT_FAILURE<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #009900;">}</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #993333;">static</span> <span style="color: #993333;">int</span> read_frame<span style="color: #009900;">(</span>FILE <span style="color: #339933;">*</span>f<span style="color: #339933;">,</span> vpx_image_t <span style="color: #339933;">*</span>img<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> size_t nbytes<span style="color: #339933;">,</span> to_read<span style="color: #339933;">;</span> <span style="color: #993333;">int</span> res <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> to_read <span style="color: #339933;">=</span> img<span style="color: #339933;">-></span>w<span style="color: #339933;">*</span>img<span style="color: #339933;">-></span>h<span style="color: #339933;">*</span><span style="color: #0000dd;">3</span><span style="color: #339933;">/</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> nbytes <span style="color: #339933;">=</span> fread<span style="color: #009900;">(</span>img<span style="color: #339933;">-></span>planes<span style="color: #009900;">[</span><span style="color: #0000dd;">0</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> to_read<span style="color: #339933;">,</span> f<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>nbytes <span style="color: #339933;">!=</span> to_read<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> res <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>nbytes <span style="color: #339933;">></span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"Warning: Read partial frame. Check your width & height!<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #b1b100;">return</span> res<span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> write_ivf_file_header<span style="color: #009900;">(</span>FILE <span style="color: #339933;">*</span>outfile<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> vpx_codec_enc_cfg_t <span style="color: #339933;">*</span>cfg<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> frame_cnt<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #993333;">char</span> header<span style="color: #009900;">[</span><span style="color: #0000dd;">32</span><span style="color: #009900;">]</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>cfg<span style="color: #339933;">-></span>g_pass <span style="color: #339933;">!=</span> VPX_RC_ONE_PASS <span style="color: #339933;">&&</span> cfg<span style="color: #339933;">-></span>g_pass <span style="color: #339933;">!=</span> VPX_RC_LAST_PASS<span style="color: #009900;">)</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span> header<span style="color: #009900;">[</span><span style="color: #0000dd;">0</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'D'</span><span style="color: #339933;">;</span> header<span style="color: #009900;">[</span><span style="color: #0000dd;">1</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'K'</span><span style="color: #339933;">;</span> header<span style="color: #009900;">[</span><span style="color: #0000dd;">2</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'I'</span><span style="color: #339933;">;</span> header<span style="color: #009900;">[</span><span style="color: #0000dd;">3</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'F'</span><span style="color: #339933;">;</span> mem_put_le16<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">4</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* version */</span> mem_put_le16<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">6</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">32</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* headersize */</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">8</span><span style="color: #339933;">,</span> fourcc<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* headersize */</span> mem_put_le16<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">12</span><span style="color: #339933;">,</span> cfg<span style="color: #339933;">-></span>g_w<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* width */</span> mem_put_le16<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">14</span><span style="color: #339933;">,</span> cfg<span style="color: #339933;">-></span>g_h<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* height */</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">16</span><span style="color: #339933;">,</span> cfg<span style="color: #339933;">-></span>g_timebase.<span style="color: #202020;">den</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* rate */</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">20</span><span style="color: #339933;">,</span> cfg<span style="color: #339933;">-></span>g_timebase.<span style="color: #202020;">num</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* scale */</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">24</span><span style="color: #339933;">,</span> frame_cnt<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* length */</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">28</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* unused */</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span><span style="color: #009900;">)</span> fwrite<span style="color: #009900;">(</span>header<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">32</span><span style="color: #339933;">,</span> outfile<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #993333;">static</span> <span style="color: #993333;">void</span> write_ivf_frame_header<span style="color: #009900;">(</span>FILE <span style="color: #339933;">*</span>outfile<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> vpx_codec_cx_pkt_t <span style="color: #339933;">*</span>pkt<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #993333;">char</span> header<span style="color: #009900;">[</span><span style="color: #0000dd;">12</span><span style="color: #009900;">]</span><span style="color: #339933;">;</span> vpx_codec_pts_t pts<span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>pkt<span style="color: #339933;">-></span>kind <span style="color: #339933;">!=</span> VPX_CODEC_CX_FRAME_PKT<span style="color: #009900;">)</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span> pts <span style="color: #339933;">=</span> pkt<span style="color: #339933;">-></span>data.<span style="color: #202020;">frame</span>.<span style="color: #202020;">pts</span><span style="color: #339933;">;</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">,</span> pkt<span style="color: #339933;">-></span>data.<span style="color: #202020;">frame</span>.<span style="color: #202020;">sz</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">4</span><span style="color: #339933;">,</span> pts<span style="color: #339933;">&</span><span style="color: #208080;">0xFFFFFFFF</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> mem_put_le32<span style="color: #009900;">(</span>header<span style="color: #339933;">+</span><span style="color: #0000dd;">8</span><span style="color: #339933;">,</span> pts <span style="color: #339933;">>></span> <span style="color: #0000dd;">32</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span><span style="color: #009900;">)</span> fwrite<span style="color: #009900;">(</span>header<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">12</span><span style="color: #339933;">,</span> outfile<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #993333;">int</span> main<span style="color: #009900;">(</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> FILE <span style="color: #339933;">*</span>infile<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>outfile<span style="color: #339933;">;</span> vpx_codec_ctx_t codec<span style="color: #339933;">;</span> vpx_codec_enc_cfg_t cfg<span style="color: #339933;">;</span> <span style="color: #993333;">int</span> frame_cnt <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> vpx_image_t raw<span style="color: #339933;">;</span> vpx_codec_err_t res<span style="color: #339933;">;</span> <span style="color: #993333;">long</span> width<span style="color: #339933;">;</span> <span style="color: #993333;">long</span> height<span style="color: #339933;">;</span> <span style="color: #993333;">int</span> frame_avail<span style="color: #339933;">;</span> <span style="color: #993333;">int</span> got_data<span style="color: #339933;">;</span> <span style="color: #993333;">int</span> flags <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* Open files */</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>argc<span style="color: #339933;">!=</span><span style="color: #0000dd;">5</span><span style="color: #009900;">)</span> die<span style="color: #009900;">(</span><span style="color: #ff0000;">"Usage: %s <width> <height> <infile> <outfile><span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span> argv<span style="color: #009900;">[</span><span style="color: #0000dd;">0</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> width <span style="color: #339933;">=</span> strtol<span style="color: #009900;">(</span>argv<span style="color: #009900;">[</span><span style="color: #0000dd;">1</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> height <span style="color: #339933;">=</span> strtol<span style="color: #009900;">(</span>argv<span style="color: #009900;">[</span><span style="color: #0000dd;">2</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>width <span style="color: #339933;"><</span> <span style="color: #0000dd;">16</span> <span style="color: #339933;">||</span> width<span style="color: #339933;">%</span><span style="color:#800080;">2</span> <span style="color: #339933;">||</span> height <span style="color: #339933;"><</span><span style="color: #0000dd;">16</span> <span style="color: #339933;">||</span> height<span style="color: #339933;">%</span><span style="color:#800080;">2</span><span style="color: #009900;">)</span> die<span style="color: #009900;">(</span><span style="color: #ff0000;">"Invalid resolution: %ldx%ld"</span><span style="color: #339933;">,</span> width<span style="color: #339933;">,</span> height<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span><span style="color: #339933;">!</span>vpx_img_alloc<span style="color: #009900;">(</span><span style="color: #339933;">&</span>raw<span style="color: #339933;">,</span> VPX_IMG_FMT_I420<span style="color: #339933;">,</span> width<span style="color: #339933;">,</span> height<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> die<span style="color: #009900;">(</span><span style="color: #ff0000;">"Faile to allocate image"</span><span style="color: #339933;">,</span> width<span style="color: #339933;">,</span> height<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span><span style="color: #339933;">!</span><span style="color: #009900;">(</span>outfile <span style="color: #339933;">=</span> fopen<span style="color: #009900;">(</span>argv<span style="color: #009900;">[</span><span style="color: #0000dd;">4</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">"wb"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> die<span style="color: #009900;">(</span><span style="color: #ff0000;">"Failed to open %s for writing"</span><span style="color: #339933;">,</span> argv<span style="color: #009900;">[</span><span style="color: #0000dd;">4</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"Using %s<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span>vpx_codec_iface_name<span style="color: #009900;">(</span>interface<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* Populate encoder configuration */</span> <span style="color: #666666; font-style: italic;">//</span> res <span style="color: #339933;">=</span> vpx_codec_enc_config_default<span style="color: #009900;">(</span>interface<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>cfg<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>res<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #666666; font-style: italic;">//</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"Failed to get config: %s<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span> vpx_codec_err_to_string<span style="color: #009900;">(</span>res<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #b1b100;">return</span> EXIT_FAILURE<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #009900;">}</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #808080; font-style: italic;">/* Update the default configuration with our settings */</span> <span style="color: #666666; font-style: italic;">//</span> cfg.<span style="color: #202020;">rc_target_bitrate</span> <span style="color: #339933;">=</span> width <span style="color: #339933;">*</span> height <span style="color: #339933;">*</span> cfg.<span style="color: #202020;">rc_target_bitrate</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #339933;">/</span> cfg.<span style="color: #202020;">g_w</span> <span style="color: #339933;">/</span> cfg.<span style="color: #202020;">g_h</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> cfg.<span style="color: #202020;">g_w</span> <span style="color: #339933;">=</span> width<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> cfg.<span style="color: #202020;">g_h</span> <span style="color: #339933;">=</span> height<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> write_ivf_file_header<span style="color: #009900;">(</span>outfile<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>cfg<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* Open input file for this encoding pass */</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span><span style="color: #339933;">!</span><span style="color: #009900;">(</span>infile <span style="color: #339933;">=</span> fopen<span style="color: #009900;">(</span>argv<span style="color: #009900;">[</span><span style="color: #0000dd;">3</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">"rb"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> die<span style="color: #009900;">(</span><span style="color: #ff0000;">"Failed to open %s for reading"</span><span style="color: #339933;">,</span> argv<span style="color: #009900;">[</span><span style="color: #0000dd;">3</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* Initialize codec */</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>vpx_codec_enc_init<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> interface<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>cfg<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #666666; font-style: italic;">//</span> die_codec<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> <span style="color: #ff0000;">"Failed to initialize encoder"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> frame_avail <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> got_data <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">(</span>frame_avail <span style="color: #339933;">||</span> got_data<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> vpx_codec_iter_t iter <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span> <span style="color: #993333;">const</span> vpx_codec_cx_pkt_t <span style="color: #339933;">*</span>pkt<span style="color: #339933;">;</span> frame_avail <span style="color: #339933;">=</span> read_frame<span style="color: #009900;">(</span>infile<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>raw<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>vpx_codec_encode<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> frame_avail<span style="color: #339933;">?</span> <span style="color: #339933;">&</span>raw <span style="color: #339933;">:</span> NULL<span style="color: #339933;">,</span> frame_cnt<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> flags<span style="color: #339933;">,</span> VPX_DL_REALTIME<span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #666666; font-style: italic;">//</span> die_codec<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> <span style="color: #ff0000;">"Failed to encode frame"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> got_data <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">(</span> <span style="color: #009900;">(</span>pkt <span style="color: #339933;">=</span> vpx_codec_get_cx_data<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>iter<span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #009900;">)</span> <span style="color: #009900;">{</span> got_data <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">switch</span><span style="color: #009900;">(</span>pkt<span style="color: #339933;">-></span>kind<span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #b1b100;">case</span> VPX_CODEC_CX_FRAME_PKT<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">//</span> write_ivf_frame_header<span style="color: #009900;">(</span>outfile<span style="color: #339933;">,</span> pkt<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span><span style="color: #009900;">)</span> fwrite<span style="color: #009900;">(</span>pkt<span style="color: #339933;">-></span>data.<span style="color: #202020;">frame</span>.<span style="color: #202020;">buf</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> pkt<span style="color: #339933;">-></span>data.<span style="color: #202020;">frame</span>.<span style="color: #202020;">sz</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">//</span> outfile<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span>pkt<span style="color: #339933;">-></span>kind <span style="color: #339933;">==</span> VPX_CODEC_CX_FRAME_PKT <span style="color: #339933;">&&</span> <span style="color: #009900;">(</span>pkt<span style="color: #339933;">-></span>data.<span style="color: #202020;">frame</span>.<span style="color: #202020;">flags</span> <span style="color: #339933;">&</span> VPX_FRAME_IS_KEY<span style="color: #009900;">)</span><span style="color: #339933;">?</span> <span style="color: #ff0000;">"K"</span><span style="color: #339933;">:</span><span style="color: #ff0000;">"."</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> fflush<span style="color: #009900;">(</span>stdout<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> frame_cnt<span style="color: #339933;">++;</span> <span style="color: #009900;">}</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> fclose<span style="color: #009900;">(</span>infile<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: #ff0000;">"Processed %d frames.<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span>frame_cnt<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> vpx_img_free<span style="color: #009900;">(</span><span style="color: #339933;">&</span>raw<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span>vpx_codec_destroy<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #666666; font-style: italic;">//</span> die_codec<span style="color: #009900;">(</span><span style="color: #339933;">&</span>codec<span style="color: #339933;">,</span> <span style="color: #ff0000;">"Failed to destroy codec"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span> <span style="color: #808080; font-style: italic;">/* Try to rewrite the file header with the actual frame count */</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">(</span><span style="color: #339933;">!</span>fseek<span style="color: #009900;">(</span>outfile<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> SEEK_SET<span style="color: #009900;">)</span><span style="color: #009900;">)</span> write_ivf_file_header<span style="color: #009900;">(</span>outfile<span style="color: #339933;">,</span> <span style="color: #339933;">&</span>cfg<span style="color: #339933;">,</span> frame_cnt<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> fclose<span style="color: #009900;">(</span>outfile<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> EXIT_SUCCESS<span style="color: #339933;">;</span> <span style="color: #009900;">}</span></pre> </div></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> Generated by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/> </a> 1.8.3 </small></address> </body> </html>