cap.cpp
上传用户:hnnddl
上传日期:2007-01-06
资源大小:3580k
文件大小:8k
源码类别:

IP电话/视频会议

开发平台:

WINDOWS

  1. /*
  2.  * $Revision: 1.5 $
  3.  * $Date: 1998/06/08 16:57:48 $
  4.  */
  5. ////////////////////////////////////////////////////////////////
  6. //               Copyright (c) 1996-98 Lucent Technologies    //
  7. //                       All Rights Reserved                  //
  8. //                                                            //
  9. //                       THIS IS UNPUBLISHED                  //
  10. //                       PROPRIETARY SOURCE                   //
  11. //                   CODE OF Lucent Technologies              //
  12. // AND elemedia   //
  13. //                                                            //
  14. ////////////////////////////////////////////////////////////////
  15. //
  16. ////////////////////////////////////////////////////////////////
  17. // Example programs are provided soley to demonstrate one     //
  18. // possible use of the stack libraries and are included for   //
  19. // instructional purposes only.  You are free to use, modify  //
  20. // and/or redistribute any portion of code in the example     //
  21. // programs.  However, such examples are not intended to      //
  22. // represent production quality code.                         //
  23. //                                                            //
  24. // THE COPYRIGHT HOLDERS PROVIDE THESE EXAMPLE PROGRAMS       //
  25. // "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED     //
  26. // OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED     //
  27. // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A            //
  28. // PARTICULAR PURPOSE.                                        //
  29. ////////////////////////////////////////////////////////////////
  30. #include "call.h"
  31. #include "exchange.h"
  32. #include <assert.h>
  33. void
  34. H323Call::InitCapTable(H245SigCapTable& cap_table)
  35. {
  36. H245SigG7231Cap g7231cap;
  37. H245SigG711Ulaw64kCap g711ulawcap;
  38. g7231cap.SetMaxFrames(3);
  39. g7231cap.SetSilenceSupp(FALSE);
  40. cap_table.RegisterAsRW(g7231cap,G7231_INDEX);
  41. #if NEED_G711
  42. g711ulawcap.SetFramesPerPkt(90);
  43. cap_table.RegisterAsRW(g711ulawcap,G711_INDEX);
  44. #endif
  45. }
  46. void 
  47. H323Call::InitCapDescs(H245SigCapDescs& cap_descs)
  48. {
  49. H245SigAltSet alt;
  50. H245SigCapDesc cap_desc;
  51. #if NEED_G711
  52. alt.AddCapId(G711_INDEX);
  53. #endif
  54. alt.AddCapId(G7231_INDEX);
  55. cap_desc.AddSet(alt);
  56. cap_descs.AddDesc(cap_desc);
  57. }
  58. void
  59. H323Call::InitMuxCap(H245SigMuxCap& mux_cap)
  60. {
  61. int type;
  62. H245SigH225Cap *h225_cap;
  63. H245SigMultipointCap multi_pt_cap;
  64. H245SigMedDistCap mdist_cap;
  65. mux_cap.GetType(type);
  66. if (type != MT_H225)
  67. {
  68. return;
  69. }
  70. h225_cap = (H245SigH225Cap*)&mux_cap;
  71. h225_cap->SetAudioDelayJitter(0x3C);
  72. mdist_cap.SetAudio(TRUE,FALSE);
  73. mdist_cap.SetControl(TRUE,FALSE);
  74. multi_pt_cap.AddMedDistCap(mdist_cap);
  75. h225_cap->SetRxMultipointCap(multi_pt_cap);
  76. h225_cap->SetTxMultipointCap(multi_pt_cap);
  77. h225_cap->SetRxTxMultipointCap(multi_pt_cap);
  78. }
  79. // Function to check if a given cap is present in the
  80. // cap table.
  81. /*ARGSUSED*/
  82. boolean
  83. H323Call::CheckCap(H245SigCapTable& cap_table, H245SigCap& cap)
  84. {
  85. // NOT IMPLEMENTED...
  86. return TRUE;
  87. }
  88. // Utility function to print the capability table.. demonstrates
  89. // how to extract information from the capability table...
  90. void
  91. H323Call::PrintCaps(H245SigCapTable &cap_table)
  92. {
  93. ProtReturnCode result;
  94. int num,
  95. count,
  96. type,
  97. prot,
  98.    *caps;
  99. H245SigCap    *c;
  100. LOG("Capability table is as followsn");
  101. result = cap_table.GetNumNonStd(num);
  102. if (num)
  103. {
  104. count = num;
  105. caps = new int[num];
  106. result = cap_table.GetNonStd(caps, count);
  107. LOG("  Non Standard Capabilities:n");
  108. for(num = 0; num < count; num++)
  109. {
  110. result = cap_table.GetCapType(type, prot, caps[num]);
  111. LOG("    Id: %d, type = %d, prot = %dn", 
  112. caps[num], type, prot);
  113. }
  114. delete []caps;
  115. }
  116. result = cap_table.GetNumRx(num);
  117. if (num)
  118. {
  119. count = num;
  120. caps = new int[num];
  121. result = cap_table.GetRx(caps, count);
  122. LOG("  Recv Capabilitiesn");
  123. for(num = 0; num < count; num++)
  124. {
  125. result = cap_table.GetCapType(type, prot, caps[num]);
  126. LOG("    Id = %d, type = %d, prot = %dn",
  127. caps[num], type, prot);
  128. // Demonstrate how to get extract a capability.
  129. // print nonstandard audio capabilities.
  130. if (type == CAP_AUDIO && prot == AUD_NONSTD)
  131. {
  132. H245SigNonStdAudCap *nsaud_cap;
  133. H245SigNonStdParam data;
  134. result = H245SigCap::Factory(c, type, prot);
  135. result = cap_table.GetCap(*c, caps[num]);
  136. nsaud_cap = (H245SigNonStdAudCap *)c;
  137. nsaud_cap->GetData(data);
  138. LOG("      NonStandard Audio capability contentsn");
  139. LOG("        IDType = %dn", data.GetIDType());
  140. if (data.GetIDType() == H245NS_IDT_H221NS)
  141. {
  142. unsigned short t35_cc;
  143. unsigned short t35_ext; 
  144. unsigned short m_code;
  145. data.GetH221NonStd(t35_cc, t35_ext, m_code);
  146. LOG("      country = 0x%lx, ext = 0x%lx, manufaturer = 0x%lxn",
  147. t35_cc, t35_ext, m_code);
  148. unsigned char *buf;
  149. unsigned int len1;
  150. ProtReturnCode ret = data.GetNonStdData(buf, len1);
  151. int len = (int)len1;
  152. if (PROT_IS_SUCCESS(ret))
  153. {
  154. LOG("      dumping %d bytes of nonstandard datan",
  155. len);
  156. if (len > 0)
  157. {
  158. LOG("        ");
  159. }
  160. for (int i = 0; i < len; i++) {
  161. LOG("0x%x ", buf[i]);
  162. if ((i % 8) == 0)
  163. {
  164. LOG("n        ");
  165. }
  166. }
  167. LOG("n");
  168. }
  169. else
  170. {
  171. LOG("Failed to extract non standard data, error = 0x%lxn", ret);
  172. }
  173. }
  174. else if (data.GetIDType() == H245NS_IDT_OBJECT)
  175. {
  176. unsigned short *data_p;
  177. unsigned short len;
  178. data.GetObjectIdentifier(data_p, len);
  179. assert(data_p != NULL && len > 0);
  180. LOG("      dumping %d bytes of nonstandard object datan",
  181. len);
  182. if (len > 0)
  183. {
  184. LOG("        ");
  185. }
  186. for (int i = 0; i < len; i++) {
  187. LOG("0x%x ", data_p[i]);
  188. if ((i % 8) == 0)
  189. {
  190. LOG("n        ");
  191. }
  192. }
  193. LOG("n");
  194. }
  195. delete c;
  196. }
  197. }
  198. delete []caps;
  199. }
  200. result = cap_table.GetNumTx(num);
  201. if (num)
  202. {
  203. count = num;
  204. caps = new int[num];
  205. result = cap_table.GetTx(caps, count);
  206. LOG("  Xmit Capabilitiesn");
  207. for(num = 0; num < count; num++)
  208. {
  209. result = cap_table.GetCapType(type, prot, caps[num]);
  210. LOG("    Id = %d, type = %d, prot = %dn",
  211. caps[num], type, prot);
  212. }
  213. delete []caps;
  214. }
  215. result = cap_table.GetNumRW(num);
  216. if (num)
  217. {
  218. count = num;
  219. caps = new int[num];
  220. result = cap_table.GetRW(caps, count);
  221. LOG("  Xmit Capabilitiesn");
  222. for(num = 0; num < count; num++)
  223. {
  224. result = cap_table.GetCapType(type, prot, caps[num]);
  225. LOG("    Id = %d, type = %d, prot = %dn",
  226. caps[num], type, prot);
  227. // Demonstrate how to get extract a capability.
  228. // print nonstandard audio capabilities.
  229. if (type == CAP_AUDIO && prot == AUD_NONSTD)
  230. {
  231. H245SigNonStdAudCap *nsaud_cap;
  232. H245SigNonStdParam data;
  233. result = H245SigCap::Factory(c, type, prot);
  234. result = cap_table.GetCap(*c, caps[num]);
  235. nsaud_cap = (H245SigNonStdAudCap *)c;
  236. nsaud_cap->GetData(data);
  237. LOG("      NonStandard Audio capability contentsn");
  238. LOG("        IDType = %dn", data.GetIDType());
  239. if (data.GetIDType() == H245NS_IDT_H221NS)
  240. {
  241. unsigned short t35_cc;
  242. unsigned short t35_ext; 
  243. unsigned short m_code;
  244. data.GetH221NonStd(t35_cc, t35_ext, m_code);
  245. LOG("      country = 0x%lx, ext = 0x%lx, manufaturer = 0x%lxn",
  246. t35_cc, t35_ext, m_code);
  247. }
  248. else if (data.GetIDType() == H245NS_IDT_OBJECT)
  249. {
  250. unsigned short *data_p;
  251. unsigned short len;
  252. data.GetObjectIdentifier(data_p, len);
  253. assert(data_p != NULL && len > 0);
  254. LOG("      dumping %d bytes of nonstandard datan",
  255. len);
  256. if (len > 0)
  257. {
  258. LOG("        ");
  259. }
  260. for (int i = 0; i < len; i++) {
  261. LOG("0x%x ", data_p[i]);
  262. if ((i % 8) == 0)
  263. {
  264. LOG("n        ");
  265. }
  266. }
  267. LOG("n");
  268. }
  269. delete c;
  270. }
  271. }
  272. delete []caps;
  273. }
  274. }