OPAL  Version 3.18.8
opalmixer.h
Go to the documentation of this file.
1 /*
2  * opalmixer.h
3  *
4  * OPAL media mixers
5  *
6  * Open Phone Abstraction Library (OPAL)
7  * Formally known as the Open H323 project.
8  *
9  * Copyright (C) 2007 Post Increment
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 Post Increment
24  *
25  * Contributor(s): Craig Southeren (craigs@postincrement.com)
26  * Robert Jongbloed (robertj@voxlucida.com.au)
27  */
28 
29 
30 #ifndef OPAL_OPAL_OPALMIXER_H
31 #define OPAL_OPAL_OPALMIXER_H
32 
33 #ifndef _PTLIB_H
34 #include <ptlib.h>
35 #endif
36 
37 #include <opal_config.h>
38 
39 #if OPAL_HAS_MIXER
40 
41 #include <queue>
42 
43 #include <ep/localep.h>
44 #include <codec/vidcodec.h>
45 
46 
47 class RTP_DataFrame;
48 class OpalJitterBuffer;
50 
51 
52 //#define OPAL_MIXER_AUDIO_DEBUG 1
53 
54 
55 #define OPAL_MIXER_PREFIX "mcu"
56 
57 #define OPAL_OPT_LISTEN_ONLY "Listen-Only"
58 #define OPAL_OPT_CONF_OWNER "Conference-Owner"
59 
60 
62 
72 class OpalBaseMixer : public PSmartObject
73 {
74  PCLASSINFO(OpalBaseMixer, PSmartObject);
75  public:
77  bool pushThread,
78  unsigned periodMS,
79  unsigned periodTS
80  );
81 
82  virtual ~OpalBaseMixer();
83 
84  typedef PString Key_T;
85 
88  virtual bool AddStream(
89  const Key_T & key
90  );
91 
94  virtual void RemoveStream(
95  const Key_T & key
96  );
97 
100  virtual void RemoveAllStreams();
101 
107  virtual bool WriteStream(
108  const Key_T & key,
109  const RTP_DataFrame & input
110  );
111 
121  virtual RTP_DataFrame * ReadMixed();
122  virtual bool ReadMixed(RTP_DataFrame & mixed);
123 
134  virtual bool OnMixed(
135  RTP_DataFrame * & mixed
136  );
137 
141  virtual void StartPushThread();
142 
149  virtual bool OnPush();
150 
155  void StopPushThread(bool lock = true);
156 
159  unsigned GetPeriodMS() const { return m_periodMS; }
160 
163  unsigned GetPeriodTS() const { return m_periodTS; }
164 
165  protected:
166  struct Stream : public PObject {
167  virtual ~Stream() { }
168  virtual void QueuePacket(const RTP_DataFrame & rtp) = 0;
169  std::queue<RTP_DataFrame> m_queue;
170  };
171  typedef std::map<Key_T, Stream *> StreamMap_T;
172 
173  virtual Stream * CreateStream() = 0;
174  virtual bool MixStreams(RTP_DataFrame & frame) = 0;
175  virtual size_t GetOutputSize() const = 0;
176 
177  void PushThreadMain();
178 
179  bool m_pushThread; // true if to use a thread to push data out
180  unsigned m_periodMS; // Mixing interval in milliseconds
181  unsigned m_periodTS; // Mixing interval in timestamp units
182 
183  StreamMap_T m_inputStreams; // Map of key to stream for input RTP frame queues
184  unsigned m_outputTimestamp; // RTP timestamp for output data
185  RTP_DataFrame * m_pushFrame; // Cached frame for pushing RTP
186  PThread * m_workerThread; // reader thread handle
187  bool m_threadRunning; // used to stop reader thread
188  PDECLARE_MUTEX(m_mutex); // mutex for list of streams and thread handle
189 };
190 
192 
202 {
203  PCLASSINFO(OpalAudioMixer, OpalBaseMixer);
204  public:
206  bool stereo = false,
207  unsigned sampleRate = OpalMediaFormat::AudioClockRate,
208  bool pushThread = true,
209  unsigned period = 10
210  );
211 
213 
216  virtual void RemoveStream(
217  const Key_T & key
218  );
219 
222  virtual void RemoveAllStreams();
223 
226  bool IsStereo() const { return m_stereo; }
227 
230  unsigned GetSampleRate() const { return m_sampleRate; }
231 
238  bool SetSampleRate(
239  unsigned rate
240  );
241 
248  bool SetJitterBufferSize(
249  const Key_T & key,
250  const OpalJitterBuffer::Init & init
251  );
252 
253  protected:
254  struct AudioStream : public Stream
255  {
256  AudioStream(OpalAudioMixer & mixer);
257  ~AudioStream();
258 
259  virtual void QueuePacket(const RTP_DataFrame & rtp);
260  const short * GetAudioDataPtr();
261 
264  unsigned m_nextTimestamp;
265  PShortArray m_cacheSamples;
267  };
268 
269  virtual Stream * CreateStream();
270  virtual bool MixStreams(RTP_DataFrame & frame);
271  virtual size_t GetOutputSize() const;
272 
273  void PreMixStreams();
274  void MixStereo(RTP_DataFrame & frame);
275  void MixAdditive(RTP_DataFrame & frame, const short * audioToSubtract);
276 
277  protected:
278  bool m_stereo;
279  unsigned m_sampleRate;
280 
283  std::vector<int> m_mixedAudio;
284 };
285 
286 
288 
289 #if OPAL_VIDEO
290 
298 {
299  PCLASSINFO(OpalVideoMixer, OpalBaseMixer);
300  public:
301  enum Styles {
321  };
322 
324  Styles style,
325  unsigned width,
326  unsigned height,
327  unsigned rate = 15,
328  bool pushThread = true
329  );
330 
332 
335  unsigned GetFrameWidth() const { return m_width; }
336 
339  unsigned GetFrameHeight() const { return m_height; }
340 
343  unsigned GetFrameRate() const { return 1000/m_periodMS; }
344 
348  virtual bool SetFrameRate(
349  unsigned rate // New frames per second.
350  );
351 
355  bool SetFrameSize(
356  unsigned width,
357  unsigned height
358  );
359 
360  protected:
361  struct VideoStream : public Stream
362  {
363  VideoStream(OpalVideoMixer & mixer);
364  virtual void QueuePacket(const RTP_DataFrame & rtp);
365  void InsertVideoFrame(unsigned x, unsigned y, unsigned w, unsigned h);
366 
368  };
369 
370  friend struct VideoStream;
371 
372  virtual Stream * CreateStream();
373  virtual bool MixStreams(RTP_DataFrame & frame);
374  virtual size_t GetOutputSize() const;
375 
376  virtual bool MixVideo();
377  virtual bool StartMix(unsigned & x, unsigned & y, unsigned & w, unsigned & h, unsigned & left);
378  virtual bool NextMix(unsigned & x, unsigned & y, unsigned & w, unsigned & h, unsigned & left);
379  void InsertVideoFrame(const StreamMap_T::iterator & it, unsigned x, unsigned y, unsigned w, unsigned h);
380 
381  protected:
383  unsigned m_width, m_height;
385 
386  PBYTEArray m_frameStore;
388 };
389 
390 #endif // OPAL_VIDEO
391 
392 
394 
395 
401 {
402  OpalMixerNodeInfo(const char * name = NULL)
403  : m_name(name)
404  , m_closeOnEmpty(false)
405  , m_listenOnly(false)
406  , m_sampleRate(OpalMediaFormat::AudioClockRate)
407 #if OPAL_VIDEO
408  , m_audioOnly(false)
409  , m_style(OpalVideoMixer::eGrid)
410  , m_width(PVideoFrameInfo::CIFWidth)
411  , m_height(PVideoFrameInfo::CIFHeight)
412  , m_rate(15)
413 #endif
414  , m_mediaPassThru(false)
415  { }
416 
417  virtual ~OpalMixerNodeInfo() { }
418 
419  virtual OpalMixerNodeInfo * Clone() const { return new OpalMixerNodeInfo(*this); }
420 
421  PString m_name;
424  unsigned m_sampleRate;
425 #if OPAL_VIDEO
426  bool m_audioOnly;
428  unsigned m_width;
429  unsigned m_height;
430  unsigned m_rate;
431 #endif
435  PString m_displayText;
436  PString m_subject;
437  PString m_notes;
438  PString m_keywords;
439 };
440 
441 
443 
444 class OpalMixerNode;
447 
448 
454 {
455  public:
461 
465  virtual ~OpalMixerNodeManager();
466 
469  virtual void ShutDown();
470 
476  virtual PBoolean GarbageCollection();
478 
487  virtual OpalMixerNode * CreateNode(
488  OpalMixerNodeInfo * info
489  );
490 
496  virtual PSafePtr<OpalMixerNode> AddNode(
497  OpalMixerNodeInfo * info
498  );
499 
502  void AddNode(OpalMixerNode * node);
503 
507  PSafePtr<OpalMixerNode> GetFirstNode(
508  PSafetyMode mode = PSafeReference
509  ) const { return PSafePtr<OpalMixerNode>(m_nodesByUID, mode); }
510 
514  virtual PSafePtr<OpalMixerNode> FindNode(
515  const PString & name,
516  PSafetyMode mode = PSafeReference
517  );
518 
523  virtual void RemoveNode(
524  OpalMixerNode & node
525  );
526 
529  bool AddNodeName(
530  PString name,
531  OpalMixerNode * node
532  );
533 
536  void RemoveNodeName(
537  PString name
538  );
539 
543  void RemoveNodeNames(
544  const PStringSet & names
545  );
546 
549  virtual PString CreateInternalURI(
550  const PGloballyUniqueID & guid
551  );
552 
557  virtual void OnNodeStatusChanged(
558  const OpalMixerNode & node,
560  );
561 
564 
565 #if OPAL_VIDEO
568 #endif
569 
571  OpalManager & GetManager() const { return m_manager; }
573 
574  protected:
576 
577  PSafeDictionary<PGloballyUniqueID, OpalMixerNode> m_nodesByUID;
578  PSafeDictionary<PString, OpalMixerNode> m_nodesByName;
579 };
580 
581 
583 
589 {
591  public:
597  OpalManager & manager,
598  const char * prefix = OPAL_MIXER_PREFIX
599  );
600 
604 
609  virtual void ShutDown();
611 
624  virtual OpalMediaFormatList GetMediaFormats() const;
625 
628  virtual PStringList GetAvailableStringOptions() const;
629 
657  virtual PSafePtr<OpalConnection> MakeConnection(
658  OpalCall & call,
659  const PString & party,
660  void * userData = NULL,
661  unsigned options = 0,
662  OpalConnection::StringOptions * stringOptions = NULL
663  );
664 
680  virtual bool GetConferenceStates(
681  OpalConferenceStates & states,
682  const PString & name = PString::Empty()
683  ) const;
684 
689  virtual PBoolean GarbageCollection();
691 
700  PSafePtr<OpalMixerConnection> GetMixerConnectionWithLock(
701  const PString & token,
702  PSafetyMode mode = PSafeReadWrite
703  ) { return GetConnectionWithLockAs<OpalMixerConnection>(token, mode); }
704 
709  PSafePtr<OpalMixerNode> node,
710  OpalCall & call,
711  void * userData,
712  unsigned options,
713  OpalConnection::StringOptions * stringOptions
714  );
715 
720  const PString & name
721  );
723 
738  void SetAdHocNodeInfo(
739  const OpalMixerNodeInfo & info
740  );
741  void SetAdHocNodeInfo(
742  OpalMixerNodeInfo * info
743  );
744 
757 
775  void SetFactoryNodeInfo(
776  const OpalMixerNodeInfo & info
777  );
778  void SetFactoryNodeInfo(
779  OpalMixerNodeInfo * info
780  );
781 
786  virtual PString GetNewFactoryName();
787 
791 
792  protected:
793  virtual PString CreateInternalURI(const PGloballyUniqueID & guid);
794  virtual void OnNodeStatusChanged(const OpalMixerNode & node, OpalConferenceState::ChangeType change);
795 
798  PDECLARE_MUTEX(m_infoMutex); // For above two fields
799  atomic<uint32_t> m_factoryIndex;
800 };
801 
802 
804 
808 {
810  public:
816  PSafePtr<OpalMixerNode> node,
817  OpalCall & call,
818  OpalMixerEndPoint & endpoint,
819  void * userData,
820  unsigned options = 0,
821  OpalConnection::StringOptions * stringOptions = NULL
822  );
823 
828 
848  virtual void OnReleased();
849 
856  virtual OpalMediaFormatList GetMediaFormats() const;
857 
873  const OpalMediaFormat & mediaFormat,
874  unsigned sessionID,
875  PBoolean isSource
876  );
877 
880  virtual void OnStartMediaPatch(
881  OpalMediaPatch & patch
882  );
883 
885  virtual void OnApplyStringOptions();
886 
893  virtual PBoolean SendUserInputString(
894  const PString & value
895  );
896 
913  virtual PBoolean SendUserInputTone(
914  char tone,
915  unsigned duration = 0
916  );
917 
930  virtual bool GetConferenceState(
931  OpalConferenceState * state
932  ) const;
934 
939  void SetListenOnly(
940  bool listenOnly
941  );
942 
945  bool GetListenOnly() const { return m_listenOnly; }
946 
949  PSafePtr<OpalMixerNode> GetNode() const { return m_node; }
951 
952  protected:
954  PSafePtr<OpalMixerNode> m_node;
956 };
957 
958 
963 {
965  public:
971  OpalConnection & conn,
972  const OpalMediaFormat & mediaFormat,
973  unsigned sessionID,
974  bool isSource,
975  PSafePtr<OpalMixerNode> node,
976  bool listenOnly
977  );
978 
983 
988  virtual PBoolean Open();
989 
995  virtual PBoolean WritePacket(
996  RTP_DataFrame & packet
997  );
998 
1002  virtual PBoolean IsSynchronous() const;
1003 
1014  virtual PBoolean RequiresPatchThread() const;
1016 
1021  PSafePtr<OpalMixerNode> GetNode() { return m_node; }
1023 
1024 #if OPAL_VIDEO
1025  bool CheckMixedVideoSize(unsigned width, unsigned height);
1026 #endif
1027 
1028  protected:
1029  virtual void InternalClose();
1030  virtual bool InternalSetJitterBuffer(const OpalJitterBuffer::Init & init);
1031 
1032  PSafePtr<OpalMixerNode> m_node;
1034 #if OPAL_VIDEO
1037 #endif
1038 };
1039 
1040 
1042 {
1043  public:
1045  void Append(const PSafePtr<OpalMixerMediaStream> & stream);
1046  void Remove(const PSafePtr<OpalMixerMediaStream> & stream) { m_outputStreams.RemoveAt(stream->GetID()); }
1047  void CloseOne(const PSafePtr<OpalMixerMediaStream> & stream);
1048 
1049  protected:
1050  typedef PSafeDictionary<PString, OpalMixerMediaStream> StreamDict;
1052 };
1053 
1058 {
1059  PCLASSINFO(OpalAudioStreamMixer, OpalAudioMixer);
1060  public:
1063 
1064  virtual bool OnPush();
1065 
1066  protected:
1068  {
1069  CachedAudio();
1070  ~CachedAudio();
1071  enum
1072  {
1074  } m_state;
1078  };
1079  std::map<PString, CachedAudio> m_cache;
1080 
1081  void PushOne(
1082  PSafePtr<OpalMixerMediaStream> & stream,
1083  CachedAudio & cache,
1084  const short * audioToSubtract
1085  );
1086 
1087 #ifdef OPAL_MIXER_AUDIO_DEBUG
1088  class PAudioMixerDebug * m_audioDebug;
1089 #endif
1090 };
1091 
1092 
1093 #if OPAL_VIDEO
1094 
1102 {
1103  PCLASSINFO(OpalVideoStreamMixer, OpalVideoMixer);
1104  public:
1107 
1108  virtual bool SetFrameRate(unsigned rate);
1109  virtual bool OnMixed(RTP_DataFrame * & output);
1110 
1111  protected:
1112  typedef PDictionary<PString, OpalTranscoder> TranscoderMap;
1114 };
1115 #endif // OPAL_VIDEO
1116 
1117 
1121 class OpalMixerNode : public PSafeObject
1122 {
1123  PCLASSINFO(OpalMixerNode, PSafeObject);
1124  public:
1129  OpalMixerNode(
1130  OpalMixerNodeManager & manager,
1131  OpalMixerNodeInfo * info
1132  );
1133 
1136  ~OpalMixerNode();
1137 
1142  void ShutDown();
1144 
1151  void PrintOn(
1152  ostream & strm
1153  ) const;
1155 
1160  virtual void AttachConnection(
1161  OpalConnection * connection
1162  );
1163 
1166  virtual void DetachConnection(
1167  OpalConnection * connection
1168  );
1169 
1172  virtual bool AttachStream(
1173  OpalMixerMediaStream * stream
1174  );
1175 
1178  virtual void DetachStream(
1179  OpalMixerMediaStream * stream
1180  );
1181 
1184  virtual void UseMediaPassThrough(
1185  unsigned sessionID,
1186  OpalConnection * connection = NULL
1187  );
1188 
1195  bool SetJitterBufferSize(
1196  const OpalBaseMixer::Key_T & key,
1197  const OpalJitterBuffer::Init & init
1198  );
1199 
1202  bool WritePacket(
1203  const OpalMixerMediaStream & stream,
1204  const RTP_DataFrame & input
1205  );
1206 
1209  virtual void BroadcastUserInput(
1210  const OpalConnection * connection,
1211  const PString & value
1212  );
1213 
1226  virtual void GetConferenceState(
1227  OpalConferenceState & state
1228  ) const;
1230 
1235  const PGloballyUniqueID & GetGUID() const { return m_guid; }
1236 
1239  const PStringSet & GetNames() const { return m_names; }
1240 
1243  bool AddName(
1244  const PString & name
1245  );
1246 
1249  void RemoveName(
1250  const PString & name
1251  );
1252 
1258  PINDEX GetConnectionCount() const { return m_connections.GetSize(); }
1259 
1262  template <class Subclass>
1263  PSafePtr<Subclass> GetFirstConnectionAs(
1264  PSafetyMode mode = PSafeReference
1265  ) const { return PSafePtr<Subclass>(m_connections, mode); }
1266 
1269  PSafePtr<OpalConnection> GetFirstConnection(
1270  PSafetyMode mode = PSafeReference
1271  ) const { return GetFirstConnectionAs<OpalConnection>(mode); }
1272 
1275  const OpalMixerNodeInfo & GetNodeInfo() { return *m_info; }
1276 
1279  const PTime & GetCreationTime() const { return m_creationTime; }
1280 
1288  const PString & connectionIdentifier
1289  ) { m_ownerConnection = connectionIdentifier; }
1291 
1292  protected:
1294  PGloballyUniqueID m_guid;
1295  PStringSet m_names;
1298  atomic<bool> m_shuttingDown;
1299 
1300  PSafeArray<OpalConnection> m_connections;
1302 
1304 #if OPAL_VIDEO
1305  typedef std::map<OpalVideoFormat::ContentRole, OpalVideoStreamMixer *> VideoMixerMap;
1307 #endif // OPAL_VIDEO
1308 
1309  typedef std::map<PString, OpalBaseMixer *> MixerByIdMap;
1311 };
1312 
1313 
1314 #endif // OPAL_HAS_MIXER
1315 
1316 #endif // OPAL_OPAL_OPAL_MIXER
1317 
1318 
virtual void AttachConnection(OpalConnection *connection)
unsigned m_mixedVideoWidth
Definition: opalmixer.h:1035
OpalAudioMixer(bool stereo=false, unsigned sampleRate=OpalMediaFormat::AudioClockRate, bool pushThread=true, unsigned period=10)
bool m_mediaPassThru
Definition: opalmixer.h:432
virtual PBoolean WritePacket(RTP_DataFrame &packet)
Definition: manager.h:150
PSafePtr< OpalMixerNode > GetFirstNode(PSafetyMode mode=PSafeReference) const
Definition: opalmixer.h:507
OpalTranscoder * m_transcoder
Definition: opalmixer.h:1077
Styles
Definition: opalmixer.h:301
std::map< Key_T, Stream * > StreamMap_T
Definition: opalmixer.h:171
PStringSet m_names
Definition: opalmixer.h:1295
AudioStream * m_right
Definition: opalmixer.h:282
virtual PBoolean GarbageCollection()
virtual PString CreateInternalURI(const PGloballyUniqueID &guid)
bool m_audioOnly
No video is to be allowed.
Definition: opalmixer.h:426
unsigned GetPeriodMS() const
Definition: opalmixer.h:159
PTime m_creationTime
Definition: opalmixer.h:1297
Definition: opalmixer.h:166
Definition: opalmixer.h:1067
virtual bool OnMixed(RTP_DataFrame *&output)
Definition: localep.h:469
OpalManager & GetManager() const
Get manager.
Definition: opalmixer.h:789
virtual Stream * CreateStream()=0
bool m_pushThread
Definition: opalmixer.h:179
OpalAudioMixer & m_mixer
Definition: opalmixer.h:262
PBYTEArray m_frameStore
Definition: opalmixer.h:386
atomic< bool > m_shuttingDown
Definition: opalmixer.h:1298
std::map< OpalVideoFormat::ContentRole, OpalVideoStreamMixer * > VideoMixerMap
Definition: opalmixer.h:1305
virtual Stream * CreateStream()
void Remove(const PSafePtr< OpalMixerMediaStream > &stream)
Definition: opalmixer.h:1046
bool m_listenOnly
Mixer only transmits data to &quot;listeners&quot;.
Definition: opalmixer.h:423
PString m_notes
Free text about conference.
Definition: opalmixer.h:437
PString m_displayText
Human readable text for conference name.
Definition: opalmixer.h:435
virtual OpalMixerNode * CreateNode(OpalMixerNodeInfo *info)
virtual bool MixVideo()
virtual bool GetConferenceStates(OpalConferenceStates &states, const PString &name=PString::Empty()) const
virtual bool SetFrameRate(unsigned rate)
virtual PBoolean GarbageCollection()
PSafePtr< OpalMixerNode > GetNode() const
Definition: opalmixer.h:949
atomic< uint32_t > m_factoryIndex
Definition: opalmixer.h:799
PSafePtr< OpalConnection > GetFirstConnection(PSafetyMode mode=PSafeReference) const
Definition: opalmixer.h:1269
StreamDict m_outputStreams
Definition: opalmixer.h:1051
BYTE m_bgFillGreen
Definition: opalmixer.h:384
unsigned m_width
Width of mixed video.
Definition: opalmixer.h:428
void CloseOne(const PSafePtr< OpalMixerMediaStream > &stream)
OpalJitterBuffer * m_jitter
Definition: opalmixer.h:263
PString m_keywords
Space separated list of keywords for conference.
Definition: opalmixer.h:438
PSafeDictionary< PGloballyUniqueID, OpalMixerNode > m_nodesByUID
Definition: opalmixer.h:577
std::map< PString, CachedAudio > m_cache
Definition: opalmixer.h:1079
void StopPushThread(bool lock=true)
Definition: opalmixer.h:1057
Definition: opalmixer.h:361
AudioStream * m_left
Definition: opalmixer.h:281
virtual OpalAudioStreamMixer * CreateAudioMixer(const OpalMixerNodeInfo &info)
Create the instance of the audio mixer.
unsigned m_height
Height of mixed video.
Definition: opalmixer.h:429
OpalManager & GetManager() const
Get manager.
Definition: opalmixer.h:571
bool m_stereo
Definition: opalmixer.h:278
Styles m_style
Definition: opalmixer.h:382
Definition: opalmixer.h:1041
virtual Stream * CreateStream()
Definition: opalmixer.h:962
unsigned m_mixedVideoHeight
Definition: opalmixer.h:1036
virtual void OnNodeStatusChanged(const OpalMixerNode &node, OpalConferenceState::ChangeType change)
PThread * m_workerThread
Definition: opalmixer.h:186
~OpalAudioMixer()
Definition: opalmixer.h:212
OpalMixerNodeInfo * m_adHocNodeInfo
Definition: opalmixer.h:796
OpalVideoMixer & m_mixer
Definition: opalmixer.h:367
virtual ~OpalBaseMixer()
virtual void OnNodeStatusChanged(const OpalMixerNode &node, OpalConferenceState::ChangeType change)
AudioStream(OpalAudioMixer &mixer)
virtual PBoolean SendUserInputTone(char tone, unsigned duration=0)
OpalVideoMixer(Styles style, unsigned width, unsigned height, unsigned rate=15, bool pushThread=true)
bool m_listenOnly
Definition: opalmixer.h:1033
virtual OpalMixerConnection * CreateConnection(PSafePtr< OpalMixerNode > node, OpalCall &call, void *userData, unsigned options, OpalConnection::StringOptions *stringOptions)
void Append(const PSafePtr< OpalMixerMediaStream > &stream)
MixerByIdMap m_mixerById
Definition: opalmixer.h:1310
Definition: opalmixer.h:453
OpalMixerConnection(PSafePtr< OpalMixerNode > node, OpalCall &call, OpalMixerEndPoint &endpoint, void *userData, unsigned options=0, OpalConnection::StringOptions *stringOptions=NULL)
enum OpalAudioStreamMixer::CachedAudio::@10 m_state
OpalAudioStreamMixer * m_audioMixer
Definition: opalmixer.h:1303
BYTE m_bgFillBlue
Definition: opalmixer.h:384
virtual void RemoveStream(const Key_T &key)
virtual void OnApplyStringOptions()
Call back for connection to act on changed string options.
Definition: opalmixer.h:400
VideoMixerMap m_videoMixers
Definition: opalmixer.h:1306
virtual bool AttachStream(OpalMixerMediaStream *stream)
size_t m_samplesUsed
Definition: opalmixer.h:266
virtual OpalVideoStreamMixer * CreateVideoMixer(const OpalMixerNodeInfo &info)
Create the instance of the video mixer.
bool IsStereo() const
Definition: opalmixer.h:226
unsigned GetFrameWidth() const
Definition: opalmixer.h:335
void PushOne(PSafePtr< OpalMixerMediaStream > &stream, CachedAudio &cache, const short *audioToSubtract)
void SetListenOnly(bool listenOnly)
OpalBaseMixer(bool pushThread, unsigned periodMS, unsigned periodTS)
PSafePtr< Subclass > GetFirstConnectionAs(PSafetyMode mode=PSafeReference) const
Definition: opalmixer.h:1263
PSafePtr< OpalMixerConnection > GetMixerConnectionWithLock(const PString &token, PSafetyMode mode=PSafeReadWrite)
Definition: opalmixer.h:700
Definition: mediafmt.h:112
virtual void QueuePacket(const RTP_DataFrame &rtp)
OpalManager & m_manager
Definition: opalmixer.h:575
virtual bool InternalSetJitterBuffer(const OpalJitterBuffer::Init &init)
void PreMixStreams()
void SetOwnerConnection(const PString &connectionIdentifier)
Definition: opalmixer.h:1287
PSafePtr< OpalMixerNode > m_node
Definition: opalmixer.h:1032
Initialisation information.
Definition: jitter.h:86
virtual void DetachStream(OpalMixerMediaStream *stream)
void SetAdHocNodeInfo(const OpalMixerNodeInfo &info)
Definition: opalmixer.h:1101
PDictionary< PString, OpalTranscoder > TranscoderMap
Definition: opalmixer.h:1112
TranscoderMap m_transcoders
Definition: opalmixer.h:1113
virtual void RemoveAllStreams()
virtual void UseMediaPassThrough(unsigned sessionID, OpalConnection *connection=NULL)
Definition: connection.h:530
PString m_subject
Subject for conference.
Definition: opalmixer.h:436
OpalMixerMediaStream(OpalConnection &conn, const OpalMediaFormat &mediaFormat, unsigned sessionID, bool isSource, PSafePtr< OpalMixerNode > node, bool listenOnly)
VideoStream(OpalVideoMixer &mixer)
virtual PBoolean SendUserInputString(const PString &value)
virtual OpalMixerNodeInfo * Clone() const
Definition: opalmixer.h:419
virtual PSafePtr< OpalMixerNode > AddNode(OpalMixerNodeInfo *info)
Definition: rtp.h:540
PDECLARE_MUTEX(m_infoMutex)
Definition: localep.h:63
Definition: opalmixer.h:297
bool SetFrameSize(unsigned width, unsigned height)
Definition: jitter.h:51
Definition: patch.h:56
size_t m_lastStreamCount
Definition: opalmixer.h:387
PSafeArray< OpalConnection > m_connections
Definition: opalmixer.h:1300
virtual void RemoveStream(const Key_T &key)
Definition: opalmixer.h:310
virtual bool NextMix(unsigned &x, unsigned &y, unsigned &w, unsigned &h, unsigned &left)
Definition: mediafmt.h:806
bool GetListenOnly() const
Definition: opalmixer.h:945
PShortArray m_cacheSamples
Definition: opalmixer.h:265
unsigned m_sampleRate
Definition: opalmixer.h:279
const PStringSet & GetNames() const
Definition: opalmixer.h:1239
virtual OpalMediaFormatList GetMediaFormats() const
virtual PSafePtr< OpalConnection > MakeConnection(OpalCall &call, const PString &party, void *userData=NULL, unsigned options=0, OpalConnection::StringOptions *stringOptions=NULL)
virtual void StartPushThread()
Definition: call.h:62
OpalMixerNodeManager(OpalManager &manager)
RTP_DataFrame m_raw
Definition: opalmixer.h:1075
const PGloballyUniqueID & GetGUID() const
Definition: opalmixer.h:1235
unsigned m_periodMS
Definition: opalmixer.h:180
virtual void OnReleased()
bool SetSampleRate(unsigned rate)
bool SetJitterBufferSize(const OpalBaseMixer::Key_T &key, const OpalJitterBuffer::Init &init)
virtual void GetConferenceState(OpalConferenceState &state) const
bool SetJitterBufferSize(const Key_T &key, const OpalJitterBuffer::Init &init)
virtual bool StartMix(unsigned &x, unsigned &y, unsigned &w, unsigned &h, unsigned &left)
bool WritePacket(const OpalMixerMediaStream &stream, const RTP_DataFrame &input)
Definition: opalmixer.h:320
Definition: opalmixer.h:588
Definition: opalmixer.h:201
virtual ~OpalMixerNodeManager()
unsigned GetFrameRate() const
Definition: opalmixer.h:343
unsigned GetSampleRate() const
Definition: opalmixer.h:230
bool m_closeOnEmpty
Mixer node is removed when last participant exits.
Definition: opalmixer.h:422
std::vector< int > m_mixedAudio
Definition: opalmixer.h:283
virtual PSafePtr< OpalMixerNode > FindNode(const PString &name, PSafetyMode mode=PSafeReference)
Definition: transcoders.h:134
virtual void QueuePacket(const RTP_DataFrame &rtp)=0
void RemoveName(const PString &name)
void SetFactoryNodeInfo(const OpalMixerNodeInfo &info)
virtual PBoolean Open()
RTP_DataFrame * m_pushFrame
Definition: opalmixer.h:185
void MixAdditive(RTP_DataFrame &frame, const short *audioToSubtract)
OpalMixerNodeInfo * m_info
Definition: opalmixer.h:1296
unsigned GetFrameHeight() const
Definition: opalmixer.h:339
virtual void OnStartMediaPatch(OpalMediaPatch &patch)
virtual void RemoveNode(OpalMixerNode &node)
Definition: opalmixer.h:807
virtual void RemoveAllStreams()
virtual void QueuePacket(const RTP_DataFrame &rtp)
OpalManager & GetManager() const
Definition: endpoint.h:839
void InsertVideoFrame(unsigned x, unsigned y, unsigned w, unsigned h)
bool AddName(const PString &name)
PString m_name
Name for mixer node.
Definition: opalmixer.h:421
virtual size_t GetOutputSize() const
Definition: opalmixer.h:302
const OpalMixerNodeInfo & GetNodeInfo()
Definition: opalmixer.h:1275
ChangeType
Definition: manager.h:76
Definition: opalmixer.h:1121
virtual bool MixStreams(RTP_DataFrame &frame)
unsigned m_nextTimestamp
Definition: opalmixer.h:264
bool m_listenOnly
Definition: opalmixer.h:955
virtual PStringList GetAvailableStringOptions() const
virtual bool OnMixed(RTP_DataFrame *&mixed)
PGloballyUniqueID m_guid
Definition: opalmixer.h:1294
unsigned m_height
Definition: opalmixer.h:383
OpalAudioStreamMixer(const OpalMixerNodeInfo &info)
unsigned m_width
Definition: opalmixer.h:383
PSafePtr< OpalMixerNode > GetNode()
Definition: opalmixer.h:1021
virtual void BroadcastUserInput(const OpalConnection *connection, const PString &value)
bool AddNodeName(PString name, OpalMixerNode *node)
virtual ~OpalMixerNodeInfo()
Definition: opalmixer.h:417
BYTE m_bgFillRed
Definition: opalmixer.h:384
Definition: manager.h:66
OpalMixerNodeInfo * m_factoryNodeInfo
Definition: opalmixer.h:797
Definition: opalmixer.h:306
virtual OpalMixerNodeInfo * FindNodeInfo(const PString &name)
PSafeDictionary< PString, OpalMixerNode > m_nodesByName
Definition: opalmixer.h:578
virtual bool OnPush()
~OpalVideoMixer()
Definition: opalmixer.h:331
#define OPAL_MIXER_PREFIX
Definition: opalmixer.h:55
virtual OpalMediaStream * CreateMediaStream(const OpalMediaFormat &mediaFormat, unsigned sessionID, PBoolean isSource)
virtual bool SetFrameRate(unsigned rate)
OpalMixerEndPoint(OpalManager &manager, const char *prefix=OPAL_MIXER_PREFIX)
OpalMixerNodeInfo * GetAdHocNodeInfo()
Definition: opalmixer.h:756
void PushThreadMain()
8kHz sample rate
Definition: mediafmt.h:1056
virtual size_t GetOutputSize() const
unsigned m_rate
Frame rate of mixed video.
Definition: opalmixer.h:430
RTP_DataFrame m_encoded
Definition: opalmixer.h:1076
Definition: mediastrm.h:110
Definition: opalmixer.h:254
void RemoveNodeName(PString name)
Definition: opalmixer.h:72
bool m_threadRunning
Definition: opalmixer.h:187
Definition: opalmixer.h:314
void PrintOn(ostream &strm) const
virtual bool GetConferenceState(OpalConferenceState *state) const
OpalMixerNode(OpalMixerNodeManager &manager, OpalMixerNodeInfo *info)
Definition: connection.h:415
std::list< OpalConferenceState > OpalConferenceStates
Definition: manager.h:131
PSafeDictionary< PString, OpalMixerMediaStream > StreamDict
Definition: opalmixer.h:1050
virtual void InternalClose()
void MixStereo(RTP_DataFrame &frame)
PSafePtr< OpalMixerNode > m_node
Definition: opalmixer.h:954
Definition: opalmixer.h:318
void InsertVideoFrame(const StreamMap_T::iterator &it, unsigned x, unsigned y, unsigned w, unsigned h)
virtual bool MixStreams(RTP_DataFrame &frame)
OpalMixerNodeManager & m_manager
Definition: opalmixer.h:1293
virtual ~Stream()
Definition: opalmixer.h:167
OpalVideoMixer::Styles m_style
Method for mixing video.
Definition: opalmixer.h:427
virtual bool WriteStream(const Key_T &key, const RTP_DataFrame &input)
virtual PString CreateInternalURI(const PGloballyUniqueID &guid)
virtual PBoolean IsSynchronous() const
const PTime & GetCreationTime() const
Definition: opalmixer.h:1279
void RemoveNodeNames(const PStringSet &names)
const short * GetAudioDataPtr()
unsigned m_sampleRate
Audio sample rate, usually 8000.
Definition: opalmixer.h:424
virtual bool MixStreams(RTP_DataFrame &frame)=0
PINDEX GetConnectionCount() const
Definition: opalmixer.h:1258
OpalMixerNodeInfo(const char *name=NULL)
Definition: opalmixer.h:402
virtual bool OnPush()
unsigned m_outputTimestamp
Definition: opalmixer.h:184
PString m_ownerConnection
Definition: opalmixer.h:1301
unsigned GetPeriodTS() const
Definition: opalmixer.h:163
virtual void ShutDown()
virtual RTP_DataFrame * ReadMixed()
virtual void DetachConnection(OpalConnection *connection)
std::queue< RTP_DataFrame > m_queue
Definition: opalmixer.h:169
std::map< PString, OpalBaseMixer * > MixerByIdMap
Definition: opalmixer.h:1309
virtual PString GetNewFactoryName()
virtual size_t GetOutputSize() const =0
StreamMap_T m_inputStreams
Definition: opalmixer.h:183
OpalMixerEndPoint & m_endpoint
Definition: opalmixer.h:953
OpalVideoStreamMixer(const OpalMixerNodeInfo &info)
virtual PBoolean RequiresPatchThread() const
virtual OpalMediaFormatList GetMediaFormats() const
PString Key_T
Definition: opalmixer.h:84
PDECLARE_MUTEX(m_mutex)
unsigned m_periodTS
Definition: opalmixer.h:181
bool CheckMixedVideoSize(unsigned width, unsigned height)
virtual bool AddStream(const Key_T &key)
virtual void ShutDown()