#ifndef __HAL_INTERFACE_VIDEO_H__ #define __HAL_INTERFACE_VIDEO_H__ #include #include #include "hal.h" #include "hal_interface_audio.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ //////////////////////////////////////////////////////////// // // 数据类型定义 // //////////////////////////////////////////////////////////// /** * 视频回调参数结构定义 */ typedef enum { VIDEO_FORMAT_H264 = (HAL_AUDIO_MAX + 1), VIDEO_FORMAT_H265, VIDEO_FORMAT_JPEG, VIDEO_FORMAT_MJPEG, VIDEO_FORMAT_YV12, VIDEO_FORMAT_MAX } HAL_VIDEO_FORMAT; typedef struct { int8_t chn; //视频流通道 HAL_VIDEO_FORMAT format; //视频格式 HAL_FRAME_TYPE type; //帧类型 uint32_t ts; //时间戳 uint32_t seq; //帧序号 uint32_t local_time; //本地时间 uint32_t width; //分辨率宽度 uint32_t height; //分辨率高度 uint32_t size; //数据大小 int8_t data[0]; //视频数据 } video_frame; #define sizeof_av(_frame) (sizeof(*_frame) + _frame->size) typedef enum{ SENSOR_MAIN = 0, SENSOR_SEC, SENSOR_THR, SENSOR_FOUR, SENSOR_MAX }HAL_SENSOR_IDX; /** * hal_video视频流通道常量定义 */ typedef enum { STREAM_CHANNEL_LIVE = 0, //(0)主码流 STREAM_CHANNEL_OSS, //(1)子码流 STREAM_CHANNEL_REC, //(2)第三码流 STREAM_CHANNEL_AI, //(3)第四码流 STREAM_CHANNEL_JPEG, STREAM_CHANNEL_MAX } HAL_STREAM_CHANNEL; /** * ISP 工作模式配置,正常模式或夜视模式。 */ typedef enum { ISP_MODE_DAY = 0, /**< 正常模式 */ ISP_MODE_NIGHT = 1, /**< 夜视模式 */ } HAL_ISP_MODE; /** * 视频流属性参数数据结构定义 */ typedef struct { HAL_STREAM_CHANNEL stream_chn; // 流通道 HAL_VIDEO_FORMAT format; // 流格式: stream format uint32_t width; // resolution width, 0为不重复设置 uint32_t height; // resolution height, 0为不重复设置 uint32_t bitrate; // 码率: Kbit per second, 0为不重复设置 uint32_t fps; // 编码帧率 uint32_t gop; } video_attr_st; typedef uint32_t(*hal_video_frame_callback)(video_frame * frame); typedef uint32_t(*hal_video_status_callback)(uint32_t status); //////////////////////////////////////////////////////////// // // HAL内部接口定义 // //////////////////////////////////////////////////////////// /** * 函数:hal_video_init * 声明:int32_t hal_video_init() * 功能:视频hal初始化, 构建视频运行所需环境, 在使用视频功能接口前调用 * 入参: * 出参:无 * 返回:函数执行指示, ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_init(HAL_SENSOR_IDX sensor_idx); /** * 函数:hal_video_IsInited * 声明:int32_t hal_video_IsInited() * 功能:判 * 入参: * 出参:判断视频hal是否已经被初始化 * 返回:函数执行指示, ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_isinited(); /** * 函数:hal_video_deinit * 声明:int32_t hal_video_deinit() * 功能:视频HAL去初始化, 释放资源 * 入参:无 * 出参:无 * 返回:函数执行指示, ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_deinit(); /** * 函数:hal_video_OpenStream * 声明:int32_t hal_video_OpenStream(HAL_STREAM_CHANNEL stream_chn) * 功能:打开视频流, 内部创建pooling线程来获取视频流 * 入参:HAL_STREAM_CHANNEL stream_chn, 视频流通道 HAL_VIDEO_FORMAT Format, 视频格式 uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_openstream(HAL_SENSOR_IDX idx, hal_video_frame_callback cb, HAL_STREAM_CHANNEL stream_chn, const video_attr_st attr); /** * 函数:hal_video_set_attr * 声明:int32_t hal_video_Motion_SetParam(HAL_STREAM_CHANNEL stream_chn, const video_attr * pStreamAttr) * 功能:设置指定流通道属性参数,无需设置参数项置为-1 * 入参:HAL_STREAM_CHANNEL stream_chn, 指定的流通道 * video_attr * pStreamAttr, 属性参数 * uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:video_attr参数项不需要设置则置为-1 */ uint32_t hal_video_set_attr(HAL_SENSOR_IDX idx, HAL_STREAM_CHANNEL stream_chn, const video_attr_st * attr); /** * 函数:hal_video_CloseStream * 声明:int32_t hal_video_CloseStream(HAL_STREAM_CHANNEL stream_chn) * 功能:关闭视频流 * 入参:HAL_STREAM_CHANNEL stream_chn, 视频流通道 HAL_VIDEO_FORMAT Format, 视频格式 uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_closestream(hal_video_frame_callback cb); /** * 函数:hal_video_get_jpeg * 声明:int32_t hal_video_get_jpeg(int8_t *data, uint32_t *size) * 功能:获取编码JPEG数据 * 入参:data由函数内部申请内存,外部释放, size 内部赋值 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_get_jpeg(HAL_SENSOR_IDX idx, int8_t **data, uint32_t *size); /** * hal_video_getYUVframe * 声明:int32_t hal_video_getYUVframe(int8_t *pBuf, uint32_t nBufSize) * 功能:获取YUV数据 * 入参:int32_t Channel, 设备通道号 * uint32_t nBufSize BufSize * 出参:int8_t *pBuf 返回YUVBuf * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_getYUVframe(HAL_SENSOR_IDX idx, int8_t *pBuf, uint32_t nBufSize); /** * 函数:hal_video_set_nightmode * 声明:HAL_ERRCODE hal_video_set_nightmodee(HAL_ISP_MODE mode) * 功能:设置ISP工作模式,白天模式或夜视模式,默认为白天模式 * 入参:HAL_ISP_MODE mode, 运行模式: 0, ISP_RUNNING_MODE_DAY, 白天模式 1, ISP_RUNNING_MODE_NIGHT,夜视模式 uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_set_nightmode(HAL_ISP_MODE mode); /** * 函数:hal_video_set_isp_flip * 声明:int32_t hal_video_set_isp_flip(uint32_t flip) * 功能:设置ISP图像上下反转效果功能是否使能 * 入参:int32_t sensor_idx, sensor index * uint32_t flip, 反转使能 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_set_isp_flip(HAL_SENSOR_IDX idx, uint32_t flip); /** * 函数:hal_video_get_isp_flip * 声明:int32_t hal_video_get_isp_flip(uint32_t *flip) * 功能:设置ISP图像上下反转效果功能是否使能 * 入参:无 * uint32_t sensor_idx, sensor index * 出参:uint32_t *flip, 反转使能 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_get_isp_flip(HAL_SENSOR_IDX idx, uint32_t * flip); /** * 函数:hal_video_get_attr * 声明:int32_t hal_video_Motion_GetParam(HAL_STREAM_CHANNEL stream_chn, video_attr * pStreamAttr) * 功能:设置指定流通道属性参数,无需设置参数项置为-1 * 入参:HAL_STREAM_CHANNEL stream_chn, 指定的流通道 * uint32_t Channel, 设备通道号 * 出参:video_attr * pStreamAttr, 属性参数 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:此函数只适用于H264和H265编码channel */ uint32_t hal_video_get_attr(HAL_STREAM_CHANNEL stream_chn, video_attr_st * attr); /** * 函数:hal_video_set_bitrate * 声明:int32_t hal_video_set_bitrate(HAL_STREAM_CHANNEL stream_chn, uint32_t BitRate) * 功能:设置指定编码通道的码率(Kbit/s) * 入参:HAL_STREAM_CHANNEL stream_chn, 指定的流通道 * uint32_t BitRate, 设置的码率 * uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:此函数只适用于H264和H265编码channel */ uint32_t hal_video_set_bitrate(HAL_STREAM_CHANNEL stream_chn, uint32_t BitRate); /** * 函数:hal_video_get_bitrate * 声明:int32_t hal_video_get_bitrate(HAL_STREAM_CHANNEL stream_chn, uint32_t * pBitRate) * 功能:获取指定码流的码率(Kbit/s) * 入参:HAL_STREAM_CHANNEL stream_chn, 指定的流通道 * uint32_t Channel, 设备通道号 * 出参:uint32_t * pBitRate, 输出码率 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:此函数只适用于H264和H265编码channel */ uint32_t hal_video_get_bitrate(HAL_STREAM_CHANNEL stream_chn, uint32_t * pBitRate); /** * 函数:hal_video_set_GOP * 声明:int32_t hal_video_set_GOP(HAL_STREAM_CHANNEL stream_chn, uint32_t gop) * 功能:设置指定码流的GOP(I帧间隔: interval between two key frame = n*fps) * 入参:HAL_STREAM_CHANNEL stream_chn, 指定的流通道 * uint32_t gop, 设置的GOP * uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:此函数只适用于H264和H265编码channel */ uint32_t hal_video_set_GOP(HAL_STREAM_CHANNEL stream_chn, uint32_t gop); /** * 函数:hal_video_get_GOP * 声明:int32_t hal_video_get_GOP(HAL_STREAM_CHANNEL stream_chn, uint32_t * pgop) * 功能:获取指定码流GOP值(I帧间隔: interval between two key frame = n*fps) * 入参:HAL_STREAM_CHANNEL stream_chn, 指定的流通道 * uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:此函数只适用于H264和H265编码channel */ uint32_t hal_video_get_GOP(HAL_STREAM_CHANNEL stream_chn, uint32_t * pgop); /** * 函数:hal_video_request_IDR * 声明:int32_t hal_video_request_IDR(HAL_STREAM_CHANNEL stream_chn) * 功能:强制出I帧 * 入参:HAL_STREAM_CHANNEL stream_chn, 指定的流通道 * uint32_t Channel, 设备通道号 * 出参:无 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:此函数只适用于H264和H265编码channel */ uint32_t hal_video_request_IDR(HAL_STREAM_CHANNEL stream_chn); /** * 函数:hal_video_get_sensor_name * 声明:int32_t hal_video_get_sensor_name(int8_t *sensor_name) * 功能:获取sensor名 * 入参:int32_t sensor_idx sensor的序号 * 出参:int8_t *sensor_name, 最长31个字符 * 返回:函数执行指示, HAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 * 说明:此函数只适用于H264和H265编码channel */ uint32_t hal_video_get_sensor_name(uint32_t sensor_idx, int8_t *sensor_name); /** * 函数: hal_video_get_frame * 声明:int32_t hal_video_get_frame(video_frame *frame) * 功能:取一帧视频或图像 * 入参:无 * 出参:*frame * 返回:函数执行指示 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_get_frame(HAL_STREAM_CHANNEL stream_chn, video_frame *frame, uint32_t wait_ms); /** * hal_video_set_isp_mode * 声明:int32_t hal_video_set_isp_mode(uint32_t sensor_idx, HAL_ISP_MODE mode) * 功能:设置ISP工作模式,白天模式或夜视模式,默认为白天模式 * 入参:int32_t sensor_idx 设定的sensor对象 * HAL_ISP_MODE mode, 运 行模式: 0, ISP_MODE_DAY, 白天模式(全彩模式) * 1, ISP_MODE_NIGHT,夜视模式(黑白模式) * 出参:无 * 返回:函数执行指示, PAL_ERRCODE代码值 * 0 成功 * 非0 失败, 错误码 */ uint32_t hal_video_set_isp_mode(uint32_t sensor_idx, HAL_ISP_MODE mode); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __HAL_INTERFACE_AUDIO_H__ */