317 lines
12 KiB
C
317 lines
12 KiB
C
![]() |
/*
|
||
|
Copyright (c), 2001-2022, Shenshu Tech. Co., Ltd.
|
||
|
*/
|
||
|
|
||
|
#ifndef OT_COMMON_VDEC_H
|
||
|
#define OT_COMMON_VDEC_H
|
||
|
#include "ot_type.h"
|
||
|
#include "ot_common.h"
|
||
|
#include "ot_errno.h"
|
||
|
#include "ot_common_video.h"
|
||
|
#include "ot_common_vb.h"
|
||
|
#include "ot_defines.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
typedef enum {
|
||
|
OT_VDEC_SEND_MODE_STREAM = 0, /* Send by stream. */
|
||
|
OT_VDEC_SEND_MODE_FRAME, /* Send by frame. */
|
||
|
/**
|
||
|
* One frame supports multiple packets sending.
|
||
|
* The current frame is considered to end when end_of_frame is equal to TD_TRUE.
|
||
|
*/
|
||
|
OT_VDEC_SEND_MODE_COMPAT,
|
||
|
OT_VDEC_SEND_MODE_BUTT
|
||
|
} ot_vdec_send_mode;
|
||
|
|
||
|
typedef enum {
|
||
|
OT_VIDEO_DEC_MODE_IPB = 0,
|
||
|
OT_VIDEO_DEC_MODE_IP,
|
||
|
OT_VIDEO_DEC_MODE_I,
|
||
|
OT_VIDEO_DEC_MODE_BUTT
|
||
|
} ot_video_dec_mode;
|
||
|
|
||
|
typedef enum {
|
||
|
OT_VIDEO_OUT_ORDER_DISPLAY = 0,
|
||
|
OT_VIDEO_OUT_ORDER_DEC,
|
||
|
OT_VIDEO_OUT_ORDER_BUTT
|
||
|
} ot_video_out_order;
|
||
|
|
||
|
typedef enum {
|
||
|
OT_VDEC_EVENT_STREAM_ERR = 1,
|
||
|
OT_VDEC_EVENT_UNSUPPORT,
|
||
|
OT_VDEC_EVENT_ERR_THRESHOLD_OVER,
|
||
|
OT_VDEC_EVENT_REF_NUM_OVER,
|
||
|
OT_VDEC_EVENT_SLICE_NUM_OVER,
|
||
|
OT_VDEC_EVENT_SPS_NUM_OVER,
|
||
|
OT_VDEC_EVENT_PPS_NUM_OVER,
|
||
|
OT_VDEC_EVENT_PIC_BUF_SIZE_ERR,
|
||
|
OT_VDEC_EVENT_SIZE_OVER,
|
||
|
OT_VDEC_EVENT_FRAME_SIZE_CHG,
|
||
|
OT_VDEC_EVENT_VPS_NUM_OVER,
|
||
|
OT_VDEC_EVENT_BUTT
|
||
|
} ot_vdec_event;
|
||
|
|
||
|
typedef enum {
|
||
|
OT_VDEC_CAPACITY_STRATEGY_BY_MOD = 0,
|
||
|
OT_VDEC_CAPACITY_STRATEGY_BY_CHN = 1,
|
||
|
OT_VDEC_CAPACITY_STRATEGY_BUTT
|
||
|
} ot_vdec_capacity_strategy;
|
||
|
|
||
|
typedef enum {
|
||
|
OT_VDEC_FRAME_TYPE_I = 0,
|
||
|
OT_VDEC_FRAME_TYPE_P = 1,
|
||
|
OT_VDEC_FRAME_TYPE_B = 2,
|
||
|
OT_VDEC_FRAME_TYPE_BUTT
|
||
|
} ot_vdec_frame_type;
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
td_u32 ref_frame_num; /* RW, Range: [0, 16]; reference frame num. */
|
||
|
/**
|
||
|
* RW; Specifies whether temporal motion vector predictors
|
||
|
* can be used for inter prediction.
|
||
|
*/
|
||
|
td_bool temporal_mvp_en;
|
||
|
td_u32 tmv_buf_size; /* RW; The size of tmv buffer (byte). */
|
||
|
} ot_vdec_video_attr;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_payload_type type; /* RW; Video type to be decoded. */
|
||
|
ot_vdec_send_mode mode; /* RW; Send by stream or by frame. */
|
||
|
td_u32 pic_width; /* RW; Max width of pic. */
|
||
|
td_u32 pic_height; /* RW; Max height of pic. */
|
||
|
td_u32 stream_buf_size; /* RW; The size of stream buffer (byte). */
|
||
|
td_u32 frame_buf_size; /* RW; The size of frame buffer (byte). */
|
||
|
td_u32 frame_buf_cnt;
|
||
|
union {
|
||
|
/**
|
||
|
* RW; Structure with video (h264/h265/mpeg4).
|
||
|
* AUTO:ot_payload_type:OT_PT_H264, OT_PT_H265, OT_PT_MP4VIDEO;
|
||
|
*/
|
||
|
ot_vdec_video_attr video_attr;
|
||
|
};
|
||
|
} ot_vdec_chn_attr;
|
||
|
|
||
|
typedef struct {
|
||
|
td_bool end_of_frame; /* W; Is the end of a frame. */
|
||
|
td_bool end_of_stream; /* W; Is the end of all stream. */
|
||
|
td_bool need_display; /* W; Is the current frame displayed. only valid by OT_VDEC_SEND_MODE_FRAME. */
|
||
|
td_u64 pts; /* W; Time stamp */
|
||
|
td_u64 private_data; /* W; Private data, only valid by OT_VDEC_SEND_MODE_FRAME or OT_VDEC_SEND_MODE_COMPAT. */
|
||
|
td_u32 len; /* W; The len of stream */
|
||
|
td_u8 *ATTRIBUTE addr; /* W; The address of stream. */
|
||
|
} ot_vdec_stream;
|
||
|
|
||
|
typedef struct {
|
||
|
td_phys_addr_t phys_addr; /* R; The physical address of user data. */
|
||
|
td_u32 len; /* R; The len of user data. */
|
||
|
td_bool is_valid; /* R; Is valid? */
|
||
|
td_u8 *ATTRIBUTE virt_addr; /* R; The virtual address of user data. */
|
||
|
} ot_vdec_user_data;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_vdec_frame_type frame_type;
|
||
|
td_u32 err_rate;
|
||
|
td_u32 poc;
|
||
|
} ot_vdec_video_supplement_info;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_payload_type type; /* RW; Video type to be decoded. */
|
||
|
union {
|
||
|
/**
|
||
|
* Structure with video (h265/h264/mpeg4).
|
||
|
* AUTO:ot_payload_type:OT_PT_H264, OT_PT_H265, OT_PT_MP4VIDEO;
|
||
|
*/
|
||
|
ot_vdec_video_supplement_info video_supplement_info;
|
||
|
};
|
||
|
} ot_vdec_supplement_info;
|
||
|
|
||
|
typedef struct {
|
||
|
td_s32 set_pic_size_err; /* R; Picture width or height is larger than channel width or height. */
|
||
|
td_s32 set_protocol_num_err; /* R; Protocol num is not enough. eg: slice, pps, sps. */
|
||
|
td_s32 set_ref_num_err; /* R; Reference num is not enough. */
|
||
|
td_s32 set_pic_buf_size_err; /* R; The buffer size of picture is not enough. */
|
||
|
td_s32 format_err; /* R; Format error. eg: do not support filed. */
|
||
|
td_s32 stream_unsupport; /* R; Unsupported stream specification. */
|
||
|
td_s32 pack_err; /* R; Stream package error. */
|
||
|
td_s32 stream_size_over; /* R; The stream size is too big and force discard stream. */
|
||
|
td_s32 stream_not_release; /* R; The stream not released for too long time. */
|
||
|
} ot_vdec_dec_err;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_payload_type type; /* R; Video type to be decoded. */
|
||
|
td_u32 left_stream_bytes; /* R; Left stream bytes waiting for decode. */
|
||
|
td_u32 left_stream_frames; /* R; Left frames waiting for decode,only valid for OT_VDEC_SEND_MODE_FRAME. */
|
||
|
td_u32 left_decoded_frames; /* R; Pics waiting for output. */
|
||
|
td_bool is_started; /* R; Had started recv stream? */
|
||
|
td_u32 recv_stream_frames; /* R; How many frames of stream has been received. valid when send by frame. */
|
||
|
td_u32 dec_stream_frames; /* R; How many frames of stream has been decoded. valid when send by frame. */
|
||
|
ot_vdec_dec_err dec_err; /* R; Information about decode error. */
|
||
|
td_u32 width; /* R; The width of the currently decoded stream. */
|
||
|
td_u32 height; /* R; The height of the currently decoded stream. */
|
||
|
td_u64 latest_frame_pts; /* R; PTS of the latest decoded frame. */
|
||
|
} ot_vdec_chn_status;
|
||
|
|
||
|
typedef enum {
|
||
|
OT_QUICK_MARK_ADAPT = 0,
|
||
|
OT_QUICK_MARK_FORCE,
|
||
|
OT_QUICK_MARK_NONE,
|
||
|
OT_QUICK_MARK_BUTT
|
||
|
} ot_quick_mark_mode;
|
||
|
|
||
|
typedef struct {
|
||
|
/* RW; TD_FALSE: output base layer; TD_TRUE: output enhance layer; default: TD_FALSE */
|
||
|
td_bool composite_dec_en;
|
||
|
/* RW; TD_FALSE: don't support slice low latency; TD_TRUE: support slice low latency; default: TD_FALSE */
|
||
|
td_bool slice_input_en;
|
||
|
/**
|
||
|
* RW, Range: [0, 100]; threshold for stream error process,
|
||
|
* 0: discard with any error, 100 : keep data with any error.
|
||
|
*/
|
||
|
td_s32 err_threshold;
|
||
|
/**
|
||
|
* RW; Decode mode , 0: decode IPB frames,
|
||
|
* 1: only decode I frame & P frame , 2: only decode I frame.
|
||
|
*/
|
||
|
ot_video_dec_mode dec_mode;
|
||
|
/**
|
||
|
* RW; Frames output order ,
|
||
|
* 0: the same with display order , 1: the same width decoder order.
|
||
|
*/
|
||
|
ot_video_out_order out_order;
|
||
|
ot_compress_mode compress_mode; /* RW; Compress mode. */
|
||
|
ot_video_format video_format; /* RW; Video format. */
|
||
|
ot_quick_mark_mode quick_mark_mode;
|
||
|
} ot_vdec_video_param;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_pixel_format pixel_format; /* RW; Out put pixel format. */
|
||
|
/**
|
||
|
* RW, range: [0, 255]; Value 0 is transparent.
|
||
|
* [0 ,127] is deemed to transparent when pixel_format is ARGB1555 or ABGR1555
|
||
|
* [128 ,256] is deemed to non-transparent when pixel_format is ARGB1555 or ABGR1555.
|
||
|
*/
|
||
|
td_u32 alpha;
|
||
|
} ot_vdec_pic_param;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_payload_type type; /* RW; Video type to be decoded. */
|
||
|
td_u32 display_frame_num; /* RW, Range: [0, 16]; display frame num. */
|
||
|
union {
|
||
|
/**
|
||
|
* Structure with video (h265/h264/mpeg4).
|
||
|
* AUTO:ot_payload_type:OT_PT_H264, OT_PT_H265, OT_PT_MP4VIDEO;
|
||
|
*/
|
||
|
ot_vdec_video_param video_param;
|
||
|
/**
|
||
|
* Structure with picture (jpeg/mjpeg).
|
||
|
* AUTO:ot_payload_type:OT_PT_JPEG, OT_PT_MJPEG;
|
||
|
*/
|
||
|
ot_vdec_pic_param pic_param;
|
||
|
};
|
||
|
} ot_vdec_chn_param;
|
||
|
|
||
|
typedef struct {
|
||
|
td_s32 max_slice_num; /* RW; Max slice num support. */
|
||
|
td_s32 max_sps_num; /* RW; Max sps num support. */
|
||
|
td_s32 max_pps_num; /* RW; Max pps num support. */
|
||
|
} ot_h264_protocol_param;
|
||
|
|
||
|
typedef struct {
|
||
|
td_s32 max_slice_segment_num; /* RW; Max slice segment num support. */
|
||
|
td_s32 max_vps_num; /* RW; Max vps num support. */
|
||
|
td_s32 max_sps_num; /* RW; Max sps num support. */
|
||
|
td_s32 max_pps_num; /* RW; Max pps num support. */
|
||
|
} ot_h265_protocol_param;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_payload_type type; /* RW; Video type to be decoded, only h264 and h265 supported. */
|
||
|
union {
|
||
|
/**
|
||
|
* Protocol param structure for h264.
|
||
|
* AUTO:ot_payload_type:OT_PT_H264;
|
||
|
*/
|
||
|
ot_h264_protocol_param h264_param;
|
||
|
/**
|
||
|
* Protocol param structure for h265.
|
||
|
* AUTO:ot_payload_type:OT_PT_H265;
|
||
|
*/
|
||
|
ot_h265_protocol_param h265_param;
|
||
|
};
|
||
|
} ot_vdec_protocol_param;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_vb_pool pic_vb_pool; /* RW; Vb pool id for pic buffer. */
|
||
|
ot_vb_pool tmv_vb_pool; /* RW; Vb pool id for tmv buffer. */
|
||
|
} ot_vdec_chn_pool;
|
||
|
|
||
|
typedef struct {
|
||
|
td_u32 max_pic_width;
|
||
|
td_u32 max_pic_height;
|
||
|
td_u32 max_slice_num;
|
||
|
td_u32 vdh_msg_num;
|
||
|
} ot_vdec_video_mod_param;
|
||
|
|
||
|
typedef struct {
|
||
|
td_u32 max_pic_width;
|
||
|
td_u32 max_pic_height;
|
||
|
td_bool progressive_en;
|
||
|
td_bool dynamic_alloc_en;
|
||
|
ot_vdec_capacity_strategy capacity_strategy;
|
||
|
} ot_vdec_pic_mod_param;
|
||
|
|
||
|
typedef struct {
|
||
|
ot_vb_src vb_src; /* RW, Range: [1, 3]; frame buffer mode. */
|
||
|
td_u32 mini_buf_mode; /* RW, Range: [0, 1]; stream buffer mode. */
|
||
|
ot_vdec_video_mod_param video_mod_param;
|
||
|
ot_vdec_pic_mod_param pic_mod_param;
|
||
|
} ot_vdec_mod_param;
|
||
|
|
||
|
typedef struct {
|
||
|
td_bool enable;
|
||
|
td_u32 max_user_data_len;
|
||
|
} ot_vdec_user_data_attr;
|
||
|
|
||
|
/*********************************************************************************************/
|
||
|
/* Invalid channel ID. */
|
||
|
#define OT_ERR_VDEC_INVALID_CHN_ID OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_INVALID_CHN_ID)
|
||
|
/* At least one parameter is illegal ,eg, an illegal enumeration value. */
|
||
|
#define OT_ERR_VDEC_ILLEGAL_PARAM OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_ILLEGAL_PARAM)
|
||
|
/* Channel exists. */
|
||
|
#define OT_ERR_VDEC_EXIST OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_EXIST)
|
||
|
/* Using a NULL pointer. */
|
||
|
#define OT_ERR_VDEC_NULL_PTR OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_NULL_PTR)
|
||
|
/* Try to enable or initialize system,device or channel, before configure attribute. */
|
||
|
#define OT_ERR_VDEC_NOT_CFG OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_CFG)
|
||
|
/* Operation is not supported by NOW. */
|
||
|
#define OT_ERR_VDEC_NOT_SUPPORT OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_SUPPORT)
|
||
|
/* Operation is not permitted ,eg, try to change statuses attribute. */
|
||
|
#define OT_ERR_VDEC_NOT_PERM OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_PERM)
|
||
|
/* The channel is not existed. */
|
||
|
#define OT_ERR_VDEC_UNEXIST OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_UNEXIST)
|
||
|
/* Failure caused by malloc memory. */
|
||
|
#define OT_ERR_VDEC_NO_MEM OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_NO_MEM)
|
||
|
/* Failure caused by malloc buffer. */
|
||
|
#define OT_ERR_VDEC_NO_BUF OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_NO_BUF)
|
||
|
/* No data in buffer. */
|
||
|
#define OT_ERR_VDEC_BUF_EMPTY OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_BUF_EMPTY)
|
||
|
/* No buffer for new data. */
|
||
|
#define OT_ERR_VDEC_BUF_FULL OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_BUF_FULL)
|
||
|
/* System is not ready,had not initialed or loaded. */
|
||
|
#define OT_ERR_VDEC_SYS_NOT_READY OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_READY)
|
||
|
/* System busy */
|
||
|
#define OT_ERR_VDEC_BUSY OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_BUSY)
|
||
|
|
||
|
/* Bad address, eg. used for copy_from_user & copy_to_user. */
|
||
|
#define OT_ERR_VDEC_BAD_ADDR OT_DEFINE_ERR(OT_ID_VDEC, OT_ERR_LEVEL_ERROR, OT_ERR_BAD_ADDR)
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* end of #ifndef OT_COMMON_VDEC_H */
|
||
|
|