#ifndef RT_Video_C_H_
#define RT_Video_C_H_

#include "common_c.h"

/**
* 房间中视频模块回调接口.
*
* 视频模块回调接口定义了房间中视频相关的通知和视频异步操作返回。
*/
typedef struct Video_Callback {
	/// 通知
	/** 摄像头状态更改通知
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] status 摄像头状态。
	* @param[in] *fromId 摄像头Id，唯一标示一个摄像头。
	* @note 当摄像头状态更改后，房间内所有用户接收到此通知, notify when publishLocalCamera,publishRemoteCamera。
	*/
	void(*video_onCameraStatusNotify)(AVDHandle handle, AVDCameraStatus status, const char* fromId);
	/** 摄像头数据更改通知
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] level 摄像头整形数据。
	* @param[in] *description 摄像头字符串数据。
	* @param[in] *fromId 摄像头Id，唯一标示一个摄像头。
	* @note 当摄像头数据更改后，房间内所有用户接收到此通知, notify when publishLocalCamera(Camera), updateCameraData。
	*/
	void(*video_onCameraDataNotify)(AVDHandle handle, int level, const char* description, const char* fromId);
	/** 摄像头视频发布通知
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] from 摄像头信息，摄像头信息中level和description为应用层数据，应用层可以使用这些字段保存次摄像头视频相关的应用逻辑数据，方便标示、订阅视频。
	*
	* @note 当摄像头视频发布时，房间内所有用户接收到此通知；因通知的重要程度，将从video_onCameraStatusNotify中分离出此状态。
	* @sa avd_video_publishLocalCamera
	*/
	void(*video_onPublishCameraNotify)(AVDHandle handle, const AVDCamera& from);
	/** 摄像头视频取消发布通知
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] from 摄像头信息。
	*
	* @note 当摄像头视频取消发布时，房间内所有用户接收到此通知；因通知的重要程度，将从video_onCameraStatusNotify中分离出此状态。
	* @sa avd_video_unpublishLocalCamera
	*/
	void(*video_onUnpublishCameraNotify)(AVDHandle handle, const AVDCamera& from);

	/// 异步返回
	/** 本用户订阅视频异步返回
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *deviceId 摄像头Id，唯一标示一路视频。
	*
	* @sa avd_video_subscribe
	*/
	void(*video_onSubscribeResult)(AVDHandle handle, Result result, const char* deviceId);
	/** 本用户取消订阅视频异步返回
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *deviceId 摄像头Id，唯一标示一路视频。
	*
	* @sa avd_video_unsubscrible
	*/
	void(*video_onUnsubscribeResult)(AVDHandle handle, Result result, const char* deviceId);
	//
	/** 本用户发布摄像头视频异步返回
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *deviceId 摄像头Id，唯一标示一路视频。
	*
	* @sa avd_video_publishLocalCamera
	*/
	void(*video_onPublishLocalResult)(AVDHandle handle, Result result, const char* deviceId);
	/** 本用户取消发布摄像头视频异步返回
	*
	* @param[in] handle 视频模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *deviceId 摄像头Id，唯一标示一路视频。
	*
	* @sa avd_video_unpublishLocalCamera
	*/
	void(*video_onUnpublishLocalResult)(AVDHandle handle, Result result, const char* deviceId);

    /** 发布本地摄像头视频质量变更通知
     *
     * @param[in] handle 视频模块句柄。
     * @param[in] fromId 设备id
     * @param[in] width 视频宽
     * @param[in] height 视频高
     * @param[in] fps 帧率
     *
     * @sa onCameraCapabilityNotify
     */
    void(*video_onCameraCapabilityNotify)(AVDHandle handle, const char* fromId, const uint32 width, const uint32 height, const uint32 fps);
	Video_Callback() {
		video_onCameraStatusNotify = NULL;
		video_onCameraDataNotify = NULL;
		video_onPublishCameraNotify = NULL;
		video_onUnpublishCameraNotify = NULL;
		video_onSubscribeResult = NULL;
		video_onUnsubscribeResult = NULL;
		video_onPublishLocalResult = NULL;
		video_onUnpublishLocalResult = NULL;
        video_onCameraCapabilityNotify = NULL;
	}
}*LPVideo_Callback;

