High quality video MPEG4 en/decoder XvidCore 1.3.4

Headers, Bindings, Libraries for use with FreeBASIC, Please include example of use to help ensure they are tested and usable.
Post Reply
D.J.Peters
Posts: 8631
Joined: May 28, 2005 3:28
Contact:

High quality video MPEG4 en/decoder XvidCore 1.3.4

Post by D.J.Peters »

xvid is an high quality opensource video MPEG4 en/decoder for Windows , Linux, ARM, Mac ...

I wrote XVidCapture an MPG4 Video & Audio encoder for FreeBASIC (win32) in the past.

With library xvidcore.dll or xvidcore.so you can write your own MPEG 4 en/decoders (32/64-bit).

Joshy

xvidcore.bi

Code: Select all

#ifndef __XVIDCORE_BI__
#define __XVIDCORE_BI__

/'
   XVID MPEG-4 VIDEO CODEC
 
   Copyright(C) 2001-2014 Peter Ross <pross@xvid.org>
 
   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.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY ; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with this program ; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 
  $Id: xvid.h 2123 2015-06-17 19:49:29Z Isibaar $
'/ 

#inclib "xvidcore"

extern "C"
' 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

' 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) and &Hff) shl 16) or (((b) and &Hff) shl 8) or ((c) and &Hff))
#define XVID_VERSION_MAJOR(a)    ((((a) shr 16) and &Hff))
#define XVID_VERSION_MINOR(a)    ((((a) shr  8) and &Hff))
#define XVID_VERSION_PATCH(a)    ((((a) shr  0) and &Hff))

#define XVID_MAKE_API(a,b)       ((((a) and &Hff) shl 16) or ((b) and &Hff))
#define XVID_API_MAJOR(a)        (((a) shr 16) and &Hff)
#define XVID_API_MINOR(a)        ((a) and &Hff)

#define XVID_VERSION             XVID_MAKE_VERSION(1,3,4)
#define XVID_API                 XVID_MAKE_API(4, 3)

' 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 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 67

' all functions return values <0 indicate error
#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

' FreeBASIC helper
function get_error_desc(byval ecode as long) as string
  select case ecode
  case XVID_ERR_FAIL    : return "general fault"
  case XVID_ERR_MEMORY  : return "memory allocation error"
  case XVID_ERR_FORMAT  : return "file format error"
  case XVID_ERR_VERSION : return "structure version not supported"
  case XVID_ERR_END     : return "encoder only end of stream reached"
  case else             : return "unknow error code [" & eCode & "]"
  end select
end function


' xvid_image_t
' colorspace values
#define XVID_CSP_PLANAR   (1 shl  0) ' 4:2:0 planar (==I420, except for pointers/strides)
#define XVID_CSP_USER    XVID_CSP_PLANAR
#define XVID_CSP_I420     (1 shl  1) ' 4:2:0 planar
#define XVID_CSP_YV12     (1 shl  2) ' 4:2:0 planar
#define XVID_CSP_YUY2     (1 shl  3) ' 4:2:2 packed
#define XVID_CSP_UYVY     (1 shl  4) ' 4:2:2 packed
#define XVID_CSP_YVYU     (1 shl  5) ' 4:2:2 packed
#define XVID_CSP_RGB      (1 shl 16) ' 24-bit rgb packed
#define XVID_CSP_BGRA     (1 shl  6) ' 32-bit bgra packed
#define XVID_CSP_ABGR     (1 shl  7) ' 32-bit abgr packed
#define XVID_CSP_RGBA     (1 shl  8) ' 32-bit rgba packed
#define XVID_CSP_ARGB     (1 shl 15) ' 32-bit argb packed
#define XVID_CSP_BGR      (1 shl  9) ' 24-bit bgr packed
#define XVID_CSP_RGB555   (1 shl 10) ' 16-bit rgb555 packed
#define XVID_CSP_RGB565   (1 shl 11) ' 16-bit rgb565 packed
#define XVID_CSP_SLICE    (1 shl 12) ' decoder only: 4:2:0 planar, per slice rendering
#define XVID_CSP_INTERNAL (1 shl 13) ' decoder only: 4:2:0 planar, returns ptrs to internal buffers
#define XVID_CSP_NULL     (1 shl 14) ' decoder only: dont output anything
#define XVID_CSP_VFLIP    (1 shl 31) ' vertical flip mask

