/*! @file trro_field.h */
#ifndef TRRO_FIELD_H
#define TRRO_FIELD_H
#define TRRO_EXPORT __attribute__((visibility("default")))
#define DEPRECATED __attribute__((deprecated))

/*
 * TRROFIELD_EXPORT: 2.5 风格 TRROField_xxx 接口的可见性标记。
 * 始终 default 可见性——两个 .so 都导出 TRROField_xxx 全集。
 */
#define TRROFIELD_EXPORT __attribute__((visibility("default")))

/*
 * TRROCOMPAT_EXPORT: 2.4 兼容 TRRO_xxx 接口的可见性标记。
 *
 * 本对外头文件 **只暴露 2.5 TRROField_xxx 接口**；2.4 兼容接口
 * （TRRO_xxx / 裸名 getErrorMsg）的声明位于 **内部头 src/trro_field_compat.h**，
 * 仅供 SDK 内部 trro_field.cpp 包含使用，不随产物发布。
 *
 * TRROCOMPAT_EXPORT 始终 default 可见性，由链接期 version script 决定是否
 * 真正进入动态符号表：
 *   - libtrro_field.so（标准库）：无 version script，TRRO_xxx 全部导出，
 *     兼容按 2.4 TRRO_ 接口开发的存量客户。
 *   - libtrro_field_alone.so（推拉流共用客户专用）：链接时使用
 *     cmake/trro_field_alone.ver，仅 TRROField_* 进入导出列表，
 *     TRRO_* 与 getErrorMsg 在 ld 阶段被强制 local 化（不进入动态符号表），
 *     避免与同进程的拉流端 SDK TRRO_ 前缀符号冲突。
 */
#define TRROCOMPAT_EXPORT __attribute__((visibility("default")))

#include "trro_error_enum.h"

/**
* @name TRROField_OnMultiNetworkStat
* @brief  回调所绑定的每个网卡的内网IP，外网IP， rtt、lost 接收数据和发送数据
* @param[in]     stats
* @return void
*/
typedef void TRROField_onMultiNetworkStat(void* context, const TrroMultiNetworkStats stats);

/**
* @name TRROField_OnAudioState
* @brief 音频连接状态回调
* @param[in]     context        上下文
* @param[in]     up_or_down     0 为上行 1 为下行 
* @param[in]     state          TrroState连接状态
* @return void
*/
typedef void TRROField_OnAudioState(void* context, int up_or_down, int state);

/**
* @name TRROField_OnControlState
* @brief 数据连接状态回调
* @param[in]     context        上下文
* @param[in]     state          TrroState连接状态
* @return void
*/
typedef void TRROField_OnControlState(void* context, int state);

/**
* @name TRROField_OnVideoState
* @brief 视频连接状态回调
* @param[in]     context        上下文
* @param[in]     stream_id      视频流id
* @param[in]     state          TrroState连接状态
* @return void
*/
typedef void TRROField_OnVideoState(void* context, int stream_id, int state);

/**
* @name TRROField_OnState
* @brief 视频连接状态回调
* @deprecated 该回调类型已被废弃，命名不够明确，请使用 TRROField_OnVideoState 代替。
*             两者签名完全一致，作为函数指针类型可互相替代。
* @param[in]     context        上下文
* @param[in]     stream_id      视频流id
* @param[in]     state          TrroState连接状态
* @return void
*/
typedef void DEPRECATED TRROField_OnState(void* context, int stream_id, int state);

/**
* @name TRROField_OnErrorEvent
* @brief 异步错误事件回调，SDK 内部发生异步错误时触发。
*        注意：error_code 为负值，即 trro_error_enum.h 中定义的错误码取负。
*        可通过 TRROField_getErrorMsg(-error_code) 获取对应的错误描述字符串。
*
* @param[in] context        注册时传入的上下文指针
* @param[in] error_code     异步错误码（负值），所有可能的取值如下：
*
*   【采集设备错误】
*   -TRRO_ERROR_CALLBACK_CAMERA
*       相机采集初始化失败或采集过程中发生错误（设备打开失败、数据源获取失败等）。
*       处理建议：检查摄像头设备是否正常连接，或切换为外部视频输入模式（outside/outenc）。
*
*   -TRRO_ERROR_CALLBACK_MIC
*       麦克风采集初始化失败或采集过程中发生错误。
*       处理建议：检查麦克风设备是否正常，或切换为外部音频输入模式（audio_external）。
*
*   【网络带宽错误】
*   -TRRO_ERROR_CALLBACK_BANDWIDTH_LIMIT
*       评估网络带宽无法满足所有流的最低码率需求（total_kbps < least_required_kbps）。
*       处理建议：降低配置中各流的最低码率（min_bitrate），或减少推流路数。
*
*   -TRRO_ERROR_CALLBACK_RESERVE_DEGRADE
*       网络带宽不足，reserve 带宽发生降级（reserve_kbps 超过总码率的 40%）。
*       处理建议：属于告警性通知，可记录日志，无需立即处理；持续出现时建议降低码率配置。
*
*   【数据通道发送错误】（仅在 TRROField_sendControlDataV2 发送时底层通道异常时触发）
*   -TRRO_MESSAGE_CHANNEL
*       数据通道异常：通道未找到、通道未连接或底层 SCTP 发送失败。
*       处理建议：等待连接恢复后重试，或检查对端是否在线。
*
*   -TRRO_MESSAGE_BLOCK
*       数据通道发送缓冲区已满（SCTP 发送阻塞）。
*       处理建议：降低发送频率，等待缓冲区释放后重试。
*
*   -TRRO_MESSAGE_BYTE_EXCEED
*       单条消息字节数超出数据通道限制。
*       处理建议：拆分消息后重新发送。
*
*   -TRRO_MESSAGE_RATE_EXCEED
*       数据通道发送频率过高（底层 SCTP 频率限制）。
*       处理建议：降低发送频率，增加发送间隔。
*
*   【配置/证书错误】
*   -TRRO_CONFIG_CERTIFICATE_MD5_INVALID
*       配置文件中指定的 certificate 证书文件 MD5 校验失败（证书文件被篡改或路径错误）。
*       注意：此错误为警告性回调，不影响 SDK 初始化流程（在非 Linux 平台上会阻止初始化）。
*       处理建议：检查 config.json 中 certificate 字段指向的证书文件是否完整、未被修改。
*
*   【RTC 进房鉴权错误】
*   -TRRO_ERROR_CALLBACK_JOIN_AUTH_FAILED
*       RTC 进房鉴权失败（底层 event 10006），error_msg 中包含 userId、stream_id 及详细属性信息。
*       常见原因：后台黑白名单限制、UserSig 非法或已过期。
*       处理建议：检查后台房间权限配置及 UserSig 是否有效。
*
* @param[in] error_msg      错误信息字符串，可直接用于日志输出
* @return void
*/
typedef void TRROField_OnErrorEvent(void* context, int error_code, const char* error_msg);

