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__
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