sdk-hwV1.3/external/eyesee-mpp/middleware/sun8iw21/include/media/mm_comm_vdec.h

240 lines
10 KiB
C
Raw Normal View History

2024-05-07 10:09:20 +00:00
/******************************************************************************
Copyright (C), 2001-2016, Allwinner Tech. Co., Ltd.
******************************************************************************
File Name : mm_comm_vdec.h
Version : Initial Draft
Author : Allwinner BU3-PD2 Team
Created : 2016/04/20
Last Modified :
Description : common struct definition for VDEC
Function List :
History :
******************************************************************************/
#ifndef __IPCLINUX_COMM_VDEC_H__
#define __IPCLINUX_COMM_VDEC_H__
#include "mm_comm_video.h"
#include "mm_common.h"
#include "plat_defines.h"
#include "plat_errno.h"
#include "plat_type.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
/*vdec channel attr(user interface)*/
//#define AW_IO_BLOCK HI_TRUE
//#define AW_IO_NOBLOCK HI_FALSE
typedef struct VDEC_CHN_LUM_S {
uint64_t mLumPixSum; /* Luma sum of current frame */
unsigned int mLumPixAverage; /* Luma average of current frame */
uint64_t mPts; /* PTS of current frame ?? */
} VDEC_CHN_LUM_S;
typedef enum VIDEO_MODE_E {
VIDEO_MODE_STREAM = 0, /*send by stream*/
VIDEO_MODE_FRAME, /*send by frame*/
VIDEO_MODE_BUTT
} VIDEO_MODE_E;
typedef struct VDEC_ATTR_JPEG_S {
VIDEO_MODE_E enMode; /* video stream mode select */
} VDEC_ATTR_JPEG_S, *PTR_VDEC_ATTR_JPEG_S;
typedef struct VDEC_ATTR_VIDEO_S {
unsigned int mRefFrameNum; /*ref pic num [1,16]*/
VIDEO_MODE_E mMode; /*send by stream or by frame*/
int
mSupportBFrame; /*enable chnl to support BFrame decode, 0: disable support BFrame decode,1: enable support BFrame*/
} VDEC_ATTR_VIDEO_S, *PTR_VDEC_ATTR_VIDEO_S;
typedef struct VDEC_CHN_ATTR_S {
PAYLOAD_TYPE_E mType; /* video type to be decoded */
unsigned int mBufSize; /* stream buf size(Byte) */
unsigned int mPriority; /* priority */
unsigned int mPicWidth; /* max pic width */
unsigned int mPicHeight; /* max pic height */
ROTATE_E mInitRotation; //clockwise rotation: val=0 no rotation, val=1 90 degree; val=2 180 degree, val=3 270 degree
PIXEL_FORMAT_E mOutputPixelFormat;
BOOL mSubPicEnable; //support second picture flag, now just for mjpeg,20180103
int mSubPicWidthRatio; // val = 0 : 1; 1 : 1/2; 2 : 1/4; 3 : 1/8; 4 : 1/16
int mSubPicHeightRatio;//[0 4],
PIXEL_FORMAT_E mSubOutputPixelFormat; //sub channel output pixelformat
union {
VDEC_ATTR_JPEG_S mVdecJpegAttr; /* structure with jpeg or mjpeg type */
VDEC_ATTR_VIDEO_S mVdecVideoAttr; /* structure with video ( h264/mpeg4) */
};
int mnFrameBufferNum; /* set frame number which is malloc by vdeclib, 0 means any number. only valid to jpeg.*/
int mExtraFrameNum; /* let vdeclib malloc more frame buffer base on initial frame number.*/
} VDEC_CHN_ATTR_S;
typedef struct VDEC_STREAM_S {
unsigned char* pAddr; /* stream address */
unsigned int mLen; /* stream len */
uint64_t mPTS; /* time stamp */
BOOL mbEndOfFrame; /* is the end of a frame */
BOOL mbEndOfStream; /* is the end of all stream */
} VDEC_STREAM_S;
typedef struct VDEC_USERDATA_S {
unsigned char* pu8Addr; /* userdata data vir address */
unsigned int u32PhyAddr; /* userdata data phy address */
unsigned int u32Len; /* userdata data len */
BOOL bValid; /* is valid? */
} VDEC_USERDATA_S;
typedef struct VDEC_DECODE_FRAME_PARAM_S
{
int mDecodeFrameNum;
}VDEC_DECODE_FRAME_PARAM_S;
typedef struct VDEC_DECODE_ERROR_S {
int mFormatErr; /* format error. eg: do not support filed */
int mPicSizeErrSet; /* picture width or height is larger than chnnel width or height*/
int mStreamUnsprt; /* unsupport the stream specification */
int mPackErr; /* stream package error */
int mPrtclNumErrSet; /* protocol num is not enough. eg: slice, pps, sps */
int mRefErrSet; /* refrence num is not enough */
int mPicBufSizeErrSet; /* the buffer size of picture is not enough */
} VDEC_DECODE_ERROR_S;
typedef struct VDEC_CHN_STAT_S {
PAYLOAD_TYPE_E mType; /* video type to be decoded */
unsigned int mLeftStreamBytes; /* left stream bytes waiting for decode */
unsigned int mLeftStreamFrames; /* left frames waiting for decode,only valid for H264D_MODE_FRAME */
unsigned int mLeftPics; /* pics waiting for output */
BOOL mbStartRecvStream; /* had started recv stream? */
unsigned int mRecvStreamFrames; /* how many frames of stream has been received. valid when send by frame. */
unsigned int mDecodeStreamFrames; /* how many frames of stream has been decoded. valid when send by frame. */
unsigned int mLeftDecodeStreamFrames; /* Number of frames to be decoded. This member is valid after AW_MPI_VDEC_StartRecvStreamEx is called.*/
VDEC_DECODE_ERROR_S mVdecDecErr; /* information about decode error */
} VDEC_CHN_STAT_S;
/*
* static parameter: must set after stop sending stream and all stream is decoded.
* dynamic parameter: can be set at any time.
*/
typedef struct VDEC_CHN_PARAM_S {
int mChanErrThr; /* threshold for stream error process, 0: discard with any error, 100 : keep data with any error */
int mChanStrmOFThr; /* threshold for stream overflow, 0~ , 0: nothing to do when stream is overflow */
int mDecMode; /* decode mode , 0: deocde IPB frames, 1: only decode I frame & P frame , 2: only decode I frame */
int mDecOrderOutput; /* frames output order ,0: the same with display order , 1: the same with decoder order */
VIDEO_FORMAT_E mVideoFormat;
COMPRESS_MODE_E mCompressMode;
} VDEC_CHN_PARAM_S;
typedef struct VDEC_PRTCL_PARAM_S {
int mMaxSliceNum; /* max slice num support */
int mMaxSpsNum; /* max sps num support */
int mMaxPpsNum; /* max pps num support */
int mDisplayFrameNum; /* display frame num */
} VDEC_PRTCL_PARAM_S;
//structure & varibale for jpegd decoder lib
/*********************************************************************************************************/
/* stream packet for jpeg */
typedef struct JPEGD_STREAM_PACKET_S {
unsigned int PhyAddr[2];
void* VirAddr[2];
unsigned int Length[2];
uint64_t Pts;
unsigned int Index;
} USR_STREAM_PACKET_S;
/* description structure for memory record */
typedef struct USR_MEM_DESC_S {
unsigned int u32PhyAddr;
unsigned int u32Length;
} USR_MEM_DESC_S;
typedef enum JPEGD_DECODE_ERROR_E {
JPEGD_ERR_NONE = 0,
JPEGD_ERR_STREAM,
JPEGD_ERR_PIC_SIZE,
JPEGD_ERR_PICBUF_SIZE,
JPEGD_ERR_FORMAT,
VIDEO_ERR_BULL
} JPEGD_DECODE_ERROR_E;
typedef enum VDEC_JPG_COLOR_FMT_E {
JPG_COLOR_FMT_YCBCR400, /*YUV400*/
JPG_COLOR_FMT_YCBCR420 = 3, /*YUV420*/
JPG_COLOR_FMT_YCBCR422BHP, /*YUV 422 2x1*/
JPG_COLOR_FMT_YCBCR422BVP, /*YUV 422 1x2*/
JPG_COLOR_FMT_YCBCR444, /*YUV 444*/
JPG_COLOR_FMT_BUTT
} VDEC_JPG_COLOR_FMT_E;
typedef struct {
VDEC_JPG_COLOR_FMT_E enFmt; /* YUV format */
int s32IsFrameValid;
uint64_t u64LuPixSum;
uint64_t Pts;
int s32IsSemiPlanar;
int s32YWidth;
int s32YHeight;
int s32LumaPhyAddr;
int s32LumaStride;
int
s32CbPhyAddr; /* semi-planar: this variable is PhyAddr of interlaced chroma; planar: this variable is PhyAddr of Cb */
int s32CrPhyAddr; /* semi-planar: this variable is not value ; planar: this variable is PhyAddr of Cr */
int s32ChromStride;
int s32ChromCrStride;
} VDEC_FRAME_DESC_S;
/************************************************************************************************************************/
/* invlalid channel ID */
#define ERR_VDEC_INVALID_CHNID DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID)
/* at lease one parameter is illagal ,eg, an illegal enumeration value */
#define ERR_VDEC_ILLEGAL_PARAM DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM)
/* channel exists */
#define ERR_VDEC_EXIST DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST)
/* using a NULL point */
#define ERR_VDEC_NULL_PTR DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR)
/* try to enable or initialize system,device or channel, before configing attribute */
#define ERR_VDEC_NOT_CONFIG DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG)
/* operation is not supported by NOW */
#define ERR_VDEC_NOT_SURPPORT DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT)
/* operation is not permitted ,eg, try to change stati attribute */
#define ERR_VDEC_NOT_PERM DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM)
/* the channle is not existed */
#define ERR_VDEC_UNEXIST DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST)
/* failure caused by malloc memory */
#define ERR_VDEC_NOMEM DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM)
/* failure caused by malloc buffer */
#define ERR_VDEC_NOBUF DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF)
/* no data in buffer */
#define ERR_VDEC_BUF_EMPTY DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY)
/* no buffer for new data */
#define ERR_VDEC_BUF_FULL DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL)
/* system is not ready,had not initialed or loaded*/
#define ERR_VDEC_SYS_NOTREADY DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY)
/*system busy*/
#define ERR_VDEC_BUSY DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY)
/* component state is same as user wanted */
#define ERR_VDEC_SAMESTATE DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_SAMESTATE)
/* component state is transit to invalid state */
#define ERR_VDEC_INVALIDSTATE DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALIDSTATE)
/* component current state can't transit to destination state */
#define ERR_VDEC_INCORRECT_STATE_TRANSITION DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_INCORRECT_STATE_TRANSITION)
/* Attempting a command that is not allowed during the present state. */
#define ERR_VDEC_INCORRECT_STATE_OPERATION DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_INCORRECT_STATE_OPERATION)
/* bad address, eg. used for copy_from_user & copy_to_user */
#define ERR_VDEC_BADADDR DEF_ERR(MOD_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR)
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
#endif /* End of #ifndef __IPCLINUX_COMM_VDEC_H__ */