/**
* @name TRROField_onControlData
* @brief 接收远端设备消息回调
* @param[in]     context        上下文指针，返回注册时传入的context
* @param[in]     controller_id  远端设备ID
* @param[in]     msg            消息体内容
* @param[in]     len            消息体长度
* @param[in]     qos            消息qos类型 0:unreliable, 1:reliable
* @return void
*/
typedef void TRROField_onControlData(void *context, const char *controller_id, const char* msg, int len, int qos);

/**
* @name TRROField_onVideoCaptureData
* @brief 采集视频帧回调
* @param[in]     context        上下文指针，返回注册时传入的context
* @param[in]     data           视频数据
* @param[in]     width          宽
* @param[in]     height         高
* @param[in]     type           视频格式,0 YUV420, 4 YUYV
* @param[in]     stream_id      流号
* @return void 
*/
typedef void TRROField_onVideoCaptureData(void *context, const char* data, int width, int height, int type, int stream_id);

/**
* @name TRROField_onVideoEncodeData
* @brief 编码视频帧回调
* @param[in]     context        上下文指针，返回注册时传入的context
* @param[in]     data           视频数据
* @param[in]     length         视频数据长度
* @param[in]     width          宽
* @param[in]     height         高
* @param[in]     type           对应 TrroFormat Trro_VideoH264 = 10, Trro_VideoH265 = 11, Trro_VideoAV1 = 12,
* @param[in]     frame_type     帧类型，参考枚举 FrameFieldType
* @param[in]     stream_id      流号
* @return void 
*/
typedef void TRROField_onVideoEncodeData(void* context, const char* data, int length, int width, int height, int type, int frame_type, int stream_id);

/**
* @name TRROField_OnLogData
* @brief 日志回调
* @param[in]     context        上下文
* @param[in]     msg            日志内容
* @param[in]     level          日志级别,参考枚举TrroLogLevel
* @return void 
*/
typedef void TRROField_OnLogData(void *context, const char *msg, int level);

/**
* @name TRROField_onEncodeFrameInfo
* @brief 编码建议信息回调，适用于外部输入编码帧场景
* @param[in]     context        上下文
* @param[in]     stream_id      流ID
* @param[in]     type           回调类型， 0：强制关键帧请求 ,  1 码率更新请求 
* @param[in]     bitrate        type为1时有效，表示建议输入的编码数据码率，单位kbps 
* @return void 
*/
typedef void TRROField_onEncodeFrameInfo(void *context, int stream_id, int type, int bitrate);

/**
* @name TRROField_onLatencyReport
* @brief 延迟信息回调
* @param[in]     context        上下文
* @param[in]     stream_id      流ID
* @param[in]     vcct           视频控制闭环时延， 等于视频上行延迟（不含采集）+控制下行延迟
* @return void 
*/
typedef void TRROField_onLatencyReport(void *context, int stream_id, int vcct);

/**
* @name TRROField_onMediaState
* @brief 媒体传输状态回调
* @param[in]   context      回调上下文指针
* @param[in]   stream_id    流ID 
* @param[in]   fps          每秒帧数目
* @param[in]   bps          每秒数据量
* @param[in]   rtt          封包来回时间
* @param[in]   lost         丢包率
* @param[in]   packets_send 总发送数目
* @param[in]   stun         穿网模式 0：host, 1：srflx, 2：prflx, 3：relay
* @return void 
*/
typedef void TRROField_onMediaState(void* context, int stream_id, int fps, int bps, int rtt, long long lost, long long packets_send, int stun);

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

/**
* @name TRROField_onOperationPermissionRequest
* @brief 远端设备操控权限申请通知
* @param[in]     remote_devid        请求权限的remote deviceId
* @param[in]     permission          请求的权限，参考TRROFieldPermission，  0: guest 只有观看权限,  1: master 完全控制权限
* @return void 
*/
typedef void TRROField_onOperationPermissionRequest(void* context, const char* remote_devid, int permission);

/**
 * @name TRROField_onVideoCaptureFrame
 * @brief 外部调用TRROField_startVideoCapture时的数据回调
 * @param[in] context      上下文
 * @param[in] capture_id   采集视频的当前源ID
 * @param[in] data         采集的视频数据
 * @param[in] length       采集的视频数据长度
 * @param[in] width        采集的视频宽度
 * @param[in] height       采集的视频高度
 * @param[in] color_format 采集的视频格式
 * @param[in] timestamp    采集的视频时间戳 v4l2的内置采集时间戳，rtsp的内置采集时间戳
 * @param[in] type         采集的视频类型
 * @return void
 */