' xvid_image_t
' for non-planar colorspaces use only plane[0] and stride[0]
' four plane reserved for alpha
type xvid_image_t
  as long    csp               ' [in] colorspace; or with XVID_CSP_VFLIP to perform vertical flip
  as any ptr plane(4-1)        ' [in] image plane ptrs
  as long    stride(4-1)       ' [in] image stride; "bytes per row"*/
end type

' video-object-sequence profiles
#define XVID_PROFILE_S_L0    &H08 ' simple
#define XVID_PROFILE_S_L1    &H01
#define XVID_PROFILE_S_L2    &H02
#define XVID_PROFILE_S_L3    &H03
#define XVID_PROFILE_S_L4a   &H04
#define XVID_PROFILE_S_L5    &H05
#define XVID_PROFILE_S_L6    &H06

#define XVID_PROFILE_ARTS_L1 &H91 ' advanced realtime simple
#define XVID_PROFILE_ARTS_L2 &H92
#define XVID_PROFILE_ARTS_L3 &H93
#define XVID_PROFILE_ARTS_L4 &H94

#define XVID_PROFILE_AS_L0   &Hf0 ' advanced simple
#define XVID_PROFILE_AS_L1   &Hf1
#define XVID_PROFILE_AS_L2   &Hf2
#define XVID_PROFILE_AS_L3   &Hf3
#define XVID_PROFILE_AS_L4   &Hf4

' aspect ratios
#define XVID_PAR_11_VGA    1 ' 1:1 vga (square), default if supplied PAR is not a valid value
#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 (make sure to sync this with cpuid.asm for ia32)
#define XVID_CPU_FORCE    (1 shl 31) ' force passed cpu flags
#define XVID_CPU_ASM      (1 shl  7) ' native assembly
' ARCH_IS_IA32
#define XVID_CPU_MMX      (1 shl  0) '       mmx : pentiumMMX,k6
#define XVID_CPU_MMXEXT   (1 shl  1) '   mmx-ext : pentium2, athlon
#define XVID_CPU_SSE      (1 shl  2) '       sse : pentium3, athlonXP
#define XVID_CPU_SSE2     (1 shl  3) '      sse2 : pentium4, athlon64
#define XVID_CPU_SSE3     (1 shl  8) '      sse3 : pentium4, athlon64
#define XVID_CPU_SSE41    (1 shl  9) '      sse41: penryn
#define XVID_CPU_3DNOW    (1 shl  4) '     3dnow : k6-2
#define XVID_CPU_3DNOWEXT (1 shl  5) ' 3dnow-ext : athlon
#define XVID_CPU_TSC      (1 shl  6) '       tsc : Pentium
' ARCH_IS_PPC
#define XVID_CPU_ALTIVEC  (1 shl  0) ' altivec
' FreeBASIC helper
function get_cpu_flag(byval flag as long) as string
  dim as string ret
  if flag and XVID_CPU_ASM      then ret &= " ASM"
  if flag and XVID_CPU_MMX      then ret &= " MMX"
  if flag and XVID_CPU_MMXEXT   then ret &= " MMX2"
  if flag and XVID_CPU_SSE      then ret &= " SSE"
  if flag and XVID_CPU_SSE2     then ret &= " SSE2"
  if flag and XVID_CPU_SSE3     then ret &= " SSE3"
  if flag and XVID_CPU_SSE41    then ret &= " SSE41"
  if flag and XVID_CPU_3DNOW    then ret &= " 3DNOW"
  if flag and XVID_CPU_3DNOWEXT then ret &= " 3DNOW2"
  if flag and XVID_CPU_TSC      then ret &= " TSC"
  return ret
end function
' FreeBASIC helper
function get_version(byval version as long) as string
  return XVID_VERSION_MAJOR(version) & "." & _
         XVID_VERSION_MINOR(version) & "." & _ 
         XVID_VERSION_PATCH(version)
end function

#define XVID_DEBUG_ERROR     (1 shl  0)
#define XVID_DEBUG_STARTCODE (1 shl  1)
#define XVID_DEBUG_HEADER    (1 shl  2)
#define XVID_DEBUG_TIMECODE  (1 shl  3)
#define XVID_DEBUG_MB        (1 shl  4)
#define XVID_DEBUG_COEFF     (1 shl  5)
#define XVID_DEBUG_MV        (1 shl  6)
#define XVID_DEBUG_RC        (1 shl  7)
#define XVID_DEBUG_DEBUG     (1 shl 31)

