#ifndef RT_COMMON_C_H
#define RT_COMMON_C_H

#include "api/combase.h"
#include "string.h"


typedef rtc::CameraStatus					AVDCameraStatus;
typedef rtc::CameraType					AVDCameraType;
typedef rtc::ScreenStatus					AVDScreenStatus;
typedef rtc::ScreenType					AVDScreenType;
typedef rtc::VideoQuality					AVDVideoQuality;
typedef rtc::StreamType					AVDStreamType;
typedef rtc::AvdProxyType                    AVDProxyType;

/**
* C语言自定义Bool类型.
*
*/
typedef int AVDBool;
#define avd_false 0  
#define avd_true  1  

/**
* C语言设备信息结构.
*
* 设备信息结构定义了设备基本信息，此处设备包括麦克风、扬声器、摄像头和屏幕窗口。
*/
struct AVDDevice
{
	char id[Max_DeviceId];							/**< 设备Id，唯一标识一个设备 */
    char realid[Max_DeviceId];                      /**< 真实设备ID */
	char name[Max_DeviceName];						/**< 设备名称，应用层可用于设备显示  */
	rtc::DeviceStatus status;							/**< 设备状态 */
	AVDDevice() :status(rtc::ds_none){
		memset(id, 0, sizeof(id));
        memset(realid,0,sizeof(realid));
		memset(name, 0, sizeof(name));
	}
	AVDDevice(rtc::DeviceStatus astatus, const char* aid, const char* aname)
		: status(astatus){
#ifdef WIN32
        strcpy_s(id, aid);
        strcpy_s(name, aname);
#else
        strcpy(id, aid);
        strcpy(name, aname);
#endif // RT_WIN32

	}
	bool isValid() const { return id[0] !=0x00; }
};
struct AVDVideoDevice
{
	AVDDevice device;
	int		  level;								/**< 应用层对设备设置的数据，可用于表示视频权重等, 应用层开发可用  */
	char	  description[Max_DeviceDescription];	/**< 应用层对设备的描述，应用层开发可用 */
	uint32	  deviceQualities;						/**< 视频质量类型集：摄像头通知时指摄像头支持视频质量  */
	uint32	  publishedQualities;					/**< 视频质量类型集：publish时是指发布视频的质量，可设置多个值； */
	AVDVideoDevice() :level(0), deviceQualities(0), publishedQualities(0) {
		memset(description, 0, sizeof(description));
	}
};

struct AVDScreenWindow {
	AVDVideoDevice videodevice;
	AVDScreenType  type;							/**< 窗口类型  */
	AVDScreenWindow() : type(rtc::st_desktop) {}
};

struct AVDCamera {
	AVDVideoDevice videodevice;
	AVDCameraType  type;							/**< 摄像头类型  */
	AVDCamera() : type(rtc::ct_unknown) {
	}
	void clear(){
		memset(this, 0, sizeof(AVDCamera));
	}
};
struct AVDUserId {
	char   userId[Max_UserId];						/**< 用户Id */
};
/**
* C语言视频采集信息结构.
*
* 视频采集结构定义了视频采集相关参数，包含视频分辨率和帧率。
*/
struct AVDCameraCapability {
	uint32 width;							/**< 视频宽度  */
	uint32 height;							/**< 视频高度  */
	uint32 maxFPS;							/**< 视频帧率  */
	AVDCameraCapability() :width(0), height(0), maxFPS(0) {}
	AVDCameraCapability(uint32 w, uint32 h, uint32 fps) :width(w), height(h), maxFPS(fps) {}
	/** 判断分辨率是否有效 */
	bool isValid() const { return 0 != width && 0 != height; }
};

/**
* 语音激励信息结构.
*
* 语音激励信息信息定义了当前房间中本地语音输入和输出能量，以及远端用户的语音能量信息。
* 语音能量幅度：0-9，其中0为无能量，9为最大能量
*/
#define MAX_AUDIO_SPEAKER  16
struct AVDAudioInfo {
	int input_level;						/**< 本地语音输入能量 */
	int output_level;						                          /**< 本地语音输出能量 */