/**
* 房间中导入视频的回调
*
*/
typedef struct FakeVideoCallback{

	/** 启动视频导入的回调通知
	* 
	* @sa video_OnStart
	*/
	void(*video_OnStart)();
	/** 停止视频导入的回调通知
	*
	* @sa video_OnStop
	*/
	void(*video_OnStop)();
	FakeVideoCallback(){
		video_OnStart = NULL;
		video_OnStop = NULL;
	}
}*LFakeVideoCallback;
///
extern "C" {
	/// video option operate
	// device option
	/** 根据摄像头设备采集参数集判断是否支持指定的视频质量。
	*
	* @param[in] deviceQualities 摄像头设备采集参数集。
	* @param[in] value 视频质量
	* @return 是否支持指定的质量。
	* @note deviceQualities可以从AVDCamera.deviceQualities取到
	* @sa AVDCamera
	*/
	RT_API_EXPORT AVDBool avd_videooption_hasQuality(uint32 deviceQualities, rtc::VideoQuality value);
	/** 获取摄像头设备采集参数集中参数的数量。
	*
	* @param[in] deviceQualities 摄像头设备采集参数集。
	* @return 摄像头设备采集参数的数量。
	* @note deviceQualities可以从AVDCamera.deviceQualities取到
	* @sa AVDCamera
	*/
	RT_API_EXPORT int avd_videooption_getCapabilitiesCount(uint32 deviceQualities);
	/** 根据摄像头设备采集参数集获取采集参数列表。
	*
	* @param[in] deviceQualities 摄像头设备采集参数集。
	* @param[in,out] ncount 请求数量，实际返回数量。
	* @param[in] *&capabilities 摄像头设备采集参数列表。
	* @return 摄像头设备采集参数的数量。
	* @note deviceQualities可以从AVDCamera.deviceQualities取到
	* @sa AVDCamera
	* @sa AVDCameraCapability
	*/
	RT_API_EXPORT void avd_videooption_getCapabilities(uint32 deviceQualities, uint32& ncount, AVDCameraCapability*& capabilities);
	
	// publish option
	/** 根据摄像头发布参数集获取发布的视频宽高比例。
	*
	* @param[in] publishQualities 摄像头发布参数集。
	* @return 视频宽高比例。
	* @note publishQualities可以从AVDCamera.publishQualities取到
	* @sa AVDCamera
	* @sa VideoRatio
	*/
	RT_API_EXPORT rtc::VideoRatio avd_videooption_getRatio(uint32 publishQualities);
	/** 设置摄像头发布参数集中发布的视频宽高比例。
	*
	* @param[in,out] publishQualities 摄像头发布参数集。
	* @param[in] value 视频宽高比例。
	* @note publishQualities可以从AVDCamera.publishQualities取到
	* @sa AVDCamera
	* @sa VideoRatio
	*/
	RT_API_EXPORT void avd_videooption_setRatio(uint32& publishQualities, rtc::VideoRatio value);
	/** 设置指定流的视频发布参数
	*
	* @param[in,out] publishQualities 摄像头发布参数集。
	* @param[in] type 流类型。
	* @param[in] quality 视频质量。
	* @param[in] codec 编码类型。
	* @return 返回错误代码。
	* @sa AVDCamera
	* @sa StreamType
	* @sa VideoQuality
	* @sa VideoCodec
	* @note 当前每个摄像头设备根据机器性能最多可以发布三路视频流，分别为主流、辅流1和辅流2，
	* 每路视频流的参数可以根据应用场景设置。chrome浏览器当前仅支持VP8编码；移动端对H264的支持
	* 较好，PC端两种编码都支持良好。
	*/
	RT_API_EXPORT Result avd_videooption_setStreamOptions(uint32& publishQualities, rtc::StreamType type, rtc::VideoQuality quality, rtc::VideoCodec codec);
	/** 设置指定流的视频发布参数
	*
	* @param[in,out] publishQualities 摄像头发布参数集。
	* @param[in] type 流类型。
	* @param[in] cap 视频分辨率帧率。
	* @param[in] codec 编码类型。
	* @return 返回错误代码。
	* @sa AVDCamera
	* @sa StreamType
	* @sa AVDCameraCapability
	* @sa VideoCodec
	*
	* @note 当前每个摄像头设备根据机器性能最多可以发布三路视频流，分别为主流、辅流1和辅流2，
	* 每路视频流的参数可以根据应用场景设置。chrome浏览器当前仅支持VP8编码；移动端对H264的支持
	* 较好，PC端两种编码都支持良好。
	*/
	RT_API_EXPORT Result avd_videooption_setStreamOptionsWithCapability(uint32& publishQualities, rtc::StreamType type, const AVDCameraCapability& cap, rtc::VideoCodec codec);
	/** 根据摄像头发布参数集获取指定流的分辨率帧率 
	*
	* @param[in] publishQualities 摄像头发布参数集。
	* @param[in] type 流类型。
	* @param[out] cap 视频分辨率帧率。
	* @return 返回错误代码。
	* @note publishQualities可以从AVDCamera.publishQualities取到
	* @sa AVDCamera
	* @sa StreamType
	* @sa AVDCameraCapability
	*/
	RT_API_EXPORT Result avd_videooption_getStreamCapability(uint32 publishQualities, rtc::StreamType type, AVDCameraCapability& cap);
	/** 根据摄像头发布参数集获取指定流的质量
	*
	* @param[in] publishQualities 摄像头发布参数集。
	* @param[in] type 流类型。
	* @return 视频质量。
	* @sa AVDCamera
	* @sa StreamType
	* @sa VideoQuality
	* @note publishQualities可以从AVDCamera.publishQualities取到
	*/
	RT_API_EXPORT rtc::VideoQuality avd_videooption_getStreamQuality(uint32 publishQualities, rtc::StreamType type);
	/** 根据摄像头发布参数集获取指定流的编码类型
	*
	* @param[in] publishQualities 摄像头发布参数集。
	* @param[in] type 流类型。
	* @return 视频编码类型。
	* @sa AVDCamera
	* @sa StreamType
	* @note publishQualities可以从AVDCamera.publishQualities取到
	*/
	RT_API_EXPORT rtc::VideoCodec avd_videooption_getStreamCodec(uint32 publishQualities, rtc::StreamType type);
	/** 根据摄像头发布参数集判断是否有主流或辅流
	*
	* @param[in] publishQualities 摄像头发布参数集。
	* @param[in] type 流类型。
	* @return 是否存在相应流。
	* @sa StreamType
	* @note publishQualities可以从AVDCamera.publishQualities取到
	*/
	RT_API_EXPORT AVDBool avd_videooption_hasStream(uint32 publishQualities, rtc::StreamType type);

	/**
	* 房间中视频模块接口.
	*
	* 房间视频模块定义房间中视频发布、订阅功能接口。
	*/

	/** 初始视频模块接口.
	*
	* @param[in] roomHandle 房间句柄。
	* @param[in] cb 视频模块回调接口指针。
	* @param[out] videoHandle 视频模块句柄。
	* @return 返回错误代码。
	* @sa Video_Callback
	*/
	RT_API_EXPORT Result avd_video_init(AVDHandle roomHandle, LPVideo_Callback cb, AVDHandle& videoHandle);

	/** 反初始屏幕窗口共享模块接口
	*
	* @param[in] videoHandle 视频模块句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_uninit(AVDHandle videoHandle);

	/** 预览本地缺省摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] renderHandle 显示对象接口指针
	* @note 本地视频在发布到会议前，可以调用此接口进行视频预览；视频发布到会议中后，需要使用attachRender接口来进行视频显示，此时此接口无效。
	* @return 返回错误代码。
	* @sa avd_render_create
	*/
	RT_API_EXPORT Result avd_video_previewLocalCamera(AVDHandle videoHandle, AVDHandle renderHandle);

	/** 取消预览缺省摄像头视频
	* @param[in] videoHandle 视频模块句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_unpreviewLocalCamera(AVDHandle videoHandle);

	/** 更新正在使用的摄像头的视频质量（分辨率和帧率）。
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id。
	* @param[in] quality 视频质量。
	* @return 返回错误代码。
	* @sa AVDCameraCapability
	*/
	RT_API_EXPORT Result avd_video_updateCaptureCapability(AVDHandle videoHandle, const char* deviceId, AVDCameraCapability& quality);

	/** 发布缺省摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @return 返回错误代码。
	* @note 发布操作为异步操作，操作结果在 video_onPublishLocalResult 中返回。
	* @sa video_onPublishLocalResult
	*/
	RT_API_EXPORT Result avd_video_publishLocalCamera(AVDHandle videoHandle);

	/** 取消发布缺省摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @return 返回错误代码。
	* @note 取消发布操作为异步操作，操作结果在 video_onUnpublishLocalResult 中返回。
	* @sa video_onUnpublishLocalResult
	*/
	RT_API_EXPORT Result avd_video_unpublishLocalCamera(AVDHandle videoHandle);
	/** 设置视频动态码率调整的范围，最小和最大比特率，
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 视频设备对应ID。
	* @param[in] minBitrateBps 最小比特率,单位bps
	* @param[in] maxBitrateBps 最大比特率,单位bps
	* @return 返回错误代码。
	* @note 例如30k/s = 30*8*1000 bps(bits/s)。当min和max相等时，码率固定，将不会动态调整。
	*		需要在视频publish成功后才能做设置。
	*/
	RT_API_EXPORT Result avd_video_setVideoBitrate(AVDHandle videoHandle, const char* deviceId, int minBitrateBps, int maxBitrateBps);

	/** 订阅摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一路摄像头视频。
	* @return 返回错误代码。
	* @note 订阅操作为异步操作，操作结果在 video_onSubscribeResult 中返回。
	* 订阅视频规则：
	*	有清晰度要求，选择此清晰度下视频；
	*	如无清晰度要求，优先选择硬件编码码流视频；
	*	无硬件编码码流，选择缺省设置清晰度；
	*	同一清晰度下有两路码流，按是否支持硬件编码来选择码流。
	* @sa video_onSubscribeResult
	*/
	RT_API_EXPORT Result avd_video_subscribe(AVDHandle videoHandle, const char* deviceId);


    /** 订阅摄像头视频指定视频质量视频
    *
    * @param[in] videoHandle 视频模块句柄。
    * @param[in] deviceId 摄像头Id，唯一标示一路摄像头视频。
    * @param[in] stream 指定视频流（主流，辅流1，辅流2）。
    * @return 返回错误代码。
    * @note 订阅说明如同名接口所描述。
    * @sa StreamType
    * @sa video_onSubscribeResult
    */
    RT_API_EXPORT Result avd_video_subscribeWithStreamType(AVDHandle videoHandle, const char* deviceId, AVDStreamType stream);

	/** 更改订阅视频的视频质量
	*
	* @param[in] deviceId 摄像头Id，唯一标示一路摄像头视频。
	* @param[in] quality 视频质量。
	* @return 返回错误代码。
	* @sa VideoQuality
	*/
	RT_API_EXPORT Result avd_video_changeSubscribedVideoQuality(AVDHandle videoHandle, const char* deviceId, AVDVideoQuality quality);

	/** 取消订阅摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一路摄像头视频。
	* @return 返回错误代码。
	* @note 取消订阅操作为异步操作，操作结果在 video_onUnsubscribeResult 中返回。
	* @sa video_onUnsubscribeResult
	*/
	RT_API_EXPORT Result avd_video_unsubscribe(AVDHandle videoHandle, const char* deviceId);
	// some
	/** 获取已发布的摄像头数量
	*
	* @param[in] videoHandle 视频模块句柄。
	* @return 已发布视频数量。
	*/
	RT_API_EXPORT uint32 avd_video_getPublishedCameraCount(AVDHandle videoHandle);
	/** 根据索引获取发布的摄像头信息
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] index 索引编号，从0开始。
	* @param[out] item 摄像头信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_getPublishedCamera(AVDHandle videoHandle, uint32 index, AVDCamera& item);
	/** 获取发布的摄像头信息列表
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in,out] ncount 请求窗口数量；实际消息返回数量。
	* @param[out] items 摄像头集合存放列表。
	* @note 调用此方法之前一定要调用avd_video_getPublishedCameraCount获取到已发布的摄像头实际数量。
	* @return 返回错误代码。
	* @sa avd_video_getPublishedCameraCount
	*/
	RT_API_EXPORT Result avd_video_getPublishedCameras(AVDHandle videoHandle, uint32& ncount, AVDCamera*& items);
	/** 获取已订阅的摄像头数量
	*
	* @param[in] videoHandle 视频模块句柄。
	* @return 摄像头数量。
	*/
	RT_API_EXPORT uint32 avd_video_getSubscribedCameraCount(AVDHandle videoHandle);
	/** 根据索引获取已订阅的摄像头信息
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] index 索引编号，从0开始。
	* @param[out] item 摄像头信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_getSubscribedCamera(AVDHandle videoHandle, uint32 index, AVDCamera& item);
	/** 获取已订阅的摄像头信息列表
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in,out] ncount 请求窗口数量；实际消息返回数量。
	* @param[out] items 摄像头集合存放列表。
	* @note 调用此方法之前一定要调用avd_screen_getSubscribedScreenCount获取到已订阅的摄像头实际数量。
	* @return 返回错误代码。
	* @sa avd_screen_getSubscribedScreenCount
	*/
	RT_API_EXPORT Result avd_video_getSubscribedCameras(AVDHandle videoHandle, uint32& ncount, AVDCamera*& items);

	/** 已发布摄像头切换功能
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] fromId 已发布摄像头Id。
	* @param[in] toId 目标摄像头Id。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_switchLocalCamera(AVDHandle videoHandle, const char* fromId, const char* toId);
	/** 判断摄像头是否已经发布到房间中
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一路摄像头视频。
	* @return 返回是否是已发布的摄像头。
	*/
	RT_API_EXPORT AVDBool avd_video_isCameraPublished(AVDHandle videoHandle, const char* deviceId);
	/** 判断摄像头是否已经被本用户订阅
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一路摄像头视频。
	* @return 返回是否是已订阅的摄像头。
	*/
	RT_API_EXPORT AVDBool avd_video_isCameraSubscribed(AVDHandle videoHandle, const char* deviceId);
	/** 预览本地某一摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一路摄像头视频。
	* @param[in] renderHandle 显示对象接口指针
	* @return 返回错误代码。
	* @sa IVideoRender
	*/
	RT_API_EXPORT Result avd_video_previewLocalCameraWithDeviceId(AVDHandle videoHandle, const char* deviceId, AVDHandle renderHandle);
	/** 取消预览摄像头视频
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_unpreviewLocalCameraWithDeviceId(AVDHandle videoHandle, const char* deviceId);
	/** 发布摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] device 摄像头信息。
	* @return 返回错误代码。
	* @note 发布操作为异步操作，操作结果在 video_onPublishLocalResult 中返回。
	* @sa video_onPublishLocalResult
	*/
	RT_API_EXPORT Result avd_video_publishLocalCameraWithDevice(AVDHandle videoHandle, const AVDCamera& device);
	/** 取消发布摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] *deviceId 摄像头Id，唯一标示一路摄像头视频。
	* @return 返回错误代码。
	* @note 取消发布操作为异步操作，操作结果在 video_onUnpublishLocalResult 中返回。
	* @sa video_onUnpublishLocalResult
	*/
	RT_API_EXPORT Result avd_video_unpublishLocalCameraWithDeviceId(AVDHandle videoHandle, const char* deviceId);
	/** 已经published或preview的视频暂停：视频卡住，且也不发送到网络上
	*
	* @param[in] deviceId 摄像头设备ID。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_muteLocalCamera(AVDHandle videoHandle, const char* deviceId);
	/** 取消视频暂停
	*
	* @param[in] deviceId 摄像头设备ID。
	* @return 返回错误代码。
	* @note muteLocalCamera
	*/
	RT_API_EXPORT Result avd_video_unmuteLocalCamera(AVDHandle videoHandle, const char* deviceId);

	// remote camera control
	/** 命令远端用户发布某一摄像头视频
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] device 远端摄像头信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_remotecmdPublishCamera(AVDHandle videoHandle, const AVDCamera& device);
	/** 命令远端用户取消发布摄像头视频
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_remotecmdUnpublishCamera(AVDHandle videoHandle, const char* deviceId);
	//
	/** 关联视频数据和显示对象，在render中显示视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一路共享的摄像头视频。
	* @param[in] renderHandle 显示对象接口指针。
	*
	* @note 视频数据可以在多个显示对象上显示，而一个显示对象某一时刻只能显示一路视频。
	*		在本地视频发布到房间中，或者远端视频订阅成功后，调用此接口完成视频与显示对象的对接，从而在显示对象中显示视频。
	* @return 返回错误代码。
	* @sa avd_render_create
	*/
	RT_API_EXPORT Result avd_video_attachRender(AVDHandle videoHandle, const char* deviceId, AVDHandle renderHandle);
	/** 解除摄像头视频数据的所有显示对象关联
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一路共享的摄像头视频。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_video_detachRenderWithDeviceId(AVDHandle videoHandle, const char* deviceId);
	/** 解除某一显示对象与摄像头视频数据的关联
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] renderHandle 视频模块句柄。
	* @return 返回错误代码。
	* @sa avd_render_create
	* @sa avd_video_attachRender
	*/
	RT_API_EXPORT Result avd_video_detachRender(AVDHandle videoHandle, AVDHandle renderHandle);
	// fake video capturer
	/** 创建一个视频导入对象句柄
	*
	* @param[in] videoCapturerHandle 视频导入对象句柄。
	* @param[in] fourFormat 将要传入的视频数据类型。
	* @param[in] isScreen 是否是桌面共享。
	* @note 除了FOURCC_H264和其他FourCC不能混淆；其他的FourCC可以混淆导入。
	*       视频导入步骤：a.创建视频导入对象；
	*					  b.调用avd_video_previewLocalCameraWithFakeCapturer做预览或者avd_video_publishLocalCameraWithFakeCapturer做视频分享；
	*					  c.当视频数据采集到后，调用   导入视频数据
	*					  d.完成后要销毁视频导入对象。
	* @return 返回错误代码。
	* @sa avd_fakeVideoCapturer_destory
	*/
	RT_API_EXPORT Result avd_fakeVideoCapturer_create(AVDHandle& videoCapturerHandle, rtc::FourCC fourFormat, AVDBool isScreen, LFakeVideoCallback cb);

	/** 判断Capturer是否正在运行
	* @return 是否在运行。
	*/
	RT_API_EXPORT bool avd_fakeVideoisRunning(AVDHandle videoCapturerHandle);

	/** 给Capturer输入原始图像
	*
	* @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_fakeVideoCapturer_inputCapturedFrame(
		AVDHandle videoCapturerHandle, uint64 timestamp_ns, uint32 format, int w, int h, const uint8* data, size_t len, int rotation, bool mirror);
	/** 给Capturer输入编码后的数据
	*
	* @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_fakeVideoCapturer_inputEncodedFrame(
		AVDHandle videoCapturerHandle, uint64 timestamp_ns, int w, int h, const uint8* sample, size_t sample_size);
	/** 销毁一个视频导入对象句柄
	*
	* @param[in] videoCapturerHandle 视频导入对象句柄。
	*
	* @return 返回错误代码。
	* @sa avd_fakeVideoCapturer_create
	*/
	RT_API_EXPORT Result avd_fakeVideoCapturer_destory(AVDHandle videoCapturerHandle);
	/** 预览模拟摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in,out] fakeDevice 模拟摄像头信息，接口会生成deviceId，生成规则："userId_"+（用户输入的deviceId), 此处deviceId不能包含'_'和'{'、'}'此三个字符。
	* @param[in] videoCapturerHandle 视频导入对象句柄。
	* @param[in] renderHandle 视频渲染对象句柄
	* @return 返回错误代码。
	* 模拟摄像头用于在房间中导入特定已经存在的视频数据流，比如视频文件、录播系统视频流等。
	* @sa avd_fakeVideoCapturer_create
	* @note renderHandle  允许被设置为0。
	*	    fakeDevice.id 会按照3tee设备id规则重新构造成。
	*/
	RT_API_EXPORT Result avd_video_previewLocalCameraWithFakeCapturer(AVDHandle videoHandle, AVDCamera& fakeDevice, AVDHandle videoCapturerHandle, AVDHandle renderHandle);
	/** 发布模拟摄像头视频
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in,out] fakeDevice 模拟摄像头信息，接口会生成deviceId，生成规则："userId_"+（用户输入的deviceId), 此处deviceId不能包含'_'和'{'、'}'此三个字符。
	* @param[in] videoCapturerHandle 视频导入对象句柄。
	* @return 返回错误代码。
	* @note 发布操作为异步操作，操作结果在 onPublishLocalResult 中返回。
	* 模拟摄像头用于在房间中导入特定已经存在的视频数据流，比如视频文件、录播系统视频流等。
	* @sa avd_fakeVideoCapturer_create
	*/
	RT_API_EXPORT Result avd_video_publishLocalCameraWithFakeCapturer(AVDHandle videoHandle, AVDCamera& fakeDevice, AVDHandle videoCapturerHandle);
	
	/** 摄像头数据更改
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] deviceId 摄像头Id，唯一标示一个摄像头。
	* @param[in] level 摄像头整形数据。
	* @param[in] description 摄像头字符串数据。
	* @sa onCameraDataNotify
	*/
	RT_API_EXPORT Result avd_video_updateCameraData(AVDHandle videoHandle, const char* deviceId, int level, const char* description);

    RT_API_EXPORT Result avd_video_setMirror(AVDHandle handle,const char* deviceId, bool mirror);
}
///
/**
* 视频设备管理回调接口.
*
* 视频设备管理回调接口定义了视频设备相关通知。
*/
typedef struct VideoDevice_Callback {
	/// 通知
	/** 摄像头插入通知
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] item 摄像头信息。
	* @note 当系统中有摄像头设备插入时，此回调触发。
	*/
	void(*videodive_onCameraPlugin) (AVDHandle vdeviceHandle, const AVDCamera& item);
	/** 摄像头拔出通知
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] item 摄像头信息。
	* @note 当系统中有摄像头设备拔出时，此回调触发。
	*/
	void(*videodive_onCameraPlugout)(AVDHandle vdeviceHandle, const AVDCamera& item);
	VideoDevice_Callback() {
		videodive_onCameraPlugin = NULL;
		videodive_onCameraPlugout = NULL;
	}
}*LPVideoDevice_Callback;