' XVID_GBL_INIT param1
type xvid_gbl_init_t
  as long version    ' [in] = XVID_VERSION
  as ulong cpu_flags ' [in:opt] zero = autodetect cpu; XVID_CPU_FORCE|{cpu features} = force cpu features
  as long debug      ' [in:opt] debug level
end type

' XVID_GBL_INFO param1
type xvid_gbl_info_t
  as long version            ' [in] = XVID_VERSION
  as long actual_version     ' [out] returns the actual xvidcore version
  as const zstring ptr build ' [out] if !null, points to description of this xvid core build
  as ulong cpu_flags         ' [out] detected cpu features
  as long num_threads        ' [out] detected number of cpus/threads
end type

' XVID_GBL_CONVERT param1
type xvid_gbl_convert_t
  as long version         ' [in] = XVID_VERSION
  as xvid_image_t input   ' [in] input image & colorspace
  as xvid_image_t output  ' [in] output image & colorspace
  as long width           ' [in] width
  as long height          ' [in] height
  as long interlacing     ' [in] interlacing
end type

#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
declare function xvid_global(byval handle as any ptr, byval opt as long, byval param1 as any ptr,byval param2 as any ptr) as long

' 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
declare function xvid_decore(byval handle as any ptr, byval opt as long, byval param1 as any ptr,byval param2 as any ptr) as long

' XVID_DEC_CREATE param 1
' image width & height as well as FourCC code may be specified 
' here when known in advance (e.g. being read from container)
type xvid_dec_create_t
  as long version
  as long width       ' [in:opt] image width
  as long height      ' [in:opt] image width
  as any ptr handle   ' [out]    decore context handle
  ' ------- v1.3.x -------
  as long fourcc      ' [in:opt] fourcc of the input video
  as long num_threads ' [in:opt] number of threads to use in decoder
end type


' XVID_DEC_DECODE param1
' general flags
#define XVID_LOWDELAY      (1 shl  0) ' lowdelay mode 
#define XVID_DISCONTINUITY (1 shl  1) ' indicates break in stream
#define XVID_DEBLOCKY      (1 shl  2) ' perform luma deblocking
#define XVID_DEBLOCKUV     (1 shl  3) ' perform chroma deblocking
#define XVID_FILMEFFECT    (1 shl  4) ' adds film grain
#define XVID_DERINGUV      (1 shl  5) ' perform chroma deringing, requires deblocking to work
#define XVID_DERINGY       (1 shl  6) ' perform luma deringing, requires deblocking to work

#define XVID_DEC_FAST      (1 shl 29) ' disable postprocessing to decrease cpu usage *todo*
#define XVID_DEC_DROP      (1 shl 30) ' drop bframes to decrease cpu usage *todo*
#define XVID_DEC_PREROLL   (1 shl 31) ' decode as fast as you can, don't even show output *todo*

type xvid_dec_frame_t
  as long version
  as long general         ' [in:opt] general flags
  as any ptr bitstream    ' [in]     bitstream (read from)
  as long length          ' [in]     bitstream length
  as xvid_image_t output  ' [in]     output image (written to)
  ' ------- v1.1.x -------
  as long brightness      ' [in]   brightness offset (0=none)
end type

type vop_t  ' type>0 {XVID_TYPE_IVOP,XVID_TYPE_PVOP,XVID_TYPE_BVOP,XVID_TYPE_SVOP}
  as long general              ' [out] flags
  as long time_base            ' [out] time base
  as long time_increment       ' [out] time increment
      ' XXX: external deblocking stuff
  as long ptr qscale           ' [out] pointer to quantizer table
  as long qscale_stride        ' [out] quantizer scale stride
end type

type vol_t  ' XVID_TYPE_VOL
  as long general              ' [out] flags
  as long width                ' [out] width
  as long height               ' [out] height
  as long par                  ' [out] pixel aspect ratio (refer to XVID_PAR_xxx above)
  as long par_width            ' [out] aspect ratio width  [1..255]
  as long par_height           ' [out] aspect ratio height [1..255]
end type

union data_t
  as vop_t vop
  as vol_t vol
end union

