--- xvid.h 2002/11/16 23:38:16 1.23
+++ xvid.h 2003/03/25 10:57:02 1.27.2.11
@@ -5,8 +5,8 @@
*
* This file is part of XviD, a free MPEG-4 video encoder/decoder
*
- * XviD is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
@@ -19,805 +19,650 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Under section 8 of the GNU General Public License, the copyright
- * holders of XVID explicitly forbid distribution in the following
- * countries:
+ * $Id: xvid.h,v 1.27.2.11 2003/03/25 10:57:02 suxen_drol Exp $
*
- * - Japan
- * - United States of America
- *
- * Linking XviD statically or dynamically with other modules is making a
- * combined work based on XviD. Thus, the terms and conditions of the
- * GNU General Public License cover the whole combination.
- *
- * As a special exception, the copyright holders of XviD give you
- * permission to link XviD with independent modules that communicate with
- * XviD solely through the VFW1.1 and DShow interfaces, regardless of the
- * license terms of these independent modules, and to copy and distribute
- * the resulting combined work under terms of your choice, provided that
- * every copy of the combined work is accompanied by a complete copy of
- * the source code of XviD (the version of XviD used to produce the
- * combined work), being distributed under the terms of the GNU General
- * Public License plus this exception. An independent module is a module
- * which is not derived from or based on XviD.
- *
- * Note that people who make modified versions of XviD are not obligated
- * to grant this special exception for their modified versions; it is
- * their choice whether to do so. The GNU General Public License gives
- * permission to release a modified version without this exception; this
- * exception also makes it possible to release a modified version which
- * carries forward this exception.
- *
- * $Id: xvid.h,v 1.23 2002/11/16 23:38:16 edgomez Exp $
- *
- *****************************************************************************/
+ ****************************************************************************/
#ifndef _XVID_H_
#define _XVID_H_
+
#ifdef __cplusplus
extern "C" {
#endif
+/*****************************************************************************
+ * versioning
+ ****************************************************************************/
+
+/* versioning
+ version takes the form "$major.$minor.$patch"
+ $patch is incremented when there is no api change
+ $minor is incremented when the api is changed, but remains backwards compatible
+ $major is incremented when the api is changed significantly
-/**
- * \defgroup global_grp Global constants used in both encoder and decoder.
+ when initialising an xvid structure, you must always zero it, and set the version field.
+ memset(&struct,0,sizeof(struct));
+ struct.version = XVID_VERSION;
+
+ XVID_UNSTABLE is defined only during development.
+ */
+
+#define XVID_MAKE_VERSION(a,b,c) ( (((a)&0xff)<<16) | (((b)&0xff)<<8) | ((c)&0xff) )
+#define XVID_MAJOR(a) ( ((a)>>16) & 0xff )
+#define XVID_MINOR(b) ((char)( ((b)>>8) & 0xff ))
+#define XVID_PATCH(c) ( (c) & 0xff )
+
+#define XVID_VERSION XVID_MAKE_VERSION(1,-127,0)
+#define XVID_UNSTABLE
+
+/* Bitstream Version
+ * this will be writen into the bitstream to allow easy detection of xvid
+ * encoder bugs in the decoder, without this it might not possible to
+ * automatically distinquish between a file which has been encoded with an
+ * old & buggy XVID from a file which has been encoded with a bugfree version
+ * see the infamous interlacing bug ...
*
- * This module describe all constants used in both the encoder and the decoder.
- * @{
+ * this MUST be increased if an encoder bug is fixed, increasing it too often
+ * doesnt hurt but not increasing it could cause difficulty for decoders in the
+ * future
*/
+#define XVID_BS_VERSION "0009"
+
/*****************************************************************************
- * API version number
+ * error codes
****************************************************************************/
-/**
- * \defgroup api_grp API version
- * @{
- */
+ /* all functions return values <0 indicate error */
-#define API_VERSION ((2 << 16) | (1))/**< This constant tells you what XviD's
- * version this header defines.
- *
- * You can use it to check if the host XviD library API is the same as the one
- * you used to build you client program. If versions mismatch, then it is
- * highly possible that your application will segfault because the host XviD
- * library and your application use different structures.
- *
- */
+#define XVID_ERR_FAIL -1 /* general fault */
+#define XVID_ERR_MEMORY -2 /* memory allocation error */
+#define XVID_ERR_FORMAT -3 /* file format error */
+#define XVID_ERR_VERSION -4 /* structure version not supported */
+#define XVID_ERR_END -5 /* encoder only; end of stream reached */
-/** @} */
/*****************************************************************************
- * Error codes
+ * xvid_image_t
****************************************************************************/
+/* colorspace values */
-/**
- * \defgroup error_grp Error codes returned by XviD API entry points.
- * @{
- */
+#define XVID_CSP_USER 0 /* 4:2:0 planar */
+#define XVID_CSP_I420 1 /* 4:2:0 packed(planar win32) */
+#define XVID_CSP_YV12 2 /* 4:2:0 packed(planar win32) */
+#define XVID_CSP_YUY2 3 /* 4:2:2 packed */
+#define XVID_CSP_UYVY 4 /* 4:2:2 packed */
+#define XVID_CSP_YVYU 5 /* 4:2:2 packed */
+#define XVID_CSP_BGRA 6 /* 32-bit bgra packed */
+#define XVID_CSP_ABGR 7 /* 32-bit abgr packed */
+#define XVID_CSP_RGBA 8 /* 32-bit rgba packed */
+#define XVID_CSP_BGR 9 /* 32-bit bgr packed */
+#define XVID_CSP_RGB555 10 /* 16-bit rgb555 packed */
+#define XVID_CSP_RGB565 11 /* 16-bit rgb565 packed */
+#define XVID_CSP_SLICE 12 /* decoder only: 4:2:0 planar, per slice rendering */
+#define XVID_CSP_INTERNAL 13 /* decoder only: 4:2:0 planar, returns ptrs to internal buffers */
+#define XVID_CSP_NULL 14 /* decoder only: dont output anything */
+#define XVID_CSP_VFLIP 0x80000000 /* vertical flip mask */
-#define XVID_ERR_FAIL -1 /**< Operation failed.
- *
- * The requested XviD operation failed. If this error code is returned from :
- *
- * - the xvid_init function : you must not try to use an XviD's instance from
- * this point of the code. Clean all instances you
- * already created and exit the program cleanly.
- *
- xvid_encore or xvid_decore : something was wrong and en/decoding
- * operation was not completed sucessfully.
- * you can stop the en/decoding process or just
- * ignore and go on.
- *
- xvid_stop : you can safely ignore it if you call this function at the
- * end of your program.
- *
- */
+/* xvid_image_t
+ for non-planar colorspaces use only plane[0] and stride[0]
+ four plane reserved for alpha*/
+typedef struct {
+ int csp; /* [in] colorspace; or with XVID_CSP_VFLIP to perform vertical flip */
+ void * plane[4]; /* [in] image plane ptrs */
+ int stride[4]; /* [in] image stride; "bytes per row"*/
+} xvid_image_t;
-#define XVID_ERR_OK 0 /**< Operation succeed.
- *
- * The requested XviD operation succeed, you can continue to use XviD's
- * functions.
- */
-#define XVID_ERR_MEMORY 1 /**< Operation failed.
- *
- * Insufficent memory was available on the host system.
- */
+/* aspect ratios */
+#define XVID_PAR_11_VGA 1 /* 1:1 vga (square) */
+#define XVID_PAR_43_PAL 2 /* 4:3 pal (12:11 625-line) */
+#define XVID_PAR_43_NTSC 3 /* 4:3 ntsc (10:11 525-line) */
+#define XVID_PAR_169_PAL 4 /* 16:9 pal (16:11 625-line) */
+#define XVID_PAR_169_NTSC 5 /* 16:9 ntsc (40:33 525-line) */
+#define XVID_PAR_EXT 15 /* extended par; use par_width, par_height */
+
+/* frame type flags */
+#define XVID_TYPE_VOL -1 /* decoder only: vol was decoded */
+#define XVID_TYPE_NOTHING 0 /* decoder only (encoder stats): nothing was decoded/encoded */
+#define XVID_TYPE_AUTO 0 /* encoder: automatically determine coding type */
+#define XVID_TYPE_IVOP 1 /* intra frame */
+#define XVID_TYPE_PVOP 2 /* predicted frame */
+#define XVID_TYPE_BVOP 3 /* bidirectionally encoded */
+#define XVID_TYPE_SVOP 4 /* predicted+sprite frame */
+
+/*****************************************************************************
+ * xvid_global()
+ ****************************************************************************/
+
+/* cpu_flags definitions */
+
+#define XVID_CPU_FORCE 0x80000000 /* force passed cpu flags */
+#define XVID_CPU_ASM 0x00000080 /* native assembly */
+/* ARCH_IS_IA32 */
+#define XVID_CPU_MMX 0x00000001 /* mmx : pentiumMMX,k6 */
+#define XVID_CPU_MMXEXT 0x00000002 /* mmx-ext : pentium2, athlon */
+#define XVID_CPU_SSE 0x00000004 /* sse : pentium3, athlonXP */
+#define XVID_CPU_SSE2 0x00000008 /* sse2 : pentium4, athlon64 */
+#define XVID_CPU_3DNOW 0x00000010 /* 3dnow : k6-2 */
+#define XVID_CPU_3DNOWEXT 0x00000020 /* 3dnow-ext: athlon */
+#define XVID_CPU_TSC 0x00000040 /* timestamp counter */
+/* ARCH_IS_PPC */
+#define XVID_CPU_ALTIVEC 0x00000001 /* altivec */
-#define XVID_ERR_FORMAT 2 /**< Operation failed.
- *
- * The format of the parameters or input stream were incorrect.
- */
-/** @} */
+/* XVID_GBL_INIT param1 */
+typedef struct {
+ int version;
+ int cpu_flags; /* [in:opt] zero = autodetect cpu
+ XVID_CPU_FORCE|{cpu features} = force cpu features */
+} xvid_gbl_init_t;
+
+
+/* XVID_GBL_INFO param1 */
+typedef struct {
+ int version;
+ int actual_version; /* [out] returns the actual xvidcore version */
+ const char * build; /* [out] if !null, points to description of this xvid core build */
+ int cpu_flags; /* [out] detected cpu features */
+ int num_threads; /* [out] detected number of cpus/threads */
+} xvid_gbl_info_t;
+
+
+/* XVID_GBL_CONVERT param1 */
+typedef struct {
+ int version;
+ xvid_image_t input; /* [in] input image & colorspace */
+ xvid_image_t output; /* [in] output image & colorspace */
+ int width; /* [in] width */
+ int height; /* [in] height */
+ int interlacing; /* [in] interlacing */
+} xvid_gbl_convert_t;
+
+
+#define XVID_GBL_INIT 0 /* initialize xvidcore; must be called before using xvid_decore, or xvid_encore) */
+#define XVID_GBL_INFO 1 /* return some info about xvidcore, and the host computer */
+#define XVID_GBL_CONVERT 2 /* colorspace conversion utility */
+#define XVID_GBL_TEST 3 /* testing.. */
+
+int xvid_global(void *handle, int opt, void *param1, void *param2);
/*****************************************************************************
- * Color space constants
+ * xvid_decore()
****************************************************************************/
+#define XVID_DEC_CREATE 0 /* create decore instance; return 0 on success */
+#define XVID_DEC_DESTROY 1 /* destroy decore instance: return 0 on success */
+#define XVID_DEC_DECODE 2 /* decode a frame: returns number of bytes consumed >= 0 */
-/**
- * \defgroup csp_grp Colorspaces constants.
- * @{
- */
+int xvid_decore(void *handle, int opt, void *param1, void *param2);
+
+/* XVID_DEC_CREATE param 1
+ image width & height may be specified here when the dimensions are
+ known in advance. */
+typedef struct {
+ int version;
+ int width; /* [in:opt] image width */
+ int height; /* [in:opt] image width */
+ void * handle; /* [out] decore context handle */
+} xvid_dec_create_t;
-#define XVID_CSP_RGB24 0 /**< 24-bit RGB colorspace (b,g,r packed) */
-#define XVID_CSP_YV12 1 /**< YV12 colorspace (y,v,u planar) */
-#define XVID_CSP_YUY2 2 /**< YUY2 colorspace (y,u,y,v packed) */
-#define XVID_CSP_UYVY 3 /**< UYVY colorspace (u,y,v,y packed) */
-#define XVID_CSP_I420 4 /**< I420 colorsapce (y,u,v planar) */
-#define XVID_CSP_RGB555 10 /**< 16-bit RGB555 colorspace */
-#define XVID_CSP_RGB565 11 /**< 16-bit RGB565 colorspace */
-#define XVID_CSP_USER 12 /**< user colorspace format, where the image buffer points
- * to a DEC_PICTURE (y,u,v planar) structure.
- *
- * For encoding, image is read from the DEC_PICTURE
- * parameter values. For decoding, the DEC_PICTURE
- * parameters are set, pointing to the internal XviD
- * image buffer. */
-#define XVID_CSP_EXTERN 1004 /**< Special colorspace used for slice rendering
- *
- * The application provides an external buffer to XviD.
- * This way, XviD works directly into the final rendering
- * buffer, no need to specify this is a speed boost feature.
- * This feature is only used by mplayer at the moment, refer
- * to mplayer code to see how it can be used. */
-#define XVID_CSP_YVYU 1002 /**< YVYU colorspace (y,v,y,u packed) */
-#define XVID_CSP_RGB32 1000 /**< 32-bit RGB colorspace (b,g,r,a packed) */
-#define XVID_CSP_NULL 9999 /**< NULL colorspace; no conversion is performed */
-#define XVID_CSP_VFLIP 0x80000000 /**< (flag) Flip frame vertically during conversion */
+/* XVID_DEC_DECODE param1 */
+/* general flags */
+#define XVID_LOWDELAY 0x00000001 /* lowdelay mode */
+#define XVID_DISCONTINUITY 0x00000002 /* indicates break in stream */
-/** @} */
+typedef struct {
+ int version;
+ int general; /* [in:opt] general flags */
+ void *bitstream; /* [in] bitstream (read from)*/
+ int length; /* [in] bitstream length */
+ xvid_image_t output; /* [in] output image (written to) */
+}
+xvid_dec_frame_t;
-/** @} */
-/**
- * \defgroup init_grp Initialization constants, structures and functions.
- *
- * This section describes all the constants, structures and functions used to
- * initialize the XviD core library
- *
- * @{
- */
+/* XVID_DEC_DECODE param2 :: optional */
+typedef struct
+{
+ int version;
+ int type; /* [out] output data type */
+ union {
+ struct { /* type>0 {XVID_TYPE_IVOP,XVID_TYPE_PVOP,XVID_TYPE_BVOP,XVID_TYPE_SVOP} */
+ int general; /* [out] flags */
+ int time_base; /* [out] time base */
+ int time_increment; /* [out] time increment */
+
+ /* XXX: external deblocking stuff */
+ int * qscale; /* [out] pointer to quantizer table */
+ int qscale_stride; /* [out] quantizer scale stride */
+
+ } vop;
+ struct { /* XVID_TYPE_VOL */
+ int general; /* [out] flags */
+ int width; /* [out] width */
+ int height; /* [out] height */
+ int par; /* [out] picture aspect ratio (refer to XVID_PAR_xxx above) */
+ int par_width; /* [out] aspect ratio width */
+ int par_height; /* [out] aspect ratio height */
+ } vol;
+ } data;
+} xvid_dec_stats_t;
/*****************************************************************************
- * CPU flags
+ xvid plugin system -- internals
+
+ xvidcore will call XVID_PLG_INFO and XVID_PLG_CREATE during XVID_ENC_CREATE
+ before encoding each frame xvidcore will call XVID_PLG_BEFORE
+ after encoding each frame xvidcore will call XVID_PLG_AFTER
+ xvidcore will call XVID_PLG_DESTROY during XVID_ENC_DESTROY
****************************************************************************/
+#define XVID_PLG_CREATE 0
+#define XVID_PLG_DESTROY 1
+#define XVID_PLG_INFO 2
+#define XVID_PLG_BEFORE 3
+#define XVID_PLG_AFTER 4
-/**
- * \defgroup cpu_grp Flags for XVID_INIT_PARAM.cpu_flags.
- *
- * This section describes all constants that show host cpu available features,
- * and allow a client application to force usage of some cpu instructions sets.
- * @{
- */
+/* xvid_plg_info_t.flags */
+#define XVID_REQORIGINAL 1 /* plugin requires a copy of the original (uncompressed) image */
+#define XVID_REQPSNR 2 /* plugin requires psnr between the uncompressed and compressed image*/
+#define XVID_REQDQUANTS 3 /* plugin requires access to the dquant table */
-/**
- * \defgroup x86_grp x86 specific cpu flags
- * @{
- */
+typedef struct
+{
+ int version;
+ int flags; /* plugin flags */
+} xvid_plg_info_t;
-#define XVID_CPU_MMX 0x00000001 /**< use/has MMX instruction set */
-#define XVID_CPU_MMXEXT 0x00000002 /**< use/has MMX-ext (pentium3) instruction set */
-#define XVID_CPU_SSE 0x00000004 /**< use/has SSE (pentium3) instruction set */
-#define XVID_CPU_SSE2 0x00000008 /**< use/has SSE2 (pentium4) instruction set */
-#define XVID_CPU_3DNOW 0x00000010 /**< use/has 3dNOW (k6-2) instruction set */
-#define XVID_CPU_3DNOWEXT 0x00000020 /**< use/has 3dNOW-ext (athlon) instruction set */
-#define XVID_CPU_TSC 0x00000040 /**< has TimeStampCounter instruction */
-
-/** @} */
-
-/**
- * \defgroup ia64_grp ia64 specific cpu flags.
- * @{
- */
-#define XVID_CPU_IA64 0x00000080 /**< Forces ia64 optimized code usage
- *
- * This flags allow client applications to force IA64 optimized functions.
- * This feature is considered exeperimental and should be treated as is.
- */
+typedef struct
+{
+ int version;
-/** @} */
+ int width;
+ int height;
+ int mb_width;
+ int mb_height;
+ int fincr;
+ int fbase;
-/**
- * \defgroup iniflags_grp Initialization commands.
- *
- * @{
- */
+ void * param;
+} xvid_plg_create_t;
-#define XVID_CPU_CHKONLY 0x40000000 /**< Check cpu features
- *
- * When this flag is set, the xvid_init function performs just a cpu feature
- * checking and then fills the cpu field. This flag is usefull when client
- * applications want to know what instruction sets the host cpu supports.
- */
-#define XVID_CPU_FORCE 0x80000000 /**< Force input flags to be used
- *
- * When this flag is set, client application forces XviD to use other flags
- * set in cpu_flags. \b Use this at your own risk.
- */
+typedef struct
+{
+ int version;
-/** @} */
+ int num_frames; /* [out] totlal frame encoded */
+} xvid_plg_destroy_t;
-/** @} */
-/*****************************************************************************
- * Initialization structures
- ****************************************************************************/
+typedef struct
+{
+ int version;
-/** Structure used in xvid_init function. */
- typedef struct
- {
- int cpu_flags; /**< [in/out]
- *
- * Filled with desired[in] or available[out]
- * cpu instruction sets.
- */
- int api_version; /**< [out]
- *
- * xvid_init will initialize this field with
- * the API_VERSION used in this XviD core
- * library
- */
- int core_build; /**< [out]
- * \todo Unused.
- */
- }
- XVID_INIT_PARAM;
+ int width; /* [out] */
+ int height; /* [out] */
+ int mb_width; /* [out] */
+ int mb_height; /* [out] */
+ int fincr; /* [out] */
+ int fbase; /* [out] */
+
+ xvid_image_t reference; /* [out] -> [out] */
+ xvid_image_t current; /* [out] -> [in,out] */
+ xvid_image_t original; /* [out] after: points the original (uncompressed) copy of the current frame */
+ int frame_num; /* [out] frame number */
-/*****************************************************************************
- * Initialization entry point
- ****************************************************************************/
+ int type; /* [in,out] */
+ int quant; /* [in,out] */
-/**
- * \defgroup inientry_grp Initialization entry point.
- * @{
- */
+ int * dquant; /* [in,out] pointer to diff quantizer table */
+ int dquant_stride; /* [in,out] diff quantizer stride */
-/**
- * \brief Initialization entry point.
- *
- * This is the XviD's initialization entry point, it is only used to initialize
- * the XviD internal data (function pointers, vector length code tables,
- * rgb2yuv lookup tables).
- *
- * \param handle Reserved for future use.
- * \param opt Reserved for future use (set it to 0).
- * \param param1 Used to pass an XVID_INIT_PARAM parameter.
- * \param param2 Reserved for future use.
- */
- int xvid_init(void *handle,
- int opt,
- void *param1,
- void *param2);
+ int vop_flags; /* [in,out] */
+ int vol_flags; /* [in,out] */
+ int motion_flags; /* [in,out] */
-/** @} */
+ int length; /* [out] after: length of encoded frame */
+ int kblks, mblks, ublks; /* [out] after: */
+ int sse_y, sse_u, sse_v; /* [out] */
+} xvid_plg_data_t;
-/** @} */
/*****************************************************************************
- * Decoder constant
+ xvid plugin system -- external
+
+ the application passes xvid an array of "xvid_plugin_t" at XVID_ENC_CREATE. the array
+ indicates the plugin function pointer and plugin-specific data.
+ xvidcore handles the rest. example:
+
+ xvid_enc_create_t create;
+ xvid_enc_plugin_t plugins[2];
+
+ plugins[0].func = xvid_psnr_func;
+ plugins[0].param = NULL;
+ plugins[1].func = xvid_cbr_func;
+ plugins[1].param = &cbr_data;
+
+ create.num_plugins = 2;
+ create.plugins = plugins;
+
****************************************************************************/
-/**
- * \defgroup decoder_grp Decoder related functions and structures.
- *
- * This part describes all the structures/functions from XviD's API needed for
- * decoding a MPEG4 compliant streams.
- * @{
- */
+typedef int (xvid_plugin_func)(void * handle, int opt, void * param1, void * param2);
-/**
- * \defgroup decframe_grp Flags for XVID_DEC_FRAME.general
- *
- * Flags' description for the XVID_DEC_FRAME.general member.
- *
- * @{
- */
+typedef struct
+{
+ xvid_plugin_func * func;
+ void * param;
+} xvid_enc_plugin_t;
-/** Not used at the moment */
-#define XVID_QUICK_DECODE 0x00000010
-/**
- * @}
- */
+xvid_plugin_func xvid_plugin_fixed; /* fixed quantizer control */
+xvid_plugin_func xvid_plugin_cbr; /* constant bitrate control */
+xvid_plugin_func xvid_plugin_2pass1; /* 2pass rate control: first pass */
+xvid_plugin_func xvid_plugin_2pass2; /* 2pass rate control: second pass */
-/*****************************************************************************
- * Decoder structures
- ****************************************************************************/
+xvid_plugin_func xvid_plugin_lumimasking; /* lumimasking */
- typedef struct
- {
- int width;
- int height;
- void *handle;
- }
- XVID_DEC_PARAM;
-
-
- typedef struct
- {
- int general;
- void *bitstream;
- int length;
-
- void *image;
- int stride;
- int colorspace;
- }
- XVID_DEC_FRAME;
-
-
- // This struct is used for per slice rendering
- typedef struct
- {
- void *y,*u,*v;
- int stride_y, stride_u,stride_v;
- } XVID_DEC_PICTURE;
+xvid_plugin_func xvid_plugin_psnr; /* write psnr values to stdout */
+xvid_plugin_func xvid_plugin_dump; /* dump before and after yuvpgms */
-/*****************************************************************************
- * Decoder entry point
- ****************************************************************************/
+typedef struct
+{
+ int version;
+ int quant_increment;
+ int quant_base;
+} xvid_plugin_fixed_t;
-/**
- * \defgroup decops_grp Decoder operations
- *
- * These are all the operations XviD's decoder can perform.
- *
- * @{
- */
-#define XVID_DEC_DECODE 0 /**< Decodes a frame
- *
- * This operation constant is used when client application wants to decode a
- * frame. Client application must also fill XVID_DEC_FRAME appropriately.
- */
+typedef struct
+{
+ int version;
+ int bitrate;
+ int max_quantizer;
+ int min_quantizer;
+ int reaction_delay_factor;
+ int averaging_period;
+ int buffer;
+} xvid_plugin_cbr_t;
-#define XVID_DEC_CREATE 1 /**< Creates a decoder instance
- *
- * This operation constant is used by a client application in order to create
- * a decoder instance. Decoder instances are independant from each other, and
- * can be safely threaded.
- */
-#define XVID_DEC_DESTROY 2 /**< Destroys a decoder instance
- *
- * This operation constant is used by the client application to destroy a
- * previously created decoder instance.
- */
+typedef struct {
+ int version;
+ char * filename;
+} xvid_plugin_2pass1_t;
-/**
- * @}
- */
-/**
- * \defgroup decentry_grp Decoder entry point
- *
- * @{
- */
+#define XVID_CURVE_COSINE 0 /* low aggressiveness */
+#define XVID_CURVE_LINEAR 1 /* medium aggressiveness */
+#define XVID_CURVE_SINE 2 /* high aggressiveness */
-/**
- * \brief Decoder entry point.
- *
- * This is the XviD's decoder entry point. The possible operations are
- * described in the \ref decops_grp section.
- *
- * \param handle Decoder instance handle.
- * \param opt Decoder option constant
- * \param param1 Used to pass a XVID_DEC_PARAM or XVID_DEC_FRAME structure
- * \param param2 Reserved for future use.
- */
+#define XVID_PAYBACK_BIAS 0 /* payback with bias */
+#define XVID_PAYBACK_PROP 1 /* payback proportionally */
- int xvid_decore(void *handle,
- int opt,
- void *param1,
- void *param2);
+typedef struct {
+ int version;
+ char * filename1;
+ char * filename2;
-/** @} */
+ int keyframe_boost; /* keyframe boost percentage: [0..100...]; */
+ int payback_method;
+ int bitrate_payback_delay;
+ int curve_compression_high;
+ int curve_compression_low;
+ int max_overflow_improvement;
+ int max_overflow_degradation;
+ int min_quant[3];
+ int max_quant[3];
-/** @} */
+ int use_alt_curve;
+ int alt_curve_high_dist;
+ int alt_curve_low_dist;
+ int alt_curve_use_auto;
+ int alt_curve_auto_str;
+ int alt_curve_type; /* XVID_CURVE_ */
+ int alt_curve_min_rel_qual;
+ int alt_curve_use_auto_bonus_bias;
+ int alt_curve_bonus_bias;
+
+ int kftreshold;
+ int kfreduction;
+ int min_key_interval;
+}xvid_plugin_2pass2_t;
-/**
- * \defgroup encoder_grp Encoder related functions and structures.
- *
- * @{
- */
/*****************************************************************************
- * Encoder constants
+ * xvid_encore()
****************************************************************************/
-/**
- * \defgroup encgenflags_grp Flags for XVID_ENC_FRAME.general
- * @{
- */
+/* Encoder options */
+#define XVID_ENC_CREATE 0 /* create encoder instance; returns 0 on success */
+#define XVID_ENC_DESTROY 1 /* destroy encoder instance; returns 0 on success */
+#define XVID_ENC_ENCODE 2 /* encode a frame: returns number of ouput bytes
+ 0 means this frame should not be written (ie. encoder lag) */
-#define XVID_VALID_FLAGS 0x80000000 /**< Reserved for future use */
+int xvid_encore(void *handle, int opt, void *param1, void *param2);
-#define XVID_CUSTOM_QMATRIX 0x00000004 /**< Use custom quantization matrices
- *
- * This flag forces XviD to use custom matrices passed to encoder in
- * XVID_ENC_FRAME structure (members quant_intra_matrix and quant_inter_matrix) */
-#define XVID_H263QUANT 0x00000010 /**< Use H263 quantization
- *
- * This flag forces XviD to use H263 quantization type */
-#define XVID_MPEGQUANT 0x00000020 /**< Use MPEG4 quantization.
- *
- * This flag forces XviD to use MPEG4 quantization type */
-#define XVID_HALFPEL 0x00000040 /**< Halfpel motion estimation
- *
-* informs xvid to perform a half pixel motion estimation. */
-#define XVID_ADAPTIVEQUANT 0x00000080/**< Adaptive quantization
- *
-* informs xvid to perform an adaptative quantization using a Luminance
-* masking algorithm */
-#define XVID_LUMIMASKING 0x00000100/**< Lumimasking flag
- *
- * \deprecated This flag is no longer used. */
-#define XVID_LATEINTRA 0x00000200/**< Unknown
- *
- * \deprecated This flag is no longer used. */
-#define XVID_INTERLACING 0x00000400/**< MPEG4 interlacing mode.
- *
- * Enables interlacing encoding mode */
-#define XVID_TOPFIELDFIRST 0x00000800/**< Unknown
- *
- * \deprecated This flag is no longer used. */
-#define XVID_ALTERNATESCAN 0x00001000/**<
- *
- * \deprecated This flag is no longer used. */
-#define XVID_HINTEDME_GET 0x00002000/**< Gets Motion vector data from ME system.
- *
-* informs xvid to return Motion Estimation vectors from the ME encoder
-* algorithm. Used during a first pass. */
-#define XVID_HINTEDME_SET 0x00004000/**< Gives Motion vectors hint to ME system.
- *
-* informs xvid to use the user given motion estimation vectors as hints
-* for the encoder ME algorithms. Used during a 2nd pass. */
-#define XVID_INTER4V 0x00008000/**< Inter4V mode.
- *
-* forces XviD to search a vector for each 8x8 block within the 16x16 Macro
-* Block. This mode should be used only if the XVID_HALFPEL mode is activated
-* (this could change in the future). */
-#define XVID_ME_ZERO 0x00010000/**< Unused
- *
-* Do not use this flag (reserved for future use) */
-#define XVID_ME_LOGARITHMIC 0x00020000/**< Unused
- *
-* Do not use this flag (reserved for future use) */
-#define XVID_ME_FULLSEARCH 0x00040000/**< Unused
- *
-* Do not use this flag (reserved for future use) */
-#define XVID_ME_PMVFAST 0x00080000/**< Use PMVfast ME algorithm.
- *
-* Switches XviD ME algorithm to PMVfast */
-#define XVID_ME_EPZS 0x00100000/**< Use EPZS ME algorithm.
- *
-* Switches XviD ME algorithm to EPZS */
-#define XVID_GREYSCALE 0x01000000/**< Discard chroma data.
- *
-* This flags forces XviD to discard chroma data, this is not mpeg4 greyscale
-* mode, it simply drops chroma MBs using cbp == 0 for these blocks */
-#define XVID_GRAYSCALE XVID_GREYSCALE /**< XVID_GREYSCALE alias
- *
-* United States locale support. */
-
-/** @} */
-
-/**
- * \defgroup encmotionflags_grp Flags for XVID_ENC_FRAME.motion
- * @{
- */
-#define PMV_ADVANCEDDIAMOND8 0x00004000/**< Uses advanced diamonds for 8x8 blocks
- *
-* Same as its 16x16 companion option
-*/
-#define PMV_ADVANCEDDIAMOND16 0x00008000/**< Uses advanced diamonds for 16x16 blocks
- *
-* */
-#define PMV_HALFPELDIAMOND16 0x00010000/**< Turns on halfpel precision for 16x16 blocks
- *
-* switches the search algorithm from 1 or 2 full pixels precision to 1 or 2 half pixel precision.
-*/
-#define PMV_HALFPELREFINE16 0x00020000/**< Turns on halfpel refinement step
- *
-* After normal diamond search, an extra halfpel refinement step is performed. Should always be used if
-* XVID_HALFPEL is on, because it gives a rather big increase in quality.
-*/
-#define PMV_EXTSEARCH16 0x00040000/**< Extends search for 16x16 blocks
- *
-* Normal PMVfast predicts one start vector and does diamond search around this position. EXTSEARCH means that 2
-* more start vectors are used: (0,0) and median predictor and diamond search is done for those, too. Makes
-* search slightly slower, but quality sometimes gets better.
-*/
-#define PMV_EARLYSTOP16 0x00080000/**< Dynamic ME thresholding
- *
-* PMVfast and EPZS stop search if current best is below some dynamic threshhold. No diamond search is done,
-* only halfpel refinement (if active). Without EARLYSTOP diamond search is always done. That would be much slower,
-* but not really lead to better quality.
-*/
-#define PMV_QUICKSTOP16 0x00100000/**< Dynamic ME thresholding
- *
-* like EARLYSTOP, but not even halfpel refinement is done. Normally worse quality, so it defaults to
-* off. Might be removed, too.
-*/
-#define PMV_UNRESTRICTED16 0x00200000/**< Not implemented
- *
-* "unrestricted ME" is a feature of MPEG4. It's not implemented, so this flag is ignored (not even
-* checked).
-*/
-#define PMV_OVERLAPPING16 0x00400000/**< Not implemented
- *
-* Same as above
-*/
-#define PMV_USESQUARES16 0x00800000/**< Use square pattern
- *
-* Replace the diamond search with a square search.
-*/
-#define PMV_HALFPELDIAMOND8 0x01000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
-#define PMV_HALFPELREFINE8 0x02000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
-#define PMV_EXTSEARCH8 0x04000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
-#define PMV_EARLYSTOP8 0x08000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
-#define PMV_QUICKSTOP8 0x10000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
-#define PMV_UNRESTRICTED8 0x20000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
-#define PMV_OVERLAPPING8 0x40000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
-#define PMV_USESQUARES8 0x80000000/**< see 16x16 equivalent
- *
-* Same as its 16x16 companion option */
+/* global flags */
+typedef enum
+{
+ XVID_PACKED = 0x00000001, /* packed bitstream */
+ XVID_CLOSED_GOP = 0x00000002, /* closed_gop: was DX50BVOP dx50 bvop compatibility */
+ XVID_EXTRASTATS_ENABLE = 0x00000004
+/*define XVID_VOL_AT_IVOP 0x00000008 write vol at every ivop: WIN32/divx compatibility */
+/*define XVID_FORCE_VOL 0x00000008 XXX: when vol-based parameters are changed, insert an ivop NOT recommended */
+} xvid_global_t;
-/** @} */
-/*****************************************************************************
- * Encoder structures
- ****************************************************************************/
+/* XVID_ENC_ENCODE param1 */
+/* vol-based flags */
+typedef enum {
+ XVID_MPEGQUANT = 0x00000001,
+ XVID_EXTRASTATS = 0x00000002,
+ XVID_QUARTERPEL = 0x00000004, /* enable quarterpel: frames will encoded as quarterpel */
+ XVID_GMC = 0x00000008, /* enable GMC; frames will be checked for gmc suitability */
+ XVID_REDUCED_ENABLE = 0x00000010, /* enable reduced resolution vops: frames will be checked for rrv suitability */
+ XVID_INTERLACING = 0x00000400, /* enable interlaced encoding */
+} xvid_vol_t;
- /** Structure used for encoder instance creation */
- typedef struct
- {
- int width; /**< [in]
- *
- * Input frame width. */
- int height; /**< [in]
- *
- * Input frame height. */
- int fincr; /**< [in]
- *
- * Time increment (fps = increment/base). */
- int fbase; /**< [in]
- *
- * Time base (fps = increment/base). */
- int rc_bitrate; /**< [in]
- *
- * Sets the target bitrate of the encoded stream, in bits/second. **/
- int rc_reaction_delay_factor; /**< [in]
- *
- * Tunes how fast the rate control reacts - lower values are faster. */
- int rc_averaging_period; /**< [in]
- *
- * Tunes how fast the rate control reacts - lower values are faster. */
- int rc_buffer; /**< [in]
- *
- * Tunes how fast the rate control reacts - lower values are faster. */
- int max_quantizer; /**< [in]
- *
- * Sets the upper limit of the quantizer. */
- int min_quantizer; /**< [in]
- *
- * Sets the lower limit of the quantizer. */
- int max_key_interval; /**< [in]
- *
- * Sets the maximum interval between key frames. */
- void *handle; /**< [out]
- *
- * XviD core lib will set this with the creater encoder instance. */
- }
- XVID_ENC_PARAM;
-
- typedef struct
- {
- int x;
- int y;
- }
- VECTOR;
-
- typedef struct
- {
- int mode; /* macroblock mode */
- VECTOR mvs[4];
- }
- MVBLOCKHINT;
-
- typedef struct
- {
- int intra; /* frame intra choice */
- int fcode; /* frame fcode */
- MVBLOCKHINT *block; /* caller-allocated array of block hints (mb_width * mb_height) */
- }
- MVFRAMEHINT;
-
- typedef struct
- {
- int rawhints; /* if set, use MVFRAMEHINT, else use compressed buffer */
-
- MVFRAMEHINT mvhint;
- void *hintstream; /* compressed hint buffer */
- int hintlength; /* length of buffer (bytes) */
- }
- HINTINFO;
-
- /** Structure used to pass a frame to the encoder */
- typedef struct
- {
- int general; /**< [in]
- *
- * Sets general options flag (See \ref encgenflags_grp) */
- int motion; /**< [in]
- *
- * Sets Motion Estimation options */
- void *bitstream; /**< [out]
- *
- * Output MPEG4 bitstream buffer pointer */
- int length; /**< [out]
- *
- * Output MPEG4 bitstream length (bytes) */
- void *image; /**< [in]
- *
- * Input frame */
- int colorspace; /**< [in]
- *
- * input frame colorspace */
- unsigned char *quant_intra_matrix; /**< [in]
- *
- * Custom intra quantization matrix */
- unsigned char *quant_inter_matrix; /**< [in]
- *
- * Custom inter quantization matrix */
- int quant; /**< [in]
- *
- * Frame quantizer :
- *
- * - 0 (zero) : Then the rate controler chooses the right quantizer
- * for you. Typically used in ABR encoding, or first pass of a VBR
- * encoding session.
- *
- != 0 : Then you force the encoder to use this specific
- * quantizer value. It is clamped in the interval
- * [1..31]. Tipically used during the 2nd pass of a VBR encoding
- * session.
- *
*/
- int intra; /**< [in/out]
- *
- *
- * - [in] : tells XviD if the frame must be encoded as an intra frame
- *
- * - 1: forces the encoder to create a keyframe. Mainly used during
- * a VBR 2nd pass.
- *
- 0: forces the encoder not to create a keyframe. Minaly used
- * during a VBR second pass
- *
- -1: let the encoder decide (based on contents and
- * max_key_interval). Mainly used in ABR mode and during a 1st
- * VBR pass.
- *
- * - [out] : When first set to -1, the encoder returns the effective keyframe state
- * of the frame.
- *
- */
- HINTINFO hint; /**< [in/out]
- *
- * mv hint information */
-
- }
- XVID_ENC_FRAME;
-
-
- /** Encoding statistics */
- typedef struct
- {
- int quant; /**< [out]
- *
- * Frame quantizer used during encoding */
- int hlength; /**< [out]
- *
- * Header bytes in the resulting MPEG4 stream */
- int kblks; /**< [out]
- *
- * Number of intra macro blocks */
- int mblks; /**< [out]
- *
- * Number of inter macro blocks */
- int ublks; /**< [out]
- *
- * Number of skipped macro blocks */
- }
- XVID_ENC_STATS;
+/* vop-based flags */
+typedef enum {
+ XVID_DEBUG = 0x00000001,
-/*****************************************************************************
- * Encoder entry point
- ****************************************************************************/
+ XVID_HALFPEL = 0x00000004, /* use halfpel interpolation */
+ XVID_INTER4V = 0x00000008,
+
+ XVID_CHROMAOPT = 0x00000020, /* enable chroma optimization pre-filter */
+ XVID_GREYSCALE = 0x00000040, /* enable greyscale only mode (even for
+ color input material chroma is ignored) */
+ XVID_HQACPRED = 0x00000080, /* 20030209: high quality ac prediction */
+ XVID_MODEDECISION_BITS = 0x00000100, /* enable DCT-ME and use it for mode decision */
+ XVID_DYNAMIC_BFRAMES = 0x00000200,
-/**
- * \defgroup encops_grp Encoder operations
- *
- * These are all the operations XviD's encoder can perform.
- *
- * @{
- */
+ /* only valid for vol_flags|=XVID_INTERLACING */
+ XVID_TOPFIELDFIRST = 0x00000400, /* set top-field-first flag */
+ XVID_ALTERNATESCAN = 0x00000800, /* set alternate vertical scan flag */
-#define XVID_ENC_ENCODE 0 /**< Encodes a frame
- *
- * This operation constant is used when client application wants to encode a
- * frame. Client application must also fill XVID_ENC_FRAME appropriately.
- */
+ /* only valid for vol_flags|=XVID_REDUCED_ENABLED */
+ XVID_REDUCED = 0x00001000, /* reduced resolution vop */
+} xvid_vop_t;
-#define XVID_ENC_CREATE 1 /**< Creates a decoder instance
- *
- * This operation constant is used by a client application in order to create
- * an encoder instance. Encoder instances are independant from each other.
- */
-#define XVID_ENC_DESTROY 2 /**< Destroys a encoder instance
- *
- * This operation constant is used by the client application to destroy a
- * previously created encoder instance.
- */
+typedef enum {
+ PMV_ADVANCEDDIAMOND16 = 0x00008000, /* use advdiamonds instead of diamonds as search pattern */
+ PMV_USESQUARES16 = 0x00800000, /* use squares instead of diamonds as search pattern */
+ PMV_HALFPELREFINE16 = 0x00020000,
+ PMV_HALFPELREFINE8 = 0x02000000,
-/** @} */
+ PMV_QUARTERPELREFINE16 = 0x00040000,
+ PMV_QUARTERPELREFINE8 = 0x04000000,
-/**
- * \defgroup encentry_grp Encoder entry point
- *
- * @{
- */
+ PMV_EXTSEARCH16 = 0x00080000, /* extend PMV by more searches */
-/**
- * \brief Encoder entry point.
- *
- * This is the XviD's encoder entry point. The possible operations are
- * described in the \ref encops_grp section.
- *
- * \param handle Encoder instance handle
- * \param opt Encoder option constant
- * \param param1 Used to pass XVID_ENC_PARAM or XVID_ENC_FRAME structures.
- * \param param2 Optionally used to pass the XVID_ENC_STATS structure.
- */
- int xvid_encore(void *handle,
- int opt,
- void *param1,
- void *param2);
+ PMV_EXTSEARCH8 = 0x08000000, /* use diamond/square for extended 8x8 search */
+ PMV_ADVANCEDDIAMOND8 = 0x00004000, /* use advdiamond for PMV_EXTSEARCH8 */
+ PMV_USESQUARES8 = 0x80000000, /* use square for PMV_EXTSEARCH8 */
+
+ PMV_CHROMA16 = 0x00100000, /* also use chroma for P_VOP/S_VOP ME */
+ PMV_CHROMA8 = 0x10000000, /* also use chroma for B_VOP ME */
+
+ /* Motion search using DCT. use XVID_MODEDECISION_BITS to enable */
+ HALFPELREFINE16_BITS = 0x00000100, /* perform DCT-based halfpel refinement */
+ HALFPELREFINE8_BITS = 0x00000200, /* perform DCT-based halfpel refinement for 8x8 mode */
+ QUARTERPELREFINE16_BITS = 0x00000400, /* perform DCT-based qpel refinement */
+ QUARTERPELREFINE8_BITS = 0x00000800, /* perform DCT-based qpel refinement for 8x8 mode */
+
+ EXTSEARCH_BITS = 0x00001000, /* perform DCT-based search using square pattern
+ enable PMV_EXTSEARCH8 to do this in 8x8 search as well */
+ CHECKPREDICTION_BITS = 0x00002000, /* always check vector equal to prediction */
+
+ PMV_UNRESTRICTED16 = 0x00200000, /* unrestricted ME, not implemented */
+ PMV_OVERLAPPING16 = 0x00400000, /* overlapping ME, not implemented */
+ PMV_UNRESTRICTED8 = 0x20000000, /* unrestricted ME, not implemented */
+ PMV_OVERLAPPING8 = 0x40000000 /* overlapping ME, not implemented */
+} xvid_motion_t;
+
+
+/* XVID_ENC_CREATE param1 */
+typedef struct {
+ int version;
+ int width; /* [in] frame dimensions; width, pixel units */
+ int height; /* [in] frame dimensions; height, pixel units */
+
+ int num_plugins; /* [in:opt] number of plugins */
+ xvid_enc_plugin_t * plugins; /* ^^ plugin array */
+
+ int num_threads; /* [in:opt] number of threads */
+ int max_bframes; /* [in:opt] max sequential bframes (0=disable bframes) */
+
+ xvid_global_t global; /* [in:opt] global flags; controls encoding behavior */
+
+/* --- vol-based stuff; included here for conveinience */
+ int fincr; /* [in:opt] framerate increment; set to zero for variable framerate */
+ int fbase; /* [in] framerate base
+ frame_duration = fincr/fbase seconds*/
+/* ^^^---------------------------------------------- */
+
+
+/* ---vop-based; included here for conveienience */
+ int max_key_interval; /* [in:opt] the maximum interval between key frames */
+ /*XXX: maybe call it gop_size? */
+
+ int frame_drop_ratio; /* [in:opt] frame dropping: 0=drop none... 100=drop all */
-/** @} */
+ int bquant_ratio; /* [in:opt] bframe quantizer multipier/offeset; used to decide bframes quant when bquant==-1 */
+ int bquant_offset; /* bquant = (avg(past_ref_quant,future_ref_quant)*bquant_ratio + bquant_offset) / 100 */
-/** @} */
+/* ^^^ -------------------------------------------------------------------------*/
+
+ void *handle; /* [out] encoder instance handle */
+}
+xvid_enc_create_t;
+
+
+typedef struct {
+ int version;
+ int type; /* [in] rate control type: XVID_RC_xxx */
+
+ /* common stuff */
+ int min_iquant; /* [in:opt] ivop quantizer upper/lower limit */
+ int max_iquant; /* [in:opt] */
+ int min_pquant; /* [in:opt] psvop quantizer upper/lower limit */
+ int max_pquant; /* [in:opt] */
+ int min_bquant; /* [in:opt] bvop quantizer upper/lower limit */
+ int max_bquant; /* [in:opt] */
+
+ union {
+ struct { /* XVID_RC_FQUANT */
+ float quant; /* [in] quantizer */
+ } fquant;
+ struct { /* XVID_RC_CBR */
+ int bitrate; /* [in] the bitrate of the target encoded stream, in bits/second */
+ int reaction_delay_factor; /* [in] how fast the rate control reacts - lower values are faster */
+ int averaging_period; /* [in] */
+ int buffer; /* [in] */
+ } cbr;
+ } data;
+} xvid_enc_rc_t;
+
+
+
+#define XVID_KEYFRAME 0x00000001
+
+typedef struct {
+ int version;
+
+/* --- VOL related stuff; unless XVID_FORCEVOL is set, the encoder will not react to any
+ changes here until the next VOL (keyframe). */
+ xvid_vol_t vol_flags; /* [in] vol flags */
+ unsigned char *
+ quant_intra_matrix; /* [in:opt] custom intra qmatrix */
+ unsigned char *
+ quant_inter_matrix; /* [in:opt] custom inter qmatrix */
+
+ int par; /* [in:opt] picture aspect ratio (refer to XVID_PAR_xxx above) */
+ int par_width; /* [in:opt] aspect ratio width */
+ int par_height; /* [in:opt] aspect ratio height */
+/* ^^^----------------------------------------------------------------------------------*/
+
+ int fincr; /* framerate increment, for variable framerate only */
+ xvid_vop_t vop_flags; /* [in] (general)vop-based flags */
+ xvid_motion_t motion; /* [in] ME options */
+
+ xvid_image_t input; /* [in] input image (read from) */
+
+ int type; /* [in:opt] coding type */
+ int quant; /* [in] frame quantizer; if <=0, automatatic (ratecontrol) */
+
+ void *bitstream; /* [in:opt] bitstream ptr (written to)*/
+ int length; /* [in:opt] bitstream length (bytes) */
+
+ int out_flags; /* [out] bitstream output flags */
+}
+xvid_enc_frame_t;
+
+
+/* XVID_ENC_ENCODE param2 (optional)
+ xvid_enc_stats_t describes individual frame details
+
+ coding_type==XVID_TYPE_NOTHING if the stats are not given
+*/
+typedef struct {
+ int version;
+
+ /* encoding parameters */
+ int type; /* [out] coding type */
+ int quant; /* [out] frame quantizer */
+ xvid_vol_t vol_flags; /* [out] vol flags (see above) */
+ int vop_flags; /* [out] vop flags (see above) */
+ /* bitrate */
+ int length; /* [out] frame length */
+
+ int hlength; /* [out] header length (bytes) */
+ int kblks, mblks, ublks; /* [out] */
+
+ int sse_y, sse_u, sse_v;
+}
+xvid_enc_stats_t;
#ifdef __cplusplus
}
#endif
+
#endif