28 #ifndef OPAL_SIP_SDP_H
29 #define OPAL_SIP_SDP_H
43 #include <ptclib/pssl.h>
49 #define OPAL_OPT_OFFER_SDP_PTIME "Offer-SDP-PTime"
61 #define OPAL_OPT_OFFER_RTCP_FB "Offer-RTCP-FB"
67 #define OPAL_OPT_FORCE_RTCP_FB "Force-RTCP-FB"
75 #define OPAL_OPT_RTCP_MUX "RTCP-Mux"
80 #define OPAL_OPT_OFFER_REDUCED_SIZE_RTCP "Offer-Reduced-Size-RTCP"
88 #define OPAL_OPT_SUPPRESS_UDP_TLS "Suppress-UDP-TLS"
93 #define OPAL_OPT_SDP_SSRC_INFO "SDP-SSRC-Info"
98 #define OPAL_OPT_OFFER_ICE "Offer-ICE"
103 #define OPAL_OPT_ICE_DISABLE_mDNS "ICE-Disable-mDNS"
108 #define OPAL_OPT_ALLOW_MUSIC_ON_HOLD "SDP-Music-On-Hold"
113 class SDPBandwidth :
public std::map<PCaselessString, OpalBandwidth>
115 typedef std::map<PCaselessString, OpalBandwidth> BaseClass;
118 OpalBandwidth operator[](
const PCaselessString & type)
const;
119 friend ostream &
operator<<(ostream & out,
const SDPBandwidth & bw);
120 bool Parse(
const PString & param);
121 void SetMax(
const PCaselessString & type,
OpalBandwidth value);
126 class SDPMediaDescription;
128 class SDPMediaFormat :
public PObject
130 PCLASSINFO(SDPMediaFormat, PObject);
132 SDPMediaFormat(SDPMediaDescription & parent);
135 virtual bool FromSDP(
136 const PString & portString
139 virtual void FromMediaFormat(
143 virtual void PrintOn(ostream & str)
const;
144 virtual PObject * Clone()
const {
return new SDPMediaFormat(*
this); }
148 const PCaselessString & GetEncodingName()
const {
return m_encodingName; }
149 void SetEncodingName(
const PString & v) { m_encodingName = v; }
151 void SetFMTP(
const PString & _fmtp);
152 PString GetFMTP()
const;
154 unsigned GetClockRate(
void) {
return m_clockRate ; }
155 void SetClockRate(
unsigned v) { m_clockRate = v; }
157 void SetParameters(
const PString & v) { m_parameters = v; }
162 virtual bool PreEncode();
166 virtual bool AdjustMediaFormat(
OpalMediaFormat & mediaFormat,
unsigned bandwidth)
const;
167 virtual void SetMediaFormatOptions(
OpalMediaFormat & mediaFormat)
const;
169 SDPMediaDescription & m_parent;
172 unsigned m_clockRate;
173 PCaselessString m_encodingName;
174 PString m_parameters;
177 P_REMOVE_VIRTUAL(
bool,Initialise(
const PString &),
false);
182 typedef PList<SDPMediaFormat> SDPMediaFormatList;
187 class SDPCommonAttributes
200 #if OPAL_SRTP // DTLS
201 P_DECLARE_BITWISE_ENUM_EX(SetupModes, 3, (
207 SetupActivePassive = SetupActive | SetupPassive
218 typedef PDictionary<PString, PStringArray> GroupDict;
220 SDPCommonAttributes()
221 : m_direction(Undefined)
223 , m_setupMode(SetupNotSet)
224 , m_connectionMode(ConnectionNotSet)
228 virtual ~SDPCommonAttributes() { }
230 virtual void SetDirection(
const Direction & d) { m_direction = d; }
231 virtual Direction GetDirection()
const {
return m_direction; }
233 virtual OpalBandwidth GetBandwidth(
const PString & type)
const {
return m_bandwidth[type]; }
234 virtual void SetBandwidth(
const PString & type,
OpalBandwidth value) { m_bandwidth[type] = value; }
236 virtual const SDPBandwidth & GetBandwidth()
const {
return m_bandwidth; }
238 virtual const RTPHeaderExtensions & GetHeaderExtensions()
const {
return m_headerExtensions; }
241 virtual void ParseAttribute(
const PString & value);
242 virtual void SetAttribute(
const PString & attr,
const PString & value);
244 virtual void OutputAttributes(ostream & strm)
const;
247 SetupModes GetSetupMode()
const {
return m_setupMode; }
248 void SetSetupMode(SetupModes setupType) { m_setupMode = setupType; }
249 ConnectionMode GetConnectionMode()
const {
return m_connectionMode; }
250 void SetConnectionMode(ConnectionMode mode) { m_connectionMode = mode; }
251 const PSSLCertificateFingerprint& GetFingerprint()
const {
return m_fingerprint; }
252 void SetFingerprint(
const PSSLCertificateFingerprint& fp) { m_fingerprint = fp; }
255 void SetStringOptions(
const PStringOptions & options) { m_stringOptions = options; }
256 const PStringOptions & GetStringOptions()
const {
return m_stringOptions; }
258 static const PCaselessString & ConferenceTotalBandwidthType();
259 static const PCaselessString & ApplicationSpecificBandwidthType();
260 static const PCaselessString & TransportIndependentBandwidthType();
263 const PString & GetUsername()
const {
return m_username; }
264 const PString & GetPassword()
const {
return m_password; }
266 const PString & username,
267 const PString & password
269 m_username = username;
270 m_password = password;
275 Direction m_direction;
276 SDPBandwidth m_bandwidth;
278 #if OPAL_SRTP // DTLS
279 SetupModes m_setupMode;
280 ConnectionMode m_connectionMode;
281 PSSLCertificateFingerprint m_fingerprint;
284 PStringSet m_iceOptions;
288 PStringOptions m_stringOptions;
294 class SDPMediaDescription :
public PObject,
public SDPCommonAttributes
296 PCLASSINFO(SDPMediaDescription, PObject);
298 SDPMediaDescription();
305 virtual bool PreEncode();
308 virtual bool Decode(
const PStringArray & tokens);
309 virtual bool Decode(
char key,
const PString & value);
313 virtual PString GetSDPMediaType()
const;
316 virtual PCaselessString GetSDPTransportType()
const;
317 virtual void SetSDPTransportType(
const PString & type);
320 virtual PCaselessString GetSessionType()
const;
322 virtual const SDPMediaFormatList & GetSDPMediaFormats()
const;
326 virtual void AddSDPMediaFormat(SDPMediaFormat * sdpMediaFormat);
334 virtual bool IsSecure()
const;
337 virtual void SetAttribute(
const PString & attr,
const PString & value);
338 virtual void OutputAttributes(ostream & str)
const;
340 virtual Direction GetDirection()
const {
return m_mediaAddress.IsEmpty() ? Inactive : m_direction; }
344 virtual bool IsGroupMember(
const PString & groupId)
const {
return m_groups.Contains(groupId); }
345 virtual PStringArray GetGroups()
const {
return m_groups.GetKeys(); }
346 virtual PString GetGroupMediaId(
const PString & groupId)
const {
return m_groups(groupId); }
347 virtual void MatchGroupInfo(
const GroupDict & groups);
348 bool IsBundleOnly()
const {
return m_bundleOnly; }
354 WORD GetPort()
const {
return m_port; }
355 void SetPort(WORD port) { m_port = port; }
358 PNatCandidateList GetCandidates()
const {
return m_candidates; }
361 const PString & username,
362 const PString & password,
363 const PNatCandidateList & candidates
367 virtual OpalMediaType GetMediaType()
const {
return m_mediaType; }
369 virtual void CreateSDPMediaFormats(
const PStringArray & tokens);
370 virtual SDPMediaFormat * CreateSDPMediaFormat() = 0;
372 virtual PString GetSDPPortList()
const;
374 virtual void ProcessMediaOptions(SDPMediaFormat & sdpFormat,
const OpalMediaFormat & mediaFormat);
377 virtual OpalVideoFormat::ContentRole GetContentRole()
const {
return OpalVideoFormat::eNoRole; }
381 virtual SDPMediaFormat * FindFormat(PString & str)
const;
390 PStringToString m_groups;
392 PNatCandidateList m_candidates;
394 SDPMediaFormatList m_formats;
396 P_REMOVE_VIRTUAL(SDPMediaFormat *,CreateSDPMediaFormat(
const PString &),0);
399 P_REMOVE_VIRTUAL_VOID(Copy(SDPMediaDescription &));
402 PARRAY(SDPMediaDescriptionArray, SDPMediaDescription);
405 class SDPDummyMediaDescription :
public SDPMediaDescription
407 PCLASSINFO(SDPDummyMediaDescription, SDPMediaDescription);
409 SDPDummyMediaDescription() { }
412 virtual PString GetSDPMediaType()
const;
413 virtual PCaselessString GetSDPTransportType()
const;
414 virtual void SetSDPTransportType(
const PString & type);
415 virtual PCaselessString GetSessionType()
const;
416 virtual SDPMediaFormat * CreateSDPMediaFormat();
417 virtual PString GetSDPPortList()
const;
420 PStringArray m_tokens;
425 class SDPCryptoSuite :
public PObject
427 PCLASSINFO(SDPCryptoSuite, PObject)
429 SDPCryptoSuite(
unsigned tag);
434 bool Decode(const PString & attrib);
435 void PrintOn(ostream & strm) const;
438 KeyParam(
const PString & keySalt)
448 unsigned m_mkiLength;
451 unsigned GetTag()
const {
return m_tag; }
452 const PString &
GetName()
const {
return m_suiteName; }
457 list<KeyParam> m_keyParams;
458 PStringOptions m_sessionParams;
468 class SDPRTPAVPMediaDescription :
public SDPMediaDescription
470 PCLASSINFO(SDPRTPAVPMediaDescription, SDPMediaDescription);
473 virtual bool Decode(
const PStringArray & tokens);
474 virtual PCaselessString GetSDPTransportType()
const;
475 virtual void SetSDPTransportType(
const PString & type);
476 virtual PCaselessString GetSessionType()
const;
477 virtual SDPMediaFormat * CreateSDPMediaFormat();
478 virtual PString GetSDPPortList()
const;
479 virtual bool PreEncode();
480 virtual void OutputAttributes(ostream & str)
const;
485 virtual bool IsSecure()
const;
487 virtual void SetAttribute(
const PString & attr,
const PString & value);
492 typedef std::map<RTP_SyncSourceId, PStringOptions> SsrcInfo;
493 const SsrcInfo & GetSsrcInfo()
const {
return m_ssrcInfo; }
496 class Format :
public SDPMediaFormat
499 Format(SDPRTPAVPMediaDescription & parent) : SDPMediaFormat(parent) { }
500 virtual bool FromSDP(
const PString & portString);
502 virtual void PrintOn(ostream & str)
const;
503 virtual bool PreEncode();
505 void AddRTCP_FB(
const PString & str);
506 void SetRTCP_FB(
const OpalMediaFormat::RTCPFeedback & v) { m_rtcp_fb = v; }
507 OpalMediaFormat::RTCPFeedback GetRTCP_FB()
const {
return m_rtcp_fb; }
510 virtual void SetMediaFormatOptions(
OpalMediaFormat & mediaFormat)
const;
512 OpalMediaFormat::RTCPFeedback m_rtcp_fb;
515 PCaselessString m_transportType;
516 bool m_reducedSizeRTCP;
520 vector<RTP_SyncSourceArray> m_flowSSRC;
521 OpalMediaFormat::RTCPFeedback m_rtcp_fb;
523 PList<SDPCryptoSuite> m_cryptoSuites;
532 class SDPAudioMediaDescription :
public SDPRTPAVPMediaDescription
534 PCLASSINFO(SDPAudioMediaDescription, SDPRTPAVPMediaDescription);
537 virtual void OutputAttributes(ostream & str)
const;
538 virtual void SetAttribute(
const PString & attr,
const PString & value);
544 PString m_silenceSupp;
555 class SDPVideoMediaDescription :
public SDPRTPAVPMediaDescription
557 PCLASSINFO(SDPVideoMediaDescription, SDPRTPAVPMediaDescription);
560 virtual SDPMediaFormat * CreateSDPMediaFormat();
561 virtual bool PreEncode();
562 virtual void OutputAttributes(ostream & str)
const;
563 virtual void SetAttribute(
const PString & attr,
const PString & value);
565 virtual OpalVideoFormat::ContentRole GetContentRole()
const {
return m_contentRole; }
568 class Format :
public SDPRTPAVPMediaDescription::Format
571 Format(SDPVideoMediaDescription & parent);
573 virtual void PrintOn(ostream & str)
const;
574 virtual PObject * Clone()
const {
return new Format(*
this); }
576 void ParseImageAttr(
const PString & params);
579 virtual void SetMediaFormatOptions(
OpalMediaFormat & mediaFormat)
const;
581 unsigned m_minRxWidth;
582 unsigned m_minRxHeight;
583 unsigned m_maxRxWidth;
584 unsigned m_maxRxHeight;
585 unsigned m_minTxWidth;
586 unsigned m_minTxHeight;
587 unsigned m_maxTxWidth;
588 unsigned m_maxTxHeight;
591 OpalVideoFormat::ContentRole m_contentRole;
592 unsigned m_contentMask;
603 class SDPApplicationMediaDescription :
public SDPMediaDescription
605 PCLASSINFO(SDPApplicationMediaDescription, SDPMediaDescription);
608 virtual PCaselessString GetSDPTransportType()
const;
609 virtual SDPMediaFormat * CreateSDPMediaFormat();
610 virtual PString GetSDPMediaType()
const;
612 static const PCaselessString & TypeName();
615 class Format :
public SDPMediaFormat
618 Format(SDPApplicationMediaDescription & parent) : SDPMediaFormat(parent) { }
619 virtual bool FromSDP(
const PString & portString);
625 class SDPSessionDescription :
public PObject,
public SDPCommonAttributes
627 PCLASSINFO_WITH_CLONE(SDPSessionDescription, PObject);
629 SDPSessionDescription(
635 virtual void PrintOn(ostream & strm)
const;
636 virtual void ReadFrom(istream & strm);
638 virtual PString Encode()
const;
641 virtual void SetAttribute(
const PString & attr,
const PString & value);
643 void SetSessionName(
const PString & v);
644 PString GetSessionName()
const {
return sessionName; }
646 void SetUserName(
const PString & v);
647 PString GetUserName()
const {
return ownerUsername; }
649 const SDPMediaDescriptionArray & GetMediaDescriptions()
const {
return mediaDescriptions; }
651 PINDEX GetMediaDescriptionIndexByType(
const OpalMediaType & rtpMediaType)
const;
652 SDPMediaDescription * GetMediaDescriptionByType(
const OpalMediaType & rtpMediaType)
const;
653 SDPMediaDescription * GetMediaDescriptionByIndex(PINDEX i)
const;
654 void AddMediaDescription(SDPMediaDescription * md);
656 virtual SDPMediaDescription::Direction GetDirection(
unsigned)
const;
657 bool IsHold(
bool allowMusicOnHold)
const;
658 bool HasActiveSend()
const;
661 void SetDefaultConnectAddress(
665 time_t GetOwnerSessionId()
const {
return ownerSessionId; }
666 void SetOwnerSessionId(time_t value) { ownerSessionId = value; }
668 unsigned GetOwnerVersion()
const {
return ownerVersion; }
669 void SetOwnerVersion(
unsigned value) { ownerVersion = value; }
674 GroupDict GetGroups()
const {
return m_groups; }
677 PStringSet GetICEOptions()
const {
return m_iceOptions; }
683 void ParseOwner(
const PString & str);
685 SDPMediaDescriptionArray mediaDescriptions;
687 PINDEX protocolVersion;
690 PString ownerUsername;
691 time_t ownerSessionId;
692 unsigned ownerVersion;
698 PStringArray m_mediaStreamIds;
706 #endif // OPAL_SIP_SDP_H
PString GetName(const OpalMediaType &mediaType)
std::vector< RTP_SyncSourceId > RTP_SyncSourceArray
Definition: rtp.h:47
PayloadTypes
Definition: rtp.h:556
Definition: mediafmt.h:60
OpalMediaFormat GetMediaFormat(const OpalMediaType &mediaType)
ostream & operator<<(ostream &strm, OpalSilenceDetector::Mode mode)
PARRAY(H323CapabilitiesList, H323Capability)
Definition: transports.h:151
uint32_t RTP_SyncSourceId
Definition: rtp.h:46