<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Dirac Video Codec</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <h1 align="center" color="#606080"> Dirac - A Video Codec </h1> <p align="center"> Created by the <a href="http://www.bbc.co.uk">British Broadcasting Corporation</a>. </p> <hr> <!-- Generated by Doxygen 1.5.4 --> <h1>dirac_encoder.h File Reference</h1>C interface to Dirac Encoder. <a href="#_details">More...</a> <p> <code>#include <<a class="el" href="a00253.html">libdirac_common/dirac_types.h</a>></code><br> <p> <a href="a00250.html">Go to the source code of this file.</a><h2>Classes</h2> <ul> <li>struct <a class="el" href="a00042.html">dirac_encparams_t</a> <li>struct <a class="el" href="a00040.html">dirac_encoder_context_t</a> <li>struct <a class="el" href="a00037.html">dirac_enc_data_t</a> <li>struct <a class="el" href="a00038.html">dirac_enc_framestats_t</a> <li>struct <a class="el" href="a00039.html">dirac_enc_seqstats_t</a> <li>struct <a class="el" href="a00047.html">dirac_mv_t</a> <li>struct <a class="el" href="a00046.html">dirac_mv_cost_t</a> <li>struct <a class="el" href="a00045.html">dirac_instr_t</a> <li>struct <a class="el" href="a00041.html">dirac_encoder_t</a> </ul> <h2>Typedefs</h2> <ul> <li>typedef <a class="el" href="a00168.html#216a5d43d2a518325c84f100ed7735a5">VideoFormat</a> <a class="el" href="a00177.html#5c2b1cecf4880c180845367d9a891689">dirac_encoder_presets_t</a> <li>typedef <a class="el" href="a00168.html#73c509e14745c98e30772b6c4f8b6e1e">MVPrecisionType</a> <a class="el" href="a00177.html#7533c4c4245e67a6517d95749b712755">dirac_mvprecision_t</a> </ul> <h2>Enumerations</h2> <ul> <li>enum <a class="el" href="a00177.html#5fc325d503a9b28131076aa3f8ebb306">dirac_encoder_state_t</a> { <a class="el" href="a00177.html#5fc325d503a9b28131076aa3f8ebb306de4346f74475e567da4d6649338f94b8">ENC_STATE_INVALID</a> = -1, <a class="el" href="a00177.html#5fc325d503a9b28131076aa3f8ebb306c0af1f9ec7a1e9c3df9edb491ca239ae">ENC_STATE_BUFFER</a>, <a class="el" href="a00177.html#5fc325d503a9b28131076aa3f8ebb30606dc87bdac156124d857134bd3cd21a7">ENC_STATE_AVAIL</a> } </ul> <h2>Functions</h2> <ul> <li>DllExport void <a class="el" href="a00177.html#24cf3cb4253eb9034252e2885278cb00">dirac_encoder_context_init</a> (<a class="el" href="a00040.html">dirac_encoder_context_t</a> *enc_ctx, <a class="el" href="a00168.html#216a5d43d2a518325c84f100ed7735a5">dirac_encoder_presets_t</a> preset) <li>DllExport <a class="el" href="a00041.html">dirac_encoder_t</a> * <a class="el" href="a00177.html#9062baaff3bbbc1880d8d59b5ee8e1e0">dirac_encoder_init</a> (const <a class="el" href="a00040.html">dirac_encoder_context_t</a> *enc_ctx, int verbose) <li>DllExport int <a class="el" href="a00177.html#bec8d7f0c177114a47910bedf807ea8e">dirac_encoder_load</a> (<a class="el" href="a00041.html">dirac_encoder_t</a> *encoder, unsigned char *uncdata, int uncdata_size) <li>DllExport <a class="el" href="a00177.html#5fc325d503a9b28131076aa3f8ebb306">dirac_encoder_state_t</a> <a class="el" href="a00177.html#2e7991c68ecf07b21eba6c06bd8fa43c">dirac_encoder_output</a> (<a class="el" href="a00041.html">dirac_encoder_t</a> *encoder) <li>DllExport int <a class="el" href="a00177.html#fb06f62e4a9e1b77813291119c21ff50">dirac_encoder_end_sequence</a> (<a class="el" href="a00041.html">dirac_encoder_t</a> *encoder) <li>DllExport void <a class="el" href="a00177.html#dbfe5fb6e0928ceeef27fe9ee7007054">dirac_encoder_close</a> (<a class="el" href="a00041.html">dirac_encoder_t</a> *encoder) </ul> <hr><a name="_details"></a><h2>Detailed Description</h2> A set of 'C' functions that define the public interface to the Dirac encoder. Refer to the the reference encoder source code, encoder/encmain.cpp for an example of how to use the "C" interface. The pseudocode below gives a brief description of the "C" interface usage.<p> <div class="fragment"><pre class="fragment"> #include <libdirac_decoder/dirac_encoder.h> #define ENCBUF_SIZE 1024*1024; unsigned char *buffer, enc_buf[ENC_BUFSIZE]; int buffer_size; dirac_encoder_t *encoder; dirac_encoder_context_t enc_ctx; // Initialse the encoder context with the presets for SD576 - Standard // Definition Digital dirac_encoder_context_init (&enc_ctx, SD576); // Override parameters if required // interlace : 1 - interlaced; 0 - progressive enc_ctx.seq_params.interlace = 0; enc_ctx.seq_params.topfieldfirst = 0; enc_ctx.enc_params.qf = 7.5; // disable instrumentation flag enc_ctx.instr_flag = 0; // return locally decoded output enc_ctx.decode_flag = 1; // Initialise the encoder with the encoder context. // Setting verbose output to false encoder= dirac_encoder_init(&enc_ctx, false); // Set the buffer size. For SD576 4:2:0 chroma buffer_size = (720*576*3)/2; buffer = (unsigned char *)malloc (buffer_size); // Output buffer dirac_encoder_state_t state; while (read uncompressed frame data into buffer) { // load one frame of data into encoder if (dirac_encoder_load(encoder, buffer, buffer_size) == 0) { // Retrieve encoded frames from encoder do { encoder->enc_buf.buffer = enc_buf; encoder->enc_buf.size = ENCBUF_SIZE; state = dirac_encoder_output (encoder); switch (state) { case ENC_STATE_AVAIL: // Encoded frame available in encoder->enc_buf // Encoded frame params available in enccoder->enc_fparams // Encoded frame stats available in enccoder->enc_fstats break; case ENC_STATE_BUFFER: break; case ENC_STATE_INVALID: default: // Unrecoverable error encountered. Exit; exit (exit code); } if (encoder->decoded_frame_avail) { //locally decoded frame is available in //encoder->dec_buf //locally decoded frame parameters available //in encoder->dec_fparams } if (encoder->instr_data_avail) { //Instrumentation data (motion vectors etc.) //available in encoder->instr } } while (state == ENC_STATE_AVAIL) } } // Retrieve end of sequence info encoder->enc_buf.buffer = video_buf; encoder->enc_buf.size = VIDEO_BUFFER_SIZE; dirac_encoder_end_sequence( encoder ); // End of sequence info is availale in encoder->enc_buf // Sequence statistics available in encoder->enc_seqstats; // Free the encoder resources dirac_encoder_close(encoder) // Free the uncompressed data buffer free (buffer); </pre></div> <hr><h2>Typedef Documentation</h2> <a class="anchor" name="5c2b1cecf4880c180845367d9a891689"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_presets_t" ref="5c2b1cecf4880c180845367d9a891689" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">typedef <a class="el" href="a00168.html#216a5d43d2a518325c84f100ed7735a5">VideoFormat</a> <a class="el" href="a00168.html#216a5d43d2a518325c84f100ed7735a5">dirac_encoder_presets_t</a> </td> </tr> </table> </div> <div class="memdoc"> <p> Enumerated type that defines encoder presets that set the encoder and sequence paramters. More presets may be added in future </div> </div><p> <a class="anchor" name="7533c4c4245e67a6517d95749b712755"></a><!-- doxytag: member="dirac_encoder.h::dirac_mvprecision_t" ref="7533c4c4245e67a6517d95749b712755" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">typedef <a class="el" href="a00168.html#73c509e14745c98e30772b6c4f8b6e1e">MVPrecisionType</a> <a class="el" href="a00168.html#73c509e14745c98e30772b6c4f8b6e1e">dirac_mvprecision_t</a> </td> </tr> </table> </div> <div class="memdoc"> <p> Enumerated type that defined motion vector precisions supported by the encoder. More mv precisions may be added in future. </div> </div><p> <hr><h2>Enumeration Type Documentation</h2> <a class="anchor" name="5fc325d503a9b28131076aa3f8ebb306"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_state_t" ref="5fc325d503a9b28131076aa3f8ebb306" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">enum <a class="el" href="a00177.html#5fc325d503a9b28131076aa3f8ebb306">dirac_encoder_state_t</a> </td> </tr> </table> </div> <div class="memdoc"> <p> Enumerated type that defines encoder state <dl compact><dt><b>Enumerator: </b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"><em><a class="anchor" name="5fc325d503a9b28131076aa3f8ebb306de4346f74475e567da4d6649338f94b8"></a><!-- doxytag: member="ENC_STATE_INVALID" ref="5fc325d503a9b28131076aa3f8ebb306de4346f74475e567da4d6649338f94b8" args="" -->ENC_STATE_INVALID</em> </td><td> </td></tr> <tr><td valign="top"><em><a class="anchor" name="5fc325d503a9b28131076aa3f8ebb306c0af1f9ec7a1e9c3df9edb491ca239ae"></a><!-- doxytag: member="ENC_STATE_BUFFER" ref="5fc325d503a9b28131076aa3f8ebb306c0af1f9ec7a1e9c3df9edb491ca239ae" args="" -->ENC_STATE_BUFFER</em> </td><td> </td></tr> <tr><td valign="top"><em><a class="anchor" name="5fc325d503a9b28131076aa3f8ebb30606dc87bdac156124d857134bd3cd21a7"></a><!-- doxytag: member="ENC_STATE_AVAIL" ref="5fc325d503a9b28131076aa3f8ebb30606dc87bdac156124d857134bd3cd21a7" args="" -->ENC_STATE_AVAIL</em> </td><td> </td></tr> </table> </dl> </div> </div><p> <hr><h2>Function Documentation</h2> <a class="anchor" name="dbfe5fb6e0928ceeef27fe9ee7007054"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_close" ref="dbfe5fb6e0928ceeef27fe9ee7007054" args="(dirac_encoder_t *encoder)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">DllExport void dirac_encoder_close </td> <td>(</td> <td class="paramtype"><a class="el" href="a00041.html">dirac_encoder_t</a> * </td> <td class="paramname"> <em>encoder</em> </td> <td> ) </td> <td width="100%"></td> </tr> </table> </div> <div class="memdoc"> <p> Free resources held by encoder <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>encoder</em> </td><td>Encoder Handle </td></tr> </table> </dl> </div> </div><p> <a class="anchor" name="24cf3cb4253eb9034252e2885278cb00"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_context_init" ref="24cf3cb4253eb9034252e2885278cb00" args="(dirac_encoder_context_t *enc_ctx, dirac_encoder_presets_t preset)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">DllExport void dirac_encoder_context_init </td> <td>(</td> <td class="paramtype"><a class="el" href="a00040.html">dirac_encoder_context_t</a> * </td> <td class="paramname"> <em>enc_ctx</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"><a class="el" href="a00168.html#216a5d43d2a518325c84f100ed7735a5">dirac_encoder_presets_t</a> </td> <td class="paramname"> <em>preset</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td><td width="100%"></td> </tr> </table> </div> <div class="memdoc"> <p> Function that creates an encoder context based on a preset value. The values can then be overridden by the user by setting each field separately <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>enc_ctx</em> </td><td>pointer to Encoder context tp be initialised. </td></tr> <tr><td valign="top"></td><td valign="top"><em>preset</em> </td><td>Preset to be used to initialise the encoder context <div class="fragment"><pre class="fragment"> For a full list of video formats presets supported and the default values of the source and encoder parameters. refer to Annex C of the Dirac ByteStream Specification. </pre></div> </td></tr> </table> </dl> </div> </div><p> <a class="anchor" name="fb06f62e4a9e1b77813291119c21ff50"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_end_sequence" ref="fb06f62e4a9e1b77813291119c21ff50" args="(dirac_encoder_t *encoder)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">DllExport int dirac_encoder_end_sequence </td> <td>(</td> <td class="paramtype"><a class="el" href="a00041.html">dirac_encoder_t</a> * </td> <td class="paramname"> <em>encoder</em> </td> <td> ) </td> <td width="100%"></td> </tr> </table> </div> <div class="memdoc"> <p> Retrieve end of sequence information from the encoder. The encoder buffer, enc_buf, in the encodermust be set up with the buffer and buffer_size that will hold the end of sequence information. <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>encoder</em> </td><td>Encoder Handle </td></tr> </table> </dl> <dl class="return" compact><dt><b>Returns:</b></dt><dd>return status. >=0 - successful; -1 failed </dd></dl> </div> </div><p> <a class="anchor" name="9062baaff3bbbc1880d8d59b5ee8e1e0"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_init" ref="9062baaff3bbbc1880d8d59b5ee8e1e0" args="(const dirac_encoder_context_t *enc_ctx, int verbose)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">DllExport <a class="el" href="a00041.html">dirac_encoder_t</a>* dirac_encoder_init </td> <td>(</td> <td class="paramtype">const <a class="el" href="a00040.html">dirac_encoder_context_t</a> * </td> <td class="paramname"> <em>enc_ctx</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"> <em>verbose</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td><td width="100%"></td> </tr> </table> </div> <div class="memdoc"> <p> Initialise encoder. Makes a copy of the enc_ctx passed to it. <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>enc_ctx</em> </td><td>Parameters to initialise encoder context </td></tr> <tr><td valign="top"></td><td valign="top"><em>verbose</em> </td><td>boolean flag to set verbose output </td></tr> </table> </dl> <dl class="return" compact><dt><b>Returns:</b></dt><dd>encoder Handle to encoder if successful or NULL on failure </dd></dl> </div> </div><p> <a class="anchor" name="bec8d7f0c177114a47910bedf807ea8e"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_load" ref="bec8d7f0c177114a47910bedf807ea8e" args="(dirac_encoder_t *encoder, unsigned char *uncdata, int uncdata_size)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">DllExport int dirac_encoder_load </td> <td>(</td> <td class="paramtype"><a class="el" href="a00041.html">dirac_encoder_t</a> * </td> <td class="paramname"> <em>encoder</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">unsigned char * </td> <td class="paramname"> <em>uncdata</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"> <em>uncdata_size</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td><td width="100%"></td> </tr> </table> </div> <div class="memdoc"> <p> Load uncompressed data into the encoder. Expects one full frame of data <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>encoder</em> </td><td>Encoder Handle </td></tr> <tr><td valign="top"></td><td valign="top"><em>uncdata</em> </td><td>Uncompressed data buffer </td></tr> <tr><td valign="top"></td><td valign="top"><em>uncdata_size</em> </td><td>boolean flag to set verbose output </td></tr> </table> </dl> <dl class="return" compact><dt><b>Returns:</b></dt><dd>return status. >0 - successful; -1 failed Failure may be due to input data size not matching the required frame size. </dd></dl> </div> </div><p> <a class="anchor" name="2e7991c68ecf07b21eba6c06bd8fa43c"></a><!-- doxytag: member="dirac_encoder.h::dirac_encoder_output" ref="2e7991c68ecf07b21eba6c06bd8fa43c" args="(dirac_encoder_t *encoder)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">DllExport <a class="el" href="a00177.html#5fc325d503a9b28131076aa3f8ebb306">dirac_encoder_state_t</a> dirac_encoder_output </td> <td>(</td> <td class="paramtype"><a class="el" href="a00041.html">dirac_encoder_t</a> * </td> <td class="paramname"> <em>encoder</em> </td> <td> ) </td> <td width="100%"></td> </tr> </table> </div> <div class="memdoc"> <p> Retrieve an encoded frame from the encoder. Returns the state of the encoder. The encoder buffer enc_buf in the encodermust be set up with the buffer and buffer_size that will hold the encoded frame <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>encoder</em> </td><td>Encoder Handle </td></tr> </table> </dl> <dl class="return" compact><dt><b>Returns:</b></dt><dd>ENC_STATE_INVALID - unrecoverable error ENC_STATE_BUFFER - load data into encoder ENC_STATE_AVAIL - Encoded frame available </dd></dl> </div> </div><p> <hr> <p align="center"><small> © 2004 British Broadcasting Corporation. Dirac code licensed under the <a href="http://www.mozilla.org/MPL/">Mozilla Public License (MPL) Version 1.1</a>.<br> HTML documentation generated by Dimitri van Heesch's excellent <a href="http://www.doxygen.org">Doxygen</a> tool. </small></p> </body> </html>