www.pudn.com > vc-network-communication.rar > AVIOMgr.h


//NetTalk 
/*------------------------------------------------------------------------------*\ 
 ============================= 
   模块名称: AVIOMgr.h 
 ============================= 
  
 [版权] 
  
   2000-2002  115软件工厂  版权所有 
                                               
\*------------------------------------------------------------------------------*/ 
//视频通讯的核心部分// 
 
#ifndef _AVIOMGR_H_ 
#define _AVIOMGR_H_ 
 
#include "AudioRec.h" 
#include "CodecMgr.h" 
#include "VideoCapture.h" 
#include "AudioPlay.h" 
#include "UDPSocket.h" 
 
 
//AVIO版本 
#define VER_AVIO 102 
 
//msg 
//the LOWORD wParam specify the notify code 
#define IOM_NOTIFY     WM_USER+50 
 
//notify code 
//the HIWORD of wParam specify the VER of AVIO 
#define IOMN_CALL              0 
#define IOMN_ACCEPT            1 
#define IOMN_CONNECTED         2 
////////// 
#define IOMN_END               3//HIWORD of wParam identify the end code 
#define E_TIMEOUT   1 
#define E_USER      2 
//////////////// 
#define IOMN_REFUSE            4 //HIWORD of wParam identify the refuse code 
 
#define R_TIMEOUT    1 
#define R_USER       2 
#define R_BUSY       3 
 
//the HIWORD of wParam specify the err code 
#define IOMN_ERR               5       
 
//err code 
 
#define IOME_STOP        0 
#define IOME_SOCKET      1 
#define IOME_AUDIO_IN    2 
#define IOME_AUDIO_OUT   3 
#define IOME_VIDEO_IN    4 
#define IOME_VIDEO_OUT   5 
#define IOME_AUDIO_CODEC 6 
#define IOME_VIDEO_CODEC 7 
 
 
#define IOMN_TXT                6//lParam point to the txt 
#define IOMN_VQSET               7//Hiword :q 
//////////////////////////////////////////// 
//data handle msg 
//the lParam point to the AVIO object 
//Use 
//GetRemoteAudio 
//GetRemoteVideo 
//GetLocalAudio 
//GetLocalVideo 
//to Handle the data ,and proccess this as you like(paint or play) 
//Warning:you should return these messages quickly,as these msg is sent by SendMessage 
////the wParam identify the data type,0 local,or remote 
#define IOM_AUDIO       WM_USER+51 
#define IOM_VIDEO       WM_USER+52 
 
 
///status 
#define STA_FREE    0 
#define STA_BUSY    1 
 
 
 
//pack flag 
#define FLAG_AUDIO 0x3131 
#define FLAG_VIDEO 0x3132 
#define FLAG_CMD   0x3133 
 
// 
#define SIZE_AUDIO_FRAME 960 
#define SIZE_AUDIO_PACKED 60 
// 
//音频数据包(包含音频数据) 
typedef struct 
{ 
	short flag; 
	BYTE session; 
	BYTE  id; 
	BYTE data[SIZE_AUDIO_PACKED]; 
}PACK_AUDIO; 
//视频数据包(不包含视频数据) 
typedef struct 
{ 
	short flag; 
	BYTE session; 
	BYTE id; 
	BYTE subid; 
	BYTE key; //whether key frame 
	unsigned int data_size_total; 
	unsigned short data_size; 
	 
}PACK_VIDEO; 
 
///// 
#define CMD_CALL           1 
#define CMD_REFUSE         2 
#define CMD_ACCEPT	       3 
#define CMD_END            4 
 
 
#define CMD_TXT            20 
 
//丢包率 
#define CMD_DROPRATE      21 
//命令数据包(文本信息也用该数据包) 
#define SIZE_TXT 1024 
 
typedef struct 
{ 
	short flag; 
	BYTE session; 
	BYTE id; 
	 
	BYTE cmd; 
	BYTE type;//0:始发 1:反馈 
	BYTE ext; 
	unsigned short data_size_extra; 
}PACK_CMD; 
 
