/*! @file trro_error_enum.h */
#ifndef TRRO_ERROR_ENUM_H
#define TRRO_ERROR_ENUM_H

// 推拉流共同错误码
/**
 * @deprecated 已被废弃，不再推荐使用。请使用 TRRO_SUCCEED代替。
 * @def TRRO_SUCCED
 * @brief 十进制【1】
 * 成功
 */
#define TRRO_SUCCED           		                        0x00000001 

/**
 * @def TRRO_SUCCEED
 * @brief 十进制【1】
 * 成功
 */
 #define TRRO_SUCCEED           		                    0x00000001 

/**
 * @def TRRO_COMMON_ERROR
 * @brief 十进制【16777215】
 * 失败
 */
#define TRRO_COMMON_ERROR                                   0x00FFFFFF 

/* 配置文件加载模块*/
/**
 * @def TRRO_CONFIG_ERROR
 * @brief 十进制【33554431】
 * 配置解析失败
 */
#define TRRO_CONFIG_ERROR                                   0x01FFFFFF 

/**
 * @def TRRO_CONFIG_PARSE_FAILED
 * @brief 十进制【16777218】
 *  配置文件格式异常
 */
#define TRRO_CONFIG_PARSE_FAILED                            0x01000002 

/**
 * @def TRRO_CONFIG_ILLEGAL
 * @brief 十进制【16777219】 
 * 参数格式非法，需新增参数检查
 */
#define TRRO_CONFIG_ILLEGAL                                 0x01000003 

/**
 * @def TRRO_CONFIG_UNEXIST
 * @brief 十进制【16777220】 
 * 配置文件不存在
 */
#define TRRO_CONFIG_UNEXIST                                 0x01000004 

/**
 * @def TRRO_CONFIG_CER_FAILED
 * @brief 十进制【16777221】 
 * 云证书错误
 */
#define TRRO_CONFIG_CER_FAILED                              0x01000005

/**
 * @def TRRO_CONFIG_LOG_PERMISSION_DENIED
 * @brief 十进制【16777225】
 * 打开log文件权限不足
 */
#define TRRO_CONFIG_LOG_PERMISSION_DENIED                    0x01000009 

#define TRRO_CONFIG_DEVICE_ID_INVALID                       0x0100000A // 16777226:设备ID格式非法
#define TRRO_CONFIG_DEVICE_NAME_INVALID                     0x0100000B // 16777227:设备名称格式非法
#define TRRO_CONFIG_SDK_MODE_INVALID                        0x0100000C // 16777228:SDK模式值非法
#define TRRO_CONFIG_CLOUD_MODE_INVALID                      0x0100000D // 16777229:云模式值非法
#define TRRO_CONFIG_REQUIRED_FIELD_MISSING                  0x0100000E // 16777230:必填字段缺失
#define TRRO_CONFIG_FIELD_TYPE_ERROR                        0x0100000F // 16777231:字段类型错误
#define TRRO_CONFIG_CERTIFICATE_MD5_INVALID                 0x01000010 // 16777232:证书MD5校验失败

/* 初始化模块 */
/**
 * @def TRRO_INIT_ERROR
 * @brief 十进制【50331647】 
 * 初始化通用失败
 */
#define TRRO_INIT_ERROR                                     0x02FFFFFF

/**
 * @def TRRO_INIT_INPUT_ILLEGAL
 * @brief 十进制【33554434】 
 * 初始化参数异常
 */
#define TRRO_INIT_INPUT_ILLEGAL                             0x02000002

/**
 * @def TRRO_INIT_PARSE_FAILED
 * @brief 十进制【33554435】 
 * 配置节点解析异常
 */
#define TRRO_INIT_PARSE_FAILED                              0x02000003

/**
 * @def TRRO_INIT_CREAT_MEDIAMODE_FAILED
 * @brief 十进制【33554436】
 * 媒体模块创建失败
 */
#define TRRO_INIT_CREAT_MEDIAMODE_FAILED                    0x02000004

/**
 * @def TRRO_INIT_LICENSE_CHECK_FAILED
 * @brief 十进制【33554437】
 * LICENSE校验失败
 */
#define TRRO_INIT_LICENSE_CHECK_FAILED                      0x02000005

