AVIOMgr.h
上传用户:oldpeter23
上传日期:2013-01-09
资源大小:1111k
文件大小:8k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. //NetTalk
  2. /*------------------------------------------------------------------------------*
  3.  =============================
  4.    模块名称: AVIOMgr.h
  5.  =============================
  6.  
  7.  [版权]
  8.  
  9.    2000-2002  115软件工厂  版权所有
  10.                                               
  11. *------------------------------------------------------------------------------*/
  12. //视频通讯的核心部分//
  13. #ifndef _AVIOMGR_H_
  14. #define _AVIOMGR_H_
  15. #include "AudioRec.h"
  16. #include "CodecMgr.h"
  17. #include "VideoCapture.h"
  18. #include "AudioPlay.h"
  19. #include "UDPSocket.h"
  20. //AVIO版本
  21. #define VER_AVIO 102
  22. //msg
  23. //the LOWORD wParam specify the notify code
  24. #define IOM_NOTIFY     WM_USER+50
  25. //notify code
  26. //the HIWORD of wParam specify the VER of AVIO
  27. #define IOMN_CALL              0
  28. #define IOMN_ACCEPT            1
  29. #define IOMN_CONNECTED         2
  30. //////////
  31. #define IOMN_END               3//HIWORD of wParam identify the end code
  32. #define E_TIMEOUT   1
  33. #define E_USER      2
  34. ////////////////
  35. #define IOMN_REFUSE            4 //HIWORD of wParam identify the refuse code
  36. #define R_TIMEOUT    1
  37. #define R_USER       2
  38. #define R_BUSY       3
  39. //the HIWORD of wParam specify the err code
  40. #define IOMN_ERR               5      
  41. //err code
  42. #define IOME_STOP        0
  43. #define IOME_SOCKET      1
  44. #define IOME_AUDIO_IN    2
  45. #define IOME_AUDIO_OUT   3
  46. #define IOME_VIDEO_IN    4
  47. #define IOME_VIDEO_OUT   5
  48. #define IOME_AUDIO_CODEC 6
  49. #define IOME_VIDEO_CODEC 7
  50. #define IOMN_TXT                6//lParam point to the txt
  51. #define IOMN_VQSET               7//Hiword :q
  52. ////////////////////////////////////////////
  53. //data handle msg
  54. //the lParam point to the AVIO object
  55. //Use
  56. //GetRemoteAudio
  57. //GetRemoteVideo
  58. //GetLocalAudio
  59. //GetLocalVideo
  60. //to Handle the data ,and proccess this as you like(paint or play)
  61. //Warning:you should return these messages quickly,as these msg is sent by SendMessage
  62. ////the wParam identify the data type,0 local,or remote
  63. #define IOM_AUDIO       WM_USER+51
  64. #define IOM_VIDEO       WM_USER+52
  65. ///status
  66. #define STA_FREE    0
  67. #define STA_BUSY    1
  68. //pack flag
  69. #define FLAG_AUDIO 0x3131
  70. #define FLAG_VIDEO 0x3132
  71. #define FLAG_CMD   0x3133
  72. //
  73. #define SIZE_AUDIO_FRAME 960
  74. #define SIZE_AUDIO_PACKED 60
  75. //
  76. //音频数据包(包含音频数据)
  77. typedef struct
  78. {
  79. short flag;
  80. BYTE session;
  81. BYTE  id;
  82. BYTE data[SIZE_AUDIO_PACKED];
  83. }PACK_AUDIO;
  84. //视频数据包(不包含视频数据)
  85. typedef struct
  86. {
  87. short flag;
  88. BYTE session;
  89. BYTE id;
  90. BYTE subid;
  91. BYTE key; //whether key frame
  92. unsigned int data_size_total;
  93. unsigned short data_size;
  94. }PACK_VIDEO;
  95. /////
  96. #define CMD_CALL           1
  97. #define CMD_REFUSE         2
  98. #define CMD_ACCEPT        3
  99. #define CMD_END            4
  100. #define CMD_TXT            20
  101. //丢包率
  102. #define CMD_DROPRATE      21
  103. //命令数据包(文本信息也用该数据包)
  104. #define SIZE_TXT 1024
  105. typedef struct
  106. {
  107. short flag;
  108. BYTE session;
  109. BYTE id;
  110. BYTE cmd;
  111. BYTE type;//0:始发 1:反馈
  112. BYTE ext;
  113. unsigned short data_size_extra;
  114. }PACK_CMD;
  115. typedef struct
  116. {
  117. bool bVideoIn;
  118. bool bVideoOut;
  119. bool bAudioIn;
  120. bool bAudioOut;
  121. bool bVideoCodec;
  122. bool bAudioCodec;
  123. }DEVICE_SUPPORT;
  124. //////////////////
  125. struct CMD_ITEM
  126. {
  127. char resend;
  128. int ID;
  129. char* pbuf;
  130. UINT len;
  131. sockaddr_in addr;
  132. CMD_ITEM* pNext;
  133. CMD_ITEM* pPrev;
  134. };
  135. //Cmd queue implementation
  136. class CCmdQueue
  137. {
  138. public:
  139. CCmdQueue()
  140. {
  141. InitializeCriticalSection(&m_cs);
  142. pHead=0;
  143. count=0;
  144. }
  145. ~CCmdQueue()
  146. {
  147. CMD_ITEM* p=pHead,*temp;
  148. while(p)
  149. {
  150. temp=p->pNext;
  151. Remove(p);
  152. p=temp;
  153. }
  154. DeleteCriticalSection(&m_cs);
  155. }
  156. void Add(int ID,char* buf,UINT len,sockaddr_in &addr)
  157. {
  158. EnterCriticalSection(&m_cs);
  159. CMD_ITEM* p=new CMD_ITEM;
  160. p->pNext=pHead;
  161. if(pHead)
  162. pHead->pPrev=p;
  163. p->resend=1;
  164. p->pPrev=0;
  165. p->ID=ID;
  166. p->pbuf=new char[len];
  167. p->len=len;
  168. p->addr=addr;
  169. CopyMemory(p->pbuf,buf,len);
  170. pHead=p;
  171. count++;
  172. LeaveCriticalSection(&m_cs);
  173. }
  174. char* GetBuf(int ID,UINT& len,char& resend,sockaddr_in& addr)
  175. {
  176. CMD_ITEM* p=pHead;
  177. while(p)
  178. {
  179. if(p->ID==ID)
  180. {
  181. len=p->len;
  182. addr=p->addr;
  183. resend=p->resend++;
  184. return p->pbuf;
  185. }
  186. p=p->pNext;
  187. }
  188. return 0;
  189. }
  190. bool Remove(int ID)
  191. {
  192. EnterCriticalSection(&m_cs);
  193. bool ret=false;
  194. CMD_ITEM* p=pHead,*temp;
  195. while(p)
  196. {
  197. temp=p->pNext;
  198. if(p->ID==ID)
  199. {
  200. Remove(p);
  201. ret=true;
  202. break;
  203. }
  204. p=temp;
  205. }
  206. LeaveCriticalSection(&m_cs);
  207. return ret;
  208. }
  209. bool Remove(CMD_ITEM* p)
  210. {
  211. if(p)
  212. {
  213. if(p==pHead)
  214. pHead=p->pNext;
  215. if(p->pbuf)
  216. delete []p->pbuf;
  217. if(p->pPrev)
  218. p->pPrev->pNext=p->pNext;
  219. if(p->pNext)
  220. p->pNext->pPrev=p->pPrev;
  221. delete p;
  222. count--;
  223. return true;
  224. }
  225. else
  226. {
  227. return false;
  228. }
  229. }
  230. int count;
  231. private:
  232. CMD_ITEM* pHead;
  233. protected:
  234. CRITICAL_SECTION m_cs;
  235. };
  236. //
  237. class CAVIOMgr
  238. {
  239. public:
  240. BOOL EnableBandAdjust(BOOL bEnable);
  241. BOOL Enable(BOOL bEnable);
  242. sockaddr_in& GetCurrentAddr();
  243. BOOL SendTxt(char* ip,unsigned short port,char* txt);
  244. UINT GetFps();
  245. CAVIOMgr();
  246. virtual  ~CAVIOMgr();
  247. BOOL Init(UINT nPort);
  248. void Destroy();
  249. BOOL Call(char* ip,unsigned short port);
  250. BOOL Accept();
  251. void OnAccept();
  252. BOOL Refuse();
  253. BOOL EndTalk();
  254. UINT GetFrameCount();
  255. UINT GetDataRcv();
  256. UINT GetDataSend();
  257. BOOL EnablePreview(BOOL b);
  258. sockaddr_in GetRemoteAddr();
  259. int GetStatus();
  260. void GetDeviceSupport(DEVICE_SUPPORT& ds);
  261. BITMAPINFO* GetBitampInfo();
  262. char* GetRemoteAudio(UINT& len);
  263. char* GetRemoteVideo(UINT& len);
  264. char* GetLocalAudio(UINT&len);
  265. char* GetLocalVideo(UINT& len);
  266. void SetRemoteAudioRcvWnd(HWND hwnd);
  267. void SetRemoteVideoRcvWnd(HWND hwnd);
  268. void SetLocalAudioRcvWnd(HWND hwnd);
  269. void SetLocalVideoRcvWnd(HWND hwnd);
  270. void SetMainWnd(HWND hwnd);
  271. void VideoSend(BOOL b);
  272. void SetVideoQuality(UINT q);
  273. friend class CCodecMgr;
  274. protected:
  275. BOOL InitCap();
  276. BOOL DestroyCap();
  277. void DestroyVideoCodec();
  278. BOOL InitVideoCodec();
  279. void DestroyAudioCodec();
  280. BOOL InitAudioCodec();
  281. BOOL DestroyAudioPlay();
  282. BOOL InitAudioPlay();
  283. BOOL DestroyAudioRec();
  284. BOOL InitAudioRec();
  285. BOOL DestroySocket();
  286. BOOL InitSocket(UINT nPort);
  287. void OnEncodeVideoData(char* pv,int len);
  288. void OnEncodeAudioData(char* pa,int len);
  289. void OnDecodeVideoData(PACK_VIDEO* ppv,int len);
  290. void OnDecodeAudioData(PACK_AUDIO* ppa,int len);
  291. void OnCommand(PACK_CMD* ppc,int len);
  292. void SetDst(char* ip,unsigned short port);
  293. static DWORD WINAPI AudioInThreadProc(LPVOID lpParameter);
  294. static DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);
  295. static DWORD WINAPI SockThreadProc(LPVOID lpParameter);
  296. static void CALLBACK CmdTimeOutProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
  297. static void CALLBACK DropRateCounter(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
  298. static LRESULT CALLBACK VideoStreamCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr);
  299. protected:
  300. BOOL m_bEnableBandAdjust;
  301. BOOL m_bEnable;
  302. CWndX m_MsgRcvWnd;
  303. BYTE m_session;
  304. BYTE m_idCmd;
  305. BYTE m_idVideo;
  306. BOOL SendCmd(PACK_CMD* pCmd,UINT nLen,sockaddr_in &addr,BOOL bFlag);
  307. CCmdQueue m_CmdQueue;
  308. UINT m_nFrameCount;
  309. UINT m_nLastFrameCount;
  310. UINT m_nDropRate;
  311. UINT m_nFps;
  312. UINT m_uDataRcv;
  313. UINT m_uDataSend;
  314. UINT m_nCurVid;
  315. UINT m_nLastVid;
  316. HANDLE m_hAudioOut;
  317. HANDLE m_hAudioIn;
  318. DWORD m_dwAudioOutId;
  319. DWORD m_dwAudioInId;
  320. BOOL m_bVideoSend;
  321. PACK_AUDIO m_AudioPack;
  322. char m_VideoPack[MAX_UDP_SIZE];
  323. char m_AudioLocal[SIZE_AUDIO_FRAME];
  324. char m_VideoRemote[76032];
  325. char m_AudioRemote[SIZE_AUDIO_FRAME];
  326. char* m_VideoLocal;
  327. int m_iStatus;
  328. DEVICE_SUPPORT m_ds;
  329. HWND m_hwndMainWnd;
  330. HWND m_hwndLocalVideoRcv;
  331. HWND m_hwndLocalAudioRcv;
  332. HWND m_hwndRemoteVideoRcv;
  333. HWND m_hwndRemoteAudioRcv;
  334. int m_iAudioBuf;
  335. CAudioPlay m_AudioPlay;
  336. CAudioRec m_AudioRec;
  337. CCodecMgr m_CodecMgr;
  338. CVideoCapture m_ViCap;
  339. CUDPSocket m_Socket;
  340. sockaddr_in m_sockaddr;
  341. sockaddr_in m_dst;
  342. CAPSTATUS m_CapStauts;
  343. HANDLE m_hSockThread;
  344. DWORD m_dwSockThreadId;
  345. };
  346. #endif