' XVID_DEC_DECODE param2 optional
type xvid_dec_stats_t
  as long version
  as long type                 ' [out] output data type
  as data_t data
end type

#define XVID_ZONE_QUANT  (1 shl 0)
#define XVID_ZONE_WEIGHT (1 shl 1)

type xvid_enc_zone_t
  as long frame
  as long mode
  as long increment
  as long base
end type

' xvid_enc_stats_t structure
' Used in:
'  - xvid_plg_data_t structure
'  - optional parameter in xvid_encore() function
'
' .coding_type = XVID_TYPE_NOTHING if the stats are not given

type xvid_enc_stats_t
  as long version
  ' encoding parameters
  as long type      ' [out] coding type
  as long quant     ' [out] frame quantizer
  as long vol_flags ' [out] vol flags (see above)
  as long vop_flags ' [out] vop flags (see above)
  ' bitrate
  as long length    ' [out] frame length

  as long hlength   ' [out] header length (bytes)
  as long kblks     ' [out] number of blocks compressed as Intra
  as long mblks     ' [out] number of blocks compressed as Inter
  as long ublks     ' [out] number of blocks marked as not_coded

  as long sse_y     ' [out] Y plane's sse
  as long sse_u     ' [out] U plane's sse
  as long sse_v     ' [out] V plane's sse
end type

' 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  (1 shl 0)
#define XVID_PLG_DESTROY (1 shl 1)
#define XVID_PLG_INFO    (1 shl 2)
#define XVID_PLG_BEFORE  (1 shl 3)
#define XVID_PLG_FRAME   (1 shl 4)
#define XVID_PLG_AFTER   (1 shl 5)

' xvid_plg_info_t.flags
#define XVID_REQORIGINAL (1 shl 0) ' plugin requires a copy of the original (uncompressed) image
#define XVID_REQPSNR     (1 shl 1) ' plugin requires psnr between the uncompressed and compressed image*/
#define XVID_REQDQUANTS  (1 shl 2) ' plugin requires access to the dquant table
#define XVID_REQLAMBDA   (1 shl 3) ' plugin requires access to the lambda table

type xvid_plg_info_t
  as long version
  as long flags   ' [in:opt] plugin flags
end type

type xvid_plg_create_t
  as long version
  as long num_zones            ' [out]
  as xvid_enc_zone_t ptr zones ' [out]
  as long width                ' [out]
  as long height               ' [out]
  as long mb_width             ' [out]
  as long mb_height            ' [out]
  as long fincr                ' [out]
  as long fbase                ' [out]
  as any ptr param             ' [out]
end type 


type xvid_plg_destroy_t
  as long version
  as long num_frames ' [out] total frame encoded
end type

type xvid_plg_data_t
  as long version
  as xvid_enc_zone_t ptr zone ' [out] current zone

  as long width              ' [out]
  as long height             ' [out]
  as long mb_width           ' [out]
  as long mb_height          ' [out]
  as long fincr              ' [out]
  as long fbase              ' [out]

  as long min_quant(3-1)     ' [out]
  as long max_quant(3-1)     ' [out]

  as xvid_image_t reference  ' [out] -> [out]
  as xvid_image_t current    ' [out] -> [in,out]
  as xvid_image_t original   ' [out] after: points the original (uncompressed) copy of the current frame
  as long frame_num          ' [out] frame number

  as long type               ' [in,out]
  as long quant              ' [in,out]

  as long ptr dquant         ' [in,out]  pointer to diff quantizer table
  as long dquant_stride      ' [in,out]  diff quantizer stride

  as long vop_flags          ' [in,out]
  as long vol_flags          ' [in,out]
  as long motion_flags       ' [in,out]

  ' Lambda table for HVSPlugins
  as single ptr lambda       ' [in,out] six floats for each macroblock. read, multiply, write back

' Deprecated, use the stats field instead.
' Will disapear before 1.0
  as long length             ' [out] after: length of encoded frame
  as long kblks              ' [out] number of blocks compressed as Intra
  as long mblks              ' [out] number of blocks compressed as Inter
  as long ublks              ' [out] number of blocks marked not_coded
  as long sse_y              ' [out] Y plane's sse
  as long sse_u              ' [out] U plane's sse
  as long sse_v              ' [out] V plane's sse
