/** @file nim_vchat.h
* @brief 音视频 接口头文件
* @copyright (c) 2015-2017, NetEase Inc. All rights reserved
* @author gq
* @date 2015/4/30
*/

#ifndef NIM_SDK_DLL_API_NIM_VCHAT_H_
#define NIM_SDK_DLL_API_NIM_VCHAT_H_

#include "nim_sdk_dll.h"
#include "../export_headers/nim_vchat_def.h"
#include "../util/stdbool.h"

#ifdef __cplusplus
extern"C"
{
#endif
	/** @fn bool nim_vchat_init(const char *json_extension)
	* NIM VCHAT初始化，需要在SDK的nim_client_init成功之后
	* @param[in] json_extension 无效的扩展字段
	* @return bool 初始化结果，如果是false则以下所有接口调用无效
	*/
	NIM_SDK_DLL_API	bool nim_vchat_init(const char *json_extension);

	/** @fn bool nim_vchat_cleanup(const char *json_extension)
	* NIM VCHAT清理，需要在SDK的nim_client_cleanup之前
	* @param[in] json_extension 无效的扩展字段
	* @return void 无返回值
	*/
	NIM_SDK_DLL_API	void nim_vchat_cleanup(const char *json_extension);

	//通话相关

	/** @fn void nim_vchat_set_cb_func(nim_vchat_cb_func cb, const void *user_data)
	* NIM VCHAT 设置通话回调或者服务器通知
	* @param[in] cb 结果回调见nim_vchat_def.h
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	200:成功
	*				9103:已经在其他端接听/拒绝过这通电话
	*				11001:通话不可送达，对方离线状态
	*/
	NIM_SDK_DLL_API void nim_vchat_set_cb_func(nim_vchat_cb_func cb, const void *user_data);

	/** @fn bool nim_vchat_start(NIMVideoChatMode mode, const char *apns_text, const char *custom_info, const char *json_extension, const void *user_data)
	* NIM VCHAT 启动点对点通话，异步回调nim_vchat_cb_func 见nim_vchat_def.h
	* @param[in] mode NIMVideoChatMode 启动音视频通话类型 见nim_vchat_def.h
	* @param[in] apns_text 自定义推送字段，填空用默认推送
	* @param[in] custom_info 自定义数据，用于透传给接收方
	* @param[in] json_extension Json string 扩展，kNIMVChatUids成员id列表(必填),其他可选 如{"uids":["uid_temp"],"custom_video":0, "custom_audio":0, "video_quality":0, "session_id":"1231sda"}
	* @param[in] user_data 无效的扩展字段
	* @return bool true 调用成功，false 调用失败可能有正在进行的通话
	*/
	NIM_SDK_DLL_API bool nim_vchat_start(enum NIMVideoChatMode mode, const char *apns_text, const char *custom_info, const char *json_extension, const void *user_data);


	//回应邀请
	/** @fn bool nim_vchat_callee_ack(int64_t channel_id, bool accept, const char *json_extension, const void *user_data)
	* NIM VCHAT 回应音视频通话邀请，异步回调nim_vchat_cb_func 见nim_vchat_def.h
	* @param[in] channel_id 音视频通话通道id
	* @param[in] accept true 接受，false 拒绝
	* @param[in] json_extension 扩展的json string,接起时有效 参数可选 如{"custom_video":0, "custom_audio":0, "video_quality":0, "session_id":"1231sda"}
	* @param[in] user_data 无效的扩展字段
	* @return bool true 调用成功，false 调用失败（可能channel_id无匹配，如要接起另一路通话前先结束当前通话）
	*/
	NIM_SDK_DLL_API bool nim_vchat_callee_ack(int64_t channel_id, bool accept, const char *json_extension, const void *user_data);

	/** @fn bool nim_vchat_control(int64_t channel_id, NIMVChatControlType type, const char *json_extension, const void *user_data)
	* NIM VCHAT 音视频通话控制，点对点通话有效，异步回调nim_vchat_cb_func 见nim_vchat_def.h
	* @param[in] channel_id 音视频通话通道id
	* @param[in] type NIMVChatControlType 见nim_vchat_def.h
	* @param[in] json_extension 无效的扩展字段
	* @param[in] user_data 无效的扩展字段
	* @return bool true 调用成功，false 调用失败
	*/
	NIM_SDK_DLL_API bool nim_vchat_control(int64_t channel_id,enum NIMVChatControlType type, const char *json_extension, const void *user_data);

	/** @fn void nim_vchat_set_viewer_mode(bool viewer)
	* NIM VCHAT 设置观众模式（多人模式下），全局有效（重新发起时也生效），观众模式能减少运行开销
	* @param[in] viewer 是否观众模式
	* @return void 无返回值
	*/
	NIM_SDK_DLL_API void nim_vchat_set_viewer_mode(bool viewer);

	/** @fn bool nim_vchat_get_viewer_mode()
	* NIM VCHAT 获取当前是否是观众模式
	* @return bool true 观众模式，false 非观众模式
	*/
	NIM_SDK_DLL_API bool nim_vchat_get_viewer_mode();

	/** @fn void nim_vchat_set_audio_mute(bool muted)
	* NIM VCHAT 设置音频静音，全局有效（重新发起时也生效）；此开关打开音频只发静音包
	* @param[in] muted true 静音，false 不静音
	* @return void 无返回值
	*/
	NIM_SDK_DLL_API void nim_vchat_set_audio_mute(bool muted);

	/** @fn bool nim_vchat_audio_mute_enabled()
	* NIM VCHAT 获取音频静音状态
	* @return bool true 静音，false 不静音
	*/
	NIM_SDK_DLL_API bool nim_vchat_audio_mute_enabled();

	/** @fn void nim_vchat_set_member_in_blacklist(const char *uid, bool add, bool audio, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
	* NIM VCHAT 设置单个成员的黑名单状态，当前通话有效(只能设置进入过房间的成员)
	* @param[in] uid 成员account
	* @param[in] add true表示添加到黑名单，false表示从黑名单移除
	* @param[in] audio true表示音频黑名单，false表示视频黑名单
	* @param[in] json_extension 无效扩展字段
	* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	0:成功
	*				11403:无效的操作
	*/
	NIM_SDK_DLL_API void nim_vchat_set_member_in_blacklist(const char *uid, bool add, bool audio, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);


	/** @fn void nim_vchat_end(const char *json_extension)
	* NIM VCHAT 结束通话(需要主动在通话结束后调用，用于底层挂断和清理数据)
	* @param[in] json_extension 可扩展添加kNIMVChatSessionId，用于关闭对应的通话，如果kNIMVChatSessionId缺省则关闭当前通话
	* @return void 无返回值
	*/
	NIM_SDK_DLL_API void nim_vchat_end(const char *json_extension);

	/** @fn void nim_vchat_create_room(const char *room_name, const char *custom_info, const char *json_extension, nim_vchat_opt2_cb_func cb, const void *user_data)
	* NIM VCHAT 创建一个多人房间（后续需要主动调用加入接口进入房间）
	* @param[in] room_name 房间名
	* @param[in] custom_info 自定义的房间信息（加入房间的时候会返回）
	* @param[in] json_extension 可选kNIMVChatWebrtc
	* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	200:成功
	*				417:提示已经创建好频道
	*/
	NIM_SDK_DLL_API void nim_vchat_create_room(const char *room_name, const char *custom_info, const char *json_extension, nim_vchat_opt2_cb_func cb, const void *user_data);

	/** @fn bool nim_vchat_join_room(NIMVideoChatMode mode, const char *room_name, const char *json_extension, nim_vchat_opt2_cb_func cb, const void *user_data)
	* NIM VCHAT 加入一个多人房间（进入房间后成员变化等，等同点对点nim_vchat_cb_func）
	* @param[in] mode NIMVideoChatMode 音视频通话类型 见nim_vchat_def.h
	* @param[in] room_name 房间名
	* @param[in] json_extension 可选 如{"custom_video":0, "custom_audio":0, "video_quality":0, "session_id":"1231sda", "rtmp_url":"", "bypass_rtmp":0}
	* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension扩展字段中包含 kNIMVChatCustomInfo,kNIMVChatSessionId
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return bool true 调用成功，false 调用失败可能有正在进行的通话
	* @note 错误码	200:成功
	*/
	NIM_SDK_DLL_API bool nim_vchat_join_room(enum NIMVideoChatMode mode, const char *room_name, const char *json_extension, nim_vchat_opt2_cb_func cb, const void *user_data);


	/** @fn void nim_vchat_set_custom_data(bool custom_audio, bool custom_video, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
	* NIM 通话中修改自定义音视频数据模式
	* @param[in] custom_audio true表示使用自定义的音频数据，false表示不使用
	* @param[in] custom_video true表示使用自定义的视频数据，false表示不使用
	* @param[in] json_extension 无效扩展字段
	* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	0:成功
	*				11403:无效的操作
	*/
	NIM_SDK_DLL_API void nim_vchat_set_custom_data(bool custom_audio, bool custom_video, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);

	/** @fn bool nim_vchat_set_talking_mode(NIMVideoChatMode mode, const char *json_extension)
	* NIM VCHAT 设置通话模式，在更改通话模式后，通知底层
	* @param[in] mode NIMVideoChatMode 音视频通话类型 见nim_vchat_def.h
	* @param[in] json_extension 无效的扩展字段
	* @return bool true 调用成功，false 调用失败
	*/
	NIM_SDK_DLL_API bool nim_vchat_set_talking_mode(enum NIMVideoChatMode mode, const char *json_extension);

	/** @fn void nim_vchat_set_rotate_remote_video(bool rotate)
	* NIM VCHAT 设置不自动旋转对方画面，默认打开，全局有效（重新发起时也生效）
	* @param[in] rotate true 自动旋转，false 不旋转
	* @return void 无返回值
	*/
	NIM_SDK_DLL_API void nim_vchat_set_rotate_remote_video(bool rotate);

	/** @fn bool nim_vchat_rotate_remote_video_enabled()
	* NIM VCHAT 获取自动旋转对方画面设置状态
	* @return bool true 自动旋转，false 不旋转
	*/
	NIM_SDK_DLL_API bool nim_vchat_rotate_remote_video_enabled();

	/** @fn void nim_vchat_set_video_quality(int video_quality, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
	* NIM 通话中修改发送画面分辨率，发送的分辨率限制只对上限限制，如果数据源小于发送分辨率，不会进行放大
	* @param[in] video_quality 分辨率模式 见NIMVChatVideoQuality定义
	* @param[in] json_extension 无效扩展字段
	* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	0:成功
	*				11403:无效的操作
	*/
	NIM_SDK_DLL_API void nim_vchat_set_video_quality(int video_quality, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);

	/** @fn void nim_vchat_set_video_bitrate(int video_bitrate, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
	* NIM 通话中修改视频码率，有效区间[100kb,2000kb]，如果设置video_bitrate为0则取默认码率
	* @param[in] video_bitrate 视频码率值
	* @param[in] json_extension 无效扩展字段
	* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	0:成功
	*				11403:无效的操作
	*/
	NIM_SDK_DLL_API void nim_vchat_set_video_bitrate(int video_bitrate, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);


#if NIMAPI_UNDER_WIN_DESKTOP_ONLY


	/** @fn void nim_vchat_net_detect(const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
	* 音视频网络探测接口，需要在sdk初始化时带上app key
	* @param[in] json_extension json扩展参数，允许用户设置探测时间限制kNIMNetDetectTimeLimit，及探测类型kNIMNetDetectType
	* @param[in] cb 操作结果的回调函数
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return uint64_t 探测任务id
	* @note 错误码	200:成功
	*				0:流程错误
	*				400:非法请求格式
	*				417:请求数据不对
	*				606:ip为内网ip
	*				607:频率超限
	*				20001:探测类型错误
	*				20002:ip错误
	*				20003:sock错误
	*/
	NIM_SDK_DLL_API uint64_t nim_vchat_net_detect(const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);


	/** @fn void nim_vchat_set_frame_rate(NIMVChatVideoFrameRate frame_rate, const char* json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
	* NIM 实时设置视频发送帧率上限
	* @param[in] frame_rate  帧率类型 见NIMVChatVideoFrameRate定义
	* @param[in] json_extension  无效备用
	* @param[in] cb 结果回调见nim_vchat_def.h
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	0:成功
	*				11403:无效的操作
	*/
	NIM_SDK_DLL_API void nim_vchat_set_frame_rate(enum NIMVChatVideoFrameRate frame_rate, const char* json_extension, nim_vchat_opt_cb_func cb, const void *user_data);

	/** @fn void nim_vchat_set_video_frame_scale(NIMVChatVideoFrameScaleType type)
	* NIM VCHAT 设置发送时视频画面的长宽比例裁剪模式，裁剪的时候不改变横竖屏（重新发起时也生效）
	* @param[in] type 裁剪模式NIMVChatVideoFrameScaleType
	*/
	NIM_SDK_DLL_API void nim_vchat_set_video_frame_scale(enum NIMVChatVideoFrameScaleType type);

	/** @fn int nim_vchat_get_video_frame_scale_type()
	* NIM VCHAT 获取视频画面的裁剪模式
	* @return int 当前的裁剪模式NIMVChatVideoFrameScaleType
	*/
	NIM_SDK_DLL_API int nim_vchat_get_video_frame_scale_type();

	/** @fn void nim_vchat_start_record(const char *path, const char *json_extension, nim_vchat_mp4_record_opt_cb_func cb, const void *user_data)
	* NIM VCHAT 开始录制MP4文件，同一个成员一次只允许一个MP4录制文件，在通话开始的时候才有实际数据
	* @param[in] path 文件录制路径
	* @param[in] json_extension  kNIMVChatUid录制的成员，如果是自己填空(录制时允许同时混音对端声音，需要填kNIMVChatMp4AudioType)
	* @param[in] cb 结果回调见nim_vchat_def.h
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	200:MP4文件创建
	*				400:MP4文件已经存在
	*				403:MP4文件创建失败
	*				404:通话不存在
	*/
	NIM_SDK_DLL_API void nim_vchat_start_record(const char *path, const char *json_extension, nim_vchat_mp4_record_opt_cb_func cb, const void *user_data);

	/** @fn void nim_vchat_stop_record(const char *json_extension, nim_vchat_mp4_record_opt_cb_func cb, const void *user_data)
	* NIM VCHAT 停止录制MP4文件
	* @param[in] json_extension  kNIMVChatUid录制的成员，如果是自己填空
	* @param[in] cb 结果回调见nim_vchat_def.h
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	0:MP4结束
	*				404:通话不存在
	*/
	NIM_SDK_DLL_API void nim_vchat_stop_record(const char *json_extension, nim_vchat_mp4_record_opt_cb_func cb, const void *user_data);

	/** @fn void nim_vchat_start_audio_record(const char *path, const char *json_extension, nim_vchat_audio_record_opt_cb_func cb, const void *user_data)
	* NIM VCHAT 开始录制音频文件，一次只允许一个音频录制文件
	* @param[in] path 文件录制路径
	* @param[in] json_extension 无效扩展字段
	* @param[in] cb 结果回调见nim_vchat_def.h
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	*/
	NIM_SDK_DLL_API void nim_vchat_start_audio_record(const char *path, const char *json_extension, nim_vchat_audio_record_opt_cb_func cb, const void *user_data);

	/** @fn void nim_vchat_stop_audio_record(const char *json_extension, nim_vchat_audio_record_opt_cb_func cb, const void *user_data)
	* NIM VCHAT 停止录制音频文件
	* @param[in] json_extension 无效扩展字段
	* @param[in] cb 结果回调见nim_vchat_def.h
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	*/
	NIM_SDK_DLL_API void nim_vchat_stop_audio_record(const char *json_extension, nim_vchat_audio_record_opt_cb_func cb, const void *user_data);



	/** @fn void nim_vchat_update_rtmp_url(const char *rtmp_url, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
	* NIM 通话中修改直播推流地址（主播有效）
	* @param[in] rtmp_url 新的rtmp推流地址
	* @param[in] json_extension 无效扩展字段
	* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
	* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
	* @return void 无返回值
	* @note 错误码	0:成功
	*				11403:无效的操作
	*/
	NIM_SDK_DLL_API void nim_vchat_update_rtmp_url(const char *rtmp_url, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);

#endif
#ifdef __cplusplus
};
#endif //__cplusplus
#endif //NIM_SDK_DLL_API_NIM_VCHAT_H_