#ifndef _VENC_CORE_H_
#define _VENC_CORE_H_
#include <stdint.h>
#include <unistd.h>
#include <libpomp.h>
#include <media-buffers/mbuf_coded_video_frame.h>
#include <media-buffers/mbuf_raw_video_frame.h>
#include <video-defs/vdefs.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef VENC_API_EXPORTS
# ifdef _WIN32
# define VENC_API __declspec(dllexport)
# else
# define VENC_API __attribute__((visibility("default")))
# endif
#else
# define VENC_API
#endif
#define VENC_ANCILLARY_KEY_INPUT_TIME "venc.input_time"
#define VENC_ANCILLARY_KEY_DEQUEUE_TIME "venc.dequeue_time"
#define VENC_ANCILLARY_KEY_OUTPUT_TIME "venc.output_time"
#define VENC_ANCILLARY_KEY_INPUT_QUEUE_STATUS "venc.input_status"
struct venc_encoder;
struct venc_input_status {
uint32_t queue_frames;
uint32_t encoder_frames;
};
enum venc_encoder_implem {
VENC_ENCODER_IMPLEM_AUTO = 0,
VENC_ENCODER_IMPLEM_X264,
VENC_ENCODER_IMPLEM_X265,
VENC_ENCODER_IMPLEM_HISI,
VENC_ENCODER_IMPLEM_QCOM,
VENC_ENCODER_IMPLEM_QCOM_JPEG,
VENC_ENCODER_IMPLEM_MEDIACODEC,
VENC_ENCODER_IMPLEM_FAKEH264,
VENC_ENCODER_IMPLEM_VIDEOTOOLBOX,
VENC_ENCODER_IMPLEM_TURBOJPEG,
VENC_ENCODER_IMPLEM_MAX,
};
enum venc_rate_control {
VENC_RATE_CONTROL_CBR = 0,
VENC_RATE_CONTROL_VBR,
VENC_RATE_CONTROL_CQ,
};
enum venc_entropy_coding {
VENC_ENTROPY_CODING_CABAC = 0,
VENC_ENTROPY_CODING_CAVLC,
};
enum venc_intra_refresh {
VENC_INTRA_REFRESH_NONE = 0,
VENC_INTRA_REFRESH_VERTICAL_SCAN,
VENC_INTRA_REFRESH_SMART_SCAN,
};
struct venc_config_impl {
enum venc_encoder_implem implem;
};
struct venc_config {
const char *name;
const char *device;
enum venc_encoder_implem implem;
unsigned int preferred_thread_count;
unsigned int preferred_max_frames_in_encoder;
enum vdef_encoding encoding;
struct {
unsigned int preferred_min_buf_count;
struct vdef_raw_format format;
struct vdef_format_info info;
} input;
struct {
unsigned int preferred_min_buf_count;
enum vdef_coded_data_format preferred_format;
} output;
union {
struct {
unsigned int profile;
unsigned int level;
enum venc_rate_control rate_control;
unsigned int min_qp;
unsigned int max_qp;
unsigned int qp;
int intra_qp_delta;
int chroma_qp_delta;
unsigned int max_bitrate;
unsigned int target_bitrate;
unsigned int cpb_size;
float gop_length_sec;
unsigned int decimation;
unsigned int base_frame_interval;
unsigned int ref_frame_interval;
unsigned int slice_size_mbrows;
enum venc_entropy_coding entropy_coding;
enum venc_intra_refresh intra_refresh;
unsigned int intra_refresh_period;
unsigned int intra_refresh_length;
int insert_ps;
int insert_aud;
int insert_recovery_point_sei;
int insert_pic_timing_sei;
int streaming_user_data_sei_version;
int serialize_user_data;
int rfc6184_nri_bits;
} h264;
struct {
unsigned int profile;
unsigned int level;
enum venc_rate_control rate_control;
unsigned int min_qp;
unsigned int max_qp;
unsigned int qp;
int intra_qp_delta;
int chroma_qp_delta;
unsigned int max_bitrate;
unsigned int target_bitrate;
unsigned int cpb_size;
float gop_length_sec;
unsigned int decimation;
int insert_ps;
int insert_aud;
int insert_recovery_point_sei;
int insert_time_code_sei;
int insert_mdcv_sei;
int insert_cll_sei;
int streaming_user_data_sei_version;
int serialize_user_data;
} h265;
struct {
enum venc_rate_control rate_control;
unsigned int quality;
unsigned int max_bitrate;
unsigned int target_bitrate;
} mjpeg;
};
struct venc_config_impl *implem_cfg;
};
struct venc_dyn_config {
unsigned int qp;
unsigned int target_bitrate;
unsigned int decimation;
};
struct venc_input_buffer_constraints {
unsigned int plane_stride_align[VDEF_RAW_MAX_PLANE_COUNT];
unsigned int plane_scanline_align[VDEF_RAW_MAX_PLANE_COUNT];
unsigned int plane_size_align[VDEF_RAW_MAX_PLANE_COUNT];
};
struct venc_cbs {
void (*frame_output)(struct venc_encoder *enc,
int status,
struct mbuf_coded_video_frame *frame,
void *userdata);
void (*flush)(struct venc_encoder *enc, void *userdata);
void (*stop)(struct venc_encoder *enc, void *userdata);
mbuf_coded_video_frame_pre_release_t pre_release;
};
VENC_API enum venc_encoder_implem venc_encoder_implem_from_str(const char *str);
VENC_API const char *
venc_encoder_implem_to_str(enum venc_encoder_implem implem);
VENC_API enum venc_rate_control venc_rate_control_from_str(const char *str);
VENC_API const char *venc_rate_control_to_str(enum venc_rate_control rc);
VENC_API enum venc_entropy_coding venc_entropy_coding_from_str(const char *str);
VENC_API const char *
venc_entropy_coding_to_str(enum venc_entropy_coding coding);
VENC_API enum venc_intra_refresh venc_intra_refresh_from_str(const char *str);
VENC_API const char *venc_intra_refresh_to_str(enum venc_intra_refresh ir);
#ifdef __cplusplus
}
#endif
#endif