#ifndef __MW_VIDEO_H__
#define __MW_VIDEO_H__

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