/* ***** BEGIN LICENSE BLOCK ***** * * $Id: dirac_encoder.h,v 1.12 2007/03/21 11:05:43 tjdwave Exp $ $Name: Dirac_0_7_0 $ * * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for * the specific language governing rights and limitations under the License. * * The Original Code is BBC Research and Development code. * * The Initial Developer of the Original Code is the British Broadcasting * Corporation. * Portions created by the Initial Developer are Copyright (C) 2004. * All Rights Reserved. * * Contributor(s): Anuradha Suraparaju (Original Author) * Andrew Kennedy, * Thomas Davies * Myo Tun (Brunel University, myo.tun@brunel.ac.uk) * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser * Public License Version 2.1 (the "LGPL"), in which case the provisions of * the GPL or the LGPL are applicable instead of those above. If you wish to * allow use of your version of this file only under the terms of the either * the GPL or LGPL and not to allow others to use your version of this file * under the MPL, indicate your decision by deleting the provisions above * and replace them with the notice and other provisions required by the GPL * or LGPL. If you do not delete the provisions above, a recipient may use * your version of this file under the terms of any one of the MPL, the GPL * or the LGPL. * ***** END LICENSE BLOCK ***** */ #ifndef DIRAC_ENCODER_H #define DIRAC_ENCODER_H #include /*! \file \brief C interface to Dirac Encoder. 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. \verbatim #include #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); \endverbatim */ #ifdef __cplusplus extern "C" { #endif /*! Enumerated type that defines encoder state */ typedef enum { ENC_STATE_INVALID = -1, ENC_STATE_BUFFER, ENC_STATE_AVAIL } dirac_encoder_state_t ; /*! Enumerated type that defines encoder presets that set the encoder and sequence paramters. More presets may be added in future*/ typedef VideoFormat dirac_encoder_presets_t; /*! Enumerated type that defined motion vector precisions supported by the encoder. More mv precisions may be added in future.*/ typedef MVPrecisionType dirac_mvprecision_t; /*! Structure that holds the encoder specific parameters */ typedef struct { /*! Quality factor */ int lossless; /*! Quality factor */ float qf; /*! The separation between L1 frames */ int L1_sep; /*! The number of L1 frames before the next intra frame. Together with L1_sep determines the GOP structure. */ int num_L1; /*! Normalised viewing distance parameter, in cycles per degree */ float cpd; /*! The width of blocks used for motion compensation */ int xblen; /*! The height of blocks used for motion compensation */ int yblen; /*! The horizontal separation between blocks. Always 0 - successful; -1 failed Failure may be due to input data size not matching the required frame size. */ extern DllExport int dirac_encoder_load (dirac_encoder_t *encoder, unsigned char *uncdata, int uncdata_size); /*! 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 \param encoder Encoder Handle \return ENC_STATE_INVALID - unrecoverable error ENC_STATE_BUFFER - load data into encoder ENC_STATE_AVAIL - Encoded frame available */ extern DllExport dirac_encoder_state_t dirac_encoder_output (dirac_encoder_t *encoder); /*! 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. \param encoder Encoder Handle \return return status. >=0 - successful; -1 failed */ extern DllExport int dirac_encoder_end_sequence (dirac_encoder_t *encoder); /*! Free resources held by encoder \param encoder Encoder Handle */ extern DllExport void dirac_encoder_close (dirac_encoder_t *encoder); #endif #ifdef __cplusplus } #endif