#ifndef RT_ILocalRecord_C_H_
#define RT_ILocalRecord_C_H_

#include "common_c.h"

/**
* 录制中录制音视频流回调接口.
*/
typedef struct StreamOut_Callback {
	/** 视频流回调接口
	*
	* @param[in] recorderId 录制ID。
	* @param[in] timestamp_ns 时间戳, nanos second
	* @param[in] w 图像宽度
	* @param[in] h 图像高度
	* @param[in] data 图像内容数据指针
	* @param[in] len  图像内容大小
	* @note 视频流的数据格式为h264或者vp8等编码后格式，具体由视频发布端发布时确定。
	* 视频时间戳和音频时间戳的回调是独立的，回调时没有前后关系，即视频回调某一时间戳A后，音频后续回调的时间戳B可能比A小；反之亦然。
	* 音视频的数据回调函数中不能堵塞，不能做费时操作。
	* @sa avd_localrecord_createRecorder
	*/
	void(*record_videoStreamOut)(const char* recorderId, uint64 timestamp_ns, int w, int h, bool isKeyFrame, const uint8 *data, unsigned int len);
	/** 音频流回调接口
	*
	* @param[in] recorderId 录制ID。
	* @param[in] timestamp_ns 时间戳, nanos second。
	* @param[in] sampleRate 音频采样率
	* @param[in] channels 音频采集通道数
	* @param[in] data 音频内容数据指针
	* @param[in] len  音频内容大小
	* @note 音频流的数据格式为PCM 16位。
	* 视频时间戳和音频时间戳的回调是独立的，回调时没有前后关系，即视频回调某一时间戳A后，音频后续回调的时间戳B可能比A小；反之亦然。
	* 音视频的数据回调函数中不能堵塞，不能做费时操作。
	* @sa avd_localrecord_createRecorder
	*/
	void(*record_audioStreamOut)(const char* recorderId, uint64 timestamp_ns, int sampleRate, int channels, const uint8 *data, unsigned int len);

	StreamOut_Callback() {
		record_videoStreamOut = NULL;
		record_audioStreamOut = NULL;
	}
}*LPStreamOut_Callback;

///
extern "C" {
	/**
	* 录制管理接口，录制文件到本地.
	*
	* 录制管理定义引擎中录制的创建、停止、录制控制等功能。
	*/
	/** 初始化本地录制模块接口
	*
	* @param[in] roomHandle 房间句柄。
	* @param[in] cb 聊天模块回调接口指针。
	* @param[out] recHandle 聊天模块句柄。
	* @return 返回错误代码。
	* @sa LocalRecord_Callback
	*/
	RT_API_EXPORT Result avd_localrecord_init(AVDHandle roomHandle, AVDHandle& recHandle);
	/** 反初始化聊天模块接口
	*
	* @param[in] recHandle 聊天模块句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_localrecord_uninit(AVDHandle recHandle);
	
	/** 创建一个录制容器
	*
	* @param[in] recHandle 聊天模块句柄。
	* @param[in] filePath 录制文件地址。
	* @param[in,out] recorderId 外部分配录制ID，必须保证房间内该录制模块中具有唯一性，如果是null或""将内部分配一个UUID，并通过return 返回。
	* @param[in,out] len recorderId的最大长度。
	* @param[in] continueDecode SDK是否继续内部解码（若要用SDK内部的视频渲染等功能，则需要解码）。
	* @param[in] ansi2utf8 是否从ansi转utf8
	* @return 有效的本地录制ID，如果返回null或者""，标示创建失败。
	*/
	RT_API_EXPORT Result avd_localrecord_createRecorder(AVDHandle recHandle, const char* filePath, char* recorderId, int& len, bool continueDecode=true,bool ansi2utf8 = false);
	/** 创建一个录制容器
	*
	* @param[in] recHandle 聊天模块句柄。
	* @param[in] out 录制文件输出接口指针。
	* @param[in,out] recorderId 外部分配录制ID，必须保证房间内该录制模块中具有唯一性，如果是null或""将内部分配一个UUID，并通过return 返回。
	* @param[in,out] len recorderId的最大长度。
	* @param[in] continueDecode SDK是否继续内部解码（若要用SDK内部的视频渲染等功能，则需要解码）。
	* @return 有效的本地录制ID，如果返回null或者""，标示创建失败。
	*/
	RT_API_EXPORT Result avd_localrecord_createRecorderWithStreamOut(AVDHandle recHandle, LPStreamOut_Callback out, char* recorderId, int& len, bool continueDecode=true);
	/** 为录制容器选择房间内的某路视频
	*
	* @param[in] recHandle 聊天模块句柄。
	* @param[in] recorderId 录制ID。
	* @param[in] deviceId 视频所对应的设备ID。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_localrecord_selectVideo4Recorder(AVDHandle recHandle, const char* recorderId, const char* deviceId);
	/** 为录制容器选择房间内的某路音频
	*
	* @param[in] recHandle 聊天模块句柄。
	* @param[in] recorderId 录制ID。
	* @param[in] userId 音频所属的用户ID。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_localrecord_selectAudio4Recorder(AVDHandle recHandle, const char* recorderId, const char* userId);
	/** 为某个录制容器选择录制房间内的所有音频
	*
	* @param[in] recHandle 聊天模块句柄。
	* @param[in] recorderId 录制ID。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_localrecord_selectAllAudio4Recorder(AVDHandle recHandle, const char* recorderId);
	/** 为某个录制容器选择录制房间内的除了我自己外的所有音频
	*
	* @param[in] recHandle 聊天模块句柄。
	* @param[in] recorderId 录制ID。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_localrecord_selectAllAudioWithoutMe4Recorder(AVDHandle recHandle, const char* recorderId);
	/** 停止该录制模块中的某个录制
	*
	* @param[in] recHandle 聊天模块句柄。
	* @param[in] recorderId 录制ID。
	* @return 返回消息列表。
	*/
	RT_API_EXPORT Result avd_localrecord_stopRecorder(AVDHandle recHandle, const char* recorderId);
	/** 停止该录制模块中所有录制
	*
	* @param[in] recHandle 聊天模块句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_localrecord_stopRecorderAll(AVDHandle recHandle);
}

#endif//RT_ILocalRecord_C_H_