/**
 * @def TRRO_INIT_INVALID_INPUT
 * @brief 十进制【33554438】
 * 非法输入
 */
#define TRRO_INIT_INVALID_INPUT                            0x02000006

/**
 * @def TRRO_INIT_PRM_ERROR
 * @brief 十进制【33554439】
 * 参数错误
 */
#define TRRO_INIT_PRM_ERROR                                 0x02000007

/**
 * @def TRRO_INIT_REPEAT
 * @brief 十进制【33554440】
 * 重复初始化
 */
#define TRRO_INIT_REPEAT                                    0x02000008


/**
 * @def TRRO_INIT_LICENSE_FILE_ERROR
 * @brief 十进制【33554449】
 * LICENSE 文件错误
 */
#define TRRO_INIT_LICENSE_FILE_ERROR                        0x02000011

/**
 * @def TRRO_INIT_LICENSE_CHECK_TIME_FAILED
 * @brief 十进制【33554450】
 * LICENSE 授权过期
 */
#define TRRO_INIT_LICENSE_CHECK_TIME_FAILED                 0x02000012

/**
 * @def TRRO_INIT_LICENSE_CHECK_DEVICE_FAILED
 * @brief 十进制【33554451】
 * LICENSE 硬件验证失败
 */
#define TRRO_INIT_LICENSE_CHECK_DEVICE_FAILED               0x02000013

/**
 * @def TRRO_INIT_LICENSE_CHECK_STREAM_FAILED
 * @brief 十进制【33554452】
 * LICENSE 授权流小于设备流
 */
#define TRRO_INIT_LICENSE_CHECK_STREAM_FAILED                0x02000014

/**
 * @def TRRO_INIT_LICENSE_CHECK_ID_FAILED
 * @brief 十进制【33554453】
 * LICENSE 设备ID验证失败
 */
#define TRRO_INIT_LICENSE_CHECK_ID_FAILED                   0x02000015

/**
 * @def TRRO_INIT_PUBLIC_LICENSE_CHECK_TIMEOUT
 * @brief 十进制【33554688】
 * LICENSE 公有云license验证超时
 */
#define TRRO_INIT_PUBLIC_LICENSE_CHECK_TIMEOUT              0x02000100

/**
 * @def TRRO_INIT_PUBLIC_LICENSE_CHECK_NOT_BIND
 * @brief 十进制【33554689】
 * LICENSE 公有云设备未绑定license
 */
#define TRRO_INIT_PUBLIC_LICENSE_CHECK_NOT_BIND             0x02000101

/**
 * @def TRRO_INIT_PUBLIC_LICENSE_CHECK_NOT_ENOUGH
 * @brief 十进制【33554690】
 * LICENSE 公有云license数量不足
 */
#define TRRO_INIT_PUBLIC_LICENSE_CHECK_NOT_ENOUGH           0x02000102

/**
 * @def TRRO_INIT_PUBLIC_LICENSE_CHECK_OVERTIME
 * @brief 十进制【33554691】
 * LICENSE 公有云license已过期
 */
#define TRRO_INIT_PUBLIC_LICENSE_CHECK_OVERTIME             0x02000103

/**
 * @def TRRO_INIT_PUBLIC_LICENSE_CHECK_NOT_DURATION
 * @brief 十进制【33554692】
 * LICENSE 公有云license剩余时长不足
 */
#define TRRO_INIT_PUBLIC_LICENSE_CHECK_NOT_DURATION          0x02000104

/**
 * @def TRRO_INIT_CANCEL
 * @brief 十进制【33554447】
 * LICENSE 客户主动退出
 */
#define TRRO_INIT_CANCEL                                     0x0200000F

/* 信令服务器模块 */

/**
 * @def TRRO_SIGNAL_ERROR
 * @brief 十进制【67108863】
 * 信令模块失败
 */
#define TRRO_SIGNAL_ERROR                                   0x03FFFFFF

/**
 * @def TRRO_SIGNAL_REGIST_FAILED
 * @brief 十进制【50331650】
 * 信令注册失败
 */
#define TRRO_SIGNAL_REGIST_FAILED                           0x03000002

/**
 * @def TRRO_SIGNAL_STATUS_ABNORMAL
 * @brief 十进制【50331651】
 * 信令服务器连接异常
 */