' End of duplicated data, kept only for binary compatibility

  as long bquant_ratio       ' [in]
  as long bquant_offset      ' [in]

  as xvid_enc_stats_t stats  ' [out] frame statistics
end type


' 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

type xvid_plugin_func as function (byval handle as any ptr, byval opt as long, byval param1 as any ptr,byval param2 as any ptr) as long

type xvid_enc_plugin_t
  as xvid_plugin_func func
  as any ptr param
end type

extern xvid_plugin_single alias "xvid_plugin_single" as xvid_plugin_func ' single-pass rate control
extern xvid_plugin_2pass1 alias "xvid_plugin_2pass1" as xvid_plugin_func ' two-pass rate control: first pass
extern xvid_plugin_2pass2 alias "xvid_plugin_2pass2" as xvid_plugin_func ' two-pass rate control: second pass

extern xvid_plugin_lumimasking alias "xvid_plugin_lumimasking" as xvid_plugin_func  ' lumimasking

extern xvid_plugin_psnr alias "xvid_plugin_psnr" as xvid_plugin_func  ' write psnr values to stdout
extern xvid_plugin_dump alias "xvid_plugin_dump" as xvid_plugin_func  ' dump before and after yuvpgms

extern xvid_plugin_ssim     alias "xvid_plugin_ssim"     as xvid_plugin_func ' write ssim values to stdout
extern xvid_plugin_psnrhvsm alias "xvid_plugin_psnrhvsm" as xvid_plugin_func ' write psnrhvsm values to stdout

' single pass rate control
' CBR and Constant quantizer modes
type xvid_plugin_single_t
  as long version
  as long bitrate               ' [in] bits per second
  as long reaction_delay_factor ' [in]
  as long averaging_period      ' [in]
  as long buffer                ' [in]
end type


type xvid_plugin_2pass1_t
  as long version
  as zstring ptr filename
end type

#define XVID_PAYBACK_BIAS 0 ' payback with bias
#define XVID_PAYBACK_PROP 1 ' payback proportionally

type xvid_plugin_2pass2_t
  as long version

  as long bitrate                  ' [in] target bitrate (bits per second)
  as zstring ptr filename          ' [in] first pass stats filename

  as long keyframe_boost           ' [in] keyframe boost percentage: [0..100]
  as long curve_compression_high   ' [in] percentage of compression performed on the high part of the curve (above average)
  as long curve_compression_low    ' [in] percentage of compression performed on the low  part of the curve (below average)
  as long overflow_control_strength' [in] Payback delay expressed in number of frames
  as long max_overflow_improvement ' [in] percentage of allowed range for a frame that gets bigger because of overflow bonus
  as long max_overflow_degradation ' [in] percentage of allowed range for a frame that gets smaller because of overflow penalty

  as long kfreduction              ' [in] maximum bitrate reduction applied to an iframe under the kfthreshold distance limit
  as long kfthreshold              ' [in] if an iframe is closer to the next iframe than this distance, a quantity of bits
                                   '  is substracted from its bit allocation. The reduction is computed as multiples of
                                   '  kfreduction/kthreshold. It reaches kfreduction when the distance == kfthreshold,
                                   '  0 for 1<distance<kfthreshold

  as long container_frame_overhead ' [in] How many bytes the controller has to compensate per frame due to container format overhead
' ------- v1.1.x -------
  as long vbv_size                 ' [in] buffer size (bits) If this is zero, VBV check is disabled.*/
  as long vbv_initial              ' [in] initial buffer occupancy (bits)
  as long vbv_maxrate              ' [in] max processing bitrate (bits per second)
  as long vbv_peakrate             ' [in:opt] max average bitrate over 1 second (bits per second).
                                   '  This is used for diagnostics only and won't affect the actual peak bitrate.
                                   '  This is not a problem as long as vbv_peakrate > vbv_size + vbv_maxrate which
                                   '  guarantees that vbv_peakrate won't be exceeded.
end type 


type xvid_plugin_ssim_t
  'stat output*/
  as long b_printstat
  as zstring ptr stat_path
  'visualize
  as long b_visualize
  ' accuracy 0 very accurate 4 very fast
  as long acc 
  as long cpu_flags ' XVID_CPU_XXX flags
end type

type xvid_plugin_lumimasking_t
  as long version
  as long method      ' [in] masking method to apply. 0 for luminance masking, 1 for variance masking
