OPAL  Version 3.18.8
sdp.h
Go to the documentation of this file.
1 /*
2  * sdp.h
3  *
4  * Session Description Protocol
5  *
6  * Open Phone Abstraction Library (OPAL)
7  * Formally known as the Open H323 project.
8  *
9  * Copyright (c) 2001 Equivalence Pty. Ltd.
10  *
11  * The contents of this file are subject to the Mozilla Public License
12  * Version 1.0 (the "License"); you may not use this file except in
13  * compliance with the License. You may obtain a copy of the License at
14  * http://www.mozilla.org/MPL/
15  *
16  * Software distributed under the License is distributed on an "AS IS"
17  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
18  * the License for the specific language governing rights and limitations
19  * under the License.
20  *
21  * The Original Code is Open Phone Abstraction Library.
22  *
23  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
24  *
25  * Contributor(s): ______________________________________.
26  */
27 
28 #ifndef OPAL_SIP_SDP_H
29 #define OPAL_SIP_SDP_H
30 
31 #ifdef P_USE_PRAGMA
32 #pragma interface
33 #endif
34 
35 #include <opal_config.h>
36 
37 #if OPAL_SDP
38 
39 #include <opal/transports.h>
40 #include <opal/mediatype.h>
41 #include <opal/mediafmt.h>
42 #include <rtp/rtp_session.h>
43 #include <ptclib/pssl.h>
44 
45 
49 #define OPAL_OPT_OFFER_SDP_PTIME "Offer-SDP-PTime"
50 
61 #define OPAL_OPT_OFFER_RTCP_FB "Offer-RTCP-FB"
62 
67 #define OPAL_OPT_FORCE_RTCP_FB "Force-RTCP-FB"
68 
75 #define OPAL_OPT_RTCP_MUX "RTCP-Mux"
76 
80 #define OPAL_OPT_OFFER_REDUCED_SIZE_RTCP "Offer-Reduced-Size-RTCP"
81 
88 #define OPAL_OPT_SUPPRESS_UDP_TLS "Suppress-UDP-TLS"
89 
93 #define OPAL_OPT_SDP_SSRC_INFO "SDP-SSRC-Info"
94 
98 #define OPAL_OPT_OFFER_ICE "Offer-ICE"
99 
103 #define OPAL_OPT_ICE_DISABLE_mDNS "ICE-Disable-mDNS"
104 
108 #define OPAL_OPT_ALLOW_MUSIC_ON_HOLD "SDP-Music-On-Hold"
109 
110 
112 
113 class SDPBandwidth : public std::map<PCaselessString, OpalBandwidth>
114 {
115  typedef std::map<PCaselessString, OpalBandwidth> BaseClass;
116  public:
117  OpalBandwidth & operator[](const PCaselessString & type);
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);
122 };
123 
125 
126 class SDPMediaDescription;
127 
128 class SDPMediaFormat : public PObject
129 {
130  PCLASSINFO(SDPMediaFormat, PObject);
131  protected:
132  SDPMediaFormat(SDPMediaDescription & parent);
133 
134  public:
135  virtual bool FromSDP(
136  const PString & portString
137  );
138 
139  virtual void FromMediaFormat(
140  const OpalMediaFormat & mediaFormat
141  );
142 
143  virtual void PrintOn(ostream & str) const;
144  virtual PObject * Clone() const { return new SDPMediaFormat(*this); }
145 
146  RTP_DataFrame::PayloadTypes GetPayloadType() const { return m_payloadType; }
147 
148  const PCaselessString & GetEncodingName() const { return m_encodingName; }
149  void SetEncodingName(const PString & v) { m_encodingName = v; }
150 
151  void SetFMTP(const PString & _fmtp);
152  PString GetFMTP() const;
153 
154  unsigned GetClockRate(void) { return m_clockRate ; }
155  void SetClockRate(unsigned v) { m_clockRate = v; }
156 
157  void SetParameters(const PString & v) { m_parameters = v; }
158 
159  const OpalMediaFormat & GetMediaFormat() const { return m_mediaFormat; }
160  OpalMediaFormat & GetWritableMediaFormat() { return m_mediaFormat; }
161 
162  virtual bool PreEncode();
163  virtual bool PostDecode(const OpalMediaFormatList & mediaFormats, unsigned bandwidth);
164 
165  protected:
166  virtual bool AdjustMediaFormat(OpalMediaFormat & mediaFormat, unsigned bandwidth) const;
167  virtual void SetMediaFormatOptions(OpalMediaFormat & mediaFormat) const;
168 
169  SDPMediaDescription & m_parent;
170  OpalMediaFormat m_mediaFormat;
171  RTP_DataFrame::PayloadTypes m_payloadType;
172  unsigned m_clockRate;
173  PCaselessString m_encodingName;
174  PString m_parameters;
175  PString m_fmtp;
176 
177  P_REMOVE_VIRTUAL(bool,Initialise(const PString &),false);
178  P_REMOVE_VIRTUAL_VOID(Initialise(const OpalMediaFormat &));
179 
180 };
181 
182 typedef PList<SDPMediaFormat> SDPMediaFormatList;
183 
184 
186 
187 class SDPCommonAttributes
188 {
189  public:
190  // The following enum is arranged so it can be used as a bit mask,
191  // e.g. GetDirection()&SendOnly indicates send is available
192  enum Direction {
193  Undefined = -1,
194  Inactive,
195  RecvOnly,
196  SendOnly,
197  SendRecv
198  };
199 
200 #if OPAL_SRTP // DTLS
201  P_DECLARE_BITWISE_ENUM_EX(SetupModes, 3, (
202  SetupNotSet,
203  SetupActive,
204  SetupPassive,
205  SetupHoldConnection
206  ),
207  SetupActivePassive = SetupActive | SetupPassive
208  );
209 
210  enum ConnectionMode
211  {
212  ConnectionNotSet,
213  ConnectionNew,
214  ConnectionExisting
215  };
216 #endif
217 
218  typedef PDictionary<PString, PStringArray> GroupDict;
219 
220  SDPCommonAttributes()
221  : m_direction(Undefined)
222 #if OPAL_SRTP // DTLS
223  , m_setupMode(SetupNotSet)
224  , m_connectionMode(ConnectionNotSet)
225 #endif
226  { }
227 
228  virtual ~SDPCommonAttributes() { }
229 
230  virtual void SetDirection(const Direction & d) { m_direction = d; }
231  virtual Direction GetDirection() const { return m_direction; }
232 
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; }
235 
236  virtual const SDPBandwidth & GetBandwidth() const { return m_bandwidth; }
237 
238  virtual const RTPHeaderExtensions & GetHeaderExtensions() const { return m_headerExtensions; }
239  virtual void SetHeaderExtension(RTPHeaderExtensionInfo & ext);
240 
241  virtual void ParseAttribute(const PString & value);
242  virtual void SetAttribute(const PString & attr, const PString & value);
243 
244  virtual void OutputAttributes(ostream & strm) const;
245 
246 #if OPAL_SRTP
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; }
253 #endif
254 
255  void SetStringOptions(const PStringOptions & options) { m_stringOptions = options; }
256  const PStringOptions & GetStringOptions() const { return m_stringOptions; }
257 
258  static const PCaselessString & ConferenceTotalBandwidthType();
259  static const PCaselessString & ApplicationSpecificBandwidthType();
260  static const PCaselessString & TransportIndependentBandwidthType(); // RFC3890
261 
262 #if OPAL_ICE
263  const PString & GetUsername() const { return m_username; }
264  const PString & GetPassword() const { return m_password; }
265  void SetUserPass(
266  const PString & username,
267  const PString & password
268  ) {
269  m_username = username;
270  m_password = password;
271  }
272 #endif //OPAL_ICE
273 
274  protected:
275  Direction m_direction;
276  SDPBandwidth m_bandwidth;
277  RTPHeaderExtensions m_headerExtensions;
278 #if OPAL_SRTP // DTLS
279  SetupModes m_setupMode;
280  ConnectionMode m_connectionMode;
281  PSSLCertificateFingerprint m_fingerprint;
282 #endif
283 #if OPAL_ICE
284  PStringSet m_iceOptions;
285  PString m_username;
286  PString m_password;
287 #endif //OPAL_ICE
288  PStringOptions m_stringOptions;
289 };
290 
291 
293 
294 class SDPMediaDescription : public PObject, public SDPCommonAttributes
295 {
296  PCLASSINFO(SDPMediaDescription, PObject);
297  protected:
298  SDPMediaDescription();
299  SDPMediaDescription(
300  const OpalTransportAddress & address,
301  const OpalMediaType & mediaType
302  );
303 
304  public:
305  virtual bool PreEncode();
306  virtual void Encode(const OpalTransportAddress & commonAddr, ostream & str) const;
307 
308  virtual bool Decode(const PStringArray & tokens);
309  virtual bool Decode(char key, const PString & value);
310  virtual bool PostDecode(const OpalMediaFormatList & mediaFormats);
311 
312  // return the string used within SDP to identify this media type
313  virtual PString GetSDPMediaType() const;
314 
315  // return the string used within SDP to identify the transport used by this media
316  virtual PCaselessString GetSDPTransportType() const;
317  virtual void SetSDPTransportType(const PString & type);
318 
319  // return the string used in factory to create session
320  virtual PCaselessString GetSessionType() const;
321 
322  virtual const SDPMediaFormatList & GetSDPMediaFormats() const;
323 
324  virtual OpalMediaFormatList GetMediaFormats() const;
325 
326  virtual void AddSDPMediaFormat(SDPMediaFormat * sdpMediaFormat);
327 
328  virtual void AddMediaFormat(const OpalMediaFormat & mediaFormat);
329  virtual void AddMediaFormats(const OpalMediaFormatList & mediaFormats, const OpalMediaType & mediaType);
330 
331 #if OPAL_SRTP
332  virtual void SetCryptoKeys(OpalMediaCryptoKeyList & cryptoKeys);
333  virtual OpalMediaCryptoKeyList GetCryptoKeys() const;
334  virtual bool IsSecure() const;
335 #endif
336 
337  virtual void SetAttribute(const PString & attr, const PString & value);
338  virtual void OutputAttributes(ostream & str) const;
339 
340  virtual Direction GetDirection() const { return m_mediaAddress.IsEmpty() ? Inactive : m_direction; }
341 
342  virtual bool FromSession(OpalMediaSession * session, const SDPMediaDescription * offer, RTP_SyncSourceId ssrc);
343  virtual bool ToSession(OpalMediaSession * session, RTP_SyncSourceArray & ssrcs) const;
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; }
349 
350  const OpalTransportAddress & GetMediaAddress() const { return m_mediaAddress; }
351  const OpalTransportAddress & GetControlAddress() const { return m_controlAddress; }
352  bool SetAddresses(const OpalTransportAddress & media, const OpalTransportAddress & control);
353 
354  WORD GetPort() const { return m_port; }
355  void SetPort(WORD port) { m_port = port; }
356 
357 #if OPAL_ICE
358  PNatCandidateList GetCandidates() const { return m_candidates; }
359  bool HasICE() const;
360  void SetICE(
361  const PString & username,
362  const PString & password,
363  const PNatCandidateList & candidates
364  );
365 #endif //OPAL_ICE
366 
367  virtual OpalMediaType GetMediaType() const { return m_mediaType; }
368 
369  virtual void CreateSDPMediaFormats(const PStringArray & tokens);
370  virtual SDPMediaFormat * CreateSDPMediaFormat() = 0;
371 
372  virtual PString GetSDPPortList() const;
373 
374  virtual void ProcessMediaOptions(SDPMediaFormat & sdpFormat, const OpalMediaFormat & mediaFormat);
375 
376 #if OPAL_VIDEO
377  virtual OpalVideoFormat::ContentRole GetContentRole() const { return OpalVideoFormat::eNoRole; }
378 #endif
379 
380  protected:
381  virtual SDPMediaFormat * FindFormat(PString & str) const;
382 
383  OpalTransportAddress m_mediaAddress;
384  OpalTransportAddress m_controlAddress;
385  WORD m_port;
386  WORD m_portCount;
387  OpalMediaType m_mediaType;
388  bool m_bundleOnly; // draft-ietf-mmusic-sdp-bundle-negotiation-52
389  PStringList m_mids;
390  PStringToString m_groups;
391 #if OPAL_ICE
392  PNatCandidateList m_candidates;
393 #endif //OPAL_ICE
394  SDPMediaFormatList m_formats;
395 
396  P_REMOVE_VIRTUAL(SDPMediaFormat *,CreateSDPMediaFormat(const PString &),0);
397  P_REMOVE_VIRTUAL(OpalTransportAddress,GetTransportAddress(),OpalTransportAddress());
398  P_REMOVE_VIRTUAL(PBoolean,SetTransportAddress(const OpalTransportAddress &),false);
399  P_REMOVE_VIRTUAL_VOID(Copy(SDPMediaDescription &));
400 };
401 
402 PARRAY(SDPMediaDescriptionArray, SDPMediaDescription);
403 
404 
405 class SDPDummyMediaDescription : public SDPMediaDescription
406 {
407  PCLASSINFO(SDPDummyMediaDescription, SDPMediaDescription);
408  public:
409  SDPDummyMediaDescription() { }
410  SDPDummyMediaDescription(const OpalTransportAddress & address, const PStringArray & tokens);
411 
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;
418 
419  private:
420  PStringArray m_tokens;
421 };
422 
423 
424 #if OPAL_SRTP
425 class SDPCryptoSuite : public PObject
426 {
427  PCLASSINFO(SDPCryptoSuite, PObject)
428  public:
429  SDPCryptoSuite(unsigned tag);
430 
431  bool SetKeyInfo(const OpalMediaCryptoKeyInfo & keyInfo);
432  OpalMediaCryptoKeyInfo * GetKeyInfo() const;
433 
434  bool Decode(const PString & attrib);
435  void PrintOn(ostream & strm) const;
436 
437  struct KeyParam {
438  KeyParam(const PString & keySalt)
439  : m_keySalt(keySalt)
440  , m_lifetime(0)
441  , m_mkiIndex(0)
442  , m_mkiLength(0)
443  { }
444 
445  PString m_keySalt;
446  PUInt64 m_lifetime;
447  unsigned m_mkiIndex;
448  unsigned m_mkiLength;
449  };
450 
451  unsigned GetTag() const { return m_tag; }
452  const PString & GetName() const { return m_suiteName; }
453 
454  protected:
455  unsigned m_tag;
456  PString m_suiteName;
457  list<KeyParam> m_keyParams;
458  PStringOptions m_sessionParams;
459 };
460 #endif // OPAL_SRTP
461 
462 
464 //
465 // SDP media description for media classes using RTP/AVP transport (audio and video)
466 //
467 
468 class SDPRTPAVPMediaDescription : public SDPMediaDescription
469 {
470  PCLASSINFO(SDPRTPAVPMediaDescription, SDPMediaDescription);
471  public:
472  SDPRTPAVPMediaDescription(const OpalTransportAddress & address, const OpalMediaType & mediaType);
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;
481 
482 #if OPAL_SRTP
483  virtual void SetCryptoKeys(OpalMediaCryptoKeyList & cryptoKeys);
484  virtual OpalMediaCryptoKeyList GetCryptoKeys() const;
485  virtual bool IsSecure() const;
486 #endif
487  virtual void SetAttribute(const PString & attr, const PString & value);
488  virtual bool FromSession(OpalMediaSession * session, const SDPMediaDescription * offer, RTP_SyncSourceId ssrc);
489  virtual bool ToSession(OpalMediaSession * session, RTP_SyncSourceArray & ssrcs) const;
490 
491  // RFC5576
492  typedef std::map<RTP_SyncSourceId, PStringOptions> SsrcInfo;
493  const SsrcInfo & GetSsrcInfo() const { return m_ssrcInfo; }
494 
495  protected:
496  class Format : public SDPMediaFormat
497  {
498  public:
499  Format(SDPRTPAVPMediaDescription & parent) : SDPMediaFormat(parent) { }
500  virtual bool FromSDP(const PString & portString);
501 
502  virtual void PrintOn(ostream & str) const;
503  virtual bool PreEncode();
504 
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; }
508 
509  protected:
510  virtual void SetMediaFormatOptions(OpalMediaFormat & mediaFormat) const;
511 
512  OpalMediaFormat::RTCPFeedback m_rtcp_fb; // RFC4585
513  };
514 
515  PCaselessString m_transportType;
516  bool m_reducedSizeRTCP;
517  SsrcInfo m_ssrcInfo; // RFC5576
518  PString m_label;
519  PString m_msid;
520  vector<RTP_SyncSourceArray> m_flowSSRC;
521  OpalMediaFormat::RTCPFeedback m_rtcp_fb;
522 #if OPAL_SRTP
523  PList<SDPCryptoSuite> m_cryptoSuites;
524 #endif
525 };
526 
528 //
529 // SDP media description for audio media
530 //
531 
532 class SDPAudioMediaDescription : public SDPRTPAVPMediaDescription
533 {
534  PCLASSINFO(SDPAudioMediaDescription, SDPRTPAVPMediaDescription);
535  public:
536  SDPAudioMediaDescription(const OpalTransportAddress & address);
537  virtual void OutputAttributes(ostream & str) const;
538  virtual void SetAttribute(const PString & attr, const PString & value);
539  virtual bool PostDecode(const OpalMediaFormatList & mediaFormats);
540 
541  protected:
542  unsigned m_PTime;
543  unsigned m_maxPTime;
544  PString m_silenceSupp;
545 };
546 
547 
548 #if OPAL_VIDEO
549 
551 //
552 // SDP media description for video media
553 //
554 
555 class SDPVideoMediaDescription : public SDPRTPAVPMediaDescription
556 {
557  PCLASSINFO(SDPVideoMediaDescription, SDPRTPAVPMediaDescription);
558  public:
559  SDPVideoMediaDescription(const OpalTransportAddress & address);
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);
564  virtual bool PostDecode(const OpalMediaFormatList & mediaFormats);
565  virtual OpalVideoFormat::ContentRole GetContentRole() const { return m_contentRole; }
566 
567  protected:
568  class Format : public SDPRTPAVPMediaDescription::Format
569  {
570  public:
571  Format(SDPVideoMediaDescription & parent);
572 
573  virtual void PrintOn(ostream & str) const;
574  virtual PObject * Clone() const { return new Format(*this); }
575 
576  void ParseImageAttr(const PString & params);
577 
578  protected:
579  virtual void SetMediaFormatOptions(OpalMediaFormat & mediaFormat) const;
580 
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;
589  };
590 
591  OpalVideoFormat::ContentRole m_contentRole;
592  unsigned m_contentMask;
593 };
594 
595 #endif // OPAL_VIDEO
596 
597 
599 //
600 // SDP media description for application media
601 //
602 
603 class SDPApplicationMediaDescription : public SDPMediaDescription
604 {
605  PCLASSINFO(SDPApplicationMediaDescription, SDPMediaDescription);
606  public:
607  SDPApplicationMediaDescription(const OpalTransportAddress & address);
608  virtual PCaselessString GetSDPTransportType() const;
609  virtual SDPMediaFormat * CreateSDPMediaFormat();
610  virtual PString GetSDPMediaType() const;
611 
612  static const PCaselessString & TypeName();
613 
614  protected:
615  class Format : public SDPMediaFormat
616  {
617  public:
618  Format(SDPApplicationMediaDescription & parent) : SDPMediaFormat(parent) { }
619  virtual bool FromSDP(const PString & portString);
620  };
621 };
622 
624 
625 class SDPSessionDescription : public PObject, public SDPCommonAttributes
626 {
627  PCLASSINFO_WITH_CLONE(SDPSessionDescription, PObject);
628  public:
629  SDPSessionDescription(
630  time_t sessionId,
631  unsigned version,
632  const OpalTransportAddress & address
633  );
634 
635  virtual void PrintOn(ostream & strm) const;
636  virtual void ReadFrom(istream & strm);
637 
638  virtual PString Encode() const;
639  virtual bool Decode(const PString & str, const OpalMediaFormatList & mediaFormats);
640  virtual bool Decode(const PStringArray & lines, const OpalMediaFormatList & mediaFormats);
641  virtual void SetAttribute(const PString & attr, const PString & value);
642 
643  void SetSessionName(const PString & v);
644  PString GetSessionName() const { return sessionName; }
645 
646  void SetUserName(const PString & v);
647  PString GetUserName() const { return ownerUsername; }
648 
649  const SDPMediaDescriptionArray & GetMediaDescriptions() const { return mediaDescriptions; }
650 
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);
655 
656  virtual SDPMediaDescription::Direction GetDirection(unsigned) const;
657  bool IsHold(bool allowMusicOnHold) const;
658  bool HasActiveSend() const;
659 
660  const OpalTransportAddress & GetDefaultConnectAddress() const { return defaultConnectAddress; }
661  void SetDefaultConnectAddress(
662  const OpalTransportAddress & address
663  );
664 
665  time_t GetOwnerSessionId() const { return ownerSessionId; }
666  void SetOwnerSessionId(time_t value) { ownerSessionId = value; }
667 
668  unsigned GetOwnerVersion() const { return ownerVersion; }
669  void SetOwnerVersion(unsigned value) { ownerVersion = value; }
670 
671  OpalTransportAddress GetOwnerAddress() const { return ownerAddress; }
672  void SetOwnerAddress(OpalTransportAddress addr) { ownerAddress = addr; }
673 
674  GroupDict GetGroups() const { return m_groups; }
675 
676 #if OPAL_ICE
677  PStringSet GetICEOptions() const { return m_iceOptions; }
678 #endif
679 
680  OpalMediaFormatList GetMediaFormats() const;
681 
682  protected:
683  void ParseOwner(const PString & str);
684 
685  SDPMediaDescriptionArray mediaDescriptions;
686 
687  PINDEX protocolVersion;
688  PString sessionName;
689 
690  PString ownerUsername;
691  time_t ownerSessionId;
692  unsigned ownerVersion;
693  OpalTransportAddress ownerAddress;
694  OpalTransportAddress defaultConnectAddress;
695 
696  GroupDict m_groups;
697 
698  PStringArray m_mediaStreamIds;
699 };
700 
702 
703 
704 #endif // OPAL_SDP
705 
706 #endif // OPAL_SIP_SDP_H
707 
708 
709 // End of File ///////////////////////////////////////////////////////////////
Definition: rtp.h:792
PString GetName(const OpalMediaType &mediaType)
Definition: mediasession.h:647
Definition: mediatype.h:66
Definition: mediasession.h:282
std::vector< RTP_SyncSourceId > RTP_SyncSourceArray
Definition: rtp.h:47
PayloadTypes
Definition: rtp.h:556
Definition: mediafmt.h:112
Definition: mediafmt.h:60
Definition: mediasession.h:312
Definition: mediafmt.h:806
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
Definition: rtp.h:832