#ifndef RT_AVImporter_C_H
#define RT_AVImporter_C_H

#include "common_c.h"

/** 初始化引擎操作异步返回
*
* @param[in] result 初始化错误代码。
* @sa init
*/
typedef  void(*AVDFuncEngineInitResult) (Result result);
/**
* 加入房间回调接口
* @param[in] result 加入错误代码。
* @sa join
*/
typedef  void(*AVDFuncRoomJoinResult) (const char* roomId, Result result);

/**
* 音视频流导入回调接口.
*/
typedef struct AVImporter_Callback {
	/** 导入状态通知
	* @param[in] roomHandle 房间句柄。
	* @param[in] status 当前网络状态。
	*/
	void(*avimporter_onStatus)(AVDHandle roomHandle, Result result);

	/** 错误通知
	* @param[in] roomHandle 房间句柄。
	* @param[in] reason 错误状态。
	* @note
	*		Err_Importer_Video_Failure
	*		Err_Importer_Audio_Failure
	*		Err_User_DuplicateJoin
	*		Err_Room_OutofVideo
	*		Err_Room_OutofAudio
	*		Err_Room_Close
	*		Err_Network_Failure
	*		Err_Importer_BeKicked
	*/
	void (*avimporter_onError)(AVDHandle roomHandle, Result reason);

	AVImporter_Callback() {
		avimporter_onStatus = NULL;
		avimporter_onError = NULL;
	}
}*LPAVImporter_Callback;