#define TRRO_SIGNAL_STATUS_ABNORMAL                         0x03000003

/**
 * @def TRRO_SIGNAL_MESSAGE_FAILED
 * @brief 十进制【50331652】
 * 信令消息处理失败
 */
#define TRRO_SIGNAL_MESSAGE_FAILED                          0x03000004 

/**
 * @def TRRO_SIGNAL_CONNECT_OUTTIME
 * @brief 十进制【50331653】
 * 信令服务器连接超时
 */
#define TRRO_SIGNAL_CONNECT_OUTTIME                         0x03000005

/* 流采集模块 */
/**
 * @def TRRO_CAPTURE_ERROR
 * @brief 十进制【83886079】
 * 采集模块错误
 */
#define TRRO_CAPTURE_ERROR                                  0x04FFFFFF

/**
 * @def TRRO_CAPTURE_OPENDEVICE_FAILED
 * @brief 十进制【67108866】
 * 打开设备失败
 */
#define TRRO_CAPTURE_OPENDEVICE_FAILED                      0x04000002

/**
 * @def TRRO_CAPTURE_GETSOURCE_FAILED
 * @brief 十进制【67108867】
 * 获取数据源失败
 */
#define TRRO_CAPTURE_GETSOURCE_FAILED                       0x04000003

/**
 * @def TRRO_CAPTURE_UNKNOWN_CAPTURETYPE
 * @brief 十进制【67108868】
 * 未知采集类型
 */
#define TRRO_CAPTURE_UNKNOWN_CAPTURETYPE                    0x04000004

/* 流传输模块 */

/**
 * @def TRRO_CONNECT_ERROR
 * @brief 十进制【100663295】
 * 连接错误
 */
#define TRRO_CONNECT_ERROR                                  0x05FFFFFF

/**
 * @def TRRO_CONNECT_OUTTIME
 * @brief 十进制【83886082】
 * 超时断连
 */
#define TRRO_CONNECT_OUTTIME                                0x05000002

/**
 * @def TRRO_MESSAGE_BYTE_EXCEED
 * @brief 十进制【134217730】
 * 发送字节数超出限制
 */
#define TRRO_MESSAGE_BYTE_EXCEED                            0x08000002

/**
 * @def TRRO_MESSAGE_RATE_EXCEED
 * @brief 十进制【134217731】
 * 发送间隔过于密集
 */
#define TRRO_MESSAGE_RATE_EXCEED                            0x08000003

/**
 * @def TRRO_MESSAGE_MAX_EXCEED
 * @brief 十进制【134217732】
 * 1s钟最多发送 10KB数据
 */
#define TRRO_MESSAGE_MAX_EXCEED                             0x08000004

/**
 * @def TRRO_MESSAGE_CHANNEL
 * @brief 十进制【134217733】
 * 消息通道异常
 */
#define TRRO_MESSAGE_CHANNEL                                0x08000005

/**
 * @def TRRO_BYTE_EXCEED_ERROR
 * @brief 十进制【134217734】
 * 发送缓冲区满了
 */
#define TRRO_MESSAGE_BLOCK                                  0x08000006

/**
 * @def TRRO_MESSAGE_COMPRESS
 * @brief 十进制【134217735】
 * 消息压缩失败
 */
#define TRRO_MESSAGE_COMPRESS                               0x08000007

/**
 * @def TRRO_MESSAGE_DATA_CHANNEL_NOT_READY
 * @brief 十进制【134217736】
 * 数据通道未就绪，无法发送消息
 */
#define TRRO_MESSAGE_DATA_CHANNEL_NOT_READY                 0x08000008

/**
 * @def TRRO_MESSAGE_NOT_PAYED
 * @brief 十进制【134217737】
 * 未开通后付费，禁止发送
 */
#define TRRO_MESSAGE_NOT_PAYED                              0x08000009

// 推流独有错误码
/**
 * @def TRRO_MESSAGE_PERMISSION
 * @brief 十进制【100663304】
 * 没有接受端存在，接受权限问题
 */
#define TRRO_MESSAGE_PERMISSION                             0x06000008

/**
 * @def TRRO_MESSAGE_MEDIA_CLOSED_RATE_EXCEED
 * @brief 十进制【100663305】
 * MQTT 通道使用，媒体未连接发送受限
 */
