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;
00285
00293 virtual PBoolean IsUsable(
00294 const H323Connection & connection
00295 ) const;
00297
00300 enum CapabilityDirection {
00301 e_Unknown,
00302 e_Receive,
00303 e_Transmit,
00304 e_ReceiveAndTransmit,
00305 e_NoDirection,
00306 NumCapabilityDirections
00307 };
00308
00311 CapabilityDirection GetCapabilityDirection() const { return capabilityDirection; }
00312
00315 void SetCapabilityDirection(
00316 CapabilityDirection dir
00317 ) { capabilityDirection = dir; }
00318
00320 unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
00321
00323 void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
00324
00327 OpalMediaFormat GetMediaFormat() const;
00328
00331 bool UpdateMediaFormat(
00332 const OpalMediaFormat & format
00333 );
00334
00336 RTP_DataFrame::PayloadTypes GetPayloadType() const { return rtpPayloadType; }
00337
00339 void SetPayloadType(RTP_DataFrame::PayloadTypes pt) { rtpPayloadType = pt; }
00340
00342 virtual void AttachQoS(RTP_QOS *) { }
00344
00345 #if PTRACING
00346 friend ostream & operator<<(ostream & o , MainTypes t);
00347 friend ostream & operator<<(ostream & o , CapabilityDirection d);
00348 #endif
00349
00350 protected:
00351 OpalMediaFormat & GetWritableMediaFormat() const;
00352
00353 unsigned assignedCapabilityNumber;
00354 CapabilityDirection capabilityDirection;
00355 RTP_DataFrame::PayloadTypes rtpPayloadType;
00356
00357 private:
00358 mutable OpalMediaFormat m_mediaFormat;
00359
00360 friend class H323Capabilities;
00361 };
00362
00363
00364
00373 class H323NonStandardCapabilityInfo
00374 {
00375 public:
00376 typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
00377
00380 H323NonStandardCapabilityInfo(
00381 CompareFuncType compareFunc,
00382 const BYTE * dataBlock,
00383 PINDEX dataSize
00384 );
00385
00388 H323NonStandardCapabilityInfo(
00389 const BYTE * dataBlock,
00390 PINDEX dataSize,
00391 PINDEX comparisonOffset = 0,
00392 PINDEX comparisonLength = P_MAX_INDEX
00393 );
00394
00397 H323NonStandardCapabilityInfo(
00398 const PString & oid,
00399 const BYTE * dataBlock,
00400 PINDEX dataSize,
00401 PINDEX comparisonOffset = 0,
00402 PINDEX comparisonLength = P_MAX_INDEX
00403 );
00404
00407 H323NonStandardCapabilityInfo(
00408 BYTE country,
00409 BYTE extension,
00410 WORD maufacturer,
00411 const BYTE * dataBlock,
00412 PINDEX dataSize,
00413 PINDEX comparisonOffset = 0,
00414 PINDEX comparisonLength = P_MAX_INDEX
00415 );
00416
00419 virtual ~H323NonStandardCapabilityInfo();
00420
00425 virtual PBoolean OnSendingPDU(
00426 PBYTEArray & data
00427 ) const;
00428
00433 virtual PBoolean OnReceivedPDU(
00434 const PBYTEArray & data
00435 );
00436
00437 PBoolean IsMatch(const H245_NonStandardParameter & param) const;
00438
00439 PObject::Comparison CompareParam(
00440 const H245_NonStandardParameter & param
00441 ) const;
00442
00443 protected:
00444 PBoolean OnSendingNonStandardPDU(
00445 PASN_Choice & pdu,
00446 unsigned nonStandardTag
00447 ) const;
00448 PBoolean OnReceivedNonStandardPDU(
00449 const PASN_Choice & pdu,
00450 unsigned nonStandardTag
00451 );
00452
00453 PObject::Comparison CompareInfo(
00454 const H323NonStandardCapabilityInfo & obj
00455 ) const;
00456 PObject::Comparison CompareData(
00457 const PBYTEArray & data
00458 ) const;
00459
00460 PString oid;
00461 BYTE t35CountryCode;
00462 BYTE t35Extension;
00463 WORD manufacturerCode;
00464 PBYTEArray nonStandardData;
00465 PINDEX comparisonOffset;
00466 PINDEX comparisonLength;
00467 CompareFuncType compareFunc;
00468 };
00469
00479 class H323GenericCapabilityInfo
00480 {
00481 public:
00482 H323GenericCapabilityInfo(
00483 const PString & id,
00484 unsigned maxBitRate = 0
00485 );
00486
00487 virtual ~H323GenericCapabilityInfo() { }
00488
00489 protected:
00490 virtual PBoolean OnSendingGenericPDU(
00491 H245_GenericCapability & pdu,
00492 const OpalMediaFormat & mediaFormat,
00493 H323Capability::CommandType type
00494 ) const;
00495 virtual PBoolean OnReceivedGenericPDU(
00496 OpalMediaFormat & mediaFormat,
00497 const H245_GenericCapability & pdu,
00498 H323Capability::CommandType type
00499 );
00500
00501 PBoolean IsMatch(
00502 const H245_GenericCapability & param
00503 ) const;
00504 PObject::Comparison CompareInfo(
00505 const H323GenericCapabilityInfo & obj
00506 ) const;
00507
00508
00509 PString m_identifier;
00510 unsigned maxBitRate;
00511 };
00512
00519 class H323RealTimeCapability : public H323Capability
00520 {
00521 PCLASSINFO(H323RealTimeCapability, H323Capability);
00522
00523 public:
00528 virtual H323Channel * CreateChannel(
00529 H323Connection & connection,
00530 H323Channel::Directions dir,
00531 unsigned sessionID,
00532 const H245_H2250LogicalChannelParameters * param
00534 ) const;
00535
00536 H323RealTimeCapability();
00537 H323RealTimeCapability(const H323RealTimeCapability &rtc);
00538 virtual ~H323RealTimeCapability();
00539 void AttachQoS(RTP_QOS * _rtpqos);
00540
00541 protected:
00542 RTP_QOS * rtpqos;
00544 };
00545
00546
00553 class H323AudioCapability : public H323RealTimeCapability
00554 {
00555 PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00556
00557 public:
00562 H323AudioCapability();
00564
00570 virtual MainTypes GetMainType() const;
00572
00583 virtual unsigned GetDefaultSessionID() const;
00584
00593 virtual void SetTxFramesInPacket(
00594 unsigned frames
00595 );
00596
00602 virtual unsigned GetTxFramesInPacket() const;
00603
00609 virtual unsigned GetRxFramesInPacket() const;
00611
00622 virtual PBoolean OnSendingPDU(
00623 H245_Capability & pdu
00624 ) const;
00625
00634 virtual PBoolean OnSendingPDU(
00635 H245_DataType & pdu
00636 ) const;
00637
00646 virtual PBoolean OnSendingPDU(
00647 H245_ModeElement & pdu
00648 ) const;
00649
00658 virtual PBoolean OnSendingPDU(
00659 H245_AudioCapability & pdu,
00660 unsigned packetSize
00661 ) const;
00662 virtual PBoolean OnSendingPDU(
00663 H245_AudioCapability & pdu,
00664 unsigned packetSize,
00665 CommandType type
00666 ) const;
00667
00676 virtual PBoolean OnSendingPDU(
00677 H245_AudioMode & pdu
00678 ) const;
00679
00691 virtual PBoolean OnReceivedPDU(
00692 const H245_Capability & pdu
00693 );
00694
00704 virtual PBoolean OnReceivedPDU(
00705 const H245_DataType & pdu,
00706 PBoolean receiver
00707 );
00708
00717 virtual PBoolean OnReceivedPDU(
00718 const H245_AudioCapability & pdu,
00719 unsigned & packetSize
00720 );
00721 virtual PBoolean OnReceivedPDU(
00722 const H245_AudioCapability & pdu,
00723 unsigned & packetSize,
00724 CommandType type
00725 );
00727 };
00728
00729
00737 class H323NonStandardAudioCapability : public H323AudioCapability,
00738 public H323NonStandardCapabilityInfo
00739 {
00740 PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00741
00742 public:
00745 H323NonStandardAudioCapability(
00746 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00747 const BYTE * dataBlock,
00748 PINDEX dataSize
00749 );
00752 H323NonStandardAudioCapability(
00753 const BYTE * dataBlock = NULL,
00754 PINDEX dataSize = 0,
00755 PINDEX comparisonOffset = 0,
00756 PINDEX comparisonLength = P_MAX_INDEX
00757 );
00758
00761 H323NonStandardAudioCapability(
00762 const PString & oid,
00763 const BYTE * dataBlock = NULL,
00764 PINDEX dataSize = 0,
00765 PINDEX comparisonOffset = 0,
00766 PINDEX comparisonLength = P_MAX_INDEX
00767 );
00768
00771 H323NonStandardAudioCapability(
00772 BYTE country,
00773 BYTE extension,
00774 WORD maufacturer,
00775 const BYTE * dataBlock = NULL,
00776 PINDEX dataSize = 0,
00777 PINDEX comparisonOffset = 0,
00778 PINDEX comparisonLength = P_MAX_INDEX
00779 );
00781
00787 Comparison Compare(const PObject & obj) const;
00789
00797 virtual unsigned GetSubType() const;
00799
00810 virtual PBoolean OnSendingPDU(
00811 H245_AudioCapability & pdu,
00812 unsigned packetSize
00813 ) const;
00814
00823 virtual PBoolean OnSendingPDU(
00824 H245_AudioMode & pdu
00825 ) const;
00826
00835 virtual PBoolean OnReceivedPDU(
00836 const H245_AudioCapability & pdu,
00837 unsigned & packetSize
00838 );
00839
00842 virtual PBoolean IsMatch(
00843 const PASN_Choice & subTypePDU
00844 ) const;
00846 };
00847
00855 class H323GenericAudioCapability : public H323AudioCapability,
00856 public H323GenericCapabilityInfo
00857 {
00858 PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00859
00860 public:
00865 H323GenericAudioCapability(
00866 const PString & capabilityId,
00867 PINDEX maxBitRate = 0
00868 );
00870
00876 Comparison Compare(const PObject & obj) const;
00878
00886 virtual unsigned GetSubType() const;
00888
00899 virtual PBoolean OnSendingPDU(
00900 H245_AudioCapability & pdu,
00901 unsigned packetSize,
00902 CommandType type
00903 ) const;
00904
00913 virtual PBoolean OnSendingPDU(
00914 H245_AudioMode & pdu
00915 ) const;
00916
00925 virtual PBoolean OnReceivedPDU(
00926 const H245_AudioCapability & pdu,
00927 unsigned & packetSize,
00928 CommandType type
00929 );
00930
00933 virtual PBoolean IsMatch(
00934 const PASN_Choice & subTypePDU
00935 ) const;
00937 };
00938
00939
00940 #if OPAL_VIDEO
00941
00948 class H323VideoCapability : public H323RealTimeCapability
00949 {
00950 PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00951
00952 public:
00958 virtual MainTypes GetMainType() const;
00960
00971 virtual unsigned GetDefaultSessionID() const;
00973
00984 virtual PBoolean OnSendingPDU(
00985 H245_Capability & pdu
00986 ) const;
00987
00996 virtual PBoolean OnSendingPDU(
00997 H245_DataType & pdu
00998 ) const;
00999
01008 virtual PBoolean OnSendingPDU(
01009 H245_ModeElement & pdu
01010 ) const;
01011
01019 virtual PBoolean OnSendingPDU(
01020 H245_VideoCapability & pdu
01021 ) const;
01022 virtual PBoolean OnSendingPDU(
01023 H245_VideoCapability & pdu,
01024 CommandType type
01025 ) const;
01026
01035 virtual PBoolean OnSendingPDU(
01036 H245_VideoMode & pdu
01037 ) const = 0;
01038
01048 virtual PBoolean OnReceivedPDU(
01049 const H245_Capability & pdu
01050 );
01051
01059 virtual PBoolean OnReceivedPDU(
01060 const H245_DataType & pdu,
01061 PBoolean receiver
01062 );
01063
01071 virtual PBoolean OnReceivedPDU(
01072 const H245_VideoCapability & pdu
01073 );
01074 virtual PBoolean OnReceivedPDU(
01075 const H245_VideoCapability & pdu,
01076 CommandType type
01077 );
01079 };
01080
01081
01089 class H323NonStandardVideoCapability : public H323VideoCapability,
01090 public H323NonStandardCapabilityInfo
01091 {
01092 PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01093
01094 public:
01097 H323NonStandardVideoCapability(
01098 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01099 const BYTE * dataBlock,
01100 PINDEX dataSize
01101 );
01104 H323NonStandardVideoCapability(
01105 const BYTE * dataBlock = NULL,
01106 PINDEX dataSize = 0,
01107 PINDEX comparisonOffset = 0,
01108 PINDEX comparisonLength = P_MAX_INDEX
01109 );
01110
01113 H323NonStandardVideoCapability(
01114 const PString & oid,
01115 const BYTE * dataBlock = NULL,
01116 PINDEX dataSize = 0,
01117 PINDEX comparisonOffset = 0,
01118 PINDEX comparisonLength = P_MAX_INDEX
01119 );
01120
01123 H323NonStandardVideoCapability(
01124 BYTE country,
01125 BYTE extension,
01126 WORD maufacturer,
01127 const BYTE * dataBlock = NULL,
01128 PINDEX dataSize = 0,
01129 PINDEX comparisonOffset = 0,
01130 PINDEX comparisonLength = P_MAX_INDEX
01131 );
01133
01139 Comparison Compare(const PObject & obj) const;
01141
01150 virtual unsigned GetSubType() const;
01152
01163 virtual PBoolean OnSendingPDU(
01164 H245_VideoCapability & pdu
01165 ) const;
01166
01175 virtual PBoolean OnSendingPDU(
01176 H245_VideoMode & pdu
01177 ) const;
01178
01187 virtual PBoolean OnReceivedPDU(
01188 const H245_VideoCapability & pdu
01189 );
01190
01193 virtual PBoolean IsMatch(
01194 const PASN_Choice & subTypePDU
01195 ) const;
01197 };
01198
01206 class H323GenericVideoCapability : public H323VideoCapability,
01207 public H323GenericCapabilityInfo
01208 {
01209 PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01210
01211 public:
01216 H323GenericVideoCapability(
01217 const PString & capabilityId,
01218 PINDEX maxBitRate = 0
01219 );
01221
01227 Comparison Compare(const PObject & obj) const;
01229
01237 virtual unsigned GetSubType() const;
01239
01250 virtual PBoolean OnSendingPDU(
01251 H245_VideoCapability & pdu,
01252 CommandType type
01253 ) const;
01254
01263 virtual PBoolean OnSendingPDU(
01264 H245_VideoMode & pdu
01265 ) const;
01266
01275 virtual PBoolean OnReceivedPDU(
01276 const H245_VideoCapability & pdu,
01277 CommandType type
01278 );
01279
01282 virtual PBoolean IsMatch(
01283 const PASN_Choice & subTypePDU
01284 ) const;
01286 };
01287
01288
01289 #if OPAL_H239
01290
01293 class H323ExtendedVideoCapability : public H323GenericVideoCapability
01294 {
01295 PCLASSINFO(H323ExtendedVideoCapability, H323GenericVideoCapability);
01296
01297 public:
01302 H323ExtendedVideoCapability(
01303 const PString & identifier
01304 );
01306
01314 virtual unsigned GetSubType() const;
01316
01327 virtual PBoolean OnSendingPDU(
01328 H245_VideoCapability & pdu,
01329 CommandType type
01330 ) const;
01331
01340 virtual PBoolean OnSendingPDU(
01341 H245_VideoMode & pdu
01342 ) const;
01343
01352 virtual PBoolean OnReceivedPDU(
01353 const H245_VideoCapability & pdu,
01354 CommandType type
01355 );
01356
01359 virtual PBoolean IsMatch(
01360 const PASN_Choice & subTypePDU
01361 ) const;
01363
01364 protected:
01365 OpalMediaFormatList m_videoFormats;
01366 };
01367
01368
01370
01373 class H323GenericControlCapability : public H323Capability,
01374 public H323GenericCapabilityInfo
01375 {
01376 PCLASSINFO(H323GenericControlCapability, H323Capability);
01377
01378 public:
01383 H323GenericControlCapability(
01384 const PString & identifier
01385 );
01387
01393 virtual MainTypes GetMainType() const;
01394
01400 virtual unsigned GetSubType() const;
01402
01413 virtual PBoolean OnSendingPDU(
01414 H245_Capability & pdu
01415 ) const;
01416
01424 virtual PBoolean OnSendingPDU(
01425 H245_ModeElement & pdu
01426 ) const;
01427
01437 virtual PBoolean OnReceivedPDU(
01438 const H245_Capability & pdu
01439 );
01440
01443 virtual PBoolean IsMatch(
01444 const PASN_Choice & subTypePDU
01445 ) const;
01447
01455 virtual H323Channel * CreateChannel(
01456 H323Connection & connection,
01457 H323Channel::Directions dir,
01458 unsigned sessionID,
01459 const H245_H2250LogicalChannelParameters * param
01461 ) const;
01463 };
01464
01465
01467
01468 class H323H239VideoCapability : public H323ExtendedVideoCapability
01469 {
01470 PCLASSINFO(H323H239VideoCapability, H323ExtendedVideoCapability);
01471
01472 public:
01477 H323H239VideoCapability(
01478 const OpalMediaFormat & videoFormat
01479 );
01481
01487 Comparison Compare(const PObject & obj) const;
01488
01491 virtual PObject * Clone() const;
01493
01498 virtual PString GetFormatName() const;
01500
01511 virtual PBoolean OnSendingPDU(
01512 H245_VideoCapability & pdu,
01513 CommandType type
01514 ) const;
01515
01524 virtual PBoolean OnReceivedPDU(
01525 const H245_VideoCapability & pdu,
01526 CommandType type
01527 );
01529 };
01530
01531
01533
01534 class H323H239ControlCapability : public H323GenericControlCapability
01535 {
01536 PCLASSINFO(H323H239ControlCapability, H323GenericControlCapability);
01537
01538 public:
01543 H323H239ControlCapability();
01545
01550 virtual PObject * Clone() const;
01552
01557 virtual PString GetFormatName() const;
01559 };
01560
01561
01562 #endif // OPAL_H239
01563
01564 #endif // OPAL_VIDEO
01565
01566
01573 class H323DataCapability : public H323Capability
01574 {
01575 PCLASSINFO(H323DataCapability, H323Capability);
01576
01577 public:
01582 H323DataCapability(
01583 unsigned maxBitRate = 0
01584 );
01586
01592 virtual MainTypes GetMainType() const;
01594
01604 virtual unsigned GetDefaultSessionID() const;
01606
01617 virtual PBoolean OnSendingPDU(
01618 H245_Capability & pdu
01619 ) const;
01620
01629 virtual PBoolean OnSendingPDU(
01630 H245_DataType & pdu
01631 ) const;
01632
01641 virtual PBoolean OnSendingPDU(
01642 H245_ModeElement & pdu
01643 ) const;
01644
01652 virtual PBoolean OnSendingPDU(
01653 H245_DataApplicationCapability & pdu
01654 ) const;
01655 virtual PBoolean OnSendingPDU(
01656 H245_DataApplicationCapability & pdu,
01657 CommandType type
01658 ) const;
01659
01668 virtual PBoolean OnSendingPDU(
01669 H245_DataMode & pdu
01670 ) const = 0;
01671
01681 virtual PBoolean OnReceivedPDU(
01682 const H245_Capability & pdu
01683 );
01684
01692 virtual PBoolean OnReceivedPDU(
01693 const H245_DataType & pdu,
01694 PBoolean receiver
01695 );
01696
01704 virtual PBoolean OnReceivedPDU(
01705 const H245_DataApplicationCapability & pdu
01706 );
01707 virtual PBoolean OnReceivedPDU(
01708 const H245_DataApplicationCapability & pdu,
01709 CommandType type
01710 );
01712
01713 protected:
01714 unsigned maxBitRate;
01715 };
01716
01717
01725 class H323NonStandardDataCapability : public H323DataCapability,
01726 public H323NonStandardCapabilityInfo
01727 {
01728 PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01729
01730 public:
01735 H323NonStandardDataCapability(
01736 unsigned maxBitRate,
01737 const BYTE * dataBlock = NULL,
01738 PINDEX dataSize = 0,
01739 PINDEX comparisonOffset = 0,
01740 PINDEX comparisonLength = P_MAX_INDEX
01741 );
01742
01745 H323NonStandardDataCapability(
01746 unsigned maxBitRate,
01747 const PString & oid,
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 BYTE country,
01759 BYTE extension,
01760 WORD maufacturer,
01761 const BYTE * dataBlock = NULL,
01762 PINDEX dataSize = 0,
01763 PINDEX comparisonOffset = 0,
01764 PINDEX comparisonLength = P_MAX_INDEX
01765 );
01767
01773 Comparison Compare(const PObject & obj) const;
01775
01784 virtual unsigned GetSubType() const;
01786
01797 virtual PBoolean OnSendingPDU(
01798 H245_DataApplicationCapability & pdu
01799 ) const;
01800
01809 virtual PBoolean OnSendingPDU(
01810 H245_DataMode & pdu
01811 ) const;
01812
01821 virtual PBoolean OnReceivedPDU(
01822 const H245_DataApplicationCapability & pdu
01823 );
01824
01827 virtual PBoolean IsMatch(
01828 const PASN_Choice & subTypePDU
01829 ) const;
01831 };
01832
01833
01835
01836
01839 class H323_G711Capability : public H323AudioCapability
01840 {
01841 PCLASSINFO(H323_G711Capability, H323AudioCapability)
01842
01843 public:
01845 enum Mode {
01847 ALaw,
01849 muLaw
01850 };
01852 enum Speed {
01854 At64k,
01856 At56k
01857 };
01858
01863 H323_G711Capability(
01864 Mode mode = muLaw,
01865 Speed speed = At64k
01866 );
01868
01873 virtual PObject * Clone() const;
01875
01884 virtual unsigned GetSubType() const;
01885
01888 virtual PString GetFormatName() const;
01890
01891 protected:
01892 Mode mode;
01893 Speed speed;
01894 };
01895
01897
01900 class H323_UserInputCapability : public H323Capability
01901 {
01902 PCLASSINFO(H323_UserInputCapability, H323Capability);
01903
01904 public:
01907 enum SubTypes {
01908 BasicString,
01909 IA5String,
01910 GeneralString,
01911 SignalToneH245,
01912 HookFlashH245,
01913 SignalToneRFC2833,
01914 NumSubTypes
01915 };
01916 static const char * GetSubTypeName(SubTypes subType);
01917 friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01918
01923 H323_UserInputCapability(
01924 SubTypes subType
01925 );
01927
01932 virtual PObject * Clone() const;
01934
01942 virtual MainTypes GetMainType() const;
01943
01947 virtual unsigned GetSubType() const;
01948
01951 virtual PString GetFormatName() const;
01953
01961 virtual H323Channel * CreateChannel(
01962 H323Connection & connection,
01963 H323Channel::Directions dir,
01964 unsigned sessionID,
01965 const H245_H2250LogicalChannelParameters * param
01967 ) const;
01969
01979 virtual PBoolean OnSendingPDU(
01980 H245_Capability & pdu
01981 ) const;
01982
01990 virtual PBoolean OnSendingPDU(
01991 H245_DataType & pdu
01992 ) const;
01993
02002 virtual PBoolean OnSendingPDU(
02003 H245_ModeElement & pdu
02004 ) const;
02005
02015 virtual PBoolean OnReceivedPDU(
02016 const H245_Capability & pdu
02017 );
02018
02026 virtual PBoolean OnReceivedPDU(
02027 const H245_DataType & pdu,
02028 PBoolean receiver
02029 );
02030
02039 virtual PBoolean IsUsable(
02040 const H323Connection & connection
02041 ) const;
02043
02044 static void AddAllCapabilities(
02045 H323Capabilities & capabilities,
02046 PINDEX descriptorNum,
02047 PINDEX simultaneous
02048 );
02049
02050 protected:
02051 SubTypes subType;
02052 };
02053
02054
02055
02057
02058 PARRAY(H323CapabilitiesList, H323Capability);
02059
02060 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
02061
02062 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
02063 {
02064 PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
02065 public:
02066 PBoolean SetSize(PINDEX newSize);
02067 };
02068
02069
02070 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
02071
02072
02073 class H323CapabilitiesSet : public H323CapabilitiesSetArray
02074 {
02075 PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
02076 public:
02078 PBoolean SetSize(PINDEX newSize);
02079 };
02080
02081
02084 class H323Capabilities : public PObject
02085 {
02086 PCLASSINFO(H323Capabilities, PObject);
02087 public:
02092 H323Capabilities();
02093
02096 H323Capabilities(
02097 const H323Connection & connection,
02098 const H245_TerminalCapabilitySet & pdu
02099 );
02100
02105 H323Capabilities(
02106 const H323Capabilities & original
02107 );
02108
02113 H323Capabilities & operator=(
02114 const H323Capabilities & original
02115 );
02117
02122 void PrintOn(
02123 ostream & strm
02124 ) const;
02126
02131 PINDEX GetSize() const { return table.GetSize(); }
02132
02135 H323Capability & operator[](PINDEX i) const { return table[i]; }
02136
02157 PINDEX SetCapability(
02158 PINDEX descriptorNum,
02159 PINDEX simultaneous,
02160 H323Capability * cap
02161 );
02162
02165 PINDEX AddMediaFormat(
02166 PINDEX descriptorNum,
02167 PINDEX simultaneous,
02168 const OpalMediaFormat & mediaFormat
02169 );
02170
02175 PINDEX AddAllCapabilities(
02176 PINDEX descriptorNum,
02177 PINDEX simultaneous,
02178 const PString & name,
02179 PBoolean exact = PFalse
02180 );
02181
02182
02183 PINDEX AddAllCapabilities(
02184 const H323EndPoint &,
02185 PINDEX descriptorNum,
02186 PINDEX simultaneous,
02187 const PString & name,
02188 PBoolean exact = PFalse
02189 )
02190 { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
02191
02200 void Add(
02201 H323Capability * capability
02202 );
02203
02210 H323Capability * Copy(
02211 const H323Capability & capability
02212 );
02213
02218 void Remove(
02219 H323Capability * capability
02220 );
02221
02226 void Remove(
02227 const PString & formatName
02228 );
02229
02233 void Remove(
02234 const PStringArray & formatNames
02235 );
02236
02239 void RemoveAll();
02240
02248 H323Capability * FindCapability(
02249 unsigned capabilityNumber
02250 ) const;
02251
02267 H323Capability * FindCapability(
02268 const PString & formatName,
02269 H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
02271 PBoolean exact = PFalse
02272 ) const;
02273
02279 H323Capability * FindCapability(
02280 H323Capability::CapabilityDirection direction
02281 ) const;
02282
02290 H323Capability * FindCapability(
02291 const H323Capability & capability
02292 ) const;
02293
02299 H323Capability * FindCapability(
02300 const H245_Capability & cap
02301 ) const;
02302
02308 H323Capability * FindCapability(
02309 const H245_DataType & dataType
02310 ) const;
02311
02317 H323Capability * FindCapability(
02318 const H245_ModeElement & modeElement
02319 ) const;
02320
02326 H323Capability * FindCapability(
02327 H323Capability::MainTypes mainType,
02328 unsigned subType = UINT_MAX
02329 ) const;
02330
02333 void BuildPDU(
02334 const H323Connection & connection,
02335 H245_TerminalCapabilitySet & pdu
02336 ) const;
02337
02340 PBoolean Merge(
02341 const H323Capabilities & newCaps
02342 );
02343
02350 void Reorder(
02351 const PStringArray & preferenceOrder
02352 );
02353
02356 PBoolean IsAllowed(
02357 const H323Capability & capability
02358 );
02359
02362 PBoolean IsAllowed(
02363 unsigned capabilityNumber
02364 );
02365
02368 PBoolean IsAllowed(
02369 const H323Capability & capability1,
02370 const H323Capability & capability2
02371 );
02372
02375 PBoolean IsAllowed(
02376 unsigned capabilityNumber1,
02377 unsigned capabilityNumber2
02378 );
02379
02382 OpalMediaFormatList GetMediaFormats() const;
02383
02384 const PStringSet & GetMediaPacketizations() const { return mediaPacketizations; }
02386
02387 protected:
02388 void SetMediaPacketizations(const PStringSet & packetizations) { mediaPacketizations = packetizations; }
02389
02390 H323CapabilitiesList table;
02391 H323CapabilitiesSet set;
02392 PStringSet mediaPacketizations;
02393 };
02394
02395
02397
02398
02399
02400 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02401
02402 #define H323_REGISTER_CAPABILITY(cls, capName) static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02403
02404
02405 #endif // OPAL_H323
02406
02407 #endif // OPAL_H323_H323CAPS_H
02408
02409