h323caps.h

Go to the documentation of this file.
00001 /*
00002  * h323caps.h
00003  *
00004  * H.323 protocol handler
00005  *
00006  * Open H323 Library
00007  *
00008  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open H323 Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * Portions of this code were written with the assisance of funding from
00025  * Vovida Networks, Inc. http://www.vovida.com.
00026  *
00027  * Contributor(s): ______________________________________.
00028  *
00029  * $Revision: 23115 $
00030  * $Author: rjongbloed $
00031  * $Date: 2009-07-17 13:13:11 +0000 (Fri, 17 Jul 2009) $
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 /* The following classes have forward references to avoid including the VERY
00050    large header files for H225 and H245. If an application requires access
00051    to the protocol classes they can include them, but for simple usage their
00052    inclusion can be avoided.
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 // Known audio codecs
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     // this function is retained for backwards compatibility
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 /* New capability registration macros based on abstract factories
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 

Generated on Mon Aug 3 20:50:13 2009 for OPAL by  doxygen 1.5.1