#define TRRO_MESSAGE_MEDIA_CLOSED_RATE_EXCEED                0x0600000A

/**
 * @def TRRO_STOR_ERROR
 * @brief 十进制【134217727】
 * 存储异常
 */
#define TRRO_STOR_ERROR                                     0x07FFFFFF

/**
 * @def TRRO_STOR_UNENABLE
 * @brief 十进制【117440513】
 * 存储未使能
 */
#define TRRO_STOR_UNENABLE                                  0x07000001

/**
 * @def TRRO_STOR_IDEXIST
 * @brief 十进制【117440514】
 * 重复开启存储
 */
#define TRRO_STOR_IDEXIST                                   0x07000002

/**
 * @def TRRO_STOR_ID_ILLEGAL
 * @brief 十进制【117440515】
 * 非法ID
 */
#define TRRO_STOR_ID_ILLEGAL                                0x07000003

/**
 * @def TRRO_STOR_PARAM_ILLEGAL
 * @brief 十进制【117440516】
 * 参数非法
 */
#define TRRO_STOR_PARAM_ILLEGAL                             0x07000004

/**
 * @def TRRO_STOR_UNSET_FILENAME
 * @brief 十进制【117440517】
 * 未设置文件名
 */
#define TRRO_STOR_UNSET_FILENAME                            0x07000005

/**
 * @def TRRO_START_CAPTURE_IDEXIST
 * @brief 十进制【117440518】
 * 重复开启采集
 */
#define TRRO_START_CAPTURE_IDEXIST                          0x07000006

/**
 * @def TRRO_EXTERNAL_RESIZE
 * @brief 十进制【134217729】
 * 外采模式错误
 */
#define TRRO_EXTERNAL_RESIZE                                0x08000001

/* 异步回调错误码 */
/**
 * @def TRRO_ERROR_CALLBACK_CAMERA
 * @brief 十进制【151060480】
 * 相机异步回调错误
 */
#define TRRO_ERROR_CALLBACK_CAMERA                          0x09010000  

/**
 * @def TRRO_ERROR_CALLBACK_MIC
 * @brief 十进制【151126016】
 * 麦克风异步回调错误
 */
#define TRRO_ERROR_CALLBACK_MIC                             0x09020000      

/**
 * @def TRRO_ERROR_CALLBACK_BANDWIDTH_LIMIT
 * @brief 十进制【151191552】
 * 评估网络带宽无法满足最低码率需求
 */
#define TRRO_ERROR_CALLBACK_BANDWIDTH_LIMIT                 0x09030000      
                   
/**
 * @def TRRO_ERROR_CALLBACK_RESERVE_DEGRADE
 * @brief 十进制【151257088】
 * 网络带宽不足引发reserve带宽降级
 */
#define TRRO_ERROR_CALLBACK_RESERVE_DEGRADE                 0x09040000

/**
 * @def TRRO_ERROR_CALLBACK_JOIN_AUTH_FAILED
 * @brief 十进制【151322624】
 * RTC 进房鉴权失败（底层 event 10006），通常由后台黑白名单配置、UserSig 非法或过期引起
 */
#define TRRO_ERROR_CALLBACK_JOIN_AUTH_FAILED                     0x09050000

/**
 * @def TRRO_UNSUPPORT
 * @brief 十进制【251658241】
 * 该调用或者函数功能暂不支持
 */
#define TRRO_UNSUPPORT                                      0x0F000001

/**
 * @def TRRO_INPUT_SIZE_ILLEGAL
 * @brief 十进制【251658242】
 * 输入大小不匹配
 */
#define TRRO_INPUT_SIZE_ILLEGAL                             0x0F000002

/**
 * @def TRRO_MESSAGE_ERROR
 * @brief 十进制【117440511】
 * 消息错误
 */
#define TRRO_MESSAGE_ERROR                                  0x06FFFFFF 

/**
 * @def TRRO_SIGNAL_DEVICEID_OR_PASSWORD_INCORRECT
 * @brief 50331654
 * 信令服务器连接用户名或者密码错误
 */
#define TRRO_SIGNAL_DEVICEID_OR_PASSWORD_INCORRECT          0x03000006

