#ifndef __MW_VIDEO_H__ #define __MW_VIDEO_H__ //#include //#include #include "hal_interface_video.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ //////////////////////////////////////////////////////////// // // 数据类型定义 // //////////////////////////////////////////////////////////// /** * Video视频流通道常量定义, 适用HAL_Video */ typedef enum { //1080P 1.2Mbps //720P 0.8Mbps //720P 500kbps VIDEO_3M = 3000, VIDEO_2_5M = 2500, VIDEO_2M = 2000, VIDEO_1_5M = 1500, VIDEO_1_4M = 1400, VIDEO_1_3M = 1300, VIDEO_1_2M = 1200, VIDEO_1_1M = 1100, VIDEO_1M = 1000, VIDEO_900k = 900, VIDEO_800k = 800, VIDEO_700k = 700, VIDEO_600k = 600, VIDEO_500k = 500, VIDEO_400k = 400, VIDEO_300k = 300, VIDEO_200k = 200, VIDEO_100k = 100, } VIDEO_BITRATE_E; typedef enum { VIDEO_LEVEL_1 = 1, //VIDEO_100K VIDEO_LEVEL_2, //VIDEO_200k VIDEO_LEVEL_3, //VIDEO_300k VIDEO_LEVEL_4, //VIDEO_400k VIDEO_LEVEL_5, //VIDEO_500k VIDEO_LEVEL_6, //VIDEO_600k VIDEO_LEVEL_7, //VIDEO_700k VIDEO_LEVEL_8, //VIDEO_800k VIDEO_LEVEL_9, //VIDEO_900k VIDEO_LEVEL_10, //VIDEO_1M VIDEO_LEVEL_11, //VIDEO_1_1M VIDEO_LEVEL_12, //VIDEO_1_2M VIDEO_LEVEL_13, //VIDEO_1_3M VIDEO_LEVEL_14, //VIDEO_1_4M VIDEO_LEVEL_15, //VIDEO_1_5M VIDEO_LEVEL_16, //VIDEO_2M VIDEO_LEVEL_17, //VIDEO_2_5M VIDEO_LEVEL_18, //VIDEO_3M VIDEO_LEVEL_19, VIDEO_LEVEL_20 } VIDEO_BITRATE_LEVEL; typedef enum { AUTO_QUALITY = 0, LOW_QUALITY = 1, MEDIUM_QUALITY, HIGH_QUALITY, } VIDEO_QUALITY_LEVEL; typedef struct { unsigned int bitrate; unsigned int width; unsigned int height; unsigned int videoquality; } VIDEO_QUALITY_INFO; typedef enum { STREAM_FORM_UNDEF = -1, /**< 未指定 */ STREAM_FORM_SINGLE = 0, /**< 使能单路流模式 */ STREAM_FORM_PIP_UPPER_LEFT = 1, /**< 双摄使能画中画模式,画中画图像在左上 */ STREAM_FORM_PIP_UPPER_RIGHT = 2, /**< 双摄使能画中画模式,画中画图像在右上 */ STREAM_FORM_PIP_LOWER_LEFT = 3, /**< 双摄使能画中画模式,画中画图像在左下 */ STREAM_FORM_PIP_LOWER_RIGHT = 4, /**< 双摄使能画中画模式,画中画图像在右下 */ STREAM_FORM_SPLICE_LEFT = 5, /**< 双摄使能拼接模式,主摄图像在左边 */ STREAM_FORM_SPLICE_RIGHT = 6, /**< 双摄使能拼接模式,主摄图像在右边 */ STREAM_FORM_SPLICE_ABOVE = 7, /**< 双摄使能拼接模式,主摄图像在上边 */ STREAM_FORM_SPLICE_UNDER = 8, /**< 双摄使能拼接模式,主摄图像在下边 */ STREAM_FORM_MAX } STREAM_FORM; /** * Video视频抗频闪模式常量定义, 适用HAL_Video */ typedef enum { ANTIFLICKER_OFF = 0, ANTIFLICKER_50HZ = 50, ANTIFLICKER_60HZ = 60, } ANTIFLICKER_MODE; /** * ISP运行模式定义 */ typedef enum { ISP_RUNNING_MODE_DAY = 0, // 白天模式 ISP_RUNNING_MODE_NIGHT = 1, // 夜视模式 ISP_RUNNING_MODE_MAX } ISP_RUNNING_MODE; /** * OSD水印切换模式 */ typedef enum { LOGO_OSD_SWITCH_OFF = 0, // Logo OSD关闭, 时间戳OSD开启模式 TIMESTAMP_OSD_SWITCH_OFF = 1, // Logo OSD开启, 时间戳OSD关闭模式 BOTH_SWITCH_OFF = 2, // Logo OSD关闭, 时间戳OSD关闭模式 BOTH_SWITCH_ON = 3, // Logo OSD开启, 时间戳OSD开启模式 } OSD_SWITCH_MODE; /** * OSD遮挡切换模式 */ typedef enum { BOTH_COVER_OFF = 0, // COVER OSD都关闭 COVERMAIN_ON_COVERSUB_OFF = 1, // Main cover osd 打开, Sub cover osd 关闭 COVERMAIN_OFF_COVERSUB_ON = 2, // Main cover osd 关闭, Sub cover osd 打开 BOTH_COVER_ON = 3, // COVER OSD都打开 } COVER_OSD_SWITCH_MODE; /** * OSD遮挡属性 */ typedef struct { float Start_Percent_x; float Start_Percent_y; float End_Percent_x; float End_Percent_y; uint32_t Color; } Video_COVER_OSD; /** * 视频流属性参数数据结构定义 */ typedef struct { HAL_VIDEO_FORMAT Format; // 流格式: stream format int32_t nWidth; // resolution width int32_t nHeight; // resolution height int32_t nBitrate; // 码率: Kbit per second //int32_t nFPS; // 帧率: framerate such as 15, 25 //int32_t nGOP; // I帧间隔: interval between two key frame = n*fps HAL_STREAM_CHANNEL FS_Chn; //辅流Framesource channel int32_t rectX; //辅流叠加到主流的起始X坐标 int32_t rectY; //辅流叠加到主流的起始Y坐标 } Aux_Video_Attr_Param; /** * 视频流属性参数数据结构定义 */ typedef struct { HAL_STREAM_CHANNEL Stream; // 流通道 HAL_VIDEO_FORMAT Format; // 流格式: stream format int32_t nWidth; // resolution width int32_t nHeight; // resolution height int32_t nBitrate; // 码率: Kbit per second int32_t AuxStreamEnable; // 是否开启辅流,以下字段仅在本字段为1时启用 HAL_STREAM_CHANNEL FS_Chn; // 主流Framesource channel, Add 2021/03/16 Aux_Video_Attr_Param AuxStreamAttr; // 辅流的视频属性, Add 2021/03/16 STREAM_FORM StreamForm; // 流形式:单路流,画中画流,拼接流 } Video_Attr_Param; /** * 视频回调参数结构定义 */ typedef struct { char *pBuff; //视频数据 uint32_t nSize; //数据大小 HAL_STREAM_CHANNEL Stream_Chn; //视频流通道 HAL_VIDEO_FORMAT Video_Format;//视频格式 HAL_FRAME_TYPE Frame_Type; //帧类型 uint32_t nFPS; //帧率 uint32_t nIR_Mode; //红外模式(0:红外关闭,1:红外开启) uint32_t nWidth; //分辨率宽度 uint32_t nHeight; //分辨率高度 uint64_t nTimestamp; //时间戳 uint32_t Frame_Seq; //帧序号 uint64_t nlocal_Time; //本地时间 } Video_CallBack_Param; /** * motion条件设置 */ typedef enum { MOTOR_STOP_STATUS = 0, // 马达转动状态 LIGHT_ON_OFF_CHANGE = 1, // 大灯亮灭 INVALID_TRIGGER = 3, } MOTION_CONDITION_TYPE; /** * 视频回调参数, 函数实现者不能发生阻塞, 否则将引起视频数据断片 * 功能:视频数据输出 * 入参:Video_CallBack_Param * pVideo_Param, 视频参数 * uint32_t nChannel, 设备通道号 * 出参:无 * 返回:函数执行指示, int32_t代码值 * 0 成功 * 非0 失败, 错误码 */ typedef int32_t(*HAL_Video_Callback)(Video_CallBack_Param * pVideo_Param, uint32_t nChannel); typedef int32_t(*HAL_Video_Motion_callback)(void *pResult); //////////////////////////////////////////////////////////// // 移动检测跟踪数据类型定义 // Motion Detection Tracking #define PERM_MAX_ROI 8 #define PERM_MAX_RECT 8 /* * 点的定义 */ typedef struct { int32_t x; /**< 横向的坐标值 */ int32_t y; /**< 纵向的坐标值 */ } MD_Point; /* * 矩形框的定义 */ typedef struct { MD_Point ul; /**< 左上角点坐标 */ MD_Point br; /**< 右下角点坐标 */ } MD_Rect; /* * 周界信息结构体 */ typedef struct { MD_Point *p; /**< 周界各个顶点信息,不能有线交叉,最多6个点 */ int32_t pcnt; /**< 周界顶点数量 */ uint64_t alarm_last_time; /**< 持续报警时间 */ } MD_Perm; /* * 移动跟踪算法参数的结构体 */ typedef struct { int32_t move_sense; /** 检测灵敏度 0-5 ascend */ int32_t open_flag; /** 总开关: motion detection and motion tracking, 0:close 1:open */ int32_t perm_start; /** perm开关, 0:close 1:open */ int32_t mt_start; /** motion tracking 开关, 0:close 1:open */ int32_t permcnt; /** 周界个数 */ MD_Perm perms[PERM_MAX_ROI];/** 周界信息 */ int32_t feedback_motor; /** 电机回馈信息 */ int32_t motor_stop; /** 电机停止状态 */ } MD_Tracking_Param; /* * 移动跟踪算法的输出结构体 */ typedef struct { int32_t count; /**< 检测到的矩形框目标个数 */ MD_Rect rect[20]; /**< 检测到的目标矩形框 */ int32_t dx; /**< 检测到的目标dx */ int32_t dy; /**< 检测到的目标dy */ int32_t step; /**< 检测到的目标step */ int32_t capture_lost; /**< 何种状态下跟踪失效 */ int32_t tracking; /**< 是否处于跟踪状态 */ uint64_t timeStamp; /**< 时间戳*/ int32_t ret; /**< 是否出现越界 */ int32_t is_alarmed[PERM_MAX_ROI]; /**< 那个周界出现越界 */ MD_Rect rects[PERM_MAX_RECT]; /**< 越界物体的矩形信息 */ int32_t rectcnt; /**< 越界物体的数量 */ } MD_Tracking_Output; typedef enum { DUAL_CAM_STREAM_MODE_UNDEF = -1, /* 未指定 */ DUAL_CAM_STREAM_MODE_SINGLE_MAIN = 0, /*使能单路流,出主摄 */ DUAL_CAM_STREAM_MODE_SINGLE_SECOND = 1, /*使能单路流,出辅摄 */ DUAL_CAM_STREAM_MODE_PIP_MAIN_UPPER_LEFT = 2, /* 画中画,辅摄小图左上 */ DUAL_CAM_STREAM_MODE_PIP_MAIN_UPPER_RIGHT = 3, /*画中画,辅摄小图右上 */ DUAL_CAM_STREAM_MODE_PIP_MAIN_LOWER_LEFT = 4, /*画中画,辅摄小图左下 */ DUAL_CAM_STREAM_MODE_PIP_MAIN_LOWER_RIGHT = 5, /* 画中画,辅摄小图右下 */ DUAL_CAM_STREAM_MODE_PIP_SECOND_UPPER_LEFT = 6, /* 画中画,主摄小图左上 */ DUAL_CAM_STREAM_MODE_PIP_SECOND_UPPER_RIGHT = 7, /*画中画,主摄小图右上 */ DUAL_CAM_STREAM_MODE_PIP_SECOND_LOWER_LEFT = 8, /*画中画,主摄小图左下 */ DUAL_CAM_STREAM_MODE_PIP_SECOND_LOWER_RIGHT = 9, /* 画中画,主摄小图右下 */ DUAL_CAM_STREAM_MODE_SPLICE_LEFT = 10, /* 拼接模式,主摄图像在左边 */ DUAL_CAM_STREAM_MODE_SPLICE_RIGHT = 11, /* 拼接模式,主摄图像在右边 */ DUAL_CAM_STREAM_MODE_SPLICE_ABOVE = 12, /* 拼接模式,主摄图像在上边 */ DUAL_CAM_STREAM_MODE_SPLICE_UNDER = 13, /* 拼接模式,主摄图像在下边 */ DUAL_CAM_STREAM_MODE_MAX } DUAL_CAM_STREAM_MODE; typedef struct { unsigned char weight[15][15]; //各个区域权重[0-8] } ISP_WEIGHT; // Stream Ops /** * 函数:Video_OpenStream * 声明:int32_t video_openstream(HAL_STREAM_CHANNEL Stream, int32_t Channel) * 功能:打开视频流 * 入参:STREAM_CHANNEL Stream, 视频流通道 HAL_VIDEO_FORMAT Format, 视频格式 int32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, int32_t代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t video_openstream(HAL_SENSOR_IDX idx, hal_video_frame_callback cb, HAL_STREAM_CHANNEL stream_chn, const video_attr_st attr); /** * 函数:Video_CloseStream * 声明:int32_t video_close(HAL_STREAM_CHANNEL Stream, int32_t Channel) * 功能:关闭视频流 * 入参:STREAM_CHANNEL Stream, 视频流通道 HAL_VIDEO_FORMAT Format, 视频格式 int32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, int32_t代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t video_close(hal_video_frame_callback cb); void mw_video_test(); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __MW_VIDEO_H__ */