caps_h323.cxx 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. #include <ptlib.h>
  2. #include <h323.h>
  3. #include <h245.h>
  4. #include "ast_h323.h"
  5. #include "caps_h323.h"
  6. #define DEFINE_G711_CAPABILITY(cls, code, capName) \
  7. class cls : public AST_G711Capability { \
  8. public: \
  9. cls() : AST_G711Capability(240, code) { } \
  10. }; \
  11. H323_REGISTER_CAPABILITY(cls, capName) \
  12. DEFINE_G711_CAPABILITY(AST_G711ALaw64Capability, H323_G711Capability::ALaw, OPAL_G711_ALAW_64K);
  13. DEFINE_G711_CAPABILITY(AST_G711uLaw64Capability, H323_G711Capability::muLaw, OPAL_G711_ULAW_64K);
  14. H323_REGISTER_CAPABILITY(AST_G7231Capability, OPAL_G7231);
  15. H323_REGISTER_CAPABILITY(AST_G729Capability, OPAL_G729);
  16. H323_REGISTER_CAPABILITY(AST_G729ACapability, OPAL_G729A);
  17. H323_REGISTER_CAPABILITY(AST_GSM0610Capability, OPAL_GSM0610);
  18. H323_REGISTER_CAPABILITY(AST_CiscoG726Capability, CISCO_G726r32);
  19. H323_REGISTER_CAPABILITY(AST_CiscoDtmfCapability, CISCO_DTMF_RELAY);
  20. OPAL_MEDIA_FORMAT_DECLARE(OpalG711ALaw64kFormat,
  21. OPAL_G711_ALAW_64K,
  22. OpalMediaFormat::DefaultAudioSessionID,
  23. RTP_DataFrame::PCMA,
  24. TRUE, // Needs jitter
  25. 64000, // bits/sec
  26. 8, // bytes/frame
  27. 8, // 1 millisecond/frame
  28. OpalMediaFormat::AudioTimeUnits,
  29. 0);
  30. OPAL_MEDIA_FORMAT_DECLARE(OpalG711uLaw64kFormat,
  31. OPAL_G711_ULAW_64K,
  32. OpalMediaFormat::DefaultAudioSessionID,
  33. RTP_DataFrame::PCMU,
  34. TRUE, // Needs jitter
  35. 64000, // bits/sec
  36. 8, // bytes/frame
  37. 8, // 1 millisecond/frame
  38. OpalMediaFormat::AudioTimeUnits,
  39. 0);
  40. OPAL_MEDIA_FORMAT_DECLARE(OpalG729Format,
  41. OPAL_G729,
  42. OpalMediaFormat::DefaultAudioSessionID,
  43. RTP_DataFrame::G729,
  44. TRUE, // Needs jitter
  45. 8000, // bits/sec
  46. 10, // bytes
  47. 80, // 10 milliseconds
  48. OpalMediaFormat::AudioTimeUnits,
  49. 0);
  50. OPAL_MEDIA_FORMAT_DECLARE(OpalG729AFormat,
  51. OPAL_G729 "A",
  52. OpalMediaFormat::DefaultAudioSessionID,
  53. RTP_DataFrame::G729,
  54. TRUE, // Needs jitter
  55. 8000, // bits/sec
  56. 10, // bytes
  57. 80, // 10 milliseconds
  58. OpalMediaFormat::AudioTimeUnits,
  59. 0);
  60. OPAL_MEDIA_FORMAT_DECLARE(OpalG7231_6k3Format,
  61. OPAL_G7231_6k3,
  62. OpalMediaFormat::DefaultAudioSessionID,
  63. RTP_DataFrame::G7231,
  64. TRUE, // Needs jitter
  65. 6400, // bits/sec
  66. 24, // bytes
  67. 240, // 30 milliseconds
  68. OpalMediaFormat::AudioTimeUnits,
  69. 0);
  70. OPAL_MEDIA_FORMAT_DECLARE(OpalG7231A_6k3Format,
  71. OPAL_G7231A_6k3,
  72. OpalMediaFormat::DefaultAudioSessionID,
  73. RTP_DataFrame::G7231,
  74. TRUE, // Needs jitter
  75. 6400, // bits/sec
  76. 24, // bytes
  77. 240, // 30 milliseconds
  78. OpalMediaFormat::AudioTimeUnits,
  79. 0);
  80. OPAL_MEDIA_FORMAT_DECLARE(OpalGSM0610Format,
  81. OPAL_GSM0610,
  82. OpalMediaFormat::DefaultAudioSessionID,
  83. RTP_DataFrame::GSM,
  84. TRUE, // Needs jitter
  85. 13200, // bits/sec
  86. 33, // bytes
  87. 160, // 20 milliseconds
  88. OpalMediaFormat::AudioTimeUnits,
  89. 0);
  90. OPAL_MEDIA_FORMAT_DECLARE(OpalCiscoG726Format,
  91. CISCO_G726r32,
  92. OpalMediaFormat::DefaultAudioSessionID,
  93. RTP_DataFrame::G726,
  94. TRUE, // Needs jitter
  95. 32000, // bits/sec
  96. 4, // bytes
  97. 8, // 1 millisecond
  98. OpalMediaFormat::AudioTimeUnits,
  99. 0);
  100. #if 0
  101. OPAL_MEDIA_FORMAT_DECLARE(OpalCiscoDTMFRelayFormat,
  102. CISCO_DTMF_RELAY,
  103. OpalMediaFormat::DefaultAudioSessionID,
  104. (RTP_DataFrame::PayloadTypes)121, // Choose this for Cisco IOS compatibility
  105. TRUE, // Needs jitter
  106. 100, // bits/sec
  107. 4, // bytes/frame
  108. 8*150, // 150 millisecond
  109. OpalMediaFormat::AudioTimeUnits,
  110. 0);
  111. #endif
  112. /*
  113. * Capability: G.711
  114. */
  115. AST_G711Capability::AST_G711Capability(int rx_frames, H323_G711Capability::Mode m, H323_G711Capability::Speed s)
  116. : H323AudioCapability(rx_frames, 30) // 240ms max, 30ms desired
  117. {
  118. mode = m;
  119. speed = s;
  120. }
  121. PObject * AST_G711Capability::Clone() const
  122. {
  123. return new AST_G711Capability(*this);
  124. }
  125. unsigned AST_G711Capability::GetSubType() const
  126. {
  127. static const unsigned G711SubType[2][2] = {
  128. { H245_AudioCapability::e_g711Alaw64k, H245_AudioCapability::e_g711Alaw56k },
  129. { H245_AudioCapability::e_g711Ulaw64k, H245_AudioCapability::e_g711Ulaw56k }
  130. };
  131. return G711SubType[mode][speed];
  132. }
  133. PString AST_G711Capability::GetFormatName() const
  134. {
  135. static const char * const G711Name[2][2] = {
  136. { OPAL_G711_ALAW_64K, OPAL_G711_ALAW_56K },
  137. { OPAL_G711_ULAW_64K, OPAL_G711_ULAW_56K },
  138. };
  139. return G711Name[mode][speed];
  140. }
  141. H323Codec * AST_G711Capability::CreateCodec(H323Codec::Direction direction) const
  142. {
  143. return NULL;
  144. }
  145. /*
  146. * Capability: G.723.1
  147. */
  148. AST_G7231Capability::AST_G7231Capability(int rx_frames, PBoolean annexA_)
  149. : H323AudioCapability(rx_frames, 4)
  150. {
  151. annexA = annexA_;
  152. }
  153. PObject::Comparison AST_G7231Capability::Compare(const PObject & obj) const
  154. {
  155. Comparison result = H323AudioCapability::Compare(obj);
  156. if (result != EqualTo) {
  157. return result;
  158. }
  159. PINDEX otherAnnexA = ((const AST_G7231Capability &)obj).annexA;
  160. if (annexA < otherAnnexA) {
  161. return LessThan;
  162. }
  163. if (annexA > otherAnnexA) {
  164. return GreaterThan;
  165. }
  166. return EqualTo;
  167. }
  168. PObject * AST_G7231Capability::Clone() const
  169. {
  170. return new AST_G7231Capability(*this);
  171. }
  172. PString AST_G7231Capability::GetFormatName() const
  173. {
  174. return (annexA ? OPAL_G7231 "A" : OPAL_G7231);
  175. }
  176. unsigned AST_G7231Capability::GetSubType() const
  177. {
  178. return H245_AudioCapability::e_g7231;
  179. }
  180. PBoolean AST_G7231Capability::OnSendingPDU(H245_AudioCapability & cap,
  181. unsigned packetSize) const
  182. {
  183. cap.SetTag(H245_AudioCapability::e_g7231);
  184. H245_AudioCapability_g7231 & g7231 = cap;
  185. g7231.m_maxAl_sduAudioFrames = packetSize;
  186. g7231.m_silenceSuppression = annexA;
  187. return TRUE;
  188. }
  189. PBoolean AST_G7231Capability::OnReceivedPDU(const H245_AudioCapability & cap,
  190. unsigned & packetSize)
  191. {
  192. if (cap.GetTag() != H245_AudioCapability::e_g7231) {
  193. return FALSE;
  194. }
  195. const H245_AudioCapability_g7231 & g7231 = cap;
  196. packetSize = g7231.m_maxAl_sduAudioFrames;
  197. annexA = g7231.m_silenceSuppression;
  198. return TRUE;
  199. }
  200. H323Codec * AST_G7231Capability::CreateCodec(H323Codec::Direction direction) const
  201. {
  202. return NULL;
  203. }
  204. /*
  205. * Capability: G.729
  206. */
  207. AST_G729Capability::AST_G729Capability(int rx_frames)
  208. : H323AudioCapability(rx_frames, 2)
  209. {
  210. }
  211. PObject * AST_G729Capability::Clone() const
  212. {
  213. return new AST_G729Capability(*this);
  214. }
  215. unsigned AST_G729Capability::GetSubType() const
  216. {
  217. return H245_AudioCapability::e_g729;
  218. }
  219. PString AST_G729Capability::GetFormatName() const
  220. {
  221. return OPAL_G729;
  222. }
  223. H323Codec * AST_G729Capability::CreateCodec(H323Codec::Direction direction) const
  224. {
  225. return NULL;
  226. }
  227. /*
  228. * Capability: G.729A
  229. */
  230. AST_G729ACapability::AST_G729ACapability(int rx_frames)
  231. : H323AudioCapability(rx_frames, 6)
  232. {
  233. }
  234. PObject * AST_G729ACapability::Clone() const
  235. {
  236. return new AST_G729ACapability(*this);
  237. }
  238. unsigned AST_G729ACapability::GetSubType() const
  239. {
  240. return H245_AudioCapability::e_g729AnnexA;
  241. }
  242. PString AST_G729ACapability::GetFormatName() const
  243. {
  244. return OPAL_G729A;
  245. }
  246. H323Codec * AST_G729ACapability::CreateCodec(H323Codec::Direction direction) const
  247. {
  248. return NULL;
  249. }
  250. /*
  251. * Capability: GSM full rate
  252. */
  253. AST_GSM0610Capability::AST_GSM0610Capability(int rx_frames, int comfortNoise_, int scrambled_)
  254. : H323AudioCapability(rx_frames, 2)
  255. {
  256. comfortNoise = comfortNoise_;
  257. scrambled = scrambled_;
  258. }
  259. PObject * AST_GSM0610Capability::Clone() const
  260. {
  261. return new AST_GSM0610Capability(*this);
  262. }
  263. unsigned AST_GSM0610Capability::GetSubType() const
  264. {
  265. return H245_AudioCapability::e_gsmFullRate;
  266. }
  267. PBoolean AST_GSM0610Capability::OnSendingPDU(H245_AudioCapability & cap,
  268. unsigned packetSize) const
  269. {
  270. cap.SetTag(H245_AudioCapability::e_gsmFullRate);
  271. H245_GSMAudioCapability & gsm = cap;
  272. gsm.m_audioUnitSize = packetSize * 33;
  273. gsm.m_comfortNoise = comfortNoise;
  274. gsm.m_scrambled = scrambled;
  275. return TRUE;
  276. }
  277. PBoolean AST_GSM0610Capability::OnReceivedPDU(const H245_AudioCapability & cap,
  278. unsigned & packetSize)
  279. {
  280. if (cap.GetTag() != H245_AudioCapability::e_gsmFullRate)
  281. return FALSE;
  282. const H245_GSMAudioCapability & gsm = cap;
  283. packetSize = (gsm.m_audioUnitSize + 32) / 33;
  284. comfortNoise = gsm.m_comfortNoise;
  285. scrambled = gsm.m_scrambled;
  286. return TRUE;
  287. }
  288. PString AST_GSM0610Capability::GetFormatName() const
  289. {
  290. return OPAL_GSM0610;
  291. }
  292. H323Codec * AST_GSM0610Capability::CreateCodec(H323Codec::Direction direction) const
  293. {
  294. return NULL;
  295. }
  296. /*
  297. * Capability: G.726 32 Kbps
  298. */
  299. AST_CiscoG726Capability::AST_CiscoG726Capability(int rx_frames)
  300. : H323NonStandardAudioCapability(rx_frames, 240,
  301. 181, 0, 18,
  302. (const BYTE *)"G726r32", 0)
  303. {
  304. }
  305. PObject *AST_CiscoG726Capability::Clone() const
  306. {
  307. return new AST_CiscoG726Capability(*this);
  308. }
  309. H323Codec *AST_CiscoG726Capability::CreateCodec(H323Codec::Direction direction) const
  310. {
  311. return NULL;
  312. }
  313. PString AST_CiscoG726Capability::GetFormatName() const
  314. {
  315. return PString(CISCO_G726r32);
  316. }
  317. /*
  318. * Capability: Cisco RTP DTMF Relay
  319. */
  320. AST_CiscoDtmfCapability::AST_CiscoDtmfCapability()
  321. : H323NonStandardDataCapability(0, 181, 0, 18, (const BYTE *)"RtpDtmfRelay", 0)
  322. {
  323. rtpPayloadType = (RTP_DataFrame::PayloadTypes)121;
  324. }
  325. PObject *AST_CiscoDtmfCapability::Clone() const
  326. {
  327. return new AST_CiscoDtmfCapability(*this);
  328. }
  329. H323Codec *AST_CiscoDtmfCapability::CreateCodec(H323Codec::Direction direction) const
  330. {
  331. return NULL;
  332. }
  333. PString AST_CiscoDtmfCapability::GetFormatName() const
  334. {
  335. return PString(CISCO_DTMF_RELAY);
  336. }