typedef void TRROField_onVideoCaptureFrame(void *context, unsigned long long capture_id, const char* data, int length, int width, int height, TrroColor color_format, long long capture_ts, int type);

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

/*
 * @name :  TRROField_onRemoteEncodedFrameData
 * @brief : 编码视频图像帧回调
 * @input : context       回调上下文指针, 返回注册回调函数时传入的context
 *          gwid          视频帧的来源现场设备id
 *          stream_id     视频帧的来源现场设备流id
 *          conn_fd       接收视频流的句柄标识
 *          data          编码的视频图像帧数据
 *          len           编码的视频图像帧的长度
 *          trro_codec    编码的codec类型
 *          is_key_frame  是否是关键帧
 *          videotime     从0开始的时间戳
 * @return : void
 */
typedef void TRROField_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);

/** 
* @name  TRROField_onRemoteDeviceState
* @brief 远端用户连接状态回调接口
* @param[in] context        回调上下文指针, 返回注册回调函数时传入的context
* @param[in] remote_device  remote端用户id
* @param[in] stream_id      remote端用户 连接的哪个steam
* @param[in] state          1、连接 0、断开 对应 TrroRemoteDeviceState, 状态可能回调多次
* @return : void
*/
typedef void TRROField_onRemoteDeviceState(void* context, const char* remote_device, int stream_id, int state);

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

/**
* @name  TRROField_getErrorMsg
* @brief 根据错误码，返回错误信息。
* @param[in] errorCode   错误码
* @return errorMsg   排查帮助信息
*/
extern "C" TRROFIELD_EXPORT const char* TRROField_getErrorMsg(int errorCode);

/**
* @name  TRROField_initGwJsonWithLicense
* @brief 使用字符串和本地license初始化
* @param[in] json_str        配置文件json字符串
* @param[in] license_path    license文件路径名，e.g. "./license.txt"；传 nullptr 表示不使用本地license
* @param[in] mode            初始化模式 0 同步模式一直等待，-1 异步模式, 初始化成功后通知 TRROField_onSignalState
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_CONFIG_PARSE_FAILED              配置文件格式异常
* -TRRO_CONFIG_DEVICE_ID_INVALID         设备ID格式非法
* -TRRO_CONFIG_DEVICE_NAME_INVALID       设备名称格式非法
* -TRRO_CONFIG_LOG_PERMISSION_DENIED      打开log文件权限不足
* -TRRO_CONFIG_STREAMS_SIZE_ERROR        超过最大支持流数目
* -TRRO_CONFIG_REQUIRED_FIELD_MISSING    公有云模式下必填字段缺失
* -TRRO_CONFIG_CER_FAILED                证书文件不存在或无法访问
* -TRRO_CONIFG_PORT_RANGE_ILLEGAL        端口范围配置非法
* -TRRO_INIT_LICENSE_CHECK_FAILED        LICENSE校验失败
* -TRRO_INIT_LICENSE_FILE_ERROR          LICENSE文件错误
* -TRRO_INIT_LICENSE_CHECK_TIME_FAILED   LICENSE授权过期
* -TRRO_INIT_LICENSE_CHECK_DEVICE_FAILED LICENSE硬件验证失败
* -TRRO_INIT_LICENSE_CHECK_STREAM_FAILED LICENSE授权流小于设备流
* -TRRO_INIT_LICENSE_CHECK_ID_FAILED     LICENSE设备ID验证失败
* -TRRO_SIGNAL_CONNECT_OUTTIME           信令服务器连接超时（同步模式下）
*/
extern "C" TRROFIELD_EXPORT int TRROField_initGwJsonWithLicense(const char * json_str, const char * license_path, int mode = 0);

/**
* @name  TRROField_initGwJson
* @brief 使用字符串初始化
* @param[in] json_str        配置文件json字符串
* @param[in] mode             0 同步模式，一直等待 -1 异步模式，初始化成功后通知 TRROField_onSignalState
* @return 1 for success, other failed
* 可能返回的错误码：参考 TRROField_initGwJsonWithLicense
*/
extern "C" TRROFIELD_EXPORT int TRROField_initGwJson(const char * json_str, int mode = 0);

/**
* @name TRROField_initGwPathWithLicense
* @brief 使用配置文件和本地license初始化
* @param[in] cfg_path        json配置文件路径名，e.g. "./config.json"
* @param[in] license_path    license文件路径名，e.g. "./license.txt"；传 nullptr 表示不使用本地license
* @param[in] mode             0 同步模式一直等待，-1 异步模式 初始化成功后通知 TRROField_onSignalState
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_CONFIG_UNEXIST                  cfg_path 为空指针或配置文件不存在/内容为空
* 其他错误码参考 TRROField_initGwJsonWithLicense
*/
extern "C" TRROFIELD_EXPORT int TRROField_initGwPathWithLicense(const char * cfg_path, const char * license_path, int mode = 0);

/**
* @name TRROField_initGwPath
* @brief 使用配置文件初始化
* @param[in] cfg_path        json配置文件路径名，e.g. "./config.json"
* @param[in] mode            0  同步模式一直等待，-1 异步模式，初始化成功后TRRO_onSignalState信息
* @return 1 for success, other failed
* 可能返回的错误码：参考 TRROField_initGwPathWithLicense
*/
extern "C" TRROFIELD_EXPORT int TRROField_initGwPath(const char * cfg_path, int mode = 0);

/**
* @name TRROField_start
* @brief 启动音视频传输业务， 需要等待初始化成功后调用（同步模式init返回成功 或 异步模式初始化TRRO_onSignalState通知连接Ready）
* @param[in] void
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未初始化、正在初始化中、正在停止中或已停止
*/
extern "C" TRROFIELD_EXPORT int TRROField_start();