/**
 * @def TRRO_DEVICE_ALREADY_LOGIN
 * @brief 50331655
 * 信令服务器连接用户名已经登陆
 */
#define TRRO_DEVICE_ALREADY_LOGIN                           0x03000007

/**
 * @def TRRO_CONFIG_LIC_FAILED
 * @brief 十进制【16777222】
 * license证书错误
 */
#define TRRO_CONFIG_LIC_FAILED                              0x01000006

/**
 * @def TRRO_CONFIG_STREAMS_SIZE_ERROR
 * @brief 十进制【16777223】
 * 超过最大支持流数目
 */
#define TRRO_CONFIG_STREAMS_SIZE_ERROR                      0x01000007

/**
 * @def TRRO_CONIFG_PORT_RANGE_ILLEGAL
 * @brief 十进制【16777224】
 * 端口范围配置非法
 */
#define TRRO_CONIFG_PORT_RANGE_ILLEGAL                      0x01000008


/**
 * @def TRRO_SESSION_INACTIVE
 * @brief 十进制【251658243】
 * 会话未激活
 */
#define TRRO_SESSION_INACTIVE                               0x0F000003

// 拉流独有错误码
#define TRRO_GWID_NOT_FOUND             0x00000010  // 16
#define TRRO_PARAM_INVALID              0x00F00000  // 输入参数不正确 15728640
#define TRRO_CONNECT_RESET              0x05000003  // 83886083:connect的时候如果之前有未断开的连接需要重置
#define TRRO_CONNECT_MODE               0x05000004  // 83886084:connect网关的连接mode不支持
#define TRRO_DIAG_STARTED               0x06000000  // 100663296: 诊断工具正在启动中
#define TRRO_DIAG_TIMEOUT               0x06000001  // 100663297: 诊断工具获取推流信息超时
#define TRRO_DIAG_FAILED                0x06000002  // 100663298: 诊断工具处理失败
#define TRRO_UNAUTHORIZED               0x07000000  // 117440512: 网关未授权无法发送消息