extern "C" {
	/** 初始屏视频设备管理接口
	*
	* @param[in] videoHandle 视频模块句柄。
	* @param[in] cb 视频设备管理模块回调接口指针。
	* @param[out] vdeviceHandle 视频设备管理模块句柄。
	* @return 返回错误代码。
	* @sa VideoDevice_Callback
	*/
	RT_API_EXPORT Result avd_videodevice_init(AVDHandle videoHandle, LPVideoDevice_Callback cb, AVDHandle& vdeviceHandle);
	/** 反初始屏视频设备管理接口
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @return 返回错误代码。
	* @sa VideoDevice_Callback
	*/
	RT_API_EXPORT Result avd_videodevice_uninit(AVDHandle vdeviceHandle);
	/** 获取指定设备Id的摄像头信息
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] *deviceId 设备Id。
	* @param[in] item 摄像头信息。
	* @return 返回错误码。
	* @note 可以获取到本地用户和远端用户的摄像头信息。
	*/
	RT_API_EXPORT Result avd_videodevice_getCamera(AVDHandle vdeviceHandle, const char* deviceId, AVDCamera& item);
	/** 获取本地摄像头信息数量
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @return 返回本地摄像头数量。
	*/
	RT_API_EXPORT uint32 avd_videodevice_getLocalCameraCount(AVDHandle vdeviceHandle);
	/** 根据索引获取本地摄像头信息数量
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] index 索引号，从0开始。
	* @param[in] item 摄像头信息。
	* @return 返回错误码。
	*/
	RT_API_EXPORT Result avd_videodevice_getLocalCamera(AVDHandle vdeviceHandle, uint32 index, AVDCamera& item);
	/** 获取机摄像头设备列表
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in,out] ncount 请求数量；实际消息返回数量。
	* @param[in,out] cameras 摄像头设备列表。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_videodevice_getLocalCameras(AVDHandle vdeviceHandle, uint32& ncount, AVDCamera*& cameras);
	/** 获取指定类型的本机摄像头信息
	*
	* @param[in] videoHandle 视频设备管理模块句柄。
	* @param[in] type 摄像头类型。
	* @param[out] deviceId 摄像头设备ID号。
	* @param[out] size 摄像头设备ID长度。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_videodevice_getLocalCameraIdByType(AVDHandle videoHandle, rtc::CameraType type, char* deviceId, uint32& size);
	/** 获取指定设备Id的摄像头可支持的采集参数个数
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] deviceId 设备Id。
	* @return 返回采集参数个数。
	* @sa AVDCameraCapability
	*/
	RT_API_EXPORT uint32 avd_videodevice_getCameraCapabilitiesCount(AVDHandle vdeviceHandle, const char* deviceId);
	/** 获取指定设备Id的摄像头采集参数列表
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] deviceId 设备Id。
	* @param[in,out] ncount 请求数量；实际消息返回数量。
	* @param[out] *&capabilities 摄像头采集参数列表。
	* @return 返回错误代码。
	* @sa AVDCameraCapability
	*/
	RT_API_EXPORT Result avd_videodevice_getCameraCapabilities(AVDHandle vdeviceHandle, const char* deviceId, uint32& ncount, AVDCameraCapability*& capabilities);
	/** 获取远端用户的摄像头设备个数
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] userId 用户Id。
	* @return 摄像头设备个数。
	*/
	RT_API_EXPORT uint32 avd_videodevice_getRemoteCameraCount(AVDHandle vdeviceHandle, const char* userId);
	/** 获取远端用户的摄像头设备列表
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] userId 用户Id。
	* @param[in,out] ncount 请求数量；实际消息返回数量。
	* @param[out] *&cameras 摄像头设备列表。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_videodevice_getRemoteCameras(AVDHandle vdeviceHandle, const char* userId, uint32& ncount, AVDCamera*& cameras);
	/** 获取本机缺省摄像头信息
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[out] defaultCamera 摄像头设备。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_videodevice_getDefaultCamera(AVDHandle vdeviceHandle, AVDCamera& defaultCamera);
	/** 设置本机缺省摄像头信息
	*
	* @param[in] vdeviceHandle 视频设备管理模块句柄。
	* @param[in] deviceId 设备Id。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_videodevice_setDefaultCamera(AVDHandle vdeviceHandle, const char* deviceId);
	
}
#endif//RT_Video_C_H_
