#ifndef __HAL_INTERFACE_VIDEO_H__
#define __HAL_INTERFACE_VIDEO_H__
#include <stdint.h>
#include <stdio.h>
#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__ */