end type 


' ENCODER API
' Encoder operations
#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)
' Encoder entry point
declare function xvid_encore(byval handle as any ptr, byval opt as long, byval param1 as any ptr,byval param2 as any ptr) as long

/' Quick API reference

  XVID_ENC_CREATE operation
   - handle: ignored
   - opt: XVID_ENC_CREATE
   - param1: address of a xvid_enc_create_t structure
   - param2: ignored
 
  XVID_ENC_ENCODE operation
   - handle: an instance returned by a CREATE op
   - opt: XVID_ENC_ENCODE
   - param1: address of a xvid_enc_frame_t structure
   - param2: address of a xvid_enc_stats_t structure (optional)
             its return value is asynchronous to what is written to the buffer
             depending on the delay introduced by bvop use. It's display ordered.

  XVID_ENC_DESTROY operation
   - handle: an instance returned by a CREATE op
   - opt: XVID_ENC_DESTROY
   - param1: ignored
   - param2: ignored
'/


' "Global" flags
' These flags are used for xvid_enc_create_t->global field during instance creation (operation XVID_ENC_CREATE)

#define XVID_GLOBAL_PACKED            (1 shl 0) ' packed bitstream
#define XVID_GLOBAL_CLOSED_GOP        (1 shl 1) ' closed_gop:  was DX50BVOP dx50 bvop compatibility
#define XVID_GLOBAL_EXTRASTATS_ENABLE (1 shl 2)
#if 0
#define XVID_GLOBAL_VOL_AT_IVOP       (1 shl 3) ' write vol at every ivop: WIN32/divx compatibility
#define XVID_GLOBAL_FORCE_VOL         (1 shl 4) ' when vol-based parameters are changed, insert an ivop NOT recommended
#endif
#define XVID_GLOBAL_DIVX5_USERDATA    (1 shl 5) ' write divx5 userdata string this is implied if XVID_GLOBAL_PACKED is set

' "VOL" flags
' These flags are used for xvid_enc_frame_t->vol_flags field during frame encoding (operation XVID_ENC_ENCODE)

#define XVID_VOL_MPEGQUANT      (1 shl 0) ' enable MPEG type quantization
#define XVID_VOL_EXTRASTATS     (1 shl 1) ' enable plane sse stats
#define XVID_VOL_QUARTERPEL     (1 shl 2) ' enable quarterpel: frames will encoded as quarterpel
#define XVID_VOL_GMC            (1 shl 3) ' enable GMC frames will be checked for gmc suitability
#define XVID_VOL_REDUCED_ENABLE (1 shl 4) ' enable reduced resolution vops: frames will be checked for rrv suitability
                                       ' NOTE:  the reduced resolution feature is not supported anymore. This flag will have no effect!
#define XVID_VOL_INTERLACING    (1 shl 5) ' enable interlaced encoding


' "VOP" flags
' These flags are used for xvid_enc_frame_t->vop_flags field during frame encoding (operation XVID_ENC_ENCODE)

' Always valid
#define XVID_VOP_DEBUG                (1 shl  0) ' print debug messages in frames
#define XVID_VOP_HALFPEL              (1 shl  1) ' use halfpel interpolation
#define XVID_VOP_INTER4V              (1 shl  2) ' use 4 motion vectors per MB
#define XVID_VOP_TRELLISQUANT         (1 shl  3) ' use trellis based R-D "optimal" quantization
#define XVID_VOP_CHROMAOPT            (1 shl  4) ' enable chroma optimization pre-filter
#define XVID_VOP_CARTOON              (1 shl  5) ' use 'cartoon mode'
#define XVID_VOP_GREYSCALE            (1 shl  6) ' enable greyscale only mode (even for  color input material chroma is ignored)
#define XVID_VOP_HQACPRED             (1 shl  7) ' high quality ac prediction
#define XVID_VOP_MODEDECISION_RD      (1 shl  8) ' enable DCT-ME and use it for mode decision
#define XVID_VOP_FAST_MODEDECISION_RD (1 shl 12) ' use simplified R-D mode decision
#define XVID_VOP_RD_BVOP              (1 shl 13) ' enable rate-distortion mode decision in b-frames
#define XVID_VOP_RD_PSNRHVSM          (1 shl 14) ' use PSNR-HVS-M as metric for rate-distortion optimizations