typedef struct 
{ 
	bool bVideoIn; 
	bool bVideoOut; 
	bool bAudioIn; 
	bool bAudioOut; 
	bool bVideoCodec; 
	bool bAudioCodec; 
}DEVICE_SUPPORT; 
////////////////// 
struct CMD_ITEM 
{ 
	char resend; 
	int ID; 
	char* pbuf; 
	UINT len; 
	sockaddr_in addr; 
	CMD_ITEM* pNext; 
	CMD_ITEM* pPrev; 
}; 
//Cmd queue implementation 
class CCmdQueue 
{ 
public: 
	CCmdQueue() 
	{ 
		InitializeCriticalSection(&m_cs); 
		pHead=0; 
		count=0; 
	} 
	~CCmdQueue() 
	{ 
		CMD_ITEM* p=pHead,*temp; 
		while(p) 
		{ 
			temp=p->pNext; 
			Remove(p); 
			p=temp; 
		} 
		DeleteCriticalSection(&m_cs); 
	} 
	void Add(int ID,char* buf,UINT len,sockaddr_in &addr) 
	{ 
		EnterCriticalSection(&m_cs); 
		CMD_ITEM* p=new CMD_ITEM; 
		p->pNext=pHead; 
		if(pHead) 
			pHead->pPrev=p; 
		p->resend=1; 
		p->pPrev=0; 
		p->ID=ID; 
		p->pbuf=new char[len]; 
		p->len=len; 
		p->addr=addr; 
		CopyMemory(p->pbuf,buf,len); 
		pHead=p; 
		count++; 
		LeaveCriticalSection(&m_cs); 
	} 
	char* GetBuf(int ID,UINT& len,char& resend,sockaddr_in& addr) 
	{ 
		 
		CMD_ITEM* p=pHead; 
		while(p) 
		{ 
			if(p->ID==ID) 
			{ 
				len=p->len; 
				addr=p->addr; 
				resend=p->resend++; 
				return p->pbuf; 
			} 
			p=p->pNext; 
		} 
		return 0; 
	} 
	bool Remove(int ID) 
	{ 
		EnterCriticalSection(&m_cs); 
		bool ret=false; 
		CMD_ITEM* p=pHead,*temp; 
		 
		while(p) 
		{ 
			temp=p->pNext; 
			if(p->ID==ID) 
			{ 
			 
				Remove(p); 
				ret=true; 
				break; 
				 
			} 
			p=temp;			 
		} 
		LeaveCriticalSection(&m_cs); 
		return ret; 
	} 
	bool Remove(CMD_ITEM* p) 
	{ 
		if(p) 
		{ 
			if(p==pHead) 
				pHead=p->pNext; 
			if(p->pbuf) 
				delete []p->pbuf; 
			if(p->pPrev) 
				p->pPrev->pNext=p->pNext; 
			if(p->pNext) 
				p->pNext->pPrev=p->pPrev; 
			delete p; 
			count--; 
			return true; 
		} 
		else 
		{ 
			return false; 
		} 
	} 
	int count; 
private: 
	 
	CMD_ITEM* pHead; 
protected: 
	CRITICAL_SECTION m_cs; 
}; 
 
// 
 
class CAVIOMgr 
{ 
public: 
	BOOL EnableBandAdjust(BOOL bEnable); 
	BOOL Enable(BOOL bEnable); 
	sockaddr_in& GetCurrentAddr(); 
	BOOL SendTxt(char* ip,unsigned short port,char* txt); 
	 
	UINT GetFps(); 
	CAVIOMgr(); 
	virtual  ~CAVIOMgr(); 
	 
	BOOL Init(UINT nPort); 
	void Destroy(); 
 
	BOOL Call(char* ip,unsigned short port); 
	BOOL Accept(); 
	void OnAccept(); 
	BOOL Refuse(); 
	BOOL EndTalk(); 
 
	UINT GetFrameCount(); 
	UINT GetDataRcv(); 
	UINT GetDataSend(); 
 
	BOOL EnablePreview(BOOL b); 
	 
	sockaddr_in GetRemoteAddr(); 
	int GetStatus(); 
	void GetDeviceSupport(DEVICE_SUPPORT& ds); 
 
