#ifndef TRRO_REMOTE_H
#define TRRO_REMOTE_H

#include <stddef.h>
#include "trro_error_enum.h"
#define USE_CSHARP 1
#ifdef WIN32
#include <windows.h>
typedef HWND WindowIdType;

#ifdef TRRO_EXPORTS
#define TRRO_EXPORT __declspec(dllexport)
#else
#define TRRO_EXPORT __declspec(dllimport)
#endif

#ifdef USE_CSHARP
#define STD_CALL __stdcall 
#else
#define STD_CALL
#endif // USE_CSHARP

#else
typedef void* WindowIdType;
typedef void* HWND;
#define TRRO_EXPORT __attribute__((visibility("default")))
#define STD_CALL
#endif

#ifdef _MSC_VER
#define DEPRECATED __declspec(deprecated)
#elif defined(__GNUC__) || defined(__clang__)
#define DEPRECATED __attribute__((deprecated))
#else
#define DEPRECATED
#endif


#ifdef __cplusplus
extern "C"
{
#endif

/*
* @name :  TRRO_onVideotimeReport (depreciated)
* @brief : 视频帧采集时间戳回调, 旧接口，建议使用onAllLatencyReport接口获取
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        视频来源现场设备id
*          conn_fd     对应视频流接收句柄
*          videotime   当前视频帧的现场设备采集时间戳 (现场设备系统时钟)
* @return : void
*/
typedef void STD_CALL TRRO_onVideotimeReport(void* context, const char* gwid, int conn_fd, long long videotime);


/*
* @name :  TRRO_onLatencyReport (depreciated)
* @brief : 视频时延回调, 旧接口，建议使用onAllLatencyReport接口获取
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        视频来源现场设备id
*          conn_fd     对应视频流接收句柄
*          latency     返回视频上行时延ms
* @return : void
*/
typedef void STD_CALL TRRO_onLatencyReport(void* context, const char* gwid, int conn_fd, long long latency);


/*
* @name :  TRRO_onAllLatencyReport
* @brief : 时延回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        视频来源现场设备id
*          conn_fd     对应视频流接收句柄
*          latency1    返回视频上行时延ms
*          latency2    返回视频上行+控制下行延迟ms
*          videotime   当前视频帧的现场设备采集时间戳 (现场设备系统时钟)
*          rcct        控制信道往返时延ms, 等于控制上行延迟+控制下行延迟
* @return : void
*/
typedef void STD_CALL TRRO_onAllLatencyReport(void* context, const char* gwid, int conn_fd, long long latency1, long long latency2, long long videotime, int rcct);


/*
* @name :  TRRO_onReportData
* @brief : 接收来自现场设备信息回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        消息来源现场设备id 
*          msg         消息, 二进制透传
*          len         消息长度
*          qos         消息来源传输qos， 0:不可靠传输, 1:可靠传输
* @return : void
*/
typedef void STD_CALL TRRO_onReportData(void* context, const char* gwid, const char* msg, int len, int qos);

/*
* @name :  TRRO_onRemoteFrameData
* @brief : 原始视频图像帧回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        视频帧的来源现场设备id
*          stream_id   视频帧的来源现场设备流id
*          conn_fd     接收视频流的句柄标识
*          data        视频图像帧数据，数据格式为YUVI420，可通过I4202ARGB接口转ARGB
*          width       视频帧宽
*          height      视频帧高
*          videotime   当前视频帧的采集时间戳 (视频帧独立时钟)
* @return : void
*/
typedef void STD_CALL TRRO_onRemoteFrameData(void* context, const char* gwid, int stream_id, int conn_fd, const char* data, int width, int height, long long videotime);


/*
* @name :  TRRO_onRemoteMixAudioFrame
* @brief : 对端多路混音后音频原始数据回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          data        音频PCM数据 10ms 16bits
*          length      数据长度
*          channel     音频声道数目，如单声道为1，双声道为2，多声道为N
*          sample_rate   音频采样率
* @return : void
*/

typedef void STD_CALL TRRO_onRemoteMixAudioFrame(void* context, const char* data, int length, int channel, int sample_rate);

/*
 * @name :  TRRO_onRemoteEncodedFrameData
 * @brief : 编码视频图像帧回调
 * @input : context       回调上下文指针, 返回注册回调函数时传入的context
 *          gwid          视频帧的来源现场设备id
 *          stream_id     视频帧的来源现场设备流id
 *          conn_fd       接收视频流的句柄标识
 *          data          编码的视频图像帧数据
 *          len           编码的视频图像帧的长度
 *          trro_codec    编码的codec类型
 *          is_key_frame  是否是关键帧
 *          videotime     当前视频帧的采集时间戳 (视频帧独立时钟)
 *          has_user_time 是否有用户自定义时间戳
 *          user_time     用户自定义时间戳
 * @return : void
 */
typedef void STD_CALL TRRO_onRemoteEncodedFrameData(void* context, const char* gwid, int stream_id, int conn_fd,
                                                    const char* data, int len, TrroCodec trro_codec, bool is_key_frame,
                                                    long long videotime, bool has_user_time, unsigned long long user_time);

/*
* @name :  TRRO_OnState
* @brief : 视频流连接状态回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        视频帧的来源现场设备id
*          stream_id   视频帧的来源现场设备流id
*          conn_fd     接收视频流的句柄标识
*          state       视频流连接状态，对应 TrroState 状态
* @return : void
*/
typedef void STD_CALL TRRO_OnState(void* context, const char* gwid, int stream_id, int conn_fd, int state);

/*
* @name :  TRRO_OnAudioState
* @brief : 音频流连接状态回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        视频帧的来源现场设备id
*          up_or_down  0: 上行 1: 下行
*          state       视频流连接状态，对应 TrroState 状态
* @return : void
*/
typedef void STD_CALL TRRO_OnAudioState(void* context, const char* gwid, int up_or_down, int state);

/*
* @name :  TRRO_OnControlState
* @brief : 控制流连接状态回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          gwid        视频帧的来源现场设备id
*          state       视频流连接状态，对应 TrroState 状态
* @return : void
*/
typedef void STD_CALL TRRO_OnControlState(void* context, const char* gwid, int state);

/*
* @name :  TRRO_OnMediaState
* @brief : 视频流传输状态回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          conn_fd     接收视频流的句柄标识
*          fps         每秒帧数目
*          bps         每秒数据量
*          rtt         UDP ping网络往返时间
*          decd        解帧耗时ms
*          jitter      接收抖动值
*          packets_lost 总丢包数目
*          packets_received 总接收数目
*          stun         穿网模式 0：host, 1：srflx, 2：prflx, 3：relay
* @return : void
*/
typedef void STD_CALL TRRO_OnMediaState(void* context, int conn_fd, int fps, int bps, int rtt, long long decd, int jitter,
    long long packets_lost, long long packets_received, int stun);


/*
* @name :  TRRO_OnMediaStateInfo
* @brief : 视频流传输状态回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          conn_fd     接收视频流的句柄标识
*          mediastate  媒体相关的详细信息
* @return : void
*/
typedef void STD_CALL TRRO_OnMediaStateInfo(void* context, int conn_fd, TrroMediaState mediastate);

/*
* @name :  TRRO_OnAudioMediaStateInfo
* @brief : 视频流传输状态回调
* @input : context     回调上下文指针, 返回注册回调函数时传入的context
*          conn_fd     接收视频流的句柄标识
*          mediastate  媒体相关的详细信息
* @return : void
*/
typedef void STD_CALL TRRO_OnAudioMediaStateInfo(void* context, int conn_fd, TrroMediaState mediastate);

/*
* @name :   TRRO_OnLogData
* @brief :  日志回调
* @input :  context        回调上下文指针, 返回注册回调函数时传入的context
*           msg            日志内容
*           level          日志级别,参考枚举TrroLogLevel
* @return : void
*/
typedef void STD_CALL TRRO_OnLogData(void* context, const char* msg, int level);


/*
* #name :   TRRO_OnDiagReport
* @brief :  诊断信息回调
* @input :  context      回调上下文指针, 返回注册回调函数时传入的context
*           gwid         发起诊断的目标现场设备id
*           type         1 成功 , < 0 相关错误信息 
*           json         回调诊断详细信息 json格式
* @return : void
*/
typedef void STD_CALL TRRO_OnDiagReport(void* context, const char* gwid, int type, const char* json);

/*
* #name :   TRRO_OnOperationPermissionState
* @brief :  回调现场设备操控权限状态通知
* @input :  context             回调上下文指针, 返回注册回调函数时传入的context
*           field_devid         来源现场设备id
*           self_permission     本设备当前的操控权限，参考TrroPermission， 0 是guest，只有观看权限， 1是master，拥有完全控制权限
*           master_devid        拥有master权限的远端设备id
* @return : void
*/
typedef void STD_CALL TRRO_OnOperationPermissionState(void* context, const char* field_devid, int self_permission, const char* master_devid);


/**
 * @name TRRO_onSessionActiveState
 * @brief 会话活跃状态回调接口
 * @param[in] context 回调上下文指针, 返回注册回调函数时传入的context
 * @param[in] gw_id 网关id
 * @param[in] is_active 是否活跃
 */
typedef void TRRO_onSessionActiveState(void* context, const char* gw_id, bool is_active);

/**
* @name : TRRO_onFieldSideMediaState
* @brief : field端网络状态信息，server模式时有意义
* @input :       context            上下文
*                gwid               field端ID
*                stream_id          field端流ID
*                fps                field端推送帧率
*                bps                field端推送码率
*                rtt                field端封包来回时间
*                jitter             field端抖动
*                lost               field端丢包率
* @return : void
*/
typedef void TRRO_onFieldSideMediaState(void* context, const char* gwid, int stream_id, int fps, int bps, int rtt, int jitter, int lost);

/**
* @name TRRO_onSignalState
* @brief 信令连接状态回调
* @param[in]     context        上下文
* @param[in]     state          信令连接状态，参考枚举 SignalState
* @return void
*/
typedef void TRRO_onSignalState(void *context, SignalState state);


/**
* @name TRRO_OnErrorEvent
* @brief 错误信息回调，在异步初始化（TRRO_initJsonAsync）或运行时发生错误时触发。
*        注意：回调函数在 SDK 内部线程中执行，请勿在回调中执行耗时操作，如需长时间处理请转移到其他线程。
*
* @param[in] context        上下文
* @param[in] error_code     错误码，为负值。
*
*            ── 初始化阶段（仅 TRRO_initJsonAsync 异步初始化时通过此回调通知）──
*            收到以下错误码时，SDK 已自动重置为未初始化状态，可修正配置后重新调用 TRRO_initJsonAsync：
*
*            -TRRO_INIT_REPEAT:                       重复初始化（上一次初始化尚未完成或已成功）
*                                                     处理：等待当前初始化完成，或先调用 TRRO_destroy 后再重新初始化
*            -TRRO_CONFIG_PARSE_FAILED:               配置JSON格式异常，或private模式下server_path为空
*                                                     处理：检查并修正 JSON 配置格式或 server_ip/server_port 字段
*            -TRRO_CONFIG_DEVICE_ID_INVALID:          设备ID格式非法（仅允许中英文、数字、下划线、连字符）
*                                                     处理：修正 device_id 字段格式后重新初始化
*            -TRRO_CONFIG_DEVICE_NAME_INVALID:        设备名称格式非法（仅允许中英文、数字、下划线、连字符）
*                                                     处理：修正 device_name 字段格式后重新初始化
*            -TRRO_CONFIG_FIELD_TYPE_ERROR:           配置字段类型错误（如 server_ip 应为字符串、turn 应为数组）
*                                                     处理：检查并修正对应字段的类型后重新初始化
*            -TRRO_CONFIG_CER_FAILED:                 证书文件不存在或无法读取
*                                                     处理：检查 certificate 字段路径是否正确，确保文件存在且可读
*            -TRRO_CONFIG_REQUIRED_FIELD_MISSING:     必填字段缺失（device_id/device_name/max_streams/cloud_mode，
*                                                     public模式还需 certificate/password/project_id，
*                                                     private模式还需 server_ip/server_port/rtc_server_ip/rtc_server_port）
*                                                     处理：补全缺失的必填字段后重新初始化
*            -TRRO_CONFIG_SDK_MODE_INVALID:           sdk_mode 值非法（必须为 p2p/server/server2）
*                                                     处理：修正 sdk_mode 字段值后重新初始化
*            -TRRO_CONFIG_CLOUD_MODE_INVALID:         cloud_mode 值非法（必须为 public/private）
*                                                     处理：修正 cloud_mode 字段值后重新初始化
*            -TRRO_CONIFG_PORT_RANGE_ILLEGAL:         端口范围配置非法（min_port >= max_port 或范围小于100）
*                                                     处理：修正 min_port/max_port 字段，确保 max_port - min_port >= 100
*            -TRRO_CONFIG_LOG_PERMISSION_DENIED:       打开 log 文件权限不足
*                                                     处理：检查 output_path 目录的写入权限，或修改为有权限的路径
*            -TRRO_CONFIG_ILLEGAL:                    内部配置失败（如 RTC 端口范围设置失败）
*                                                     处理：检查 rtc_server_ip/rtc_server_port 配置是否正确
*            -TRRO_SIGNAL_REGIST_FAILED:              信令服务器注册失败（网络不通或服务器异常）
*                                                     处理：检查网络连接及 server_ip/server_port 配置，稍后重试
*            -TRRO_SIGNAL_DEVICEID_OR_PASSWORD_INCORRECT: 设备ID或密码错误
*                                                     处理：检查 device_id 和 password 配置是否正确
*            -TRRO_DEVICE_ALREADY_LOGIN:              该设备ID已在其他地方登录
*                                                     处理：确认是否有其他实例正在运行，或配置 force_login=1 强制登录
*            -TRRO_SIGNAL_CONNECT_OUTTIME:            信令服务器连接超时
*                                                     处理：检查网络连接，稍后重试；可适当增大 mqtt_timeout 配置值
*            -TRRO_INIT_CANCEL:                       初始化被主动取消（调用了 TRRO_destroy）
*                                                     处理：如需重新初始化，直接再次调用 TRRO_initJsonAsync
*
*            ── 特殊情况（初始化仍会继续，SDK 正常运行）──
*            -TRRO_CONFIG_CERTIFICATE_MD5_INVALID:    证书 MD5 校验失败（仅通知，不中断初始化流程）
*                                                     处理：建议更新为官方提供的正确证书文件，当前初始化仍会继续
*
*            ── 运行时阶段（SDK 已初始化并连接后触发，SDK 仍在运行）──
*            -TRRO_ERROR_CALLBACK_JOIN_AUTH_FAILED:   RTC 进房失败（底层 event code 10006）
*                                                     error_msg 中包含 userId、gwid、stream_id 及详细属性信息
*                                                     处理：检查后台房间权限配置及 UserSig 是否有效。
*            -TRRO_MESSAGE_CHANNEL:                   数据通道发送错误（通道未找到、未连接或发送失败）
*                                                     处理：检查目标 gwid 是否仍处于连接状态，可尝试重新连接
*            -TRRO_MESSAGE_BLOCK:                     数据通道发送被阻塞（发送缓冲区满）
*                                                     处理：降低 TRRO_sendControlData 的调用频率，等待缓冲区恢复
*
* @param[in] error_msg      错误描述信息
* @return void
*/
typedef void TRRO_OnErrorEvent(void* context, int error_code, const char* error_msg);

/*
* @name :  TRRO_getGwList
* @brief : 获取在线现场设备设备列表，接口为同步阻塞模式.
* @input : void
* @return : json字符串, 使用方不需要释放指针, 获取到值后立即拷贝。
*           {"ret":0,"msg":"suc","gateways":[{"deviceID":"xx","name":"xx","type":"gateway","status":"connected","streams":4,"timestamp":1682231838673,"version":"xx"}],"count":1}
*/
extern "C" TRRO_EXPORT const char* TRRO_getGwList();

/*
* @name :  TRRO_getGwList
* @brief : 获取对应网关的版本，接口为同步阻塞模式.
* @input : gwid 设备id 公有云含projectID前缀/
* @return : json字符串, 使用方不需要释放指针, 获取到值后立即拷贝。
*           {"ret":0, "msg": "suc", "deviceID":"xx","name":"xx","type":"gateway","status":"connected","streams":4,"timestamp":1682231838673,"version":"xx","sdk_mode":"server2","ability":0,"licenseExpire":1745666980}
*/
extern "C" TRRO_EXPORT const char* TRRO_getGwInfo(const char* gwid);


/*
* @name :  TRRO_init (depreciated)
* @brief : SDK初始化，读取"./config.json"文件初始化， 接口为同步阻塞模式，等待信令连接成功后返回
* @input : void
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_UNEXIST:                    配置文件不存在
*           -TRRO_INIT_REPEAT:                       重复初始化
*           -TRRO_CONFIG_PARSE_FAILED:               配置文件格式异常
*           -TRRO_CONFIG_DEVICE_ID_INVALID:          设备ID格式非法
*           -TRRO_CONFIG_DEVICE_NAME_INVALID:        设备名称格式非法
*           -TRRO_CONFIG_FIELD_TYPE_ERROR:           配置字段类型错误
*           -TRRO_CONFIG_CER_FAILED:                 云证书错误
*           -TRRO_CONFIG_REQUIRED_FIELD_MISSING:     必填字段缺失
*           -TRRO_CONFIG_SDK_MODE_INVALID:           SDK模式值非法
*           -TRRO_CONFIG_CLOUD_MODE_INVALID:         云模式值非法
*           -TRRO_CONIFG_PORT_RANGE_ILLEGAL:         端口范围配置非法
*           -TRRO_CONFIG_LOG_PERMISSION_DENIED:       打开log文件权限不足
*           -TRRO_CONFIG_ILLEGAL:                    配置参数非法（如RTC端口范围设置失败）
*           -TRRO_SIGNAL_REGIST_FAILED:              信令注册失败
*           -TRRO_SIGNAL_DEVICEID_OR_PASSWORD_INCORRECT: 设备ID或密码错误
*           -TRRO_DEVICE_ALREADY_LOGIN:              设备已登录
*           -TRRO_SIGNAL_CONNECT_OUTTIME:            信令服务器连接超时
*           -TRRO_INIT_CANCEL:                       用户主动取消初始化
*/
extern "C" TRRO_EXPORT int TRRO_init(); 

/*
* @name :  TRRO_initJsonPath
* @brief : SDK初始化，读取指定路径文件初始化， 接口为同步阻塞模式，等待信令连接成功后返回
* @input : jsonPath   json文件路径
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               jsonPath参数为空
*           -TRRO_CONFIG_UNEXIST:                    配置文件不存在或内容为空
*           -TRRO_INIT_REPEAT:                       重复初始化
*           -TRRO_CONFIG_DEVICE_ID_INVALID:          设备ID格式非法
*           -TRRO_CONFIG_DEVICE_NAME_INVALID:        设备名称格式非法
*           -TRRO_CONFIG_FIELD_TYPE_ERROR:           配置字段类型错误
*           -TRRO_CONFIG_CER_FAILED:                 云证书错误
*           -TRRO_CONFIG_REQUIRED_FIELD_MISSING:     必填字段缺失
*           -TRRO_CONFIG_SDK_MODE_INVALID:           SDK模式值非法
*           -TRRO_CONFIG_CLOUD_MODE_INVALID:         云模式值非法
*           -TRRO_CONIFG_PORT_RANGE_ILLEGAL:         端口范围配置非法
*           -TRRO_CONFIG_LOG_PERMISSION_DENIED:       打开log文件权限不足
*           -TRRO_CONFIG_ILLEGAL:                    配置参数非法（如RTC端口范围设置失败）
*           -TRRO_SIGNAL_REGIST_FAILED:              信令注册失败
*           -TRRO_SIGNAL_DEVICEID_OR_PASSWORD_INCORRECT: 设备ID或密码错误
*           -TRRO_DEVICE_ALREADY_LOGIN:              设备已登录
*           -TRRO_SIGNAL_CONNECT_OUTTIME:            信令服务器连接超时
*           -TRRO_INIT_CANCEL:                       用户主动取消初始化
*/
extern "C" TRRO_EXPORT int TRRO_initJsonPath(const char* jsonPath); 

/*
* @name :  TRRO_initJson
* @brief : SDK初始化，读取输入JSON字符串初始化， 接口为同步阻塞模式，等待信令连接成功后返回
* @input : json   json配置字符串
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               json参数为空或配置格式异常
*           -TRRO_INIT_REPEAT:                       重复初始化
*           -TRRO_CONFIG_DEVICE_ID_INVALID:          设备ID格式非法
*           -TRRO_CONFIG_DEVICE_NAME_INVALID:        设备名称格式非法
*           -TRRO_CONFIG_FIELD_TYPE_ERROR:           配置字段类型错误
*           -TRRO_CONFIG_CER_FAILED:                 云证书错误
*           -TRRO_CONFIG_REQUIRED_FIELD_MISSING:     必填字段缺失
*           -TRRO_CONFIG_SDK_MODE_INVALID:           SDK模式值非法
*           -TRRO_CONFIG_CLOUD_MODE_INVALID:         云模式值非法
*           -TRRO_CONIFG_PORT_RANGE_ILLEGAL:         端口范围配置非法
*           -TRRO_CONFIG_LOG_PERMISSION_DENIED:       打开log文件权限不足
*           -TRRO_CONFIG_ILLEGAL:                    配置参数非法（如RTC端口范围设置失败）
*           -TRRO_SIGNAL_REGIST_FAILED:              信令注册失败
*           -TRRO_SIGNAL_DEVICEID_OR_PASSWORD_INCORRECT: 设备ID或密码错误
*           -TRRO_DEVICE_ALREADY_LOGIN:              设备已登录
*           -TRRO_SIGNAL_CONNECT_OUTTIME:            信令服务器连接超时
*           -TRRO_INIT_CANCEL:                       用户主动取消初始化
*/
extern "C" TRRO_EXPORT int TRRO_initJson(const char* json); 


/*
* @name :  TRRO_initJsonAsync
* @brief : SDK初始化，读取输入JSON字符串初始化， 接口为异步非阻塞模式，请使用 TRRO_onSignalState 回调确认信令连接成功
* @input : json   json配置字符串
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           注意：异步模式下，函数本身仅做参数校验，成功时立即返回 TRRO_SUCCEED，
*           初始化结果通过 TRRO_onSignalState 和 TRRO_OnErrorEvent 回调通知。
*           可能返回的错误码（同步阶段）：
*           -TRRO_CONFIG_PARSE_FAILED:               json参数为空
*           -TRRO_INIT_REPEAT:                       重复初始化
*/
extern "C" TRRO_EXPORT int TRRO_initJsonAsync(const char* json); 


/*
* @name :  TRRO_setSessionPermissionToken
* @brief : 白名单模式下，针对未注册设备观看，用于观看身份验证
* @input : gwid          授权现场设备ID， project_id/device_id
*          signature     基于项目密钥签发的临时授权签名
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               gwid 或 signature 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化或内部错误
*/
extern "C" TRRO_EXPORT int TRRO_setSessionPermissionToken(const char* gwid, const char* signature); 

/*
* @deprecated 这个接口已被废弃，不再推荐使用。请使用 TRRO_connectField 接口代替。
*/
extern "C" TRRO_EXPORT DEPRECATED int TRRO_connect(const char* gwid, const char* record_config, int streams_num, int* streams_id, int* conn_fds);

/*
* @name :  TRRO_connectField
* @brief : 发起视频连接，可多次调用连接不同流，异步模式，根据onState状态回调确认视频连接成功
* @input : gwid           目标连接的现场设备ID
*          streams_num    要拉取现场设备视频流的个数， 与conn_fds和streams_num数组长度匹配， 值的范围 1 到 现场设备支持的device_streams数量
*          streams_id     现场设备视频流的ID数组， 现场设备视频流ID从0开始， 最大值为现场设备支持的device_streams数量 -1
*          conn_fds       conn_fd数组，conn_fd为接收视频流的句柄标识，自行编号，取值从0开始，最大值为max_streams -1，max_streams在远端设备配置文件配置
*          compatible     是否开启版本兼容: 设置0，根据配置文件的"sdk_mode"字段来决定连接模式；设置为1，该接口会获取网关版本信息从而根据网关模式自动适配模式连接（由于需要获取版本信息会影响秒开）。默认值为0
*          record_config: 优先使用录制配置，当默认录制配置命名规则无法满足需求时使用，
                            json字符串，需要对每一路进行配置 eg:"{\"file_names\": [{\"file\":\"test\", \"duration\":15}, {\"file\":\"test01\", \"duration\":15}]}"  
                            ps:file 文件名 duration 分片时长单位秒; 不使用时默认为NULL
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               gwid、streams_id 或 conn_fds 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化
*           -TRRO_PARAM_INVALID:                     gwid为空、streams数量非法或conn_fd超出范围
*           -TRRO_CONNECT_MODE:                      连接模式不支持
*/
extern "C" TRRO_EXPORT int TRRO_connectField(const char* gwid, int streams_num, int* streams_id, int* conn_fds, int compatible = 0, const char* record_config = NULL);

/*
* @name :  TRRO_setWindows
* @brief : 设置接收流句柄对应的显示窗口句柄
* @input : conn_fds 接收视频流句柄数组
*          windows  显示窗口句柄数组， 显示窗口句柄为显示窗体的句柄/指针，如windows平台的HWND；
*                   外部渲染时，数组中的显示窗口句柄配置为nullptr
*          num      设置显示窗口数量，与conn_fds和windows数组长度匹配
* @return : void
*/
extern "C" TRRO_EXPORT void TRRO_setWindows(int* conn_fds, WindowIdType * windows, int num);


/*
* @name :  TRRO_SetRenderConfig
* @brief : 设置接收流句柄对应的内部渲染模式, 仅内部渲染时使用
* @input : conn_fds 要设置渲染模式的接收视频流句柄数组
*          rotation 旋转角度 数组 rotation 为正顺时针旋转，rotation为负 逆时针旋转
*          scale 分辨率匹配模式数组 0 窗口拉伸， 1 保持原比例
*          config 预留渲染配置数组 0x00000XYZ X为1~2时开启夜视不同等级 推荐为2，Y为1时为开启超分模式，Z为1时为开启镜像渲染
*          num  配置的内部渲染流数量，与输入数组长度匹配
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               conn_fds、rotation、scale 或 config 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化或内部错误
*/
extern "C" TRRO_EXPORT int TRRO_SetRenderConfig(int *conn_fds, int *rotation, int *scale, int *config, int num);



/*
* @name :  TRRO_disconnect
* @brief : 关闭conn_fds 对应的视频连接
* @input : conn_fds 要关闭视频连接对应的视频接收句柄数组
*          fd_num conn_fd数组长度
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               conn_fds 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化或内部错误
*           -TRRO_PARAM_INVALID:                     conn_fd超出max_streams范围
*/
extern "C" TRRO_EXPORT int TRRO_disconnect(int* conn_fds, int fd_num);

/*
* @name :  TRRO_disconnectAll
* @brief : 关闭所有视频连接
* @input : void
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_COMMON_ERROR:                      SDK未初始化或内部错误
*/
extern "C" TRRO_EXPORT int TRRO_disconnectAll();


/*
* @name :  TRRO_sendControlData
* @brief : 给现场设备发送控制数据
* @input : gwid     目标现场设备id
*          msg      发送消息，二进制透传
*          len      消息长度  
*          qos      消息传输qos  0:不可靠传输 1:可靠传输
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               gwid 或 msg 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化，或目标gwid未连接
*           -TRRO_PARAM_INVALID:                     len 为负数
*           -TRRO_MESSAGE_BYTE_EXCEED:               消息长度超过限制（单条超限或1s内总量超限）
*           -TRRO_MESSAGE_RATE_EXCEED:               发送频率过高（3秒内超过最大消息数）
*           -TRRO_MESSAGE_MAX_EXCEED:                1秒内发送数据量超过上限
*           -TRRO_MESSAGE_CHANNEL:                   数据通道异常
*           -TRRO_UNAUTHORIZED:                      无操控权限（非master权限）
*           -TRRO_GWID_NOT_FOUND:                    目标gwid未找到
*/
extern "C" TRRO_EXPORT int TRRO_sendControlData(const char* gwid, const char* msg, int len, int qos = 0);


/*
* @name :  TRRO_audioMute
* @brief : Mute/unMute 目标现场设备的音频
* @input : gwid     目标现场设备id
*          mute     true 静音， false 取消静音
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               gwid 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化
*           -TRRO_GWID_NOT_FOUND:                    目标gwid未找到或无音频流
*/
extern "C" TRRO_EXPORT int TRRO_audioMute(const char* gwid, bool mute);

/*
* @name :  TRRO_muteLocalAudio
* @brief : Mute 本地音频流
* @input : gwid     目标现场设备id
*          mute     true 静音， false 取消静音        
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               gwid 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化
*           -TRRO_GWID_NOT_FOUND:                    目标gwid未找到或无本地音频流
*/
extern "C" TRRO_EXPORT int TRRO_muteLocalAudio(const char* gwid, bool mute);

/* @name  TRRO_externAudioData
* @brief 外部音频数据输入(pcm数据), 16位音频采样
* @param[in]   gwid         目标现场设备id
* @param[in]   data         源数据
* @param[in]   data_size    数据大小
* @param[in]   channel      音频声道数（仅支持1或2）
* @param[in]   sample_rate  音频采样率
* @return 成功 TRRO_SUCCEED 失败 <= 0
*         可能返回的错误码：
*         -TRRO_CONFIG_PARSE_FAILED:               gwid 或 data 参数为空
*         -TRRO_INIT_ERROR:                        data_size <= 0、channel不在[1,2]范围内或sample_rate <= 0
*         -TRRO_COMMON_ERROR:                      SDK未初始化或内部错误
*/
extern "C" TRRO_EXPORT int TRRO_externAudioData(const char* gwid, const char* data, int data_size, int channel, int sample_rate);

/*
* @name : TRRO_diagRequest
* @brief : 需要主动触发，诊断网关、控制端当前状态输出报告，结果通过 TRRO_OnDiagReport 回调返回
* @input : gwid     目标设备id
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               gwid 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化
*           -TRRO_DIAG_STARTED:                      诊断工具已在运行中，请勿重复触发
*/
extern "C" TRRO_EXPORT int TRRO_diagRequest(const char* gwid);


/*
* @name : TRRO_requestPermission
* @brief : 向网关发出权限请求，网关会反馈TRRO_OnOperationPermissionState 更新权限
* @input : gwid         目标设备id
*          permisson    参考结构体 TrroPermission
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               gwid 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化
*/
extern "C" TRRO_EXPORT int TRRO_requestPermission(const char* gwid, int permisson);


/*
*   回调注册函数
*   context 上下文指针，回调时会返回注册时传入的该指针, 可用于回调类对象定位
*   callback 注册的回调函数，回调函数实现中请勿在回调线程长时间阻塞，若需要长时间处理建议转移到其他线程处理
*   frame_type 注册帧回调时需要的帧类型，参考FrameType 默认I420 0
*/
extern "C" TRRO_EXPORT void TRRO_registerLatencyCallback(void* context, TRRO_onLatencyReport * callback);
extern "C" TRRO_EXPORT void TRRO_registerAllLatencyCallback(void* context, TRRO_onAllLatencyReport * callback);
extern "C" TRRO_EXPORT void TRRO_registerVideotimeCallback(void* context, TRRO_onVideotimeReport * callback);
extern "C" TRRO_EXPORT void TRRO_registerReportDataCallback(void* context, TRRO_onReportData * callback);
extern "C" TRRO_EXPORT void TRRO_registerRemoteFrameCallback(void* context, TRRO_onRemoteFrameData * callback, int frame_type = 0);
extern "C" TRRO_EXPORT void TRRO_registerRemoteMixAudioFrameCallback(void* context, TRRO_onRemoteMixAudioFrame * callback);
extern "C" TRRO_EXPORT void TRRO_registerRemoteEncodedFrameCallback(void* context, TRRO_onRemoteEncodedFrameData* callback);
extern "C" TRRO_EXPORT void TRRO_registerOnState(void* context, TRRO_OnState * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnAudioState(void* context, TRRO_OnAudioState * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnControlState(void* context, TRRO_OnControlState * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnMediaState(void* context, TRRO_OnMediaState * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnMediaStateInfo(void* context, TRRO_OnMediaStateInfo * callback);
extern "C" TRRO_EXPORT int TRRO_registerLogCallback(void* context, TRRO_OnLogData * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnDiagReport(void* context, TRRO_OnDiagReport * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnOperationPermissionState(void* context, TRRO_OnOperationPermissionState* callback);
extern "C" TRRO_EXPORT void TRRO_registerFieldSideNetworkState(void* context, TRRO_onFieldSideMediaState * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnAudioMediaStateInfo(void *context, TRRO_OnAudioMediaStateInfo * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnErrorEvent(void* context, TRRO_OnErrorEvent * callback);
extern "C" TRRO_EXPORT void TRRO_registerOnSessionActiveState(void *context, TRRO_onSessionActiveState *callback);


/**
* @name   TRRO_registerSignalStateCallback
* @brief  注册信令服务连接状态回调
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 成功 TRRO_SUCCEED，该函数始终返回 TRRO_SUCCEED
*/
extern "C" TRRO_EXPORT int TRRO_registerSignalStateCallback(void *context, TRRO_onSignalState *callback);

//获取SDK版本号
extern "C" TRRO_EXPORT const char* TRRO_getVersion();

//销毁SDK，释放资源
extern "C" TRRO_EXPORT void TRRO_destroy();


/*
* @name :  TRRO_I4202ARGB
* @brief : YUV I420图像格式转ARGB图像格式，转换时带resize功能
* @input : argb     存放输出ARGB图像数据的指针，ARGB的int表示： 0XFF(RR)(GG)(BB)  ，  RR GG BB为对应的rgb的值
*          yuvI420  输入yuvI420图像数据指针
*          src_width  输入图像宽度
*          src_height  输入图像高度
*          dst_width   输出图像宽度
*          dst_height  输出图像高度
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_PARAM_INVALID:                     宽度或高度参数 <= 0
*           -TRRO_COMMON_ERROR:                      argb 或 yuvI420 指针为空
*/
extern "C" TRRO_EXPORT int TRRO_I4202ARGB(int* argb, char* yuvI420, int src_width, int src_height, int dst_width, int dst_height);

// 现场设备RTC重配置，暂不开放
extern "C" TRRO_EXPORT int TRRO_reinitRtc(const char* gwid, int streams_id, const char* config); 
extern "C" TRRO_EXPORT int TRRO_digitalResize(const char* gwid, int streams_id, int x1, int y1, int x2, int y2, int display_width, int display_height);
extern "C" TRRO_EXPORT int TRRO_digitalResizeDouble(const char* gwid, int streams_id, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int display_width, int display_height);

/*
* @name :  TRRO_fieldDeviceEncodeConfig
* @brief : 更新现场设备目标视频流编码参数
* @input : gwid 现场设备id
*          streams_id 目标视频流编号
*          encode_config 待更新的编码参数，json格式字符串，缺省字段将保持当前值不进行更新。 下面是更新支持的编码参数示意
*  {
*       "fps": 30,
*       "encode_width": 1920,
*       "encode_height": 1080,
*       "bps": 3000,
*       "min_fps": 30,
*       "min_bps": 1800,
*       "force_min": 0,
*       "min_width": 1920 
*  }
*/
extern "C" TRRO_EXPORT int TRRO_fieldDeviceEncodeConfig(const char* gwid, int streams_id, const char* encode_config);

//是否使用外部解码(只针对视频)
extern "C" TRRO_EXPORT int TRRO_useExternalDecoder(bool external);

/*
* @name :  TRRO_startMediaPush
* @brief : 开启rtmp/rtsp转推，调用TRRO_stopMediaPush停止，当调用connect/disconnect函数后conn_fd连接的视频流发生切流或断开时，也会自动停止推流，需要重新start才能推流
* @input : conn_fd     接收视频流的句柄标识
*          path        推流地址
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_CONFIG_PARSE_FAILED:               path 参数为空
*           -TRRO_COMMON_ERROR:                      SDK未初始化
*           -TRRO_PARAM_INVALID:                     path为空字符串，或conn_fd超出max_streams范围
*/
extern "C" TRRO_EXPORT int TRRO_startMediaPush(int conn_fd, const char* path);

/*
* @name :  TRRO_stopMediaPush
* @brief : 停止rtmp/rtsp转推
* @input : conn_fd     接收视频流的句柄标识
* @return : 成功 TRRO_SUCCEED 失败 <= 0
*           可能返回的错误码：
*           -TRRO_COMMON_ERROR:                      SDK未初始化
*           -TRRO_PARAM_INVALID:                     conn_fd对应的推流任务不存在
*/
extern "C" TRRO_EXPORT int TRRO_stopMediaPush(int conn_fd);


/*
* @name :  TRRO_simpleNavigationLine （实验性功能）
* @brief : 获取车辆行驶方向的导航线坐标， 基于阿克曼转向模型构建，假设相机水平正对前方，可用于简单导航示意
* @input : car_width       车辆宽度(前轮轴宽)
*          car_length      车辆长度(前后轮轴距)
*          car_angle       车辆转向角， -90度 到 90 度， 左转负值，右转正值, 可取内侧轮转向角度
*          scale           要显示的导航线远处宽度与起点宽度比例,取值范围(0,1.0)，对应导航线真实距离为blind_dist/scale
*          camera_height   相机高度
*          blind_dist      相机图像底部目标到车辆的真实距离，即前方视觉盲区的距离
*          camera_ratio    相机图像宽高像素比
*          size            导航线采样点数
* @return: 成功 TRRO_SUCCEED 失败 <= 0
*          line_out        生成导航线坐标数组, 数组大小为4*size, 共size个采样点，编号从0到size-1，
                           line_out[i*4] 为第i个采样点，左侧导航线X坐标
                           line_out[i*4+1] 为第i个采样点，左侧导航线Y坐标
                           line_out[i*4+2] 为第i个采样点，右侧导航线X坐标
                           line_out[i*4+3] 为第i个采样点，右侧导航线Y坐标
                           导航线坐标原点，画面中心点，X坐标范围(-1，1)，y坐标范围(-1，1),line_out中超出坐标范围的点为无效点(对应距离点不存在或超出图像范围)
*          可能返回的错误码：
*          -TRRO_COMMON_ERROR:                       SDK未初始化
*/
extern "C" TRRO_EXPORT int TRRO_simpleNavigationLine(double car_width, double car_length, double car_angle, double scale, double camera_height, double blind_dist, double camera_ratio, double* line_out, int size);



/*
* @name :  TRRO_cameraViewNavigationLine （实验性功能）
* @brief : 获取车辆行驶方向的导航线坐标， 基于相机视角构建, 需要根据真实参数设置，可接近图中真实轨迹
* @input : nav_dist              导航线远端到车辆的距离
*          blind_dist            导航线近端（相机图像底部）到车辆的真实距离，即前方视觉盲区的距离
*          car_width             车辆宽度，单位与以上一致
*          car_length            车辆前后轮轴距，单位与以上一致
*          camera_height         相机高度，单位与以上一致
*          camera_pitch_degree   相机俯仰角，范围(0,90]度，正对前方为90度
*          camera_aspect_ratio   相机图像宽高比，图像宽度/高度
*          car_angle             车辆转向角， -90度 到 90 度， 左转负值，右转正值, 可取内侧轮转向角度
*          size                  导航线采样点数
* @return: 成功 TRRO_SUCCEED 失败 <= 0
*          line_out              生成导航线坐标数组, 数组大小为4*size, 共size个采样点，编号从0到size-1，
                                 line_out[i*4] 为第i个采样点，左侧导航线X坐标
                                 line_out[i*4+1] 为第i个采样点，左侧导航线Y坐标
                                 line_out[i*4+2] 为第i个采样点，右侧导航线X坐标
                                 line_out[i*4+3] 为第i个采样点，右侧导航线Y坐标
                                 导航线坐标原点，画面中心点，X坐标范围(-1，1)，y坐标范围(-1，1), line_out中超出坐标范围的点为无效点(对应距离点不存在或超出图像范围)
                                 导航线第i个点与车距离近似为 blind_dst + i * (nav_dist - blind_dst) / (size -1)
*          可能返回的错误码：
*          -TRRO_COMMON_ERROR:                       SDK未初始化
*/
extern "C" TRRO_EXPORT int TRRO_cameraViewNavigationLine(double nav_dist, double blind_dist, double car_width, double car_length, double camera_height,  double camera_pitch_degree, double camera_aspect_ratio, double car_angle, double* line_out, int size);

#ifdef __cplusplus
}
#endif


#endif