' Only valid for vol_flags|=XVID_VOL_INTERLACING
#define XVID_VOP_TOPFIELDFIRST        (1 shl  9) ' set top-field-first flag 
#define XVID_VOP_ALTERNATESCAN        (1 shl 10) ' set alternate vertical scan flag

' only valid for vol_flags|=XVID_VOL_REDUCED_ENABLED
#define XVID_VOP_REDUCED              (1 shl 11) ' reduced resolution vop
                                                 ' NOTE: reduced resolution feature is not supported anymore. This flag will have no effect!


' "Motion" flags
' These flags are used for xvid_enc_frame_t->motion field during frame encoding (operation XVID_ENC_ENCODE)

' Motion Estimation Search Patterns
#define XVID_ME_ADVANCEDDIAMOND16     (1 shl  0) ' use advdiamonds instead of diamonds as search pattern
#define XVID_ME_ADVANCEDDIAMOND8      (1 shl  1) ' use advdiamond for XVID_ME_EXTSEARCH8
#define XVID_ME_USESQUARES16          (1 shl  2) ' use squares instead of diamonds as search pattern
#define XVID_ME_USESQUARES8           (1 shl  3) ' use square for XVID_ME_EXTSEARCH8

' SAD operator based flags
#define XVID_ME_HALFPELREFINE16       (1 shl  4)
#define XVID_ME_HALFPELREFINE8        (1 shl  6)
#define XVID_ME_QUARTERPELREFINE16    (1 shl  7)
#define XVID_ME_QUARTERPELREFINE8     (1 shl  8)
#define XVID_ME_GME_REFINE            (1 shl  9)
#define XVID_ME_EXTSEARCH16           (1 shl 10) ' extend PMV by more searches
#define XVID_ME_EXTSEARCH8            (1 shl 11) ' use diamond/square for extended 8x8 search
#define XVID_ME_CHROMA_PVOP           (1 shl 12) ' also use chroma for P_VOP/S_VOP ME
#define XVID_ME_CHROMA_BVOP           (1 shl 13) ' also use chroma for B_VOP ME
#define XVID_ME_FASTREFINE16          (1 shl 25) ' use low-complexity refinement functions
#define XVID_ME_FASTREFINE8           (1 shl 29) ' low-complexity 8x8 sub-block refinement

' Rate Distortion based flags Valid when XVID_VOP_MODEDECISION_RD is enabled
#define XVID_ME_HALFPELREFINE16_RD    (1 shl 14) ' perform RD-based halfpel refinement
#define XVID_ME_HALFPELREFINE8_RD     (1 shl 15) ' perform RD-based halfpel refinement for 8x8 mode
#define XVID_ME_QUARTERPELREFINE16_RD (1 shl 16) ' perform RD-based qpel refinement
#define XVID_ME_QUARTERPELREFINE8_RD  (1 shl 17) ' perform RD-based qpel refinement for 8x8 mode
#define XVID_ME_EXTSEARCH_RD          (1 shl 18) ' perform RD-based search using square pattern enable XVID_ME_EXTSEARCH8 to do this in 8x8 search as well
#define XVID_ME_CHECKPREDICTION_RD    (1 shl 19) ' always check vector equal to prediction

' Other
#define XVID_ME_DETECT_STATIC_MOTION  (1 shl 24) ' speed-up ME by detecting stationary scenes
#define XVID_ME_SKIP_DELTASEARCH      (1 shl 26) ' speed-up by skipping b-frame delta search
#define XVID_ME_FAST_MODEINTERPOLATE  (1 shl 27) ' speed-up by partly skipping interpolate mode
#define XVID_ME_BFRAME_EARLYSTOP      (1 shl 28) ' speed-up by early exiting b-search

#if 0 ' Unused
#define XVID_ME_UNRESTRICTED16        (1 shl 20) ' unrestricted ME, not implemented
#define XVID_ME_OVERLAPPING16         (1 shl 21) ' overlapping ME, not implemented
#define XVID_ME_UNRESTRICTED8         (1 shl 22) ' unrestricted ME, not implemented
#define XVID_ME_OVERLAPPING8          (1 shl 23) ' overlapping ME, not implemented
#endif

