#ifndef X264_X264_H
#define X264_X264_H
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(_STDINT_H) && !defined(_STDINT_H_) && !defined(_STDINT_H_INCLUDED) && !defined(_STDINT) &&\
!defined(_SYS_STDINT_H_) && !defined(_INTTYPES_H) && !defined(_INTTYPES_H_) && !defined(_INTTYPES)
# ifdef _MSC_VER
# pragma message("You must include stdint.h or inttypes.h before x264.h")
# else
# warning You must include stdint.h or inttypes.h before x264.h
# endif
#endif
#include <stdint.h>
#include <stdarg.h>
#include "x264_config.h"
#define X264_BUILD 157
#ifdef X264_API_IMPORTS
#define X264_API __declspec(dllimport)
#else
#define X264_API
#endif
typedef struct x264_t x264_t;
enum nal_unit_type_e
{
NAL_UNKNOWN = 0,
NAL_SLICE = 1,
NAL_SLICE_DPA = 2,
NAL_SLICE_DPB = 3,
NAL_SLICE_DPC = 4,
NAL_SLICE_IDR = 5,
NAL_SEI = 6,
NAL_SPS = 7,
NAL_PPS = 8,
NAL_AUD = 9,
NAL_FILLER = 12,
};
enum nal_priority_e
{
NAL_PRIORITY_DISPOSABLE = 0,
NAL_PRIORITY_LOW = 1,
NAL_PRIORITY_HIGH = 2,
NAL_PRIORITY_HIGHEST = 3,
};
typedef struct x264_nal_t
{
int i_ref_idc;
int i_type;
int b_long_startcode;
int i_first_mb;
int i_last_mb;
int i_payload;
uint8_t *p_payload;
int i_padding;
} x264_nal_t;
#define X264_CPU_MMX (1<<0)
#define X264_CPU_MMX2 (1<<1)
#define X264_CPU_MMXEXT X264_CPU_MMX2
#define X264_CPU_SSE (1<<2)
#define X264_CPU_SSE2 (1<<3)
#define X264_CPU_LZCNT (1<<4)
#define X264_CPU_SSE3 (1<<5)
#define X264_CPU_SSSE3 (1<<6)
#define X264_CPU_SSE4 (1<<7)
#define X264_CPU_SSE42 (1<<8)
#define X264_CPU_AVX (1<<9)
#define X264_CPU_XOP (1<<10)
#define X264_CPU_FMA4 (1<<11)
#define X264_CPU_FMA3 (1<<12)
#define X264_CPU_BMI1 (1<<13)
#define X264_CPU_BMI2 (1<<14)
#define X264_CPU_AVX2 (1<<15)
#define X264_CPU_AVX512 (1<<16)
#define X264_CPU_CACHELINE_32 (1<<17)
#define X264_CPU_CACHELINE_64 (1<<18)
#define X264_CPU_SSE2_IS_SLOW (1<<19)
#define X264_CPU_SSE2_IS_FAST (1<<20)
#define X264_CPU_SLOW_SHUFFLE (1<<21)
#define X264_CPU_STACK_MOD4 (1<<22)
#define X264_CPU_SLOW_ATOM (1<<23)
#define X264_CPU_SLOW_PSHUFB (1<<24)
#define X264_CPU_SLOW_PALIGNR (1<<25)
#define X264_CPU_ALTIVEC 0x0000001
#define X264_CPU_ARMV6 0x0000001
#define X264_CPU_NEON 0x0000002
#define X264_CPU_FAST_NEON_MRC 0x0000004
#define X264_CPU_ARMV8 0x0000008
#define X264_CPU_MSA 0x0000001
#define X264_ANALYSE_I4x4 0x0001
#define X264_ANALYSE_I8x8 0x0002
#define X264_ANALYSE_PSUB16x16 0x0010
#define X264_ANALYSE_PSUB8x8 0x0020
#define X264_ANALYSE_BSUB16x16 0x0100
#define X264_DIRECT_PRED_NONE 0
#define X264_DIRECT_PRED_SPATIAL 1
#define X264_DIRECT_PRED_TEMPORAL 2
#define X264_DIRECT_PRED_AUTO 3
#define X264_ME_DIA 0
#define X264_ME_HEX 1
#define X264_ME_UMH 2
#define X264_ME_ESA 3
#define X264_ME_TESA 4
#define X264_CQM_FLAT 0
#define X264_CQM_JVT 1
#define X264_CQM_CUSTOM 2
#define X264_RC_CQP 0
#define X264_RC_CRF 1
#define X264_RC_ABR 2
#define X264_QP_AUTO 0
#define X264_AQ_NONE 0
#define X264_AQ_VARIANCE 1
#define X264_AQ_AUTOVARIANCE 2
#define X264_AQ_AUTOVARIANCE_BIASED 3
#define X264_B_ADAPT_NONE 0
#define X264_B_ADAPT_FAST 1
#define X264_B_ADAPT_TRELLIS 2
#define X264_WEIGHTP_NONE 0
#define X264_WEIGHTP_SIMPLE 1
#define X264_WEIGHTP_SMART 2
#define X264_B_PYRAMID_NONE 0
#define X264_B_PYRAMID_STRICT 1
#define X264_B_PYRAMID_NORMAL 2
#define X264_KEYINT_MIN_AUTO 0
#define X264_KEYINT_MAX_INFINITE (1<<30)
#define X264_AVCINTRA_FLAVOR_PANASONIC 0
#define X264_AVCINTRA_FLAVOR_SONY 1
static const char * const x264_direct_pred_names[] = { "none", "spatial", "temporal", "auto", 0 };
static const char * const x264_motion_est_names[] = { "dia", "hex", "umh", "esa", "tesa", 0 };
static const char * const x264_b_pyramid_names[] = { "none", "strict", "normal", 0 };
static const char * const x264_overscan_names[] = { "undef", "show", "crop", 0 };
static const char * const x264_vidformat_names[] = { "component", "pal", "ntsc", "secam", "mac", "undef", 0 };
static const char * const x264_fullrange_names[] = { "off", "on", 0 };
static const char * const x264_colorprim_names[] = { "", "bt709", "undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "film", "bt2020", "smpte428",
"smpte431", "smpte432", 0 };
static const char * const x264_transfer_names[] = { "", "bt709", "undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316",
"iec61966-2-4", "bt1361e", "iec61966-2-1", "bt2020-10", "bt2020-12", "smpte2084", "smpte428", "arib-std-b67", 0 };
static const char * const x264_colmatrix_names[] = { "GBR", "bt709", "undef", "", "fcc", "bt470bg", "smpte170m", "smpte240m", "YCgCo", "bt2020nc", "bt2020c",
"smpte2085", "chroma-derived-nc", "chroma-derived-c", "ICtCp", 0 };
static const char * const x264_nal_hrd_names[] = { "none", "vbr", "cbr", 0 };
static const char * const x264_avcintra_flavor_names[] = { "panasonic", "sony", 0 };
#define X264_CSP_MASK 0x00ff
#define X264_CSP_NONE 0x0000
#define X264_CSP_I400 0x0001
#define X264_CSP_I420 0x0002
#define X264_CSP_YV12 0x0003
#define X264_CSP_NV12 0x0004
#define X264_CSP_NV21 0x0005
#define X264_CSP_I422 0x0006
#define X264_CSP_YV16 0x0007
#define X264_CSP_NV16 0x0008
#define X264_CSP_YUYV 0x0009
#define X264_CSP_UYVY 0x000a
#define X264_CSP_V210 0x000b
#define X264_CSP_I444 0x000c
#define X264_CSP_YV24 0x000d
#define X264_CSP_BGR 0x000e
#define X264_CSP_BGRA 0x000f
#define X264_CSP_RGB 0x0010
#define X264_CSP_MAX 0x0011
#define X264_CSP_VFLIP 0x1000
#define X264_CSP_HIGH_DEPTH 0x2000
#define X264_TYPE_AUTO 0x0000
#define X264_TYPE_IDR 0x0001
#define X264_TYPE_I 0x0002
#define X264_TYPE_P 0x0003
#define X264_TYPE_BREF 0x0004
#define X264_TYPE_B 0x0005
#define X264_TYPE_KEYFRAME 0x0006
#define IS_X264_TYPE_I(x) ((x)==X264_TYPE_I || (x)==X264_TYPE_IDR || (x)==X264_TYPE_KEYFRAME)
#define IS_X264_TYPE_B(x) ((x)==X264_TYPE_B || (x)==X264_TYPE_BREF)
#define X264_LOG_NONE (-1)
#define X264_LOG_ERROR 0
#define X264_LOG_WARNING 1
#define X264_LOG_INFO 2
#define X264_LOG_DEBUG 3
#define X264_THREADS_AUTO 0
#define X264_SYNC_LOOKAHEAD_AUTO (-1)
#define X264_NAL_HRD_NONE 0
#define X264_NAL_HRD_VBR 1
#define X264_NAL_HRD_CBR 2
typedef struct x264_zone_t
{
int i_start, i_end;
int b_force_qp;
int i_qp;
float f_bitrate_factor;
struct x264_param_t *param;
} x264_zone_t;
typedef struct x264_param_t
{
unsigned int cpu;
int i_threads;
int i_lookahead_threads;
int b_sliced_threads;
int b_deterministic;
int b_cpu_independent;
int i_sync_lookahead;
int i_width;
int i_height;
int i_csp;
int i_bitdepth;
int i_level_idc;
int i_frame_total;
int i_nal_hrd;
struct
{
int i_sar_height;
int i_sar_width;
int i_overscan;
int i_vidformat;
int b_fullrange;
int i_colorprim;
int i_transfer;
int i_colmatrix;
int i_chroma_loc;
} vui;
int i_frame_reference;
int i_dpb_size;
int i_keyint_max;
int i_keyint_min;
int i_scenecut_threshold;
int b_intra_refresh;
int i_bframe;
int i_bframe_adaptive;
int i_bframe_bias;
int i_bframe_pyramid;
int b_open_gop;
int b_bluray_compat;
int i_avcintra_class;
int i_avcintra_flavor;
int b_deblocking_filter;
int i_deblocking_filter_alphac0;
int i_deblocking_filter_beta;
int b_cabac;
int i_cabac_init_idc;
int b_interlaced;
int b_constrained_intra;
int i_cqm_preset;
char *psz_cqm_file;
uint8_t cqm_4iy[16];
uint8_t cqm_4py[16];
uint8_t cqm_4ic[16];
uint8_t cqm_4pc[16];
uint8_t cqm_8iy[64];
uint8_t cqm_8py[64];
uint8_t cqm_8ic[64];
uint8_t cqm_8pc[64];
void (*pf_log)( void *, int i_level, const char *psz, va_list );
void *p_log_private;
int i_log_level;
int b_full_recon;
char *psz_dump_yuv;
struct
{
unsigned int intra;
unsigned int inter;
int b_transform_8x8;
int i_weighted_pred;
int b_weighted_bipred;
int i_direct_mv_pred;
int i_chroma_qp_offset;
int i_me_method;
int i_me_range;
int i_mv_range;
int i_mv_range_thread;
int i_subpel_refine;
int b_chroma_me;
int b_mixed_references;
int i_trellis;
int b_fast_pskip;
int b_dct_decimate;
int i_noise_reduction;
float f_psy_rd;
float f_psy_trellis;
int b_psy;
int b_mb_info;
int b_mb_info_update;
int i_luma_deadzone[2];
int b_psnr;
int b_ssim;
} analyse;
struct
{
int i_rc_method;
int i_qp_constant;
int i_qp_min;
int i_qp_max;
int i_qp_step;
int i_bitrate;
float f_rf_constant;
float f_rf_constant_max;
float f_rate_tolerance;
int i_vbv_max_bitrate;
int i_vbv_buffer_size;
float f_vbv_buffer_init;
float f_ip_factor;
float f_pb_factor;
int b_filler;
int i_aq_mode;
float f_aq_strength;
int b_mb_tree;
int i_lookahead;
int b_stat_write;
char *psz_stat_out;
int b_stat_read;
char *psz_stat_in;
float f_qcompress;
float f_qblur;
float f_complexity_blur;
x264_zone_t *zones;
int i_zones;
char *psz_zones;
} rc;
struct
{
unsigned int i_left;
unsigned int i_top;
unsigned int i_right;
unsigned int i_bottom;
} crop_rect;
int i_frame_packing;
int i_alternative_transfer;
int b_aud;
int b_repeat_headers;
int b_annexb;
int i_sps_id;
int b_vfr_input;
int b_pulldown;
uint32_t i_fps_num;
uint32_t i_fps_den;
uint32_t i_timebase_num;
uint32_t i_timebase_den;
int b_tff;
int b_pic_struct;
int b_fake_interlaced;
int b_stitchable;
int b_opencl;
int i_opencl_device;
void *opencl_device_id;
char *psz_clbin_file;
int i_slice_max_size;
int i_slice_max_mbs;
int i_slice_min_mbs;
int i_slice_count;
int i_slice_count_max;
void (*param_free)( void* );
void (*nalu_process)( x264_t *h, x264_nal_t *nal, void *opaque );
} x264_param_t;
void x264_nal_encode( x264_t *h, uint8_t *dst, x264_nal_t *nal );
typedef struct x264_level_t
{
uint8_t level_idc;
uint32_t mbps;
uint32_t frame_size;
uint32_t dpb;
uint32_t bitrate;
uint32_t cpb;
uint16_t mv_range;
uint8_t mvs_per_2mb;
uint8_t slice_rate;
uint8_t mincr;
uint8_t bipred8x8;
uint8_t direct8x8;
uint8_t frame_only;
} x264_level_t;
X264_API extern const x264_level_t x264_levels[];
void x264_param_default( x264_param_t * );
#define X264_PARAM_BAD_NAME (-1)
#define X264_PARAM_BAD_VALUE (-2)
int x264_param_parse( x264_param_t *, const char *name, const char *value );
static const char * const x264_preset_names[] = { "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo", 0 };
static const char * const x264_tune_names[] = { "film", "animation", "grain", "stillimage", "psnr", "ssim", "fastdecode", "zerolatency", 0 };
int x264_param_default_preset( x264_param_t *, const char *preset, const char *tune );
void x264_param_apply_fastfirstpass( x264_param_t * );
static const char * const x264_profile_names[] = { "baseline", "main", "high", "high10", "high422", "high444", 0 };
int x264_param_apply_profile( x264_param_t *, const char *profile );
X264_API extern const int x264_chroma_format;
enum pic_struct_e
{
PIC_STRUCT_AUTO = 0, PIC_STRUCT_PROGRESSIVE = 1, PIC_STRUCT_TOP_BOTTOM = 4, PIC_STRUCT_BOTTOM_TOP = 5, PIC_STRUCT_TOP_BOTTOM_TOP = 6, PIC_STRUCT_BOTTOM_TOP_BOTTOM = 7, PIC_STRUCT_DOUBLE = 8, PIC_STRUCT_TRIPLE = 9, };
typedef struct x264_hrd_t
{
double cpb_initial_arrival_time;
double cpb_final_arrival_time;
double cpb_removal_time;
double dpb_output_time;
} x264_hrd_t;
typedef struct x264_sei_payload_t
{
int payload_size;
int payload_type;
uint8_t *payload;
} x264_sei_payload_t;
typedef struct x264_sei_t
{
int num_payloads;
x264_sei_payload_t *payloads;
void (*sei_free)( void* );
} x264_sei_t;
typedef struct x264_image_t
{
int i_csp;
int i_plane;
int i_stride[4];
uint8_t *plane[4];
} x264_image_t;
typedef struct x264_image_properties_t
{
float *quant_offsets;
void (*quant_offsets_free)( void* );
uint8_t *mb_info;
void (*mb_info_free)( void* );
#define X264_MBINFO_CONSTANT (1<<0)
double f_ssim;
double f_psnr_avg;
double f_psnr[3];
double f_crf_avg;
} x264_image_properties_t;
typedef struct x264_picture_t
{
int i_type;
int i_qpplus1;
int i_pic_struct;
int b_keyframe;
int64_t i_pts;
int64_t i_dts;
x264_param_t *param;
x264_image_t img;
x264_image_properties_t prop;
x264_hrd_t hrd_timing;
x264_sei_t extra_sei;
void *opaque;
} x264_picture_t;
void x264_picture_init( x264_picture_t *pic );
int x264_picture_alloc( x264_picture_t *pic, int i_csp, int i_width, int i_height );
void x264_picture_clean( x264_picture_t *pic );
#define x264_encoder_glue1(x,y) x##y
#define x264_encoder_glue2(x,y) x264_encoder_glue1(x,y)
#define x264_encoder_open x264_encoder_glue2(x264_encoder_open_,X264_BUILD)
x264_t *x264_encoder_open( x264_param_t * );
int x264_encoder_reconfig( x264_t *, x264_param_t * );
void x264_encoder_parameters( x264_t *, x264_param_t * );
int x264_encoder_headers( x264_t *, x264_nal_t **pp_nal, int *pi_nal );
int x264_encoder_encode( x264_t *, x264_nal_t **pp_nal, int *pi_nal, x264_picture_t *pic_in, x264_picture_t *pic_out );
void x264_encoder_close( x264_t * );
int x264_encoder_delayed_frames( x264_t * );
int x264_encoder_maximum_delayed_frames( x264_t * );
void x264_encoder_intra_refresh( x264_t * );
int x264_encoder_invalidate_reference( x264_t *, int64_t pts );
#ifdef __cplusplus
}
#endif
#endif