00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef OPAL_H323_H323CAPS_H
00035 #define OPAL_H323_H323CAPS_H
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041 #include <opal/buildopts.h>
00042
00043 #if OPAL_H323
00044
00045 #include <opal/mediafmt.h>
00046 #include <h323/channels.h>
00047
00048
00049
00050
00051
00052
00053
00054 class PASN_Choice;
00055 class H245_Capability;
00056 class H245_DataType;
00057 class H245_ModeElement;
00058 class H245_AudioCapability;
00059 class H245_AudioMode;
00060 class H245_VideoCapability;
00061 class H245_VideoMode;
00062 class H245_DataApplicationCapability;
00063 class H245_DataMode;
00064 class H245_DataProtocolCapability;
00065 class H245_H2250LogicalChannelParameters;
00066 class H245_TerminalCapabilitySet;
00067 class H245_NonStandardParameter;
00068 class H323Connection;
00069 class H323Capabilities;
00070 class H245_CapabilityIdentifier;
00071 class H245_GenericCapability;
00072 class H245_GenericParameter;
00073
00075
00089 class H323Capability : public PObject
00090 {
00091 PCLASSINFO(H323Capability, PObject);
00092
00093 public:
00098 H323Capability();
00100
00106 Comparison Compare(const PObject & obj) const;
00107
00110 void PrintOn(ostream & strm) const;
00112
00115 enum MainTypes {
00117 e_Audio,
00119 e_Video,
00121 e_Data,
00123 e_UserInput,
00125 e_GenericControl,
00127 e_NumMainTypes
00128 };
00129
00135 virtual MainTypes GetMainType() const = 0;
00136
00140 virtual unsigned GetSubType() const = 0;
00141
00144 virtual PString GetFormatName() const = 0;
00146
00152 static H323Capability * Create(
00153 const PString & name
00154 );
00155
00156 enum {
00157 DefaultAudioSessionID = 1,
00158 DefaultVideoSessionID = 2,
00159 DefaultDataSessionID = 3,
00160 DefaultH224SessionID = 4
00161 };
00162
00171 virtual unsigned GetDefaultSessionID() const;
00172
00181 virtual void SetTxFramesInPacket(
00182 unsigned frames
00183 );
00184
00189 virtual unsigned GetTxFramesInPacket() const;
00190
00195 virtual unsigned GetRxFramesInPacket() const;
00196
00202 virtual H323Channel * CreateChannel(
00203 H323Connection & connection,
00204 H323Channel::Directions dir,
00205 unsigned sessionID,
00206 const H245_H2250LogicalChannelParameters * param
00208 ) const = 0;
00210
00213 enum CommandType {
00214 e_TCS,
00215 e_OLC,
00216 e_ReqMode
00217 };
00218
00226 virtual PBoolean OnSendingPDU(
00227 H245_Capability & pdu
00228 ) const = 0;
00229
00237 virtual PBoolean OnSendingPDU(
00238 H245_DataType & pdu
00239 ) const;
00240
00248 virtual PBoolean OnSendingPDU(
00249 H245_ModeElement & pdu
00250 ) const = 0;
00251
00264 virtual PBoolean OnReceivedPDU(
00265 const H245_Capability & pdu
00266 );
00267
00275 virtual PBoolean OnReceivedPDU(
00276 const H245_DataType & pdu,
00277 PBoolean receiver
00278 );
00279
00282 virtual PBoolean IsMatch(
00283 const PASN_Choice & subTypePDU,
00284 const PString & mediaPacketization
00285 ) const;
00286
00294 virtual PBoolean IsUsable(
00295 const H323Connection & connection
00296 ) const;
00298
00301 enum CapabilityDirection {
00302 e_Unknown,
00303 e_Receive,
00304 e_Transmit,
00305 e_ReceiveAndTransmit,
00306 e_NoDirection,
00307 NumCapabilityDirections
00308 };
00309
00312 CapabilityDirection GetCapabilityDirection() const { return capabilityDirection; }
00313
00316 void SetCapabilityDirection(
00317 CapabilityDirection dir
00318 ) { capabilityDirection = dir; }
00319
00321 unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
00322
00324 void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
00325
00328 OpalMediaFormat GetMediaFormat() const;
00329
00332 bool UpdateMediaFormat(
00333 const OpalMediaFormat & format
00334 );
00335
00337 RTP_DataFrame::PayloadTypes GetPayloadType() const { return GetMediaFormat().GetPayloadType(); }
00338
00340 void SetPayloadType(RTP_DataFrame::PayloadTypes pt) { GetWritableMediaFormat().SetPayloadType(pt); }
00341
00343 virtual void AttachQoS(RTP_QOS *) { }
00345
00346 #if PTRACING
00347 friend ostream & operator<<(ostream & o , MainTypes t);
00348 friend ostream & operator<<(ostream & o , CapabilityDirection d);
00349 #endif
00350
00351 protected:
00352 OpalMediaFormat & GetWritableMediaFormat() const;
00353
00354 unsigned assignedCapabilityNumber;
00355 CapabilityDirection capabilityDirection;
00356
00357 private:
00358 mutable OpalMediaFormat m_mediaFormat;
00359 P_REMOVE_VIRTUAL(PBoolean, IsMatch(const PASN_Choice &) const, false);
00360
00361 friend class H323Capabilities;
00362 };
00363
00364
00365
00374 class H323NonStandardCapabilityInfo
00375 {
00376 public:
00377 typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
00378
00381 H323NonStandardCapabilityInfo(
00382 CompareFuncType compareFunc,
00383 const BYTE * dataBlock,
00384 PINDEX dataSize
00385 );
00386
00389 H323NonStandardCapabilityInfo(
00390 const BYTE * dataBlock,
00391 PINDEX dataSize,
00392 PINDEX comparisonOffset = 0,
00393 PINDEX comparisonLength = P_MAX_INDEX
00394 );
00395
00398 H323NonStandardCapabilityInfo(
00399 const PString & oid,
00400 const BYTE * dataBlock,
00401 PINDEX dataSize,
00402 PINDEX comparisonOffset = 0,
00403 PINDEX comparisonLength = P_MAX_INDEX
00404 );
00405
00408 H323NonStandardCapabilityInfo(
00409 BYTE country,
00410 BYTE extension,
00411 WORD maufacturer,
00412 const BYTE * dataBlock,
00413 PINDEX dataSize,
00414 PINDEX comparisonOffset = 0,
00415 PINDEX comparisonLength = P_MAX_INDEX
00416 );
00417
00420 virtual ~H323NonStandardCapabilityInfo();
00421
00426 virtual PBoolean OnSendingPDU(
00427 PBYTEArray & data
00428 ) const;
00429
00434 virtual PBoolean OnReceivedPDU(
00435 const PBYTEArray & data
00436 );
00437
00438 PBoolean IsMatch(const H245_NonStandardParameter & param) const;
00439
00440 PObject::Comparison CompareParam(
00441 const H245_NonStandardParameter & param
00442 ) const;
00443
00444 protected:
00445 PBoolean OnSendingNonStandardPDU(
00446 PASN_Choice & pdu,
00447 unsigned nonStandardTag
00448 ) const;
00449 PBoolean OnReceivedNonStandardPDU(
00450 const PASN_Choice & pdu,
00451 unsigned nonStandardTag
00452 );
00453
00454 PObject::Comparison CompareInfo(
00455 const H323NonStandardCapabilityInfo & obj
00456 ) const;
00457 PObject::Comparison CompareData(
00458 const PBYTEArray & data
00459 ) const;
00460
00461 PString oid;
00462 BYTE t35CountryCode;
00463 BYTE t35Extension;
00464 WORD manufacturerCode;
00465 PBYTEArray nonStandardData;
00466 PINDEX comparisonOffset;
00467 PINDEX comparisonLength;
00468 CompareFuncType compareFunc;
00469 };
00470
00480 class H323GenericCapabilityInfo
00481 {
00482 public:
00483 H323GenericCapabilityInfo(
00484 const PString & id,
00485 unsigned maxBitRate = 0
00486 );
00487
00488 virtual ~H323GenericCapabilityInfo() { }
00489
00490 protected:
00491 virtual PBoolean OnSendingGenericPDU(
00492 H245_GenericCapability & pdu,
00493 const OpalMediaFormat & mediaFormat,
00494 H323Capability::CommandType type
00495 ) const;
00496 virtual PBoolean OnReceivedGenericPDU(
00497 OpalMediaFormat & mediaFormat,
00498 const H245_GenericCapability & pdu,
00499 H323Capability::CommandType type
00500 );
00501
00502 PBoolean IsMatch(
00503 const H245_GenericCapability & param
00504 ) const;
00505 PObject::Comparison CompareInfo(
00506 const H323GenericCapabilityInfo & obj
00507 ) const;
00508
00509
00510 PString m_identifier;
00511 unsigned maxBitRate;
00512 };
00513
00520 class H323RealTimeCapability : public H323Capability
00521 {
00522 PCLASSINFO(H323RealTimeCapability, H323Capability);
00523
00524 public:
00529 virtual H323Channel * CreateChannel(
00530 H323Connection & connection,
00531 H323Channel::Directions dir,
00532 unsigned sessionID,
00533 const H245_H2250LogicalChannelParameters * param
00535 ) const;
00536
00537 H323RealTimeCapability();
00538 H323RealTimeCapability(const H323RealTimeCapability &rtc);
00539 virtual ~H323RealTimeCapability();
00540 void AttachQoS(RTP_QOS * _rtpqos);
00541
00542 protected:
00543 RTP_QOS * rtpqos;
00545 };
00546
00547
00554 class H323AudioCapability : public H323RealTimeCapability
00555 {
00556 PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00557
00558 public:
00563 H323AudioCapability();
00565
00571 virtual MainTypes GetMainType() const;
00573
00584 virtual unsigned GetDefaultSessionID() const;
00585
00594 virtual void SetTxFramesInPacket(
00595 unsigned frames
00596 );
00597
00603 virtual unsigned GetTxFramesInPacket() const;
00604
00610 virtual unsigned GetRxFramesInPacket() const;
00612
00623 virtual PBoolean OnSendingPDU(
00624 H245_Capability & pdu
00625 ) const;
00626
00635 virtual PBoolean OnSendingPDU(
00636 H245_DataType & pdu
00637 ) const;
00638
00647 virtual PBoolean OnSendingPDU(
00648 H245_ModeElement & pdu
00649 ) const;
00650
00659 virtual PBoolean OnSendingPDU(
00660 H245_AudioCapability & pdu,
00661 unsigned packetSize
00662 ) const;
00663 virtual PBoolean OnSendingPDU(
00664 H245_AudioCapability & pdu,
00665 unsigned packetSize,
00666 CommandType type
00667 ) const;
00668
00677 virtual PBoolean OnSendingPDU(
00678 H245_AudioMode & pdu
00679 ) const;
00680
00692 virtual PBoolean OnReceivedPDU(
00693 const H245_Capability & pdu
00694 );
00695
00705 virtual PBoolean OnReceivedPDU(
00706 const H245_DataType & pdu,
00707 PBoolean receiver
00708 );
00709
00718 virtual PBoolean OnReceivedPDU(
00719 const H245_AudioCapability & pdu,
00720 unsigned & packetSize
00721 );
00722 virtual PBoolean OnReceivedPDU(
00723 const H245_AudioCapability & pdu,
00724 unsigned & packetSize,
00725 CommandType type
00726 );
00728 };
00729
00730
00738 class H323NonStandardAudioCapability : public H323AudioCapability,
00739 public H323NonStandardCapabilityInfo
00740 {
00741 PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00742
00743 public:
00746 H323NonStandardAudioCapability(
00747 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00748 const BYTE * dataBlock,
00749 PINDEX dataSize
00750 );
00753 H323NonStandardAudioCapability(
00754 const BYTE * dataBlock = NULL,
00755 PINDEX dataSize = 0,
00756 PINDEX comparisonOffset = 0,
00757 PINDEX comparisonLength = P_MAX_INDEX
00758 );
00759
00762 H323NonStandardAudioCapability(
00763 const PString & oid,
00764 const BYTE * dataBlock = NULL,
00765 PINDEX dataSize = 0,
00766 PINDEX comparisonOffset = 0,
00767 PINDEX comparisonLength = P_MAX_INDEX
00768 );
00769
00772 H323NonStandardAudioCapability(
00773 BYTE country,
00774 BYTE extension,
00775 WORD maufacturer,
00776 const BYTE * dataBlock = NULL,
00777 PINDEX dataSize = 0,
00778 PINDEX comparisonOffset = 0,
00779 PINDEX comparisonLength = P_MAX_INDEX
00780 );
00782
00788 Comparison Compare(const PObject & obj) const;
00790
00798 virtual unsigned GetSubType() const;
00800
00811 virtual PBoolean OnSendingPDU(
00812 H245_AudioCapability & pdu,
00813 unsigned packetSize
00814 ) const;
00815
00824 virtual PBoolean OnSendingPDU(
00825 H245_AudioMode & pdu
00826 ) const;
00827
00836 virtual PBoolean OnReceivedPDU(
00837 const H245_AudioCapability & pdu,
00838 unsigned & packetSize
00839 );
00840
00843 virtual PBoolean IsMatch(
00844 const PASN_Choice & subTypePDU,
00845 const PString & mediaPacketization
00846 ) const;
00848 };
00849
00857 class H323GenericAudioCapability : public H323AudioCapability,
00858 public H323GenericCapabilityInfo
00859 {
00860 PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00861
00862 public:
00867 H323GenericAudioCapability(
00868 const PString & capabilityId,
00869 PINDEX maxBitRate = 0
00870 );
00872
00878 Comparison Compare(const PObject & obj) const;
00880
00888 virtual unsigned GetSubType() const;
00890
00901 virtual PBoolean OnSendingPDU(
00902 H245_AudioCapability & pdu,
00903 unsigned packetSize,
00904 CommandType type
00905 ) const;
00906
00915 virtual PBoolean OnSendingPDU(
00916 H245_AudioMode & pdu
00917 ) const;
00918
00927 virtual PBoolean OnReceivedPDU(
00928 const H245_AudioCapability & pdu,
00929 unsigned & packetSize,
00930 CommandType type
00931 );
00932
00935 virtual PBoolean IsMatch(
00936 const PASN_Choice & subTypePDU,
00937 const PString & mediaPacketization
00938 ) const;
00940 };
00941
00942
00943 #if OPAL_VIDEO
00944
00951 class H323VideoCapability : public H323RealTimeCapability
00952 {
00953 PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00954
00955 public:
00961 virtual MainTypes GetMainType() const;
00963
00974 virtual unsigned GetDefaultSessionID() const;
00976
00987 virtual PBoolean OnSendingPDU(
00988 H245_Capability & pdu
00989 ) const;
00990
00999 virtual PBoolean OnSendingPDU(
01000 H245_DataType & pdu
01001 ) const;
01002
01011 virtual PBoolean OnSendingPDU(
01012 H245_ModeElement & pdu
01013 ) const;
01014
01022 virtual PBoolean OnSendingPDU(
01023 H245_VideoCapability & pdu
01024 ) const;
01025 virtual PBoolean OnSendingPDU(
01026 H245_VideoCapability & pdu,
01027 CommandType type
01028 ) const;
01029
01038 virtual PBoolean OnSendingPDU(
01039 H245_VideoMode & pdu
01040 ) const = 0;
01041
01051 virtual PBoolean OnReceivedPDU(
01052 const H245_Capability & pdu
01053 );
01054
01062 virtual PBoolean OnReceivedPDU(
01063 const H245_DataType & pdu,
01064 PBoolean receiver
01065 );
01066
01074 virtual PBoolean OnReceivedPDU(
01075 const H245_VideoCapability & pdu
01076 );
01077 virtual PBoolean OnReceivedPDU(
01078 const H245_VideoCapability & pdu,
01079 CommandType type
01080 );
01082 };
01083
01084
01092 class H323NonStandardVideoCapability : public H323VideoCapability,
01093 public H323NonStandardCapabilityInfo
01094 {
01095 PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01096
01097 public:
01100 H323NonStandardVideoCapability(
01101 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01102 const BYTE * dataBlock,
01103 PINDEX dataSize
01104 );
01107 H323NonStandardVideoCapability(
01108 const BYTE * dataBlock = NULL,
01109 PINDEX dataSize = 0,
01110 PINDEX comparisonOffset = 0,
01111 PINDEX comparisonLength = P_MAX_INDEX
01112 );
01113
01116 H323NonStandardVideoCapability(
01117 const PString & oid,
01118 const BYTE * dataBlock = NULL,
01119 PINDEX dataSize = 0,
01120 PINDEX comparisonOffset = 0,
01121 PINDEX comparisonLength = P_MAX_INDEX
01122 );
01123
01126 H323NonStandardVideoCapability(
01127 BYTE country,
01128 BYTE extension,
01129 WORD maufacturer,
01130 const BYTE * dataBlock = NULL,
01131 PINDEX dataSize = 0,
01132 PINDEX comparisonOffset = 0,
01133 PINDEX comparisonLength = P_MAX_INDEX
01134 );
01136
01142 Comparison Compare(const PObject & obj) const;
01144
01153 virtual unsigned GetSubType() const;
01155
01166 virtual PBoolean OnSendingPDU(
01167 H245_VideoCapability & pdu
01168 ) const;
01169
01178 virtual PBoolean OnSendingPDU(
01179 H245_VideoMode & pdu
01180 ) const;
01181
01190 virtual PBoolean OnReceivedPDU(
01191 const H245_VideoCapability & pdu
01192 );
01193
01196 virtual PBoolean IsMatch(
01197 const PASN_Choice & subTypePDU,
01198 const PString & mediaPacketization
01199 ) const;
01201 };
01202
01210 class H323GenericVideoCapability : public H323VideoCapability,
01211 public H323GenericCapabilityInfo
01212 {
01213 PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01214
01215 public:
01220 H323GenericVideoCapability(
01221 const PString & capabilityId,
01222 PINDEX maxBitRate = 0
01223 );
01225
01231 Comparison Compare(const PObject & obj) const;
01233
01241 virtual unsigned GetSubType() const;
01243
01254 virtual PBoolean OnSendingPDU(
01255 H245_VideoCapability & pdu,
01256 CommandType type
01257 ) const;
01258
01267 virtual PBoolean OnSendingPDU(
01268 H245_VideoMode & pdu
01269 ) const;
01270
01279 virtual PBoolean OnReceivedPDU(
01280 const H245_VideoCapability & pdu,
01281 CommandType type
01282 );
01283
01286 virtual PBoolean IsMatch(
01287 const PASN_Choice & subTypePDU,
01288 const PString & mediaPacketization
01289 ) const;
01291 };
01292
01293
01294 #if OPAL_H239
01295
01298 class H323ExtendedVideoCapability : public H323GenericVideoCapability
01299 {
01300 PCLASSINFO(H323ExtendedVideoCapability, H323GenericVideoCapability);
01301
01302 public:
01307 H323ExtendedVideoCapability(
01308 const PString & identifier
01309 );
01311
01319 virtual unsigned GetSubType() const;
01321
01332 virtual PBoolean OnSendingPDU(
01333 H245_VideoCapability & pdu,
01334 CommandType type
01335 ) const;
01336
01345 virtual PBoolean OnSendingPDU(
01346 H245_VideoMode & pdu
01347 ) const;
01348
01357 virtual PBoolean OnReceivedPDU(
01358 const H245_VideoCapability & pdu,
01359 CommandType type
01360 );
01361
01364 virtual PBoolean IsMatch(
01365 const PASN_Choice & subTypePDU,
01366 const PString & mediaPacketization
01367 ) const;
01369
01370 protected:
01371 OpalMediaFormatList m_videoFormats;
01372 };
01373
01374
01376
01379 class H323GenericControlCapability : public H323Capability,
01380 public H323GenericCapabilityInfo
01381 {
01382 PCLASSINFO(H323GenericControlCapability, H323Capability);
01383
01384 public:
01389 H323GenericControlCapability(
01390 const PString & identifier
01391 );
01393
01399 virtual MainTypes GetMainType() const;
01400
01406 virtual unsigned GetSubType() const;
01408
01419 virtual PBoolean OnSendingPDU(
01420 H245_Capability & pdu
01421 ) const;
01422
01430 virtual PBoolean OnSendingPDU(
01431 H245_ModeElement & pdu
01432 ) const;
01433
01443 virtual PBoolean OnReceivedPDU(
01444 const H245_Capability & pdu
01445 );
01446
01449 virtual PBoolean IsMatch(
01450 const PASN_Choice & subTypePDU,
01451 const PString & mediaPacketization
01452 ) const;
01454
01462 virtual H323Channel * CreateChannel(
01463 H323Connection & connection,
01464 H323Channel::Directions dir,
01465 unsigned sessionID,
01466 const H245_H2250LogicalChannelParameters * param
01468 ) const;
01470 };
01471
01472
01474
01475 class H323H239VideoCapability : public H323ExtendedVideoCapability
01476 {
01477 PCLASSINFO(H323H239VideoCapability, H323ExtendedVideoCapability);
01478
01479 public:
01484 H323H239VideoCapability(
01485 const OpalMediaFormat & videoFormat
01486 );
01488
01494 Comparison Compare(const PObject & obj) const;
01495
01498 virtual PObject * Clone() const;
01499
01502 void PrintOn(ostream & strm) const;
01504
01509 virtual PString GetFormatName() const;
01511
01522 virtual PBoolean OnSendingPDU(
01523 H245_VideoCapability & pdu,
01524 CommandType type
01525 ) const;
01526
01535 virtual PBoolean OnReceivedPDU(
01536 const H245_VideoCapability & pdu,
01537 CommandType type
01538 );
01540 };
01541
01542
01544
01545 class H323H239ControlCapability : public H323GenericControlCapability
01546 {
01547 PCLASSINFO(H323H239ControlCapability, H323GenericControlCapability);
01548
01549 public:
01554 H323H239ControlCapability();
01556
01561 virtual PObject * Clone() const;
01563
01568 virtual PString GetFormatName() const;
01570 };
01571
01572
01573 #endif // OPAL_H239
01574
01575 #endif // OPAL_VIDEO
01576
01577
01584 class H323DataCapability : public H323Capability
01585 {
01586 PCLASSINFO(H323DataCapability, H323Capability);
01587
01588 public:
01593 H323DataCapability(
01594 unsigned maxBitRate = 0
01595 );
01597
01603 virtual MainTypes GetMainType() const;
01605
01615 virtual unsigned GetDefaultSessionID() const;
01617
01628 virtual PBoolean OnSendingPDU(
01629 H245_Capability & pdu
01630 ) const;
01631
01640 virtual PBoolean OnSendingPDU(
01641 H245_DataType & pdu
01642 ) const;
01643
01652 virtual PBoolean OnSendingPDU(
01653 H245_ModeElement & pdu
01654 ) const;
01655
01663 virtual PBoolean OnSendingPDU(
01664 H245_DataApplicationCapability & pdu
01665 ) const;
01666 virtual PBoolean OnSendingPDU(
01667 H245_DataApplicationCapability & pdu,
01668 CommandType type
01669 ) const;
01670
01679 virtual PBoolean OnSendingPDU(
01680 H245_DataMode & pdu
01681 ) const = 0;
01682
01692 virtual PBoolean OnReceivedPDU(
01693 const H245_Capability & pdu
01694 );
01695
01703 virtual PBoolean OnReceivedPDU(
01704 const H245_DataType & pdu,
01705 PBoolean receiver
01706 );
01707
01715 virtual PBoolean OnReceivedPDU(
01716 const H245_DataApplicationCapability & pdu
01717 );
01718 virtual PBoolean OnReceivedPDU(
01719 const H245_DataApplicationCapability & pdu,
01720 CommandType type
01721 );
01723
01724 protected:
01725 unsigned maxBitRate;
01726 };
01727
01728
01736 class H323NonStandardDataCapability : public H323DataCapability,
01737 public H323NonStandardCapabilityInfo
01738 {
01739 PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01740
01741 public:
01746 H323NonStandardDataCapability(
01747 unsigned maxBitRate,
01748 const BYTE * dataBlock = NULL,
01749 PINDEX dataSize = 0,
01750 PINDEX comparisonOffset = 0,
01751 PINDEX comparisonLength = P_MAX_INDEX
01752 );
01753
01756 H323NonStandardDataCapability(
01757 unsigned maxBitRate,
01758 const PString & oid,
01759 const BYTE * dataBlock = NULL,
01760 PINDEX dataSize = 0,
01761 PINDEX comparisonOffset = 0,
01762 PINDEX comparisonLength = P_MAX_INDEX
01763 );
01764
01767 H323NonStandardDataCapability(
01768 unsigned maxBitRate,
01769 BYTE country,
01770 BYTE extension,
01771 WORD maufacturer,
01772 const BYTE * dataBlock = NULL,
01773 PINDEX dataSize = 0,
01774 PINDEX comparisonOffset = 0,
01775 PINDEX comparisonLength = P_MAX_INDEX
01776 );
01778
01784 Comparison Compare(const PObject & obj) const;
01786
01795 virtual unsigned GetSubType() const;
01797
01808 virtual PBoolean OnSendingPDU(
01809 H245_DataApplicationCapability & pdu
01810 ) const;
01811
01820 virtual PBoolean OnSendingPDU(
01821 H245_DataMode & pdu
01822 ) const;
01823
01832 virtual PBoolean OnReceivedPDU(
01833 const H245_DataApplicationCapability & pdu
01834 );
01835
01838 virtual PBoolean IsMatch(
01839 const PASN_Choice & subTypePDU,
01840 const PString & mediaPacketization
01841 ) const;
01843 };
01844
01845
01847
01848
01851 class H323_G711Capability : public H323AudioCapability
01852 {
01853 PCLASSINFO(H323_G711Capability, H323AudioCapability)
01854
01855 public:
01857 enum Mode {
01859 ALaw,
01861 muLaw
01862 };
01864 enum Speed {
01866 At64k,
01868 At56k
01869 };
01870
01875 H323_G711Capability(
01876 Mode mode = muLaw,
01877 Speed speed = At64k
01878 );
01880
01885 virtual PObject * Clone() const;
01887
01896 virtual unsigned GetSubType() const;
01897
01900 virtual PString GetFormatName() const;
01902
01903 protected:
01904 Mode mode;
01905 Speed speed;
01906 };
01907
01909
01912 class H323_UserInputCapability : public H323Capability
01913 {
01914 PCLASSINFO(H323_UserInputCapability, H323Capability);
01915
01916 public:
01919 enum SubTypes {
01920 BasicString,
01921 IA5String,
01922 GeneralString,
01923 SignalToneH245,
01924 HookFlashH245,
01925 SignalToneRFC2833,
01926 NumSubTypes
01927 };
01928 static const char * GetSubTypeName(SubTypes subType);
01929 friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01930
01935 H323_UserInputCapability(
01936 SubTypes subType
01937 );
01939
01944 virtual PObject * Clone() const;
01946
01954 virtual MainTypes GetMainType() const;
01955
01959 virtual unsigned GetSubType() const;
01960
01963 virtual PString GetFormatName() const;
01965
01973 virtual H323Channel * CreateChannel(
01974 H323Connection & connection,
01975 H323Channel::Directions dir,
01976 unsigned sessionID,
01977 const H245_H2250LogicalChannelParameters * param
01979 ) const;
01981
01991 virtual PBoolean OnSendingPDU(
01992 H245_Capability & pdu
01993 ) const;
01994
02002 virtual PBoolean OnSendingPDU(
02003 H245_DataType & pdu
02004 ) const;
02005
02014 virtual PBoolean OnSendingPDU(
02015 H245_ModeElement & pdu
02016 ) const;
02017
02027 virtual PBoolean OnReceivedPDU(
02028 const H245_Capability & pdu
02029 );
02030
02038 virtual PBoolean OnReceivedPDU(
02039 const H245_DataType & pdu,
02040 PBoolean receiver
02041 );
02042
02051 virtual PBoolean IsUsable(
02052 const H323Connection & connection
02053 ) const;
02055
02056 static void AddAllCapabilities(
02057 H323Capabilities & capabilities,
02058 PINDEX descriptorNum,
02059 PINDEX simultaneous,
02060 bool includeRFC2833 = true
02061 );
02062
02063 protected:
02064 SubTypes subType;
02065 };
02066
02067
02068
02070
02071 PARRAY(H323CapabilitiesList, H323Capability);
02072
02073 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
02074
02075 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
02076 {
02077 PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
02078 public:
02079 PBoolean SetSize(PINDEX newSize);
02080 };
02081
02082
02083 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
02084
02085
02086 class H323CapabilitiesSet : public H323CapabilitiesSetArray
02087 {
02088 PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
02089 public:
02091 PBoolean SetSize(PINDEX newSize);
02092 };
02093
02094
02097 class H323Capabilities : public PObject
02098 {
02099 PCLASSINFO(H323Capabilities, PObject);
02100 public:
02105 H323Capabilities();
02106
02109 H323Capabilities(
02110 const H323Connection & connection,
02111 const H245_TerminalCapabilitySet & pdu
02112 );
02113
02118 H323Capabilities(
02119 const H323Capabilities & original
02120 );
02121
02126 H323Capabilities & operator=(
02127 const H323Capabilities & original
02128 );
02130
02135 void PrintOn(
02136 ostream & strm
02137 ) const;
02139
02144 PINDEX GetSize() const { return table.GetSize(); }
02145
02148 H323Capability & operator[](PINDEX i) const { return table[i]; }
02149
02170 PINDEX SetCapability(
02171 PINDEX descriptorNum,
02172 PINDEX simultaneous,
02173 H323Capability * cap
02174 );
02175
02178 PINDEX AddMediaFormat(
02179 PINDEX descriptorNum,
02180 PINDEX simultaneous,
02181 const OpalMediaFormat & mediaFormat
02182 );
02183
02188 PINDEX AddAllCapabilities(
02189 PINDEX descriptorNum,
02190 PINDEX simultaneous,
02191 const PString & name,
02192 PBoolean exact = false
02193 );
02194
02195
02196 PINDEX AddAllCapabilities(
02197 const H323EndPoint &,
02198 PINDEX descriptorNum,
02199 PINDEX simultaneous,
02200 const PString & name,
02201 PBoolean exact = false
02202 )
02203 { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
02204
02213 void Add(
02214 H323Capability * capability
02215 );
02216
02223 H323Capability * Copy(
02224 const H323Capability & capability
02225 );
02226
02231 void Remove(
02232 H323Capability * capability
02233 );
02234
02239 void Remove(
02240 const PString & formatName
02241 );
02242
02246 void Remove(
02247 const PStringArray & formatNames
02248 );
02249
02252 void RemoveAll();
02253
02261 H323Capability * FindCapability(
02262 unsigned capabilityNumber
02263 ) const;
02264
02280 H323Capability * FindCapability(
02281 const PString & formatName,
02282 H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
02284 PBoolean exact = false
02285 ) const;
02286
02292 H323Capability * FindCapability(
02293 H323Capability::CapabilityDirection direction
02294 ) const;
02295
02303 H323Capability * FindCapability(
02304 const H323Capability & capability
02305 ) const;
02306
02312 H323Capability * FindCapability(
02313 const H245_Capability & cap
02314 ) const;
02315
02321 H323Capability * FindCapability(
02322 const H245_DataType & dataType,
02323 const PString & mediaPacketization = PString::Empty()
02324 ) const;
02325
02331 H323Capability * FindCapability(
02332 const H245_ModeElement & modeElement,
02333 const PString & mediaPacketization = PString::Empty()
02334 ) const;
02335
02341 H323Capability * FindCapability(
02342 H323Capability::MainTypes mainType,
02343 unsigned subType = UINT_MAX
02344 ) const;
02345
02348 void BuildPDU(
02349 const H323Connection & connection,
02350 H245_TerminalCapabilitySet & pdu
02351 ) const;
02352
02355 PBoolean Merge(
02356 const H323Capabilities & newCaps
02357 );
02358
02365 void Reorder(
02366 const PStringArray & preferenceOrder
02367 );
02368
02371 PBoolean IsAllowed(
02372 const H323Capability & capability
02373 );
02374
02377 PBoolean IsAllowed(
02378 unsigned capabilityNumber
02379 );
02380
02383 PBoolean IsAllowed(
02384 const H323Capability & capability1,
02385 const H323Capability & capability2
02386 );
02387
02390 PBoolean IsAllowed(
02391 unsigned capabilityNumber1,
02392 unsigned capabilityNumber2
02393 );
02394
02397 OpalMediaFormatList GetMediaFormats() const;
02398
02399 const PStringSet & GetMediaPacketizations() const { return m_mediaPacketizations; }
02401
02402 protected:
02403 H323CapabilitiesList table;
02404 H323CapabilitiesSet set;
02405 PStringSet m_mediaPacketizations;
02406 };
02407
02408
02410
02411
02412
02413 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02414
02415 #define H323_REGISTER_CAPABILITY(cls, capName) static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02416
02417
02418 #endif // OPAL_H323
02419
02420 #endif // OPAL_H323_H323CAPS_H
02421
02422