' xvid_enc_create_t structure definition
' This structure is passed as param1 during an instance creation (operation XVID_ENC_CREATE)
type xvid_enc_create_t
  as long version
  as long profile                 ' [in] profile@level refer to XVID_PROFILE_xxx
  as long width                   ' [in] frame dimensions width, pixel units
  as long height                  ' [in] frame dimensions height, pixel units

  as long num_zones               ' [in:opt] number of bitrate zones
  as xvid_enc_zone_t ptr zones     '          ^^ zone array

  as long num_plugins             ' [in:opt] number of plugins
  as xvid_enc_plugin_t ptr plugins '          ^^ plugin array

  as long num_threads             ' [in:opt] number of threads to use in encoder
  as long max_bframes             ' [in:opt] max sequential bframes (0=disable bframes)

  as long global                  ' [in:opt] global flags controls encoding behavior

  ' --- vol-based stuff included here for convenience
  as long fincr                   ' [in:opt] framerate increment set to zero for variable framerate
  as long fbase                   ' [in] framerate base frame_duration = fincr/fbase seconds
  ' ----------------------------------------------

  ' --- vop-based included here for convenience
  as long max_key_interval        ' [in:opt] the maximum interval between key frames
  as long frame_drop_ratio        ' [in:opt] frame dropping: 0=drop none... 100=drop all
  as long bquant_ratio            ' [in:opt] bframe quantizer multipier/offset used to decide bframes quant when bquant==-1
  as long bquant_offset           ' bquant = (avg(past_ref_quant,future_ref_quant)*bquant_ratio + bquant_offset) / 100
  as long min_quant(3-1)          ' [in:opt]
  as long max_quant(3-1)          ' [in:opt]
  ' ----------------------------------------------
  as any ptr handle               ' [out] encoder instance handle
  ' ------- v1.3.x -------
  as long start_frame_num         ' [in:opt] frame number of start frame relative to zones definitions. allows to encode sub-sequences
  as long num_slices              ' [in:opt] number of slices to code for each frame
end type


' xvid_enc_frame_t structure definition
' This structure is passed as param1 during a frame encoding (operation XVID_ENC_ENCODE)

' out value for the frame structure->type field
' unlike stats output in param2, this field is not asynchronous and tells
' the client app, if the frame written into the stream buffer is an ivop
' usually used for indexing purpose in the container
#define XVID_KEYFRAME (1 shl 1)

' The structure
type xvid_enc_frame_t
  as long version
  ' VOL related stuff
  ' unless XVID_FORCEVOL is set, the encoder will not react to any changes here until the next VOL (keyframe).
  as long vol_flags               ' [in] vol flags
  as ubyte ptr quant_intra_matrix ' [in:opt] custom intra qmatrix
  as ubyte ptr quant_inter_matrix ' [in:opt] custom inter qmatrix

  as long par                     ' [in:opt] pixel aspect ratio (refer to XVID_PAR_xxx above)
  as long par_width               ' [in:opt] aspect ratio width
  as long par_height              ' [in:opt] aspect ratio height

  ' Other fields that can change on a frame base

  as long fincr                   ' [in:opt] framerate increment, for variable framerate only
  as long vop_flags               ' [in] (general)vop-based flags
  as long motion                  ' [in] ME options

  as xvid_image_t input           ' [in] input image (read from)

  as long type                    ' [in:opt] coding type
  as long quant                   ' [in] frame quantizer if <=0, automatic (ratecontrol)
  as long bframe_threshold

  as any ptr bitstream            ' [in:opt] bitstream ptr (written to)
  as long length                  ' [in:opt] bitstream length (bytes)

  as long out_flags               ' [out] bitstream output flags
end type


end extern

#endif '__XVIDCORE_BI__
simple test get_info.bas

Code: Select all

#include once "xvidcore.bi"

dim as xvid_gbl_info_t gbl_info
gbl_info.version = XVID_VERSION

var ret = xvid_global(0,XVID_GBL_INFO,@gbl_info,0)
if ret<0 then 
  print "error: xvid_global() " & get_error_desc(ret)
  beep : sleep :end 1
end if

print "xvidcore info"
print "-------------"
if gbl_info.build then 
print "build            : " & *gbl_info.build
end if
print "actual version   : " & get_version(gbl_info.actual_version)
print "CPU features     : " & get_cpu_flag(gbl_info.cpu_flags)
print "CPU's (cores)    : " & gbl_info.num_threads
print "press any key ..."
sleep
Post Reply