/**
* @name TRROField_stop
* @brief 销毁SDK，释放sdk资源
* @param[in]  void
* @return void
*/
extern "C" TRROFIELD_EXPORT void TRROField_stop();


/**
* @name   TRROField_updatePassword
* @brief  更新密码, TRROField_start之后调用有效
* @param[in] password       新密码
* @param[in] length         密码长度
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
* -TRRO_PARAM_INVALID                    password 为空指针或 length 小于等于0
*/
extern "C" TRROFIELD_EXPORT int TRROField_updatePassword(const char* password, int length);

/**
* @name   TRROField_sendControlData
* @brief  向远端设备发送数据
* @deprecated 这个接口已被废弃，不再推荐使用。请使用 TRROField_sendControlDataV2 接口代替。
* @param[in] msg            消息体
* @param[in] len            消息体长度
* @param[in] qos            0:unreliable 1:reliable
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态
* -TRRO_MESSAGE_BYTE_EXCEED              发送字节数超出限制
* -TRRO_MESSAGE_RATE_EXCEED              发送间隔过于密集
* -TRRO_MESSAGE_MAX_EXCEED               1s内发送数据超限
* -TRRO_MESSAGE_CHANNEL                  消息通道异常
* -TRRO_MESSAGE_BLOCK                    发送缓冲区已满
*/
extern "C" TRROFIELD_EXPORT DEPRECATED int TRROField_sendControlData(const char* msg, int len, int qos = 0);

/**
* @name   sendControlDataV2
* @brief  向所有远端设备发送数据，仅仅建立连接的远端设备有效，不考虑版本兼容问题全部使用新版本
* @param[in] target         目标设备id，为空时发送给所有设备
* @param[in] msg            消息体
* @param[in] len            消息体长度
* @param[in] qos            0:unreliable 1:reliable
* @param[in] channel        通道号，默认0 (目前仅支持0)
* @param[in] options        选项，默认0
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未初始化（g_trro_manager 为空）
* -TRRO_MESSAGE_BYTE_EXCEED              发送字节数超出限制
* -TRRO_MESSAGE_RATE_EXCEED              发送间隔过于密集
* -TRRO_MESSAGE_MAX_EXCEED               1s内发送数据超限
* -TRRO_MESSAGE_CHANNEL                  消息通道异常
* -TRRO_MESSAGE_BLOCK                    发送缓冲区已满
*/
extern "C" TRROFIELD_EXPORT int TRROField_sendControlDataV2(const char* target, const char* msg, int len, int qos = 0, int channel = 0, int options = 0);


/**
 * @name TRROField_setChineseFontAndSize(Experimental)
 * @brief 设置渲染文字格式，需要在调用外部输入图像前前调用，否则不生效
 * @param[in] font_path                        字幕格式路径 .tff 后缀的路径
 * @param[in] size                             字幕大小
 * @param[in] input                            需要输入的文字字符集合
 * @return void
*/
extern "C" TRROFIELD_EXPORT void TRROField_setChineseFontAndSize(const char* font_path, float size, const char* input);

/**
* @name   TRROField_externalVideoData
* @brief  废弃的外部图像输入接口
* @deprecated 这个接口已被废弃，不再推荐使用。请使用 TRROField_externalVideoDataWithText 接口代替。
* @param[in]   stream_id     流ID
* @param[in]   data          消息体
* @param[in]   width         数据源宽
* @param[in]   height        数据源高
* @param[in]   type          数据源类型，当前支持TrroField_ColorYUVI420 Trro_ColorJPEG Trro_ColorYUYV
* @param[in]   dataSize      数据大小，为0时会自动根据格式计算大小，发送JPEG等无特定大小数据时需指定
* @param[in]   text          图像要叠加字符串(experimental)
* @param[in]   point_x       叠加文字起始x坐标，最左侧为0 (experimental)
* @param[in]   point_y       叠加文字起始y坐标，最顶部为0 (experimental)
* @return 1 for success, other failed
*/
extern "C" TRROFIELD_EXPORT DEPRECATED int TRROField_externalVideoData(int stream_id, const char * data, int width, int height, int type, int dataSize = 0, const char* text = "", int point_x = 0, int point_y = 0);

