32 #ifndef OPAL_SIP_SDP_H
33 #define OPAL_SIP_SDP_H
53 #define OPAL_OPT_OFFER_SDP_PTIME "Offer-SDP-PTime"
62 #define OPAL_OPT_OFFER_RTCP_FB "Offer-RTCP-FB"
68 #define OPAL_OPT_FORCE_RTCP_FB "Force-RTCP-FB"
73 #define OPAL_OPT_OFFER_ICE "Offer-ICE"
78 class SDPBandwidth :
public std::map<PCaselessString, OpalBandwidth>
80 typedef std::map<PCaselessString, OpalBandwidth> BaseClass;
84 friend ostream &
operator<<(ostream & out,
const SDPBandwidth & bw);
85 bool Parse(
const PString & param);
86 void SetMax(
const PCaselessString & type,
OpalBandwidth value);
91 class SDPMediaDescription;
93 class SDPMediaFormat :
public PObject
95 PCLASSINFO(SDPMediaFormat, PObject);
97 SDPMediaFormat(SDPMediaDescription & parent);
100 virtual bool FromSDP(
101 const PString & portString
104 virtual void FromMediaFormat(
108 virtual void PrintOn(ostream & str)
const;
109 virtual PObject * Clone()
const {
return new SDPMediaFormat(*
this); }
113 const PCaselessString & GetEncodingName()
const {
return m_encodingName; }
114 void SetEncodingName(
const PString & v) { m_encodingName = v; }
116 void SetFMTP(
const PString & _fmtp);
117 PString GetFMTP()
const;
119 unsigned GetClockRate(
void) {
return m_clockRate ; }
120 void SetClockRate(
unsigned v) { m_clockRate = v; }
122 void SetParameters(
const PString & v) { m_parameters = v; }
124 const OpalMediaFormat & GetMediaFormat()
const {
return m_mediaFormat; }
127 virtual bool PreEncode();
131 virtual void SetMediaFormatOptions(
OpalMediaFormat & mediaFormat)
const;
133 SDPMediaDescription & m_parent;
136 unsigned m_clockRate;
137 PCaselessString m_encodingName;
138 PString m_parameters;
141 P_REMOVE_VIRTUAL(
bool,Initialise(
const PString &),
false);
146 typedef PList<SDPMediaFormat> SDPMediaFormatList;
151 class SDPCommonAttributes
164 SDPCommonAttributes()
165 : m_direction(Undefined)
168 virtual ~SDPCommonAttributes() { }
170 virtual void SetDirection(
const Direction & d) { m_direction = d; }
171 virtual Direction GetDirection()
const {
return m_direction; }
173 virtual OpalBandwidth GetBandwidth(
const PString & type)
const {
return m_bandwidth[type]; }
174 virtual void SetBandwidth(
const PString & type,
OpalBandwidth value) { m_bandwidth[type] = value; }
176 virtual const SDPBandwidth & GetBandwidth()
const {
return m_bandwidth; }
178 virtual const RTPExtensionHeaders & GetExtensionHeaders()
const {
return m_extensionHeaders; }
181 virtual void ParseAttribute(
const PString & value);
182 virtual void SetAttribute(
const PString & attr,
const PString & value);
184 virtual void OutputAttributes(ostream & strm)
const;
186 static const PCaselessString & ConferenceTotalBandwidthType();
187 static const PCaselessString & ApplicationSpecificBandwidthType();
188 static const PCaselessString & TransportIndependentBandwidthType();
191 Direction m_direction;
192 SDPBandwidth m_bandwidth;
195 PStringSet m_iceOptions;
202 class SDPMediaDescription :
public PObject,
public SDPCommonAttributes
204 PCLASSINFO(SDPMediaDescription, PObject);
206 SDPMediaDescription();
213 virtual bool PreEncode();
216 virtual bool Decode(
const PStringArray & tokens);
217 virtual bool Decode(
char key,
const PString & value);
221 virtual PString GetSDPMediaType()
const;
224 virtual PCaselessString GetSDPTransportType()
const;
227 virtual PCaselessString GetSessionType()
const;
229 virtual const SDPMediaFormatList & GetSDPMediaFormats()
const;
233 virtual void AddSDPMediaFormat(SDPMediaFormat * sdpMediaFormat);
241 virtual bool HasCryptoKeys()
const;
244 virtual void SetAttribute(
const PString & attr,
const PString & value);
245 virtual void OutputAttributes(ostream & str)
const;
247 virtual Direction GetDirection()
const {
return m_mediaAddress.IsEmpty() ? Inactive : m_direction; }
249 virtual bool SetSessionInfo(
const OpalMediaSession * session,
const SDPMediaDescription * offer);
250 virtual PString GetMediaGroupId()
const {
return m_mediaGroupId; }
251 virtual void SetMediaGroupId(
const PString &
id) { m_mediaGroupId = id; }
257 virtual WORD GetPort()
const {
return m_port; }
260 PString GetUsername()
const {
return m_username; }
261 PString GetPassword()
const {
return m_password; }
262 PNatCandidateList GetCandidates()
const {
return m_candidates; }
265 const PString & username,
266 const PString & password,
267 const PNatCandidateList & candidates
270 m_username = username;
271 m_password = password;
272 m_candidates = candidates;
276 virtual OpalMediaType GetMediaType()
const {
return m_mediaType; }
278 virtual void CreateSDPMediaFormats(
const PStringArray & tokens);
279 virtual SDPMediaFormat * CreateSDPMediaFormat() = 0;
281 virtual PString GetSDPPortList()
const;
283 virtual void ProcessMediaOptions(SDPMediaFormat & sdpFormat,
const OpalMediaFormat & mediaFormat);
286 virtual OpalVideoFormat::ContentRole GetContentRole()
const {
return OpalVideoFormat::eNoRole; }
289 void SetOptionStrings(
const PStringOptions & options) { m_stringOptions = options; }
290 const PStringOptions & GetOptionStrings()
const {
return m_stringOptions; }
293 virtual SDPMediaFormat * FindFormat(PString & str)
const;
297 PCaselessString m_transportType;
298 PStringOptions m_stringOptions;
302 PString m_mediaGroupId;
304 PNatCandidateList m_candidates;
308 SDPMediaFormatList m_formats;
310 P_REMOVE_VIRTUAL(SDPMediaFormat *,CreateSDPMediaFormat(
const PString &),0);
313 P_REMOVE_VIRTUAL_VOID(Copy(SDPMediaDescription &));
316 PARRAY(SDPMediaDescriptionArray, SDPMediaDescription);
319 class SDPDummyMediaDescription :
public SDPMediaDescription
321 PCLASSINFO(SDPDummyMediaDescription, SDPMediaDescription);
323 SDPDummyMediaDescription() { }
325 SDPDummyMediaDescription(
const SDPMediaDescription & mediaDescription);
327 virtual PString GetSDPMediaType()
const;
328 virtual PCaselessString GetSDPTransportType()
const;
329 virtual PCaselessString GetSessionType()
const;
330 virtual SDPMediaFormat * CreateSDPMediaFormat();
331 virtual PString GetSDPPortList()
const;
334 PStringArray m_tokens;
339 class SDPCryptoSuite :
public PObject
341 PCLASSINFO(SDPCryptoSuite, PObject)
343 SDPCryptoSuite(
unsigned tag);
348 bool Decode(const PString & attrib);
349 void PrintOn(ostream & strm) const;
352 KeyParam(
const PString & keySalt)
362 unsigned m_mkiLength;
365 unsigned GetTag()
const {
return m_tag; }
366 const PString & GetName()
const {
return m_suiteName; }
371 list<KeyParam> m_keyParams;
372 PStringOptions m_sessionParams;
382 class SDPRTPAVPMediaDescription :
public SDPMediaDescription
384 PCLASSINFO(SDPRTPAVPMediaDescription, SDPMediaDescription);
387 virtual bool Decode(
const PStringArray & tokens);
388 virtual PCaselessString GetSDPTransportType()
const;
389 virtual SDPMediaFormat * CreateSDPMediaFormat();
390 virtual PString GetSDPPortList()
const;
391 virtual void OutputAttributes(ostream & str)
const;
395 virtual bool HasCryptoKeys()
const;
397 virtual void SetAttribute(
const PString & attr,
const PString & value);
398 virtual bool SetSessionInfo(
const OpalMediaSession * session,
const SDPMediaDescription * offer);
400 void EnableFeedback() { m_enableFeedback =
true; }
402 typedef std::map<DWORD, PStringOptions> SsrcInfo;
403 const SsrcInfo & GetSsrcInfo()
const {
return m_ssrcInfo; }
406 class Format :
public SDPMediaFormat
409 Format(SDPRTPAVPMediaDescription & parent) : SDPMediaFormat(parent) { }
410 virtual bool FromSDP(
const PString & portString);
413 bool m_enableFeedback;
417 PList<SDPCryptoSuite> m_cryptoSuites;
426 class SDPAudioMediaDescription :
public SDPRTPAVPMediaDescription
428 PCLASSINFO(SDPAudioMediaDescription, SDPRTPAVPMediaDescription);
431 virtual void OutputAttributes(ostream & str)
const;
432 virtual void SetAttribute(
const PString & attr,
const PString & value);
448 class SDPVideoMediaDescription :
public SDPRTPAVPMediaDescription
450 PCLASSINFO(SDPVideoMediaDescription, SDPRTPAVPMediaDescription);
453 virtual SDPMediaFormat * CreateSDPMediaFormat();
454 virtual bool PreEncode();
455 virtual void OutputAttributes(ostream & str)
const;
456 virtual void SetAttribute(
const PString & attr,
const PString & value);
458 virtual OpalVideoFormat::ContentRole GetContentRole()
const {
return m_contentRole; }
461 class Format :
public SDPRTPAVPMediaDescription::Format
464 Format(SDPVideoMediaDescription & parent);
466 virtual void PrintOn(ostream & str)
const;
467 virtual PObject * Clone()
const {
return new Format(*
this); }
469 virtual bool PreEncode();
471 void AddRTCP_FB(
const PString & str);
472 void SetRTCP_FB(
const OpalVideoFormat::RTCPFeedback & v) { m_rtcp_fb = v; }
473 OpalVideoFormat::RTCPFeedback GetRTCP_FB()
const {
return m_rtcp_fb; }
475 void ParseImageAttr(
const PString & params);
478 virtual void SetMediaFormatOptions(
OpalMediaFormat & mediaFormat)
const;
480 OpalVideoFormat::RTCPFeedback m_rtcp_fb;
482 unsigned m_minRxWidth;
483 unsigned m_minRxHeight;
484 unsigned m_maxRxWidth;
485 unsigned m_maxRxHeight;
486 unsigned m_minTxWidth;
487 unsigned m_minTxHeight;
488 unsigned m_maxTxWidth;
489 unsigned m_maxTxHeight;
492 OpalVideoFormat::RTCPFeedback m_rtcp_fb;
493 OpalVideoFormat::ContentRole m_contentRole;
494 unsigned m_contentMask;
505 class SDPApplicationMediaDescription :
public SDPMediaDescription
507 PCLASSINFO(SDPApplicationMediaDescription, SDPMediaDescription);
510 virtual PCaselessString GetSDPTransportType()
const;
511 virtual SDPMediaFormat * CreateSDPMediaFormat();
512 virtual PString GetSDPMediaType()
const;
514 static const PCaselessString & TypeName();
517 class Format :
public SDPMediaFormat
520 Format(SDPApplicationMediaDescription & parent) : SDPMediaFormat(parent) { }
521 virtual bool FromSDP(
const PString & portString);
527 class SDPSessionDescription :
public PObject,
public SDPCommonAttributes
529 PCLASSINFO_WITH_CLONE(SDPSessionDescription, PObject);
531 SDPSessionDescription(
537 virtual void PrintOn(ostream & strm)
const;
538 virtual PString Encode()
const;
540 virtual void SetAttribute(
const PString & attr,
const PString & value);
542 void SetSessionName(
const PString & v);
543 PString GetSessionName()
const {
return sessionName; }
545 void SetUserName(
const PString & v);
546 PString GetUserName()
const {
return ownerUsername; }
548 const SDPMediaDescriptionArray & GetMediaDescriptions()
const {
return mediaDescriptions; }
550 SDPMediaDescription * GetMediaDescriptionByType(
const OpalMediaType & rtpMediaType)
const;
551 SDPMediaDescription * GetMediaDescriptionByIndex(PINDEX i)
const;
552 void AddMediaDescription(SDPMediaDescription * md) { mediaDescriptions.Append(PAssertNULL(md)); }
554 virtual SDPMediaDescription::Direction GetDirection(
unsigned)
const;
556 bool HasActiveSend()
const;
559 void SetDefaultConnectAddress(
563 time_t GetOwnerSessionId()
const {
return ownerSessionId; }
564 void SetOwnerSessionId(time_t value) { ownerSessionId = value; }
566 unsigned GetOwnerVersion()
const {
return ownerVersion; }
567 void SetOwnerVersion(
unsigned value) { ownerVersion = value; }
572 typedef PDictionary<PString, PStringArray> GroupDict;
573 GroupDict GetGroups()
const {
return m_groups; }
576 PStringSet GetICEOptions()
const {
return m_iceOptions; }
582 void ParseOwner(
const PString & str);
584 SDPMediaDescriptionArray mediaDescriptions;
586 PINDEX protocolVersion;
589 PString ownerUsername;
590 time_t ownerSessionId;
591 unsigned ownerVersion;
604 #endif // OPAL_SIP_SDP_H