	uint32 ncount;							                            /**< 远端有能量用户数 */
	char userids[MAX_AUDIO_SPEAKER][Max_UserId];							/**< 远端用户UserId表 */
	int  levels[MAX_AUDIO_SPEAKER];							/**< 远端用户能量值表 */
	AVDAudioInfo() :input_level(0), output_level(0), ncount(0){
		
	}
	void clear(){
		input_level = 0;
		output_level = 0;
		ncount = 0;
		memset(levels, 0, sizeof(int)*MAX_AUDIO_SPEAKER);
		memset(userids, 0, MAX_AUDIO_SPEAKER * Max_UserId);
	}
};

struct AVDNetworkStats {
	int bps_received;				/**< 当前接收码率: 3s计算  */
	int bps_sent;					/**< 当前发送码率: 3s计算  */
	int lostpercent;				/**< 当前丢包率:   3s计算  */
	int lostpercent_received;		/**< 当前接收丢包率:   3s计算  */
	int lostpercent_sent;			/**< 当前发送丢包率:   3s计算  */
	int64 bytes_received;			/**< 总共已接收字节数  */
	int64 bytes_sent;				/**< 总共已发送字节数  */
	int64 packets_lost;				/**< 总共已丢包数  */
	int64 packets_lost_received;	/**< 总共接收已丢包数  */
	int64 packets_lost_sent;		/**< 总共发送已丢包数  */
	int64 packets_received;			/**< 总共已接收数据包  */
	int64 packets_sent;				/**< 总共已发送数据包  */
	void Clear()
	{
		memset(this, 0, sizeof(AVDNetworkStats));
	}
};
/**
* 房间统计信息结构.
*
* 房间统计信息结构定义了房间级的网络，媒体等统计信息。
*/
struct AVDRoomStats {
	AVDNetworkStats netstats;
	int available_receive_bandwidth;		/**< 估计接收带宽  */
	int available_send_bandwidth;			/**< 估计发送带宽  */
	char local_address[Max_Address];		/**< 本地地址  */
	char remote_address[Max_Address];		/**< 远端地址  */
	char transport_type[Max_StringEnum];	/**< 传输类型：udp : tcp  */
	AVDRoomStats() :available_receive_bandwidth(0), available_send_bandwidth(0) {
		memset(local_address, 0, sizeof(local_address));
		memset(remote_address, 0, sizeof(remote_address));
		memset(transport_type, 0, sizeof(transport_type));
	}
	void Clear() {
		netstats.Clear();
		available_receive_bandwidth = 0;
		available_send_bandwidth = 0;
		memset(local_address, 0, sizeof(local_address));
		memset(remote_address, 0, sizeof(remote_address));
		memset(transport_type, 0, sizeof(transport_type));
	}
};

/**
* 媒体统计信息结构.
*
* 媒体统计信息结构定义了媒体级的网络，媒体等统计信息。
*/
struct AVDMediaStats {
	AVDNetworkStats netstats;
	char media_type[Max_StringEnum];	/**< 媒体类型：audio : video  */
	char codec_name[Max_StringEnum];	/**< 媒体编码名称  */
	int audio_input_level;				/**< 音频输入音量  */
	int audio_output_level;				/**< 音频输出音量  */
	int frame_width;					/**< 视频宽度  */
	int frame_height;					/**< 视频高度  */
	int frame_rate;						/**< 视频帧率  */

	AVDMediaStats() :audio_input_level(0), audio_output_level(0)
		, frame_width(0), frame_height(0), frame_rate(0) {
		memset(media_type, 0, sizeof(media_type));
		memset(codec_name, 0, sizeof(codec_name));
	}
	void Clear() {
		netstats.Clear();
		audio_input_level = 0;
		audio_output_level = 0;
		frame_width = 0;
		frame_height = 0;
		frame_rate = 0;
		memset(media_type, 0, sizeof(media_type));
		memset(codec_name, 0, sizeof(codec_name));
	}
};

#endif//RT_COMMON_C_H