/**
* @name   TRROField_externalVideoDataWithText
* @brief  外部图像输入接口
* @param[in]   stream_id     流ID
* @param[in]   data          消息体
* @param[in]   width         数据源宽
* @param[in]   height        数据源高
* @param[in]   type          数据源类型，当前支持TrroField_ColorYUVI420 Trro_ColorJPEG Trro_ColorYUYV
* @param[in]   dataSize      数据大小，为0时会自动根据格式计算大小，发送JPEG等无特定大小数据时需指定
* @param[in]   textFormat    图像要叠加字符串格式，包括了文字内容，起始坐标，文字颜色，边框颜色(experimental)          
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_PRM_ERROR                   data 为空指针，或 width/height 小于等于0
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
* -TRRO_COMMON_ERROR                     内部处理异常（捕获到异常）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externalVideoDataWithText(int stream_id, const char * data, int width, int height, int type, int dataSize = 0, TRRO_TextFormat* text_format = NULL);

/**
 * @name TRROField_externalCombineVideodata
 * @brief combine 流外部图像输入接口，通过 capture_id 向指定摄像头推送数据
 * @param[in]   stream_id     流ID
 * @param[in]   capture_id    摄像头源ID（combine 流中各摄像头的索引，从0开始，对应 config.json
 *                            中 cameras 数组下标，而非全局 source_id）
 * @param[in]   data          图像数据
 * @param[in]   width         数据源宽（JPEG/MJPEG 时需填解码后真实像素分辨率，且需与 cameras 配置一致）
 * @param[in]   height        数据源高（JPEG/MJPEG 时需填解码后真实像素分辨率，且需与 cameras 配置一致）
 * @param[in]   type          数据源类型，当前支持 Trro_ColorYUVI420 / Trro_ColorI420 / Trro_ColorNV12 /
 *                            Trro_ColorYUYV / Trro_ColorUYVY / Trro_ColorARGB / Trro_ColorBGRA /
 *                            Trro_ColorRGB / Trro_ColorBGR / Trro_ColorJPEG / Trro_ColorMJPEG
 * @param[in]   dataSize      数据大小，为0时会按 width/height/type 自动计算；
 *                            发送 Trro_ColorJPEG/Trro_ColorMJPEG 等无固定大小的数据时，必须显式传入真实字节数，
 *                            否则会返回 -TRRO_INIT_PRM_ERROR
 * @param[in]   textFormat    图像要叠加字符串格式，包括了文字内容，起始坐标，文字颜色，边框颜色(experimental)  仅仅对第一个capture_id生效
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_PRM_ERROR                   data 为空指针，width/height 非法，或 JPEG/MJPEG 未显式传入 dataSize
 * -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
 * -TRRO_INIT_INVALID_INPUT               stream_id 不存在或 capture_id 超出 combine 流 cameras 范围
 * -TRRO_SESSION_INACTIVE                 会话未激活
 * -TRRO_COMMON_ERROR                     内部处理异常（捕获到异常）
 * @note 1. 当前 combine 流路径为纯 CPU 处理（不会走 Jetson 硬解），传入 JPEG/MJPEG 会触发 libyuv 软解，
 *          多路输入时 CPU 开销较大，性能敏感场景建议在调用方提前解码为 I420/NV12 再传入。
 *       2. 若解码或格式转换失败，当前帧会被丢弃，但 combine 线程仍会按配置帧率持续输出合成画面，
 *          表现为对应 capture_id 区域画面静止，可通过 SDK 日志中的 "convert error" 关键字定位。
 */
extern "C" TRROFIELD_EXPORT int TRROField_externalCombineVideodata(int stream_id, int capture_id, const char * data, int width, int height, int type, int dataSize = 0, TRRO_TextFormat* text_format = NULL);


/**
 * @name TRROField_externalVideoDataWithUserTime
 * @brief 外部图像输入接口，带用户时间戳
 * @param[in]   stream_id     流ID
 * @param[in]   data          消息体
 * @param[in]   width         数据源宽
 * @param[in]   height        数据源高
 * @param[in]   type          数据源类型，当前支持Trro_ColorYUVI420 Trro_ColorJPEG Trro_ColorYUYV
 * @param[in]   user_time     用户时间戳
 * @param[in]   dataSize      数据大小，为0时会自动根据格式计算大小，发送JPEG等无特定大小数据时需指定
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_PRM_ERROR                   data 为空指针，或 width/height 小于等于0
 * -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
 * -TRRO_COMMON_ERROR                     内部处理异常（捕获到异常）
 */
extern "C" TRROFIELD_EXPORT int TRROField_externalVideoDataWithUserTime(int stream_id, const char * data, int width, int height, int type, long long user_time, int dataSize = 0);


/**
* @name TRROField_externalEncodeVideoData
* @brief 外部编码流输入，编码流codec需要与配置codec一致
* @param[in]    stream_id            流ID
* @param[in]    data                 消息体
* @param[in]    width                数据源宽
* @param[in]    height               数据源高
* @param[in]    size                 数据大小
* @param[in]    type                 数据源类型，参考FrameFieldType
* @return  1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
* -TRRO_INIT_PRM_ERROR                   stream_id 越界（小于0或超出配置的流数量）
* -TRRO_SESSION_INACTIVE                 会话处于非激活状态（通过 TRROField_setSessionActiveState 设置）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externalEncodeVideoData(int stream_id, const char * data, int width, int height, int size, int type);

/**
* @name TRROField_externalEncodeVideoDataUserTime
* @brief 外部编码流输入，编码流codec需要与配置codec一致
* @param[in]    stream_id            流ID
* @param[in]    data                 消息体
* @param[in]    width                数据源宽
* @param[in]    height               数据源高
* @param[in]    size                 数据大小
* @param[in]    type                 数据源类型，参考FrameFieldType
* @param[in]    user_time            用户时间戳
* @return  1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
* -TRRO_INIT_PRM_ERROR                   stream_id 越界（小于0或超出配置的流数量）
* -TRRO_SESSION_INACTIVE                 会话处于非激活状态（通过 TRROField_setSessionActiveState 设置）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externalEncodeVideoDataUserTime(int stream_id, const char * data, int width, int height, int size, FrameFieldType type, long long user_time);


/**
 * @name  TRROField_setOperationPermission
 * @brief 设置远端设备操控权限，目前同时只能有一个远端设备有master权限，若已有远端设备是master权限，调用该接口设置master权限，会自动取消之前设备的master权限然后设置新设备；
 * @param[in]  remote_devid         设置权限的对端设备id
 * @param[in]  permission           参考 TRROFieldPermission， 0 guest，只有观看权、1 master， 完全控制权限
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
 */
extern "C" TRROFIELD_EXPORT int TRROField_setOperationPermission(const char* remote_devid, int permission);