	BITMAPINFO* GetBitampInfo(); 
	char* GetRemoteAudio(UINT& len); 
	char* GetRemoteVideo(UINT& len); 
	char* GetLocalAudio(UINT&len); 
	char* GetLocalVideo(UINT& len); 
	 
	 
	void SetRemoteAudioRcvWnd(HWND hwnd); 
	void SetRemoteVideoRcvWnd(HWND hwnd); 
	void SetLocalAudioRcvWnd(HWND hwnd); 
	void SetLocalVideoRcvWnd(HWND hwnd); 
	void SetMainWnd(HWND hwnd); 
	 
	void VideoSend(BOOL b); 
	void SetVideoQuality(UINT q); 
 
	friend class CCodecMgr; 
 
protected: 
	BOOL InitCap(); 
	BOOL DestroyCap(); 
 
	void DestroyVideoCodec(); 
	BOOL InitVideoCodec(); 
 
	void DestroyAudioCodec(); 
	BOOL InitAudioCodec(); 
	 
	BOOL DestroyAudioPlay(); 
	BOOL InitAudioPlay(); 
 
	BOOL DestroyAudioRec(); 
	BOOL InitAudioRec(); 
	 
	BOOL DestroySocket(); 
	BOOL InitSocket(UINT nPort); 
 
	void OnEncodeVideoData(char* pv,int len); 
	void OnEncodeAudioData(char* pa,int len); 
	void OnDecodeVideoData(PACK_VIDEO* ppv,int len); 
	void OnDecodeAudioData(PACK_AUDIO* ppa,int len); 
	void OnCommand(PACK_CMD* ppc,int len); 
 
	void SetDst(char* ip,unsigned short port); 
	 
	static DWORD WINAPI AudioInThreadProc(LPVOID lpParameter); 
	static DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter); 
	static DWORD WINAPI SockThreadProc(LPVOID lpParameter); 
	static void CALLBACK CmdTimeOutProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime); 
	static void CALLBACK DropRateCounter(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime); 
	static LRESULT CALLBACK VideoStreamCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr); 
	 
protected: 
	BOOL m_bEnableBandAdjust; 
	BOOL m_bEnable; 
	CWndX m_MsgRcvWnd; 
	BYTE m_session; 
 
	 
	BYTE m_idCmd; 
	BYTE m_idVideo; 
	BOOL SendCmd(PACK_CMD* pCmd,UINT nLen,sockaddr_in &addr,BOOL bFlag); 
 
	CCmdQueue m_CmdQueue; 
	UINT m_nFrameCount; 
	UINT m_nLastFrameCount; 
	UINT m_nDropRate; 
	UINT m_nFps; 
	UINT m_uDataRcv; 
	UINT m_uDataSend; 
	UINT m_nCurVid; 
	UINT m_nLastVid; 
 
	HANDLE m_hAudioOut; 
	HANDLE m_hAudioIn; 
	DWORD m_dwAudioOutId; 
	DWORD m_dwAudioInId; 
 
	BOOL m_bVideoSend; 
	 
 
	 
	PACK_AUDIO m_AudioPack; 
	char m_VideoPack[MAX_UDP_SIZE]; 
 
	char m_AudioLocal[SIZE_AUDIO_FRAME]; 
	char m_VideoRemote[76032]; 
	char m_AudioRemote[SIZE_AUDIO_FRAME]; 
	char* m_VideoLocal; 
 
	 
	int m_iStatus;	 
	DEVICE_SUPPORT m_ds; 
 
	HWND m_hwndMainWnd; 
	HWND m_hwndLocalVideoRcv; 
	HWND m_hwndLocalAudioRcv; 
	HWND m_hwndRemoteVideoRcv; 
	HWND m_hwndRemoteAudioRcv; 
	 
	 
 
	int m_iAudioBuf; 
	 
	CAudioPlay m_AudioPlay; 
	CAudioRec m_AudioRec; 
	 
	CCodecMgr m_CodecMgr; 
	CVideoCapture m_ViCap; 
	CUDPSocket m_Socket; 
 
 
	sockaddr_in m_sockaddr; 
	sockaddr_in m_dst; 
	 
	 
	CAPSTATUS m_CapStauts; 
 
	HANDLE m_hSockThread; 
	DWORD m_dwSockThreadId; 
	 
}; 
 
 
#endif