sdk-hwV1.3/external/fast-user-adapter/rt_media/api_adapter/AW_VideoInput_API.h

360 lines
13 KiB
C
Raw Normal View History

2024-05-07 10:09:20 +00:00
/**
@file
*/
#ifndef _AW_VIDEOINPUT_H_
#define _AW_VIDEOINPUT_H_
#include <stdint.h>
#include <stdio.h>
#include <media/rt-media/uapi_rt_media.h>
#include <media/sunxi_camera_v2.h>
// 一般API int 返回值表示:0)成功; <0)失败;
#define WAIT_CSI_TIMEOUT_TIME 5*1000*1000
// H264视频采集回调
// tv 定义为采集时的时间戳gettimeofday(&tv, NULL); 必须真实 ,根据平台不一样可以改为long long(8byte) ms单位数据从1970开始).。
// 时间戳为实现时问与osd时间显示一致。
// data 为NALU数据以 00 00 00 01开始的
// keyframe 为关键帧标志。如果是关键帧data需要同时包含NALU SPS、PPS
// SDK h264等编码数据不需要buffer回调返回再encode下一帧。
typedef struct AWVideoInput_StreamInfo {
uint64_t pts; //unit:us
unsigned char *data0;
unsigned char *data1;
unsigned char *data2;
unsigned int size0;
unsigned int size1;
unsigned int size2;
unsigned char* sps_pps_buf;
int sps_pps_size;
int b_insert_sps_pps;
int keyframe_flag;
int channel_id;
STREAM_DATA_INFO* stream_data;
} AWVideoInput_StreamInfo;
typedef void (*Video_Input_cb)(const AWVideoInput_StreamInfo* stream_info);
typedef void (*Channel_Thread_exit)(void);
typedef enum AWVideoInput_EventType
{
AWVideoInput_Event_None = 0,
AWVideoInput_Event_DropFrame, //kernel rtmedia drop frame, so notify app. nData1 = dropNum
AWVideoInput_Event_StreamReady, // AWVideoInput_StreamInfo*
/**
channel thread meet serious error and wait to exit, so notify app to do exit procedure through this event, then
channel thread wait app to destroy it.
*/
AWVideoInput_Event_WaitErrorExit,
} AWVideoInput_EventType;
typedef int (*AWVideoInputCallbackType)(void *pAppData, int channel, AWVideoInput_EventType event, int nData1, int nData2, void *pEventData);
typedef void (*AWTdmBufferDoneCallback)(struct vin_isp_tdm_event_status *status);
typedef enum
{
VIDEO_NIGHT = 0,
VIDEO_DAY,
}VIDEO_HASLIGHT;
typedef enum
{
IR_MODE_AUTO = 0, // 自动红外。由SDK层自动切换
IR_MODE_ON = 1, // 强制开红外SDK层不自动切换
IR_MODE_OFF = 2, // 强制关红外SDK层不自动切换
}IR_MODE;
typedef struct VideoChannelInfo
{
VideoInputConfig mConfig;
int state;
}VideoChannelInfo;
typedef struct {
int enable_wbyuv;
FILE *wbyuv_file;
unsigned char *yuvBuf;
unsigned int yuvSize;
int get_num;
}WbYuvFuncInfo;
typedef struct VideoYuvFrame
{
int widht;
int height;
unsigned char* phyAddr[3];
unsigned char* virAddr[3];
}VideoYuvFrame;
typedef enum AWVideoInput_State
{
VIDEO_INPUT_STATE_IDLE = 0,
VIDEO_INPUT_STATE_CONFIGED = 1,
VIDEO_INPUT_STATE_EXCUTING = 2,
VIDEO_INPUT_STATE_PAUSE = 3,
}AWVideoInput_State;
typedef struct sps_pps_data_info {
unsigned char* buf;
int size;
int bInit;
}sps_pps_data_info;
typedef struct {
int x;
int y;
} AWVideoInput_VideoPoint;
typedef struct {
unsigned short src_width;
unsigned short src_height;
} AWVideoInput_VideoSrcRes;
typedef struct {
RTVencRect face_roi_rgn[RT_AE_FACE_MAX_NUM];
unsigned char enable;
unsigned char vaild_face_num;
short face_ae_tolerance;
short face_ae_speed;
short face_ae_target;
short face_ae_delay_cnt;
unsigned short face_up_percent;
unsigned short face_down_percent;
unsigned short ae_face_block_num_thrd;
unsigned short ae_face_block_weight;
unsigned short ae_over_face_max_exp_control;
unsigned short ae_face_win_weight[RT_AE_FACE_WIN_WEIGHT_LENGTH];
int ae_face_pos_weight[RT_AE_FACE_POS_WEIGHT_LENGTH];
} AWVideoInput_FaceAeInfo;
// 一般使用流程Init -> Configure()等-->CallBack()-->Start(). 最终用完 DeInit();
int AWVideoInput_Init(void);
int AWVideoInput_Configure(int channel, VideoInputConfig *pCfg);//随时可被调用,sdk处理时需过滤掉与当前相同的参数。
int AWVideoInput_CallBack(int channel, Video_Input_cb cb, int bAppendSpspps);//bAppendSpspps = 1, will insert spspps every I frame
int AWVideoInput_SetChannelThreadExitCb(int channel, Channel_Thread_exit cb);
int AWVideoInput_SetChannelCallback(int channel, AWVideoInputCallbackType cb, void* pAppData);
int AWVideoInput_AppendSpspps(int channel, int bAppendSpspps);
int AWVideoInput_Start(int channel,int bStart); //开始与停止
int AWVideoInput_DeInit(void);
int AWVideoInput_Check_Wait_Start(int channel);
/// (operate isp)
int AWVideoInput_Get_csi_status(int channel);
AWVideoInput_State AWVideoInput_Get_channel_state(int channel);
/// 强制下次出I帧 //随时可被调用
int AWVideoInput_SetIFrame(int channel);
/// (operate venc), set overlay or cover to venc. 初始化或随时可被调用
int AWVideoInput_SetOSD(int channel, VideoInputOSD *pOsdInfo);
/// 抓图配置,随时可被调用
int AWVideoInput_CatchJpegConfig(catch_jpeg_config *jpg_conf);
/**
.
@param[in,out] bufLen buf最大长度
*/
int AWVideoInput_CatchJpeg(char *buf, int *bufLen, int channel_id);
/// (operate isp) Get YUV frame
int AWVideoInput_GetYuvFrame(int channel, VideoYuvFrame* pYuvFrame);
/// (operate isp) Release YUV frame
int AWVideoInput_ReleaseYuvFrame(int channel, VideoYuvFrame* pYuvFrame);
// buf: 用于存放bin image data的 内存
// bufLen: buf 长度;
// return: 返回 data 的实际长度
//int AWVideoInput_GetBinImageData(int channel, char *buf, int bufLen);
// buf: 用于存放mv info data的 内存
// bufLen: buf 长度;
// return: 返回 data 的实际长度
//int AWVideoInput_GetMvInfoData(int channel, char *buf, int bufLen);
int AWVideoInput_GetLuminance(int channel);
//Grey0 彩色模式 1 黑白模式
//return 0 成功other 错误码
int AWVideoInput_SetIrParam(int channel, RTIrParam* pIrParam);
//hist: 直方图数组数量为256
//return 0 成功other 错误码
int AWVideoInput_GetHist(int channel, unsigned int *hist);
/**
(operate isp) get isp exp gain.
@param[in] expgain:rgainbgain
@return 0 other
*/
int AWVideoInput_GetExpGain(int channel, RTIspExpGain *expgain);
//水平翻转 -- bflip: 0 非翻转, 1 翻转
int AWVideoInput_SetHFlip(int channel, int bflip);
/**
(operate venc) set encpp sharp to venc.
It can be called after AWVideoInput_Configure(), before or after AWVideoInput_Start().
It can be called before or after VencInit().
@param bsharp
1:enable encpp sharp of venc
0:disable encpp sharp of venc
*/
int AWVideoInput_SetSharp(int channel, int bsharp);
//垂直翻转 -- bflip: 0 非翻转, 1 翻转
int AWVideoInput_SetVFlip(int channel, int bflip);
//设置 power line frequency
int AWVideoInput_SetPowerLineFreq(int channel, RT_POWER_LINE_FREQUENCY power_line_freq);
//设置 isp特效接口
int AWVideoInput_SetBrightness(int channel, int brightness_level);
int AWVideoInput_SetContrast(int channel, int contrast_level);
int AWVideoInput_SetSaturation(int channel, int saturation_level);
int AWVideoInput_SetHue(int channel, int hue_level);
int AWVideoInput_SetSharpness(int channel, int sharpness_level);
//获取当前使用的Sensor名字 char[40]
int AWVideoInput_GetSensorName(int channel, char *name);
//获取Sensor支持的最大分辨率
int AWVideoInput_GetSensorResolution(int channel, RTSensorResolution *sensor_resolution);
//设置 ae metering mode
int AWVideoInput_SetAeMeteringMode(int channel, RT_AE_METERING_MODE ae_metering_mode);
int AWVideoInput_SetAeMode(int channel, int ae_mode);
int AWVideoInput_SetSensorExp(int channel, int exp_time);
int AWVideoInput_SetSensorGain(int channel, int gain);
/**
isp attr cfg.
*/
int AWVideoInput_SetIspAttrCfg(int channel, RTIspCtrlAttr *isp_ctrl_attr);
int AWVideoInput_GetIspAttrCfg(int channel, RTIspCtrlAttr *isp_ctrl_attr);
int AWVideoInput_SetIspFaceAeCfg(int channel, AWVideoInput_FaceAeInfo FaceAeInfo, AWVideoInput_VideoSrcRes Res);
int AWVideoInput_GetIspFaceAeCfg(int channel, AWVideoInput_FaceAeInfo *FaceAeInfo);
/// (operate isp) 设置 isp orl
int AWVideoInput_SetIspOrl(int channel, RTIspOrl *isp_orl);
//动态切换编码器类型,编码类型:0)h264 1)mjpeg 2)h265
//切换编码器前需暂停视频通道,即使用流程如下:
// AWVideoInput_Start(0, 0) --> AWVideoInput_ResetEncoderType() --> AWVideoInput_Start(0, 1)
int AWVideoInput_ResetEncoderType(int channel, int encoderType);
//reset ve buffer
int AWVideoInput_ResetInOutBuffer(int channel);
int AWVideoInput_SetKernelRtMediaStart(int channel);
int AWVideoInput_SetKernelRtMediaPause(int channel);
int AWVideoInput_ReturnStreamData(int channel, STREAM_DATA_INFO *p_stream_data);
/**
.
使
AWVideoInput_Start(0, 0) --> AWVideoInput_ResetSize() --> AWVideoInput_Start(0, 1)
*/
int AWVideoInput_ResetSize(int channel, int widht, int height);
int AWVideoInput_GetChannelInfo(int channel, VideoChannelInfo *pChannelInfo);
//* 动态设置 qp
int AWVideoInput_SetQpRange(int channel, video_qp_range* qp_range);
int AWVideoInput_SetFixQp(int channel, RTVencFixQP* fix_qp);
int AWVideoInput_GetQpRange(int channel, video_qp_range* qp_range);
//* 动态设置码率, 单位kbps
int AWVideoInput_SetBitrate(int channel, int bitrate /* kbps */);
int AWVideoInput_SetJpgQuality(int channel, int nQuality);
int AWVideoInput_SetEnIFrmMbRcMoveStatus(int channel, int nMbRcMoveStatus);
int AWVideoInput_SetH264VideoTiming(int channel, RTVencH264VideoTiming* H264VideoTiming);
int AWVideoInput_SetH265VideoTiming(int channel, RTVencH265TimingS* H265VideoTiming);
//* 获取码率, 单位kbps
int AWVideoInput_GetBitrate(int channel);
//* set the frameRate, such as 1 ~ 15 fps;
int AWVideoInput_SetFps(int channel, int fps);
int AWVideoInput_GetFps(int channel);
int AWVideoInput_SetVbrParam(int channel, RTVencVbrParam *pvbr_param);
int AWVideoInput_GetVbrParam(int channel, RTVencVbrParam *pvbr_param);
int AWVideoInput_GetSumMad(int channel);
int AWVideoInput_GetMotionSearchResult(int channel, RTVencMotionSearchResult* pMotionSearchResult);
int AWVideoInput_SetSuperFrameParam(int channel, RTVencSuperFrameConfig* pSuperFrameConfig);
int AWVideoInput_SetMotionSearchParam(int channel, RTVencMotionSearchParam* pMotionSearchParam);
int AWVideoInput_SetRoi(int channel, RTVencROIConfig* pRoiConfig);
int AWVideoInput_SetGdc(int channel, RTsGdcParam* pGdcConfig);
int AWVideoInput_SetRotate(int channel, int rotate_angle);
int AWVideoInput_GetSpsPpsInfo(int channel, sps_pps_data_info *pSpsPpsInfo);
int AWVideoInput_SetChmoraGray(int channel, int enable_gray);
int AWVideoInput_SetWbYuv(int channel, WbYuvFuncInfo *pWbYuvFuncInfo, RTsWbYuvParam *pWbYuvParam, int dst_w, int dst_h);
int AWVideoInput_SaveWbYuv(int channel, WbYuvFuncInfo *pWbYuvFuncInfo);
int AWVideoInput_DeInitWbYuv(int channel, WbYuvFuncInfo *pWbYuvFuncInfo);
int AWVideoInput_Set2dNR(int channel, RTs2DfilterParam* p_2dnr_param);
int AWVideoInput_Set3dNR(int channel, RTs3DfilterParam* p_3dnr_param);
int AWVideoInput_SetPIntraRefresh(int channel, RTVencCyclicIntraRefresh* pIntraRefresh);
int AWVideoInput_SetRecRefLbcMode(int channel, RTeVeLbcMode rec_lbc_mode);
int AWVideoInput_SetWeakTextTh(int channel, RTVenWeakTextTh *pWeakTextureTh);
int AWVideoInput_SetRegionD3DParam(int channel, RTVencRegionD3DParam *pRegionD3DParam);
int AWVideoInput_GetRegionD3DResult(int channel, RTVencRegionD3DResult *pRegionD3DResult);
int AWVideoInput_SetChromaQPOffset(int channel, int nChromaQpOffset);
int AWVideoInput_SetH264ConstraintFlag(int channel, RTVencH264ConstraintFlag *pConstraintFlag);
int AWVideoInput_SetVe2IspD2DLimit(int channel, RTVencVe2IspD2DLimit *pD2DLimit);
int AWVideoInput_EnableSmallSearchRange(int channel, int enable);
int AWVideoInput_SetForceConfWin(int channel, RTVencForceConfWin *pConfWin);
int AWVideoInput_SetRotVe2Isp(int channel, RTVencRotVe2Isp *pRotVe2Isp);
int AWVideoInput_SetInsertData(int channel, RTVencInsertData *pInsertData);
int AWVideoInput_GetInsertDataBufStatus(int channel, RT_VENC_BUF_STATUS *pStatus);
int AWVideoInput_DropFrame(int channel, int nDropNum);
//* for debug, caller should not care
int AWVideoInput_RequestEmptyYuvFrame(int channel, VideoYuvFrame* pYuvFrame);
//* for debug, caller should not care
int AWVideoInput_SubmitFilledYuvFrame(int channel, VideoYuvFrame* pYuvFrame, int yuv_size);
int AWVideoInput_SetCameraMoveStatus(int channel, RT_VENC_CAMERA_MOVE_STATUS camera_move_status);
//setting crop info, crop_info->enable_crop = 0 will disable crop
int AWVideoInput_SetCrop(int channel, RTCropInfo *crop_info);
int AWVideoInput_SetVencTargetBitsClipParam(int channel, RT_VENC_TARGET_BITS_CLIP_PARAM *target_bits_clop_param);
//tdm related api.
int AWVideoInput_RegisterTdmBufDoneCallback(int channel, void *cb);
int AWVideoInput_ReturnTdmBuf(int channel, struct vin_isp_tdm_event_status* p_tdm_status);
int AWVideoInput_GetTdmData(int channel, struct vin_isp_tdm_data *p_tdm_data);
int AWVideoInput_StartProcessTdmBuf(int channel);
int AWVideoInput_SetEncAndDecCase(int channel, int bEncAndDecCase);
int AWVideoInput_GetISPReg(int channel, VIN_ISP_REG_GET_CFG *cfg_ptr);
#endif