OPAL  Version 3.18.8
mediasession.h
Go to the documentation of this file.
1 /*
2  * mediasession.h
3  *
4  * Media session abstraction
5  *
6  * Open Phone Abstraction Library (OPAL)
7  *
8  * Copyright (C) 2010 Vox Lucida Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Open Phone Abstraction Library.
21  *
22  * The Initial Developer of the Original Code is Vox Lucida Pty. Ltd.
23  *
24  * Contributor(s): ______________________________________.
25  */
26 
27 #ifndef OPAL_OPAL_MEDIASESSION_H
28 #define OPAL_OPAL_MEDIASESSION_H
29 
30 #ifdef P_USE_PRAGMA
31 #pragma interface
32 #endif
33 
34 #include <opal_config.h>
35 
36 #include <opal/transports.h>
37 #include <opal/mediatype.h>
38 #include <ptlib/notifier_ext.h>
39 
40 
41 class OpalConnection;
42 class OpalMediaStream;
43 class OpalMediaFormat;
47 class H235SecurityCapability;
48 class H323Capability;
49 class PSTUNClient;
50 
51 
55 #define OPAL_OPT_MEDIA_RX_TIMEOUT "Media-Rx-Timeout"
56 
60 #define OPAL_OPT_MEDIA_TX_TIMEOUT "Media-Tx-Timeout"
61 
62 
63 #if OPAL_STATISTICS
64 
66 {
68 
70  PString m_mediaFormat;
71  uint32_t m_SSRC;
73 
74  PThreadIdentifier m_threadIdentifier;
75 };
76 
77 #if OPAL_ICE
78 struct OpalCandidateStatistics : PNatCandidate
79 {
80  OpalCandidateStatistics(const PNatCandidate & cand);
81 
82  virtual void PrintOn(ostream & strm) const;
83 
84  bool m_selected;
85  unsigned m_nominations;
86  PTime m_lastNomination;
87 
88  struct STUN {
89  STUN();
90  void Count();
91 
92  PTime m_first;
93  PTime m_last;
94  unsigned m_count;
95  } m_rxRequests, m_txRequests;
96 };
97 #endif // OPAL_ICE
98 
100 {
102 
106 
107 #if OPAL_ICE
108  std::vector<OpalCandidateStatistics> m_candidates;
109 #endif
110 
111  PTime m_startTime;
112  uint64_t m_totalBytes;
113  unsigned m_totalPackets;
114  unsigned m_controlPacketsIn; // RTCP received for this channel
115  unsigned m_controlPacketsOut; // RTCP sent for this channel
116  int m_NACKs; // (-1 is N/A)
117  uint32_t m_rtxSSRC; // Zero indicates no separate retransmit source
118  int m_rtxPackets; // (-1 is N/A)
119  int m_rtxDuplicates; // (-1 is N/A)
120  int m_FEC; // (-1 is N/A, for tx is number of FEC frame sent, for rx is number of frames recovered via FEC)
121  int m_unrecovered; // (-1 is N/A) Packets that failed to arrive and could not be recovered via NACK/FEC
122  int m_packetsLost; // (-1 is N/A) Packets that failed to arrive (as per RTCP Receiver Report specification)
123  int m_maxConsecutiveLost;// (-1 is N/A)
124  int m_packetsOutOfOrder; // (-1 is N/A)
125  int m_lateOutOfOrder; // (-1 is N/A)
126  int m_packetsTooLate; // (-1 is N/A)
127  int m_packetOverruns; // (-1 is N/A)
128  int m_minimumPacketTime; // Milliseconds (-1 is N/A)
129  int m_averagePacketTime; // Milliseconds (-1 is N/A)
130  int m_maximumPacketTime; // Milliseconds (-1 is N/A)
131  int m_averageJitter; // Milliseconds (-1 is N/A)
132  int m_maximumJitter; // Milliseconds (-1 is N/A)
133  int m_jitterBufferDelay; // Milliseconds (-1 is N/A)
134  int m_roundTripTime; // Milliseconds (-1 is N/A)
135  int m_lastPacketRTP; // (-1 is N/A)
139  unsigned m_targetBitRate; // As configured, not actual, which is calculated from m_totalBytes
140  float m_targetFrameRate; // As configured, not actual, which is calculated from m_totalFrames
141 };
142 
144 {
145 #if OPAL_VIDEO
147 
148  void IncrementFrames(bool key);
149  void IncrementUpdateCount(bool full);
150 
151  unsigned m_totalFrames;
152  unsigned m_keyFrames;
153  unsigned m_droppedFrames;
158  PTimeInterval m_updateResponseTime;
159  unsigned m_frameWidth;
160  unsigned m_frameHeight;
161  unsigned m_tsto; // Temporal/Spatial Trade Off, as configured
162  int m_videoQuality; // -1 is none, 0 is very good > 0 is progressively worse
163 #endif
164 };
165 
167 {
168 #if OPAL_FAX
169  enum {
174  };
180  };
181  friend ostream & operator<<(ostream & strm, FaxCompression compression);
182 
184 
185  int m_result; // -2=not started, -1=progress, 0=success, >0=ended with error
186  char m_phase; // 'A', 'B', 'D'
187  int m_bitRate; // e.g. 14400, 9600
188  FaxCompression m_compression; // 0=N/A, 1=T.4 1d, 2=T.4 2d, 3=T.6
193  int m_imageSize; // In bytes
194  int m_resolutionX; // Pixels per inch
195  int m_resolutionY; // Pixels per inch
198  int m_badRows; // Total number of bad rows
199  int m_mostBadRows; // Longest run of bad rows
201 
202  PString m_stationId; // Remote station identifier
203  PString m_errorText;
204 #endif // OPAL_FAX
205 };
206 
207 
210 class OpalMediaStatistics : public PObject
211  , public OpalCodecStatistics
212  , public OpalNetworkStatistics
213  , public OpalVideoStatistics
214  , public OpalFaxStatistics
215 {
216  PCLASSINFO(OpalMediaStatistics, PObject);
217  public:
221 
222  virtual void PrintOn(ostream & strm) const;
223 
224  // To following fields are not copied by
225  struct UpdateInfo
226  {
227  UpdateInfo();
228 
231  uint64_t m_previousBytes;
233  unsigned m_previousLost;
234 #if OPAL_VIDEO
236 #endif
237  PTimeInterval m_usedCPU;
238  PTimeInterval m_previousCPU;
239  } m_updateInfo;
240 
241  void PreUpdate();
242  OpalMediaStatistics & Update(const OpalMediaStream & stream);
243 
244  bool IsValid() const;
245 
246  unsigned GetRateInt(int64_t current, int64_t previous) const;
247  unsigned GetBitRate() const { return GetRateInt(m_totalBytes*8, m_updateInfo.m_previousBytes*8); }
250 
251  PString GetRateStr(int64_t total, const char * units = "", unsigned significantFigures = 0) const;
252  PString GetRateStr(int64_t current, int64_t previous, const char * units = "", unsigned significantFigures = 0) const;
253  PString GetAverageBitRate(const char * units = "", unsigned significantFigures = 0) const { return GetRateStr(m_totalBytes*8, units, significantFigures); }
254  PString GetCurrentBitRate(const char * units = "", unsigned significantFigures = 0) const { return GetRateStr(m_totalBytes*8, m_updateInfo.m_previousBytes*8, units, significantFigures); }
255  PString GetAveragePacketRate(const char * units = "", unsigned significantFigures = 0) const { return GetRateStr(m_totalPackets, units, significantFigures); }
256  PString GetCurrentPacketRate(const char * units = "", unsigned significantFigures = 0) const { return GetRateStr(m_totalPackets, m_updateInfo.m_previousPackets, units, significantFigures); }
257  PString GetPacketLossRate(const char * units = "", unsigned significantFigures = 0) const { return GetRateStr(m_packetsLost, m_updateInfo.m_previousLost, units, significantFigures); }
258 
259  PString GetCPU() const; // As percentage or one core
260 
261 #if OPAL_VIDEO
262  // Video
264  PString GetAverageFrameRate(const char * units = "", unsigned significantFigures = 0) const;
265  PString GetCurrentFrameRate(const char * units = "", unsigned significantFigures = 0) const;
266 #endif
267 
268  // Fax
269 #if OPAL_FAX
270  OpalFaxStatistics & m_fax; // For backward compatibility
271 #endif // OPAL_FAX
272 
273  P_DEPRECATED PString GetRate(int64_t current, int64_t previous, const char * units = "", unsigned significantFigures = 0) const
274  { return GetRateStr(current, previous, units, significantFigures); }
275 };
276 
277 #endif
278 
279 
282 class OpalMediaCryptoKeyInfo : public PObject
283 {
284  PCLASSINFO(OpalMediaCryptoKeyInfo, PObject);
285  protected:
286  OpalMediaCryptoKeyInfo(const OpalMediaCryptoSuite & cryptoSuite) : m_cryptoSuite(cryptoSuite) { }
287 
288  public:
290 
291  virtual bool IsValid() const = 0;
292  virtual void Randomise() = 0;
293  virtual bool FromString(const PString & str) = 0;
294  virtual PString ToString() const = 0;
295 
296  virtual bool SetCipherKey(const PBYTEArray & key) = 0;
297  virtual bool SetAuthSalt(const PBYTEArray & key) = 0;
298 
299  virtual PBYTEArray GetCipherKey() const = 0;
300  virtual PBYTEArray GetAuthSalt() const = 0;
301 
303 
304  void SetTag(const PString & tag) { m_tag = tag; }
305  const PString & GetTag() const { return m_tag; }
306 
307  protected:
309  PString m_tag;
310 };
311 
312 struct OpalMediaCryptoKeyList : PList<OpalMediaCryptoKeyInfo>
313 {
314  void Select(iterator & it);
315 };
316 
317 
321 class OpalMediaCryptoSuite : public PObject
322 {
323  PCLASSINFO(OpalMediaCryptoSuite, PObject);
324  protected:
326 
327  public:
328  static const PCaselessString & ClearText();
329 
330  virtual void PrintOn(ostream & strm) const;
331 
332  virtual const PCaselessString & GetFactoryName() const = 0;
333  virtual bool Supports(const PCaselessString & proto) const = 0;
334  P_DECLARE_BITWISE_ENUM(KeyExchangeModes, 3, (e_NoMode, e_AllowClear, e_SecureSignalling, e_InBandKeyEchange));
335  virtual bool ChangeSessionType(PCaselessString & mediaSession, KeyExchangeModes modes) const = 0;
336 
337  virtual const char * GetDescription() const = 0;
338 #if OPAL_SRTP
339  virtual const char * GetDTLSName() const;
340 #endif
341 #if OPAL_H235_6 || OPAL_H235_8
342  virtual H235SecurityCapability * CreateCapability(const H323Capability & mediaCapability) const;
343  virtual const char * GetOID() const = 0;
344  static OpalMediaCryptoSuite * FindByOID(const PString & oid);
345 #endif
346 
347  PINDEX GetCipherKeyBytes() const { return (GetCipherKeyBits()+7)/8; }
348  PINDEX GetAuthSaltBytes() const { return (GetAuthSaltBits()+7)/8; }
349  virtual PINDEX GetCipherKeyBits() const = 0;
350  virtual PINDEX GetAuthSaltBits() const = 0;
351 
352  virtual OpalMediaCryptoKeyInfo * CreateKeyInfo() const = 0;
353 
354  struct List : PList<OpalMediaCryptoSuite>
355  {
356  List() { DisallowDeleteObjects(); }
357  };
358  static List FindAll(
359  const PStringArray & cryptoSuiteNames,
360  const char * prefix = NULL
361  );
362 
363  private:
364  P_REMOVE_VIRTUAL(H235SecurityCapability *,CreateCapability(const OpalMediaFormat &, unsigned) const,0);
365 };
366 
367 typedef PFactory<OpalMediaCryptoSuite, PCaselessString> OpalMediaCryptoSuiteFactory;
368 
369 
371 {
373  {
376  e_Data = e_Media, // for backward compatibility
382  eMaxSubChannels // Should be enough!
383  };
384 };
385 #if PTRACING
386 ostream & operator<<(ostream & strm, OpalMediaTransportChannelTypes::SubChannels channel);
387 #endif
388 
389 
392 class OpalMediaTransport : public PSafeObject, public OpalMediaTransportChannelTypes
393 {
394  PCLASSINFO(OpalMediaTransport, PSafeObject);
395  private:
396  PDECLARE_INSTRUMENTED_READ_WRITE_MUTEX(m_instrumentedMutex, OpalMediaTransport, 500, 100);
397  public:
398  OpalMediaTransport(const PString & name);
400 
401  virtual void PrintOn(ostream & strm) const;
402 
404  const PString & GetName() const { return m_name; }
405 
407  virtual PString GetType();
408 
411  virtual bool Open(
412  OpalMediaSession & session,
413  PINDEX count,
414  const PString & localInterface,
415  const OpalTransportAddress & remoteAddress
416  ) = 0;
417 
420  virtual bool IsOpen() const;
421 
424  virtual void Start();
425 
428  virtual bool IsEstablished() const;
429 
434  virtual OpalTransportAddress GetLocalAddress(SubChannels subchannel = e_Media) const;
435 
440  virtual OpalTransportAddress GetRemoteAddress(SubChannels subchannel = e_Media) const;
441 
446  virtual bool SetRemoteAddress(const OpalTransportAddress & remoteAddress, SubChannels subchannel = e_Media);
447 
450  virtual void SetCandidates(
451  const PString & user,
452  const PString & pass,
453  const PNatCandidateList & candidates
454  );
455 
458  virtual bool GetCandidates(
459  PString & user,
460  PString & pass,
461  PNatCandidateList & candidates,
462  bool offering
463  );
464 
467  virtual bool Write(
468  const void * data,
469  PINDEX length,
470  SubChannels subchannel = e_Media,
471  const PIPSocketAddressAndPort * remote = NULL,
472  int * mtu = NULL
473  ) = 0;
474 
475 #if OPAL_SRTP
476 
478  virtual bool GetKeyInfo(
479  OpalMediaCryptoKeyInfo * keyInfo[2]
480  );
481 #endif
482 
486  typedef PNotifierTemplate<PBYTEArray> ReadNotifier;
487  #define PDECLARE_MediaReadNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalMediaTransport, cls, fn, PBYTEArray)
488 
491  void AddReadNotifier(
492  const ReadNotifier & notifier,
493  SubChannels subchannel = e_Media
494  );
495 
497  void RemoveReadNotifier(
498  const ReadNotifier & notifier,
499  SubChannels subchannel = e_Media
500  );
501  void RemoveReadNotifier(
502  PObject * target,
503  SubChannels subchannel = e_Media
504  );
505 
508  PChannel * GetChannel(SubChannels subchannel = e_Media) const;
509 
510  void SetDiscoverMTU(int mode) { m_mtuDiscoverMode = mode; }
511  void SetMediaTimeout(const PTimeInterval & t);
512  void SetRemoteBehindNAT();
513 
516  {
517  virtual ~CongestionControl() { }
518  virtual unsigned HandleTransmitPacket(unsigned sessionID, uint32_t ssrc) = 0;
519  virtual void HandleReceivePacket(unsigned sn, const PTime & received) = 0;
520  virtual PTimeInterval GetProcessInterval() const = 0;
521  virtual bool ProcessReceivedPackets() = 0;
522  virtual void ProcessTWCC(RTP_TransportWideCongestionControl & twcc) = 0;
523  };
524 
525  CongestionControl * SetCongestionControl(CongestionControl * cc);
527 
528 #if OPAL_STATISTICS
529 
531  virtual void GetStatistics(OpalMediaStatistics & statistics) const;
532 #endif
533 
534  protected:
535  virtual void InternalClose();
536  virtual bool GarbageCollection(); // Override from PSafeObject
537  virtual void InternalRxData(SubChannels subchannel, const PBYTEArray & data);
538  virtual PTimeInterval GetTimeout() const { return m_mediaTimeout; }
539 
540  PString m_name;
542  PINDEX m_packetSize;
544  PTimeInterval m_mediaTimeout;
545  PSimpleTimer m_mediaTimer;
546  PTimeInterval m_maxNoTransmitTime;
547  atomic<bool> m_opened;
548  atomic<bool> m_established;
549  atomic<bool> m_started;
550 
551  atomic<CongestionControl *> m_congestionControl;
552  PTimer m_ccTimer;
553  PDECLARE_NOTIFIER(PTimer, OpalMediaTransport, ProcessCongestionControl);
554 
561  };
562 #if PTRACING
563  friend ostream & operator<<(ostream & strm, RemoteAddressSources source);
564 #endif
565 
566  struct ChannelInfo
567  {
568  ChannelInfo(
569  OpalMediaTransport & owner,
570  SubChannels subchannel,
571  PChannel * channel
572  );
573 
574  void ThreadMain();
575  bool HandleUnavailableError();
576 
577  typedef PNotifierListTemplate<PBYTEArray> NotifierList;
579 
582  PChannel * const m_channel;
583  PThread * m_thread;
589 
590  PTRACE_THROTTLE(m_throttleWritePacket,3,60000); // 10 Minutes
591  PTRACE_THROTTLE(m_throttleReadPacket,3,60000);
592  PTRACE_PARAM(bool m_logFirstRead);
593 
594 #if defined(__GNUC__) && __cplusplus < 201103
595  void operator=(const ChannelInfo &) { }
596 #endif
597  };
598  friend struct ChannelInfo;
599  typedef vector<ChannelInfo> ChannelArray;
601  void AddChannel(PChannel * channel);
602  virtual PChannel * AddWrapperChannels(SubChannels subchannel, PChannel * channel);
603 };
604 
605 typedef PSafePtr<OpalMediaTransport, PSafePtrMultiThreaded> OpalMediaTransportPtr;
606 
607 
609 {
610  public:
611  OpalTCPMediaTransport(const PString & name);
612 
613  virtual bool Open(OpalMediaSession & session, PINDEX count, const PString & localInterface, const OpalTransportAddress & remoteAddress);
614  virtual bool SetRemoteAddress(const OpalTransportAddress & remoteAddress, PINDEX = e_Media);
615  virtual bool Write(const void * data, PINDEX length, SubChannels = e_Media, const PIPSocketAddressAndPort * = NULL, int * = NULL);
616 };
617 
618 
622 {
624  public:
625  OpalUDPMediaTransport(const PString & name);
626 
627  virtual bool Open(OpalMediaSession & session, PINDEX count, const PString & localInterface, const OpalTransportAddress & remoteAddress);
628  virtual bool SetRemoteAddress(const OpalTransportAddress & remoteAddress, SubChannels subchannel = e_Media);
629  virtual bool Write(const void * data, PINDEX length, SubChannels = e_Media, const PIPSocketAddressAndPort * = NULL, int * = NULL);
630 
631  PUDPSocket * GetSubChannelAsSocket(SubChannels subchannel = e_Media) const;
632 
633  protected:
634  virtual void InternalRxData(SubChannels subchannel, const PBYTEArray & data);
635  virtual bool InternalSetRemoteAddress(const PIPSocket::AddressAndPort & ap, SubChannels subchannel, RemoteAddressSources source);
636  virtual bool InternalOpenPinHole(PUDPSocket & socket);
637 
639  vector<PUDPSocket *> m_socketCache;
640 };
641 
642 
644 
647 class OpalMediaSession : public PSafeObject, public OpalMediaTransportChannelTypes
648 {
649  PCLASSINFO(OpalMediaSession, PSafeObject);
650  private:
651  PDECLARE_INSTRUMENTED_READ_WRITE_MUTEX(m_instrumentedMutex, OpalMediaSession, 500, 100);
652  public:
654  struct Init {
656  OpalConnection & connection,
657  unsigned sessionId,
658  const OpalMediaType & mediaType,
659  bool remoteBehindNAT
660  ) : m_connection(connection)
661  , m_sessionId(sessionId)
662  , m_mediaType(mediaType)
663  , m_remoteBehindNAT(remoteBehindNAT)
664  { }
665 
666 
668  unsigned m_sessionId;
671  };
672 
673  protected:
674  OpalMediaSession(const Init & init);
675 
676  public:
678 
679  virtual void PrintOn(ostream & strm) const;
680 
683  virtual const PCaselessString & GetSessionType() const = 0;
684 
687  virtual bool Open(
688  const PString & localInterface,
689  const OpalTransportAddress & remoteAddress
690  ) = 0;
691 
694  virtual bool IsOpen() const;
695 
698  virtual void Start();
699 
702  virtual bool IsEstablished() const;
703 
706  virtual bool Close();
707 
712  virtual OpalTransportAddress GetLocalAddress(bool isMediaAddress = true) const;
713 
718  virtual OpalTransportAddress GetRemoteAddress(bool isMediaAddress = true) const;
719 
724  virtual bool SetRemoteAddress(const OpalTransportAddress & remoteAddress, bool isMediaAddress = true);
725 
728  virtual void AttachTransport(const OpalMediaTransportPtr & transport);
729 
736  virtual OpalMediaTransportPtr DetachTransport();
737 
741  OpalMediaTransportPtr GetTransport() const { return m_transport; }
742 
745  virtual bool UpdateMediaFormat(
746  const OpalMediaFormat & mediaFormat
747  );
748 
749  static const PString & GetBundleGroupId();
750 
754  virtual bool AddGroup(
755  const PString & groupId,
756  const PString & mediaId,
757  bool overwrite = true
758  );
759 
763  bool IsGroupMember(
764  const PString & groupId
765  ) const;
766 
769  PStringArray GetGroups() const;
770 
775  PString GetGroupMediaId(
776  const PString & groupId
777  ) const;
778 
779 #if OPAL_SDP
780 
782  virtual SDPMediaDescription * CreateSDPMediaDescription();
783 #endif
784 
788  const OpalMediaFormat & mediaFormat,
789  unsigned sessionID,
790  bool isSource
791  ) = 0;
792 
793 #if OPAL_STATISTICS
794 
796  virtual void GetStatistics(OpalMediaStatistics & statistics, bool receiver) const;
797 #endif
798 
800  void SetRemoteBehindNAT();
801  bool IsRemoteBehindNAT() const { return m_remoteBehindNAT; }
802 
805  void OfferCryptoSuite(const PString & cryptoSuite);
806 
811 
814  virtual bool ApplyCryptoKey(
815  OpalMediaCryptoKeyList & keys,
816  bool rx
817  );
818 
822  virtual OpalMediaCryptoKeyInfo * IsCryptoSecured(bool rx) const;
823 
827 
830  unsigned GetSessionID() const { return m_sessionId; }
831 
834  const OpalMediaType & GetMediaType() const { return m_mediaType; }
835 
838  const PStringOptions & GetStringOptions() const { return m_stringOptions; }
839 
842  void SetStringOptions(const PStringOptions & options) { m_stringOptions = options; }
843 
844  protected:
846  unsigned m_sessionId; // unique session ID
847  OpalMediaType m_mediaType; // media type for session
849  PStringOptions m_stringOptions;
850  PStringToString m_groups;
851 
852  OpalMediaTransportPtr m_transport;
854 
855  private:
856  OpalMediaSession(const OpalMediaSession & other) : PSafeObject(other), m_connection(other.m_connection) { }
857  void operator=(const OpalMediaSession &) { }
858 
859  P_REMOVE_VIRTUAL(bool, Open(const PString &), false);
860  P_REMOVE_VIRTUAL(OpalTransportAddress, GetLocalMediaAddress() const, 0);
861  P_REMOVE_VIRTUAL(OpalTransportAddress, GetRemoteMediaAddress() const, 0);
862  P_REMOVE_VIRTUAL(bool, SetRemoteMediaAddress(const OpalTransportAddress &), false);
863  P_REMOVE_VIRTUAL(OpalTransportAddress, GetRemoteControlAddress() const, 0);
864  P_REMOVE_VIRTUAL(bool, SetRemoteControlAddress(const OpalTransportAddress &), false);
865  P_REMOVE_VIRTUAL_VOID(SetRemoteUserPass(const PString &, const PString &));
866 };
867 
868 
877 {
879  public:
880  OpalDummySession(const Init & init);
881 #if OPAL_SDP
882  OpalDummySession(const Init & init, const PStringArray & sdpTokens);
883 #endif
884  OpalDummySession(const Init & init, const OpalTransportAddressArray & transports);
885  static const PCaselessString & SessionType();
886  virtual const PCaselessString & GetSessionType() const;
887  virtual bool Open(const PString & localInterface, const OpalTransportAddress & remoteAddress);
888  virtual bool IsOpen() const;
889  virtual OpalTransportAddress GetLocalAddress(bool isMediaAddress = true) const;
890  virtual OpalTransportAddress GetRemoteAddress(bool isMediaAddress = true) const;
891  virtual bool SetRemoteAddress(const OpalTransportAddress & remoteAddress, bool isMediaAddress = true);
892  virtual void AttachTransport(const OpalMediaTransportPtr &);
893  virtual OpalMediaTransportPtr DetachTransport();
894 #if OPAL_SDP
895  virtual SDPMediaDescription * CreateSDPMediaDescription();
896 #endif
897  virtual OpalMediaStream * CreateMediaStream(const OpalMediaFormat & mediaFormat, unsigned sessionID, bool isSource);
898 
899  private:
900 #if OPAL_SDP
901  PStringArray m_sdpTokens;
902 #endif
903  OpalTransportAddress m_localTransportAddress[2];
904  OpalTransportAddress m_remoteTransportAddress[2];
905 };
906 
907 
908 typedef PParamFactory<OpalMediaSession, const OpalMediaSession::Init &, PCaselessString> OpalMediaSessionFactory;
909 
910 #if OPAL_SRTP
911  PFACTORY_LOAD(OpalSRTPSession);
912 #endif
913 
914 #if OPAL_H235_6
915  PFACTORY_LOAD(H2356_Session);
916 #endif
917 
918 #endif // OPAL_OPAL_MEDIASESSION_H
PTime m_lastPacketNetTime
Definition: mediasession.h:137
virtual const PCaselessString & GetFactoryName() const =0
PTimeInterval m_usedCPU
Definition: mediasession.h:237
virtual void PrintOn(ostream &strm) const
unsigned GetBitRate() const
Definition: mediasession.h:247
virtual const PCaselessString & GetSessionType() const =0
const OpalMediaType & GetMediaType() const
Definition: mediasession.h:834
void SetRemoteBehindNAT()
Indicate remote is behind NAT.
OpalDummySession(const Init &init)
static List FindAll(const PStringArray &cryptoSuiteNames, const char *prefix=NULL)
int m_resolutionX
Definition: mediasession.h:194
virtual bool IsOpen() const
virtual bool Supports(const PCaselessString &proto) const =0
PString m_errorText
Definition: mediasession.h:203
PString GetCurrentFrameRate(const char *units="", unsigned significantFigures=0) const
virtual void Start()
PString GetCurrentPacketRate(const char *units="", unsigned significantFigures=0) const
Definition: mediasession.h:256
PString GetCPU() const
PString m_name
Definition: mediasession.h:540
virtual bool InternalOpenPinHole(PUDPSocket &socket)
unsigned m_droppedFrames
Definition: mediasession.h:153
virtual OpalMediaStream * CreateMediaStream(const OpalMediaFormat &mediaFormat, unsigned sessionID, bool isSource)
PINDEX GetCipherKeyBytes() const
Definition: mediasession.h:347
unsigned m_keyFrames
Definition: mediasession.h:152
PTimeInterval m_maxNoTransmitTime
Definition: mediasession.h:546
unsigned GetLossRate() const
Definition: mediasession.h:249
PTime m_previousUpdateTime
Definition: mediasession.h:230
static const PCaselessString & SessionType()
virtual void PrintOn(ostream &strm) const
Definition: mediasession.h:876
int m_txPages
Definition: mediasession.h:190
virtual void InternalRxData(SubChannels subchannel, const PBYTEArray &data)
virtual bool InternalSetRemoteAddress(const PIPSocket::AddressAndPort &ap, SubChannels subchannel, RemoteAddressSources source)
Definition: mediasession.h:65
PTime m_lastUpdateTime
Definition: mediasession.h:229
uint64_t m_totalBytes
Definition: mediasession.h:112
void RemoveReadNotifier(const ReadNotifier &notifier, SubChannels subchannel=e_Media)
Remove the read notifier.
unsigned m_previousFrames
Definition: mediasession.h:235
virtual bool SetRemoteAddress(const OpalTransportAddress &remoteAddress, PINDEX=e_Media)
void IncrementUpdateCount(bool full)
unsigned GetRateInt(int64_t current, int64_t previous) const
int m_mtuDiscoverMode
Definition: mediasession.h:543
int m_rxPages
Definition: mediasession.h:191
virtual bool Open(const PString &localInterface, const OpalTransportAddress &remoteAddress)=0
virtual bool ChangeSessionType(PCaselessString &mediaSession, KeyExchangeModes modes) const =0
OpalTransportAddress m_localAddress
Definition: mediasession.h:104
virtual unsigned HandleTransmitPacket(unsigned sessionID, uint32_t ssrc)=0
unsigned m_targetBitRate
Definition: mediasession.h:139
Definition: mediasession.h:99
void AddChannel(PChannel *channel)
OpalConnection & GetConnection() const
Definition: mediasession.h:826
int m_pageHeight
Definition: mediasession.h:197
PSimpleTimer m_mediaTimer
Definition: mediasession.h:545
P_DEPRECATED PString GetRate(int64_t current, int64_t previous, const char *units="", unsigned significantFigures=0) const
Definition: mediasession.h:273
const OpalMediaCryptoSuite & m_cryptoSuite
Definition: mediasession.h:308
FaxCompression m_compression
Definition: mediasession.h:188
Initialisation information for constructing a session.
Definition: mediasession.h:654
OpalConnection & m_connection
Definition: mediasession.h:667
Definition: mediasession.h:380
Definition: mediasession.h:647
virtual bool IsEstablished() const
int m_averageJitter
Definition: mediasession.h:131
unsigned m_tsto
Definition: mediasession.h:161
CongestionControl * SetCongestionControl(CongestionControl *cc)
Definition: h323caps.h:95
bool IsRemoteBehindNAT() const
Definition: mediasession.h:801
Definition: mediasession.h:176
int m_maximumJitter
Definition: mediasession.h:132
PStringArray GetGroups() const
unsigned GetPacketRate() const
Definition: mediasession.h:248
Definition: mediasession.h:556
PString m_transportName
Definition: mediasession.h:103
bool m_errorCorrection
Definition: mediasession.h:189
PSimpleTimer m_timeForUnavailableErrors
Definition: mediasession.h:585
Definition: mediasession.h:376
virtual bool SetRemoteAddress(const OpalTransportAddress &remoteAddress, SubChannels subchannel=e_Media)
virtual const PCaselessString & GetSessionType() const
virtual void InternalRxData(SubChannels subchannel, const PBYTEArray &data)
virtual bool SetAuthSalt(const PBYTEArray &key)=0
PTime m_lastReportTime
Definition: mediasession.h:138
virtual bool IsEstablished() const
Definition: mediasession.h:321
Definition: mediatype.h:66
unsigned GetSessionID() const
Definition: mediasession.h:830
Definition: mediasession.h:282
unsigned m_sessionId
Definition: mediasession.h:846
int m_videoQuality
Definition: mediasession.h:162
virtual PBYTEArray GetCipherKey() const =0
unsigned m_controlPacketsOut
Definition: mediasession.h:115
void AddReadNotifier(const ReadNotifier &notifier, SubChannels subchannel=e_Media)
virtual bool UpdateMediaFormat(const OpalMediaFormat &mediaFormat)
Definition: mediasession.h:608
OpalTransportAddress m_remoteAddress
Definition: mediasession.h:587
FaxCompression
Definition: mediasession.h:175
virtual bool Write(const void *data, PINDEX length, SubChannels=e_Media, const PIPSocketAddressAndPort *=NULL, int *=NULL)
atomic< bool > m_started
Definition: mediasession.h:549
virtual OpalMediaTransportPtr DetachTransport()
bool m_remoteBehindNAT
Definition: mediasession.h:848
void OfferCryptoSuite(const PString &cryptoSuite)
OpalMediaCryptoSuite()
Definition: mediasession.h:325
virtual OpalTransportAddress GetLocalAddress(bool isMediaAddress=true) const
OpalMediaTransportPtr m_transport
Definition: mediasession.h:852
PTime m_lastKeyFrameTime
Definition: mediasession.h:154
virtual bool SetRemoteAddress(const OpalTransportAddress &remoteAddress, SubChannels subchannel=e_Media)
PFACTORY_LOAD(OpalPluginCodecManager)
int m_result
Definition: mediasession.h:185
uint32_t m_rtxSSRC
Definition: mediasession.h:117
virtual PString GetType()
Return the type of the transport.
NotifierList m_notifiers
Definition: mediasession.h:578
virtual bool Close()
virtual void InternalClose()
OpalFaxStatistics & m_fax
Definition: mediasession.h:270
Definition: mediasession.h:381
OpalTCPMediaTransport(const PString &name)
int m_imageSize
Definition: mediasession.h:193
virtual OpalTransportAddress GetRemoteAddress(bool isMediaAddress=true) const
virtual bool IsOpen() const
PINDEX m_packetSize
Definition: mediasession.h:542
char m_phase
Definition: mediasession.h:186
unsigned m_totalPackets
Definition: mediasession.h:113
unsigned m_previousPackets
Definition: mediasession.h:232
Definition: mediasession.h:173
Definition: mediasession.h:225
struct OpalMediaStatistics::UpdateInfo m_updateInfo
virtual void ProcessTWCC(RTP_TransportWideCongestionControl &twcc)=0
Definition: mediasession.h:370
Definition: mediafmt.h:112
Definition: mediasession.h:166
RemoteAddressSources
Definition: mediasession.h:555
void Select(iterator &it)
OpalMediaTransportPtr GetTransport() const
Definition: mediasession.h:741
PNotifierTemplate< PBYTEArray > ReadNotifier
Definition: mediasession.h:486
int m_roundTripTime
Definition: mediasession.h:134
PString m_stationId
Definition: mediasession.h:202
virtual OpalTransportAddress GetLocalAddress(bool isMediaAddress=true) const
PChannel * GetChannel(SubChannels subchannel=e_Media) const
static const PCaselessString & ClearText()
unsigned m_fullUpdateRequests
Definition: mediasession.h:155
int m_errorCorrectionRetries
Definition: mediasession.h:200
OpalMediaType m_mediaType
Definition: mediasession.h:669
atomic< CongestionControl * > m_congestionControl
Definition: mediasession.h:551
PString GetAverageBitRate(const char *units="", unsigned significantFigures=0) const
Definition: mediasession.h:253
virtual PINDEX GetCipherKeyBits() const =0
bool m_remoteBehindNAT
Definition: mediasession.h:541
PString m_tag
Definition: mediasession.h:309
virtual void AttachTransport(const OpalMediaTransportPtr &)
int m_NACKs
Definition: mediasession.h:116
SubChannels const m_subchannel
Definition: mediasession.h:581
Definition: mediasession.h:312
OpalMediaSession(const Init &init)
PChannel *const m_channel
Definition: mediasession.h:582
virtual OpalMediaCryptoKeyInfo * IsCryptoSecured(bool rx) const
int m_totalPages
Definition: mediasession.h:192
int m_rtxDuplicates
Definition: mediasession.h:119
OpalMediaTransport & m_owner
Definition: mediasession.h:580
Definition: mediafmt.h:806
bool m_remoteBehindNAT
Definition: mediasession.h:670
Definition: mediasession.h:172
atomic< bool > m_established
Definition: mediasession.h:548
virtual bool GarbageCollection()
Definition: mediasession.h:377
bool IsValid() const
int m_lateOutOfOrder
Definition: mediasession.h:125
virtual bool AddGroup(const PString &groupId, const PString &mediaId, bool overwrite=true)
Init(OpalConnection &connection, unsigned sessionId, const OpalMediaType &mediaType, bool remoteBehindNAT)
Definition: mediasession.h:655
PTimer m_ccTimer
Definition: mediasession.h:552
Definition: mediasession.h:170
int m_FEC
Definition: mediasession.h:120
vector< ChannelInfo > ChannelArray
Definition: mediasession.h:599
const PString & GetTag() const
Definition: mediasession.h:305
PNotifierListTemplate< PBYTEArray > NotifierList
Definition: mediasession.h:577
virtual bool IsOpen() const
virtual void AttachTransport(const OpalMediaTransportPtr &transport)
virtual PTimeInterval GetProcessInterval() const =0
unsigned m_sessionId
Definition: mediasession.h:668
virtual OpalMediaCryptoKeyInfo * CreateKeyInfo() const =0
OpalMediaTransport(const PString &name)
unsigned m_previousLost
Definition: mediasession.h:233
PSafePtr< OpalMediaTransport, PSafePtrMultiThreaded > OpalMediaTransportPtr
Definition: mediasession.h:605
OpalTransportAddress m_remoteAddress
Definition: mediasession.h:105
int m_pageWidth
Definition: mediasession.h:196
List()
Definition: mediasession.h:356
unsigned m_consecutiveUnavailableErrors
Definition: mediasession.h:584
virtual OpalMediaTransportPtr DetachTransport()
uint64_t m_previousBytes
Definition: mediasession.h:231
int m_jitterBufferDelay
Definition: mediasession.h:133
PThread * m_thread
Definition: mediasession.h:583
Definition: mediasession.h:621
OpalMediaStatistics & operator=(const OpalMediaStatistics &other)
static const PString & GetBundleGroupId()
unsigned m_controlPacketsIn
Definition: mediasession.h:114
OpalMediaStatistics & Update(const OpalMediaStream &stream)
PTimeInterval m_updateResponseTime
Definition: mediasession.h:158
PParamFactory< OpalMediaSession, const OpalMediaSession::Init &, PCaselessString > OpalMediaSessionFactory
Definition: mediasession.h:908
virtual void PrintOn(ostream &strm) const
virtual OpalMediaCryptoKeyList & GetOfferedCryptoKeys()
Congestion control handling.
Definition: mediasession.h:515
PINDEX GetAuthSaltBytes() const
Definition: mediasession.h:348
virtual bool SetRemoteAddress(const OpalTransportAddress &remoteAddress, bool isMediaAddress=true)
virtual PTimeInterval GetTimeout() const
Definition: mediasession.h:538
virtual void PrintOn(ostream &strm) const
int m_maxConsecutiveLost
Definition: mediasession.h:123
bool IsGroupMember(const PString &groupId) const
virtual ~CongestionControl()
Definition: mediasession.h:517
ostream & operator<<(ostream &strm, OpalSilenceDetector::Mode mode)
virtual bool FromString(const PString &str)=0
int m_packetsLost
Definition: mediasession.h:122
PString GetRateStr(int64_t total, const char *units="", unsigned significantFigures=0) const
PFactory< OpalMediaCryptoSuite, PCaselessString > OpalMediaCryptoSuiteFactory
Definition: mediasession.h:367
PString GetCurrentBitRate(const char *units="", unsigned significantFigures=0) const
Definition: mediasession.h:254
SubChannels
Definition: mediasession.h:372
virtual PString ToString() const =0
PString GetPacketLossRate(const char *units="", unsigned significantFigures=0) const
Definition: mediasession.h:257
const PString & GetName() const
Return name of the transport.
Definition: mediasession.h:404
PTRACE_PARAM(bool m_logFirstRead)
int m_maximumPacketTime
Definition: mediasession.h:130
float m_targetFrameRate
Definition: mediasession.h:140
int m_badRows
Definition: mediasession.h:198
Definition: mediasession.h:143
RemoteAddressSources m_remoteAddressSource
Definition: mediasession.h:588
unsigned m_pictureLossRequests
Definition: mediasession.h:156
virtual OpalTransportAddress GetRemoteAddress(bool isMediaAddress=true) const
virtual void Randomise()=0
int m_mostBadRows
Definition: mediasession.h:199
virtual bool ApplyCryptoKey(OpalMediaCryptoKeyList &keys, bool rx)
PTimeInterval m_mediaTimeout
Definition: mediasession.h:544
PTime m_lastPacketAbsTime
Definition: mediasession.h:136
virtual bool Open(OpalMediaSession &session, PINDEX count, const PString &localInterface, const OpalTransportAddress &remoteAddress)
Definition: mediasession.h:171
virtual void SetCandidates(const PString &user, const PString &pass, const PNatCandidateList &candidates)
PString m_mediaFormat
Definition: mediasession.h:70
friend ostream & operator<<(ostream &strm, FaxCompression compression)
OpalMediaCryptoKeyInfo(const OpalMediaCryptoSuite &cryptoSuite)
Definition: mediasession.h:286
void IncrementFrames(bool key)
PTRACE_THROTTLE(m_throttleWritePacket, 3, 60000)
OpalUDPMediaTransport(const PString &name)
virtual OpalTransportAddress GetLocalAddress(SubChannels subchannel=e_Media) const
int m_packetsOutOfOrder
Definition: mediasession.h:124
int m_resolutionY
Definition: mediasession.h:195
unsigned m_frameHeight
Definition: mediasession.h:160
virtual bool IsValid() const =0
PStringToString m_groups
Definition: mediasession.h:850
Definition: mediasession.h:178
Definition: mediasession.h:378
virtual bool SetRemoteAddress(const OpalTransportAddress &remoteAddress, bool isMediaAddress=true)
Definition: mediastrm.h:110
virtual void GetStatistics(OpalMediaStatistics &statistics) const
int m_averagePacketTime
Definition: mediasession.h:129
PString GetAverageFrameRate(const char *units="", unsigned significantFigures=0) const
int m_minimumPacketTime
Definition: mediasession.h:128
virtual bool Write(const void *data, PINDEX length, SubChannels subchannel=e_Media, const PIPSocketAddressAndPort *remote=NULL, int *mtu=NULL)=0
PStringOptions m_stringOptions
Definition: mediasession.h:849
ChannelInfo(OpalMediaTransport &owner, SubChannels subchannel, PChannel *channel)
int m_lastPacketRTP
Definition: mediasession.h:135
Definition: connection.h:415
ChannelArray m_subchannels
Definition: mediasession.h:600
vector< PUDPSocket * > m_socketCache
Definition: mediasession.h:639
virtual void GetStatistics(OpalMediaStatistics &statistics, bool receiver) const
void SetMediaTimeout(const PTimeInterval &t)
P_DECLARE_BITWISE_ENUM(KeyExchangeModes, 3,(e_NoMode, e_AllowClear, e_SecureSignalling, e_InBandKeyEchange))
Definition: mediasession.h:354
OpalMediaType m_mediaType
Definition: mediasession.h:847
virtual bool Open(OpalMediaSession &session, PINDEX count, const PString &localInterface, const OpalTransportAddress &remoteAddress)
OpalTransportAddress m_localAddress
Definition: mediasession.h:586
OpalMediaCryptoKeyList m_offeredCryptokeys
Definition: mediasession.h:853
PTimeInterval m_previousCPU
Definition: mediasession.h:238
virtual bool Open(const PString &localInterface, const OpalTransportAddress &remoteAddress)
int m_packetOverruns
Definition: mediasession.h:127
virtual bool GetCandidates(PString &user, PString &pass, PNatCandidateList &candidates, bool offering)
virtual bool Open(OpalMediaSession &session, PINDEX count, const PString &localInterface, const OpalTransportAddress &remoteAddress)=0
atomic< bool > m_opened
Definition: mediasession.h:547
bool m_localHasRestrictedNAT
Definition: mediasession.h:638
PTime m_startTime
Definition: mediasession.h:111
PUDPSocket * GetSubChannelAsSocket(SubChannels subchannel=e_Media) const
OpalMediaType m_mediaType
Definition: mediasession.h:69
PString GetGroupMediaId(const PString &groupId) const
Definition: mediasession.h:210
int m_bitRate
Definition: mediasession.h:187
Definition: mediasession.h:560
Definition: mediasession.h:375
Definition: transports.h:151
Definition: transports.h:326
virtual const char * GetDescription() const =0
CongestionControl * GetCongestionControl() const
Definition: mediasession.h:526
Definition: mediasession.h:392
int m_rtxPackets
Definition: mediasession.h:118
virtual OpalMediaStream * CreateMediaStream(const OpalMediaFormat &mediaFormat, unsigned sessionID, bool isSource)=0
PThreadIdentifier m_threadIdentifier
Definition: mediasession.h:74
int m_payloadType
Definition: mediasession.h:72
Definition: mediasession.h:566
OpalConnection & m_connection
Definition: mediasession.h:845
virtual OpalTransportAddress GetRemoteAddress(SubChannels subchannel=e_Media) const
Definition: mediasession.h:179
unsigned GetFrameRate() const
Definition: mediasession.h:263
int m_unrecovered
Definition: mediasession.h:121
const PStringOptions & GetStringOptions() const
Definition: mediasession.h:838
const OpalMediaCryptoSuite & GetCryptoSuite() const
Definition: mediasession.h:302
void SetDiscoverMTU(int mode)
Definition: mediasession.h:510
void SetStringOptions(const PStringOptions &options)
Definition: mediasession.h:842
virtual PChannel * AddWrapperChannels(SubChannels subchannel, PChannel *channel)
virtual PBYTEArray GetAuthSalt() const =0
unsigned m_totalFrames
Definition: mediasession.h:151
virtual PINDEX GetAuthSaltBits() const =0
virtual bool SetCipherKey(const PBYTEArray &key)=0
uint32_t m_SSRC
Definition: mediasession.h:71
Definition: mediasession.h:177
virtual ~OpalMediaCryptoKeyInfo()
Definition: mediasession.h:289
virtual void Start()
virtual void HandleReceivePacket(unsigned sn, const PTime &received)=0
void SetTag(const PString &tag)
Definition: mediasession.h:304
PDECLARE_NOTIFIER(PTimer, OpalMediaTransport, ProcessCongestionControl)
unsigned m_frameWidth
Definition: mediasession.h:159
virtual bool Write(const void *data, PINDEX length, SubChannels=e_Media, const PIPSocketAddressAndPort *=NULL, int *=NULL)
PTime m_lastUpdateRequestTime
Definition: mediasession.h:157
PString GetAveragePacketRate(const char *units="", unsigned significantFigures=0) const
Definition: mediasession.h:255
Definition: mediasession.h:379
int m_packetsTooLate
Definition: mediasession.h:126