///
/**
* 音视频流导入接口.
*
* 完成独立的音视频导入功能接口。
*/
extern "C" {
	/** 初始化引擎
	*
	* @param[in] severuri 服务器uri。
	* @param[in] appkey 叁体公司分发给应用公司的应用秘钥。
	* @param[in] secretkey 叁体公司分发给应用公司的安全秘钥。
	* @param[in] initresult 引擎初始化回调函数指针。
	* @note AVD引擎在做任何功能操作前，必须先要初始化引擎成功。引擎初始化是一个异步操作，调用此接口后等待回调中函数initresult回调，判断是否初始化成功。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_avimporter_initEngine(AVDFuncEngineInitResult initresult, const char* severuri, const char* appkey, const char* secretkey);
	/** 反初始化引擎
	*
	* @note AVD反初始化后，引擎中涉及的所有房间对象都无效，引擎上的功能函数都无法正常使用。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_avimporter_uninitEngine();

	/** 创建音视频流导入对象
	*
	* @param[in] roomId 房间Id。
	* @param[in] cb 导流回调接口。
	* @param[out] roomHandle 房间句柄。
	* @return 返回视频流导入对象。
	*/
	RT_API_EXPORT Result avd_avimporter_init(const char* roomId, LPAVImporter_Callback cb, AVDHandle& roomHandle);
	/** 释放音视频流导入对象
	*
	* @param[in] roomHandle 房间句柄。
	*@note 释放音视频流导入对象后，App层不能再使用当前音视频流导入对象指针，所有引用处均需设置为NULL。
	*/
	RT_API_EXPORT Result avd_avimporter_uninit(AVDHandle roomHandle);

	///
	/** 获取房间Id
	* @param[in] roomHandle 房间句柄。
	* @param[out] roomId 房间ID。
	* @param[in,out] dwsize 请求长度，实际房间ID长度。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_avimporter_getRoomId(AVDHandle roomHandle, char* roomId, uint32& dwsize);
	/** 加入房间
	* @param[in] roomHandle 房间句柄。
	* @param[in,out] userId   用户标示：用户Id(不能包含'{'、'}'字符)，用户名，用户数据等；当应用层不传入user.userId时，SDK将创建一个新的guid作为user.userId，同时返回给应用层。
	* @param[in,out] userName 用户名称。
	* @param[in] joinresult 加房间回调接口。
	* @note 加入房间时，可以指定结果单独回调接口；如果指定，则在指定单独接口回调，不会在Listener的onJoinResult回调。
	* @return 返回错误代码。
	* @sa User
	*/
	RT_API_EXPORT Result avd_avimporter_join(AVDHandle roomHandle, const char* userId, const char* userName, AVDFuncRoomJoinResult joinresult);

	/** 启用导入音频
	* @param[in] roomHandle 房间句柄。
	* @param[in] enable 启用。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_avimporter_enableAudio(AVDHandle roomHandle, AVDBool enable);
	/** 启用导入视频
	* @param[in] roomHandle 房间句柄。
	* @param[in] enable 启用。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_avimporter_enableVideo(AVDHandle roomHandle, AVDBool enable);

	/** 判断房间是否正在运行
	* @param[in] roomHandle 房间句柄。
	* @return 是否在运行。
	*/
	RT_API_EXPORT AVDBool avd_avimporter_isWorking(AVDHandle roomHandle);

	/// audio
	/** 音频流导入PCM原始数据
	* @param[in] roomHandle 房间句柄。
	* @param[in] timestamp_ns 时间戳, nanos second。
	* @param[in] sampleRate 音频采样率
	* @param[in] channels 音频采集通道数
	* @param[in] data 音频内容数据指针
	* @param[in] len  音频内容大小
	* @return 返回错误代码：
	* 	AVD_OK						成功
	* @note sampleRate和channels可以变化(但是不能频繁变化，如每次都不一样，内部每次变化的时候需要重新处理缓冲区)，每次输入的音频采样数据不能太多，最大不超过4K。
	*/
	RT_API_EXPORT Result avd_avimporter_audio_inputPCMFrame(AVDHandle roomHandle,
		uint64 timestamp_ns, int sampleRate, int channels, const uint8* data, size_t len);

	/** 音频流导入AAC编码后的数据
	* @param[in] roomHandle 房间句柄。
	* @param[in] timestamp_ns 时间戳, nanos second。
	* @param[in] sampleRate 音频采样率
	* @param[in] channels 音频采集通道数
	* @param[in] data 音频内容数据指针
	* @param[in] len  音频内容大小
	* @param[in] samplesOfEncodedData  音频编码数据包含的采样数（一般情况AAC每次编码都是1024 * channels个采样）
	* @return 返回错误代码：
	* 	AVD_OK						成功
	*/
	RT_API_EXPORT Result avd_avimporter_audio_inputAACFrame(AVDHandle roomHandle,
		uint64 timestamp_ns, int sampleRate, int channels, const uint8* data, size_t len, int samplesOfEncodedData);

	/// video
	/** 视频流导入原始图像
	* @param[in] roomHandle 房间句柄。
	* @param[in] timestamp_ns 时间戳, nanos second
	* @param[in] format 原始图像格式，见FourCC枚举
	* @param[in] w 图像宽度
	* @param[in] h 图像高度
	* @param[in] data 图像内容数据指针
	* @param[in] len  图像内容大小
	* @param[in] rotation 图像需要旋转的角度，顺时针方向，取值：0,90,180,270
	* @param[in] mirror 镜面图像，左右翻转
	* @return 返回错误代码：
	* 	AVD_OK						成功
	* 	RTC_ERR_VIDEO_CONVERT_FAILED	转换图像格式失败，有可能是内存分配失败，可考虑重启程序。
	*	Err_Invalid_Arg				参数不合法，可忽略
	*	Err_Wrong_Status			状态不对，可忽略
	*	
	*/
	RT_API_EXPORT Result avd_avimporter_video_inputRAWFrame(AVDHandle roomHandle,
		uint64 timestamp_ns, uint32 format, int w, int h, const uint8* data, size_t len, int rotation, bool mirror);
	/** 视频流导入h264编码后的数据
	* @param[in] roomHandle 房间句柄。
	* @param[in] timestamp_ns 时间戳, nanos second
	* @param[in] w 图像宽度
	* @param[in] h 图像高度
	* @param[in] sample  图像内容数据指针
	* @param[in] sample_size 图像内容大小
	* @return 返回错误代码：
	* 	AVD_OK						成功
	*	Err_Invalid_Arg				参数不合法，可忽略
	*	Err_Wrong_Status			状态不对，可忽略
	*
	*/
	RT_API_EXPORT Result avd_avimporter_video_input264Frame(AVDHandle roomHandle,
		uint64 timestamp_ns, int w, int h, const uint8* sample, size_t sample_size);

}
#endif //RT_AVImporter_C_H