#ifdef __cplusplus
extern "C" {
#endif

// 推拉流共同拥有
/**
 * TrroState trro连接状态枚举
 */
enum TrroState {
    kDisconnect = 0, /**< 断连 */
    kConnecting = 1, /**< 连接中 */
    kConnected = 2,  /**< 已连接 */
    kDisconnecting = 3, /**< 已断连 */
    kAuthFailed = 4, /**< 鉴权失败 */
};

/**
 * TrroPermission 权限枚举
 */
enum TrroPermission {
    kPermissionGuest = 0, /**< guest权限 */
    kPermissionMaster = 1,  /**< master权限 */
};

/**
 * SignalState 信令连接状态枚举
 */
enum SignalState {
    kTrroReady = 0, /**< 连接建立成功 */
    kTrroLost = 1,  /**< 连接断开，内部会进行自动重连 */
    kTrroReup = 2,  /**< 自动重连成功 */
    kTrroKickout = 3,
    kTrroAuthFailed = 4,  /**< 用户名或者密码错误 */
};

/**
 * TrroLogLevel 日志等级枚举
 */
enum TrroLogLevel {
	TRRO_LOG_INFO = 1, /**< INFO */
	TRRO_LOG_WARNING = 2, /**< WARNING */
	TRRO_LOG_ERROR = 3, /**< ERROR */
};

enum TrroCodec {
    Trro_H264 = 0,
    Trro_H265 = 1,
    Trro_AV1 = 2,
    //音频
    Trro_OPUS = 20,
  };

// 推流独有
enum TrroRemoteDeviceState {
    kRemoteDeviceDisconnect = 0,
    kRemoteDeviceConnected = 1,
};

/**
 * TrroFormat Trro常用音视频数据类型
 */
enum TrroFormat {
    Trro_ColorUnknown = -1,
    Trro_ColorYUVI420 = 0, /**< YUVI420 */
    Trro_ColorI420    = 1, /**< YUVI420 */
    Trro_ColorUYVY    = 3, /**< UYVY   */
    Trro_ColorYUYV    = 4, /**< YUYV  */
    Trro_ColorJPEG    = 5, /**< JPEG  */
    Trro_ColorARGB    = 6, /**< ARGB  */
    Trro_ColorNV12    = 7, /**< NV12  */
    Trro_ColorMJPEG   = 8, /**< MJPEG */
    Trro_ColorEYUYV   = 9, /**< eyuyv */

    /* encode type */
    Trro_VideoH264    = 10,
    Trro_VideoH265    = 11,
    Trro_VideoAV1     = 12,

    Trro_ColorH264    = 10,
    Trro_ColorH265    = 11,
    Trro_ColorAV1     = 12,

    /*other color*/
    Trro_ColorBGRA = 20, /**< BGRA */
    Trro_ColorRGB = 21, /**< RGB888 */
    Trro_ColorBGR = 22, /**< BGR888 */
};

typedef TrroFormat TrroColor;

/**
 * FrameFieldType 帧类型枚举
 */
enum FrameFieldType {
    TYPE_IFrame = 1, /**< I帧 */
    TYPE_PFrame = 0, /**< P帧 */
};

/**
 * Trro_MediaFieldDeviceType 设备类型枚举
 */
enum Trro_MediaFieldDeviceType {
    ///麦克风类型设备
    MediaDeviceTypeMic = 0,
    ///扬声器类型设备
    MediaDeviceTypeSpeaker = 1,
};

/**
 * Trro_VideoCaptureProtocol 采集类型
 */
enum Trro_VideoCaptureProtocol {
 kV4L2_DMA = 0, /**< DMA硬件加速 */
 kV4L2_MMAP, /**< 内存映射 */
 kRTSP, /**< RTSP类型 */
};

struct TrroMultiNetworkStats {

    char local_ip[16];
    int local_port;
    char extern_ip[16];
    int extern_port;

    float rtt;
    float lost;
    unsigned long long send_bytes;
    unsigned long long recv_bytes;
};

struct TRRO_TextFormat {
    const char* text = NULL;                    //图像要叠加文字内容
    int point_x = 0;                            //叠加文字起始x坐标，最左侧为0
    int point_y = 0;                            //叠加文字起始y坐标，最顶部为0
    int text_border_size = 0;                   //文字边框大小，最小为0，最大值为3
    int text_color[4] = { 255 };                //叠加文字颜色，BGRA 0~255
    int text_border_color[4] = { 0 };           //叠加文字边框颜色，BGRA 0~255
    bool has_user_time = false;
    long long user_time = 0;                    //用户时间戳
};

struct TRRO_RoiRect {
  float x0 = 0;                         //左上角的点坐标 取值范围0 ~ 1该值为整个画面的相对位置，实际位置为encode_width * x
  float y0 = 0;                         //计算方式同上
  float x1 = 0;                         //右下角的点坐标 计算方式同上
  float y1 = 0;                         //右下角的点坐标 计算方式同上
  int qp_delta = 0;                     //该区域与底图的qp差距
};

//拉流独有
enum FrameType {
    TypeI420 = 0,
    TypeARGB = 1,
    TypeRGB  = 2,
    TYPENV12 = 3,
};

/* TRRO_OnMediaStateInfo 使用该结构体 包含媒体传输的详细信息
* fps         每秒帧数目
* bps         每秒数据量
* rtt         UDP ping网络往返时间
* decd        解码耗时ms
* jitter      接收抖动值
* packets_lost 总丢包数目 1-100
* packets_received 总接收数目
* stun         穿网模式 0：host, 1：srflx, 2：prflx, 3：relay
* 单位(%) 视频播放卡顿率 = 视频播放的累计卡顿时长 / 视频播放的总时长。
* lag_k100     视频帧间隔超过100ms视为卡顿，并将其计入视频播放的累计卡顿时长，最终计算获得的卡顿率。(音频暂不支持)
* lag_k150     视频帧间隔超过150ms视为卡顿，并将其计入视频播放的累计卡顿时长，最终计算获得的卡顿率。(音频暂不支持)
* duration     视频播放的总时长。(音频暂不支持)
*/
struct TrroMediaState {
    int fps;
    int bps;
    int rtt;
    long long decd;
    int jitter;
    long long packets_lost;
    long long packets_received;
    int stun;
    double lag_k100;
    double lag_k150;
    long long duration;
};

#ifdef __cplusplus
}
#endif

#endif 