/**
* @name TRROField_registerMultiNetworkStatsCallback
* @brief 注册多网网卡状态回调
* @param[in]   context              上下文指针，回调时会返回该上下文指针
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerMultiNetworkStatsCallback(void* context, TRROField_onMultiNetworkStat * callback);

/**
* @name TRROField_registerControlDataCallback
* @brief 注册远端设备消息回调函数
* @param[in]   context              上下文指针，回调时会返回该上下文指针
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerControlDataCallback(void* context, TRROField_onControlData * callback);

/**
* @name  TRROField_registerVideoCaptureCallback
* @brief 注册视频采集数据回调函数
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerVideoCaptureCallback(void* context, TRROField_onVideoCaptureData * callback);

/**
* @name  TRROField_registerVideoEncodeCallback
* @brief 注册视频编码帧，设置改接口后，只要有采集输入就会编码回调
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未初始化（g_trro_manager 为空）
* @note 此函数无SDK状态检查，可在初始化前调用；但如果 manager 尚未初始化则返回错误
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerVideoEncodeCallback(void* context, TRROField_onVideoEncodeData * callback);

/** 
 *  @name TRROField_enableVideoEncode
 *  @brief 开启视频编码帧回调
 *  @param[in]   stream_id           流ID
 *  @param[in]   enable              是否开启，1开启，0关闭
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_ERROR                       SDK未初始化（g_trro_manager 为空）
 * @note 此函数无SDK状态检查，可在初始化前调用；但如果 manager 尚未初始化则返回错误
*/
extern "C" TRROFIELD_EXPORT int TRROField_enableVideoEncode(int stream_id, int enable);

/** 
 *  @name TRROField_forceKeyFrame
 *  @brief 强制生成关键帧
 *  @param[in]   stream_id           流ID
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_ERROR                       SDK未初始化（g_trro_manager 为空）
 * @note 此函数无SDK状态检查，可在初始化前调用；但如果 manager 尚未初始化则返回错误
*/
extern "C" TRROFIELD_EXPORT int TRROField_forceKeyFrame(int stream_id);

/**
* @name TRROField_registerEncodeFrameInfoCallback
* @brief 注册编码建议信息回调函数
* @param[in]    context              上下文
* @param[in]    callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerEncodeFrameInfoCallback(void *context, TRROField_onEncodeFrameInfo *callback);

/**
* @name TRROField_registerRemoteMixAudioFrameCallback
* @brief 注册远端混音音频数据回调函数
* @param[in]    context              上下文
* @param[in]    callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerRemoteMixAudioFrameCallback(void* context, TRROField_onRemoteMixAudioFrame * callback);

/**
* @name TRROField_registerRemoteEncodedFrameCallback
* @brief 注册远端编码数据回调函数
* @param[in]    context              上下文
* @param[in]    callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerRemoteEncodedFrameCallback(void* context, TRROField_onRemoteEncodedFrameData* callback);

/**
* @name TRROField_registerOnVideoState
* @brief 注册视频连接状态回调函数
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerOnVideoState(void* context, TRROField_OnVideoState * callback);

/**
* @name TRROField_registerOnState
* @brief 注册视频连接状态回调函数
* @deprecated 该接口已被废弃，命名不够明确，请使用 TRROField_registerOnVideoState 代替。
*             两者行为完全一致。
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT DEPRECATED int TRROField_registerOnState(void* context, TRROField_OnState * callback);

/**
* @name TRROField_registerOnAudioState
* @brief 注册音频连接状态回调函数
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerOnAudioState(void* context, TRROField_OnAudioState * callback);

/**
* @name TRROField_registerOnControlState
* @brief 注册数据连接状态回调函数
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerOnControlState(void* context, TRROField_OnControlState * callback);

/**
* @name TRROField_registerOnErrorEvent
* @brief 注册视频连接状态回调函数
* @param[in] context              上下文
* @param[in] callback             回调函数
* @return 1 for success, other failed
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerOnErrorEvent(void* context, TRROField_OnErrorEvent * callback);

/**
* @name  TRROField_registerLogCallback
* @brief 注册日志回调函数
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerLogCallback(void *context, TRROField_OnLogData *callback);

/**
* @name TRROField_registerLatencyCallback
* @brief 注册时延回调函数
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return  1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerLatencyCallback(void *context, TRROField_onLatencyReport *callback);

/**
* @name  TRROField_registerMediaState
* @brief 注册网络状态
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return  1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerMediaState(void* context, TRROField_onMediaState * callback);

/**
* @name  TRROField_registerAudioMediaState
* @brief 注册音频状态回调
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return  1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerAudioMediaState(void* context, TRROField_onMediaState * callback);

/**
* @name TRROField_testNetworkQuality
* @brief 评估网络状态                注意：此函数是阻塞函数
*                                   如果网络未连接成功超时时间为10s 再加网络探测时间
* @param[in]   stream_ids           想要进行网络探测的流ID数组
* @param[in]   stream_size          想要进行网络探测的流ID数组的大小
* @param[in]   test_time            连接成功后的探测持续时间，test_time 最小2s，最大10s；
*
* @return int 网络评估 0：无法评估网络，1：良好网络，2：较差网络，3：不可用网络
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
* -TRRO_INIT_PRM_ERROR                   stream_ids 为空指针
*/
extern "C" TRROFIELD_EXPORT int TRROField_testNetworkQuality(int* stream_ids, int stream_size, int test_time);

/**
* @name   TRROField_registerSignalStateCallback
* @brief  注册信令服务连接状态回调
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success
* @note 此函数无需检查SDK状态，可在初始化前调用，始终返回成功。
*       建议在调用 TRROField_initGwJson 系列接口之前注册，以确保异步模式下能收到初始化成功通知
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerSignalStateCallback(void *context, TRROField_onSignalState *callback);

/**
* @name  TRROField_registerOperationPermissionRequest
* @brief 注册远端设备操控权限请求通知回调
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerOperationPermissionRequest(void *context, TRROField_onOperationPermissionRequest *callback);

/**
* @name  TRROField_registerRemoteDeviceState
* @brief 注册远端用户连接状态回调接口
* @param[in]   context              上下文
* @param[in]   callback             回调函数
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_registerRemoteDeviceState(void *context, TRROField_onRemoteDeviceState *callback);

/**
 * @name TRROField_registerActiveState
 * @brief 注册会话激活状态回调
 * @param[in]   context              上下文
 * @param[in]   callback             回调函数
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
 */
extern "C" TRROFIELD_EXPORT int TRROField_registerActiveState(void *context, TRROField_onActiveState *callback);


/**
* @name TRROField_startRecorder(Experimental)
* @brief 启动录制
* @param[in]   recorderID           录制ID (若想录制采集流，id需设置成对应stream， config文件中stream_config需加上 "record_on":1)
* @param[in]   format               录制格式：0 ：264
* @param[in]   width                编码宽
* @param[in]   heigh                编码高
* @param[in]   jump                 录制跳帧数（隔几帧跳一帧）
* @param[in]   fps                  编码帧率
* @param[in]   bps                  码率
* @param[in]   filename             文件名
* @param[in]   config               录制选项（保留）
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_STOR_PARAM_ILLEGAL             jump/fps/width/heigh 任意一个小于0
* -TRRO_STOR_IDEXIST                   recorderID 已存在，重复开启录制
*/
extern "C" TRROFIELD_EXPORT int TRROField_startRecorder(int recorderID, int format, int width, int heigh, int jump, int fps, int bps,
                                  const char* filename,  const char* config);
/**
* @name TRROField_sendRecordVideoData(Experimental)
* @brief 发送录制数据
* @param[in]   recorderID           录制ID
* @param[in]   data                 录制数据
* @param[in]   width                数据源宽
* @param[in]   heigh                数据源高
* @param[in]   size                 录制数据大小
* @param[in]   format               视频源格式 1 yuv420 , 4 YUYV
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_STOR_PARAM_ILLEGAL             data 为空指针，或 width/height 小于0
* -TRRO_STOR_ID_ILLEGAL                recorderID 不存在
* -TRRO_STOR_ERROR                     recorder 内部异常
*/
extern "C" TRROFIELD_EXPORT int TRROField_sendRecordVideoData(int recorderID, const char* data, int width, int height, int format);

/** 
 * @name    TRROField_switchRecorderFile(Experimental)
 * @brief   切换录制文件
 * @param[in]    recorderID     录制ID
 * @param[in]    filname        文件名
 * @return   1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_STOR_PARAM_ILLEGAL             filename 为空指针
 * -TRRO_STOR_ID_ILLEGAL                recorderID 不存在
 * -TRRO_STOR_ERROR                     recorder 内部异常
*/
extern "C" TRROFIELD_EXPORT int TRROField_switchRecorderFile(int recorderID, const char* filename);

/**
* @name   Trro_stopRecorder(Experimental)
* @brief  停止录制
* @param[in]   recorderID      录制ID
* @return  1 for success, other failed
* 可能返回的错误码：
* -TRRO_STOR_ID_ILLEGAL                recorderID 不存在
* -TRRO_STOR_ERROR                     recorder 内部异常
*/
extern "C" TRROFIELD_EXPORT int TRROField_stopRecorder(int recorderID);


/**
* @name   Trro_setForcePush(Experimental)
* @brief  更改强制推流状态
* @param[in]   stream_id      ；流ID
* @param[in]   force_push      ；true 强制推流，false 按需推流
* @return  1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_setForcePush(int stream_id, bool force_push);

/**
* @name  TRROField_externalVideoDataNv(Experimental)
* @brief  外部码流输入-编码流，用于NV jetson平台加速 
* @param[in]   stream_id            流ID
* @param[in]   data                 消息体
* @param[in]   real_width           数据源宽
* @param[in]   real_height          数据源高
* @param[in]   type                 数据源类型，参考Color类型，支持YUYV格式
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externalVideoDataNv(int stream_id, const char * data, int real_width, int real_height, int type);

/**
 * @name TRROField_externalVideoDataDmaNative(Experimental)
 * @brief nvidia jetson平台特殊输入接口(Experimental)
 * @param[in]   stream_id 流id
 * @param[in]   fd        输入句柄
 * @param[in]   real_width     原始数据宽
 * @param[in]   real_height    原始数据高
 * @param[in]   type      输入类型
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externalVideoDataDmaNative(int stream_id, int fd, int real_width, int real_height, int type);

/**
* @name  TRROField_externVideoMJPEGDecode(Experimental)
* @brief 外部编码流输入MJPEG，使用nvidia jetson平台解码
* @param[in]   stream_id  流id
* @param[in]   data       源数据
* @param[in]   data_size  数据大小
* @param[in]   widht      原始数据宽
* @param[in]   height     原始数据高
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externVideoMJPEGDecode(int stream_id, const char* data, int data_size, int width, int height);

/**
* @name  TRROField_externAudioData(Experimental)
* @brief 外部音频数据输入(pcm数据), 16位音频采样
* @param[in]   data         源数据
* @param[in]   data_size    数据大小
* @param[in]   channel      音频声道数，仅支持 1（单声道）或 2（双声道）
* @param[in]   sample_rate  音频采样率
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       参数非法（data 为空、data_size 小于等于0、channel 不为1或2、sample_rate 小于等于0）
*                                        或 SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externAudioData(const char* data, int data_size, int channel, int sample_rate);

/**
* @name  TRROField_externAudioDataUserTime(Experimental)
* @brief 外部音频数据输入(pcm数据), 16位音频采样
* @param[in]   data         源数据
* @param[in]   data_size    数据大小
* @param[in]   channel      音频声道数，仅支持 1（单声道）或 2（双声道）
* @param[in]   sample_rate  音频采样率
* @param[in]   user_time    用户自定义时间戳
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       参数非法（data 为空、data_size 小于等于0、channel 不为1或2、sample_rate 小于等于0）
*                                        或 SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_externAudioDataUserTime(const char* data, int data_size, int channel, int sample_rate, unsigned long long user_time);

/**
 * @name TRROField_setSessionActiveState(Experimental)
 * @brief 默认为激活状态，设置后会非激活状态，仅仅保持连接，不发送数据
 * @param[in] is_active 是否激活状态
 * @return 1 for success, other failed
 * 可能返回的错误码：
 * -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
 * @note 仅仅支持 视频为"outside" "outenc" "rtsp_enc" 以及音频为外部输入模式 
 */
extern "C" TRROFIELD_EXPORT int TRROField_setSessionActiveState(bool is_active);
/**
* @name  TRROField_audioMute(Experimental)
* @brief Mute 拉流端的音频 仅Server模式
* @param[in] userid  拉流端 id
* @param[in] mute    是否mute
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_audioMute(const char* userid, bool mute);
/**
* @name  TRROField_muteLocalAudio
* @brief Mute 本地音频流
* @param[in] mute       是否mute
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_muteLocalAudio(bool mute);

/**
* @name  TRROField_muteLocalVideo
* @brief Mute 本地视频流
* @param[in] mute       是否mute
* @param[in] stream_id  流id
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态（未初始化、正在停止中或已停止）
*/
extern "C" TRROFIELD_EXPORT int TRROField_muteLocalVideo(bool mute, int stream_id);

/**
* @name  TRROField_reinitRtc(Experimental)
* @brief 重配置rtc，当前仅支持重置外采
* @param[in] config   重配置json数据
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_reinitRtc(const char * config);

/**
* @name  getSdkVersion
* @brief 获取sdk版本信息
* @param[in] void
* @return version   版本号
*/
extern "C" TRROFIELD_EXPORT const char* TRROField_getSdkVersion();

/**
* @name  TRROField_getDeviceCount(Experimental)
* @brief 根据MediaDeviceType 查询音频设备的个数。
* @param[in] type  音频设备类型
* @return 设备个数
*/
extern "C" TRROFIELD_EXPORT int TRROField_getDeviceCount(Trro_MediaFieldDeviceType type);

/**
* @name  TRROField_getDeviceName(Experimental)
* @brief 根据MediaDeviceType 和 index查询设备名字。
* @param[in] type  设备类型
* @param[in] index 为设备索引，值为 [0, TRROField_getDeviceCount)
* @return 设备名字，失败返回null
*/
extern "C" TRROFIELD_EXPORT const char* TRROField_getDeviceName(Trro_MediaFieldDeviceType type, int index);

/**
* @name  TRROField_setCurrentDevice(Experimental)
* @brief 根据MediaDeviceType 和 index设备当前采集或者播放设备。
* @param[in] type  设备类型
* @param[in] index 为设备索引，值为 [0, TRROField_getDeviceCount)
* @return 1 for success, other failed
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_setCurrentDevice(Trro_MediaFieldDeviceType type, int index);

/**
* @name  TRROField_startVideoCapture
* @brief 开始摄像头采集
* @param[in] context   上下文
* @param[in] url       采集路径，摄像头为/dev/video*， rtsp时是rtsp的地址
* @param[in] protocol  当等于kV4L2_DMA或者kV4L2_MMAP时，为摄像头采集。当等于 kRTSP 时，为rtsp地址
* @param[in] format    采集视频格式 TrroFormat
* @param[in] width     采集视频宽度
* @param[in] height    采集视频高度
* @param[in] fps       采集视频帧率
* @param[in] callback  采集视频回调
* @param[in, out] capture_id 采集流的唯一标识符(重复则返回错误)，支持传入传出(当(*capture_id) > 0时才用传入值，为0则内部生成修改该值)
* @return 开始采集失败则返回错误码，返回1表示成功
* 可能返回的错误码：
* -TRRO_INIT_PRM_ERROR                   url为空、callback为空指针或capture_id为空指针
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
* -TRRO_START_CAPTURE_IDEXIST            capture_id已存在，重复开启采集
* -TRRO_CAPTURE_OPENDEVICE_FAILED        打开设备失败
*/
extern "C" TRROFIELD_EXPORT int TRROField_startVideoCapture(void *context, const char* url, Trro_VideoCaptureProtocol protocol, int color_format, int width, int height, int fps, TRROField_onVideoCaptureFrame callback, unsigned long long* capture_id);
/**
* @name  TRROField_stopVideoCapture
* @brief 停止摄像头采集
* @param[in] capture_id 采集视频源ID(不能为0)
* @return 停止采集失败则返回错误码，返回1表示成功
* 可能返回的错误码：
* -TRRO_INIT_PRM_ERROR                   capture_id为0
* -TRRO_INIT_ERROR                       SDK未处于初始化或运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_stopVideoCapture(unsigned long long capture_id);

/**
* @name  TRROField_SetEncodeConfig
* @brief 设置编码器相关配置
* @param[in]     stream_id      视频流id
* @param[in]     roi_rects      对应的Roi区域数组
* @param[in]     len            TRRO_RoiRect数组长度
* @return 设置失败则返回错误，返回1表示成功
* 可能返回的错误码：
* -TRRO_INIT_ERROR                       SDK未处于运行状态
*/
extern "C" TRROFIELD_EXPORT int TRROField_setEncodeRoi(int stream_id, TRRO_RoiRect* roi_rects, int len);


#endif
