OPAL  Version 3.18.8
patch.h
Go to the documentation of this file.
1 /*
2  * patch.h
3  *
4  * Media stream patch thread.
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_OPAL_PATCH_H
29 #define OPAL_OPAL_PATCH_H
30 
31 #ifdef P_USE_PRAGMA
32 #pragma interface
33 #endif
34 
35 #include <opal_config.h>
36 
37 #include <opal/mediastrm.h>
38 #include <opal/mediasession.h>
39 #include <opal/mediacmd.h>
40 
41 #include <list>
42 
43 class OpalTranscoder;
44 
56 class OpalMediaPatch : public PSafeObject
57 {
58  PCLASSINFO(OpalMediaPatch, PObject);
59  private:
60  PDECLARE_INSTRUMENTED_READ_WRITE_MUTEX(m_instrumentedMutex, OpalMediaPatch, 500, 100);
61  public:
68  OpalMediaStream & source
69  );
70 
75 
82  void PrintOn(
83  ostream & strm
84  ) const;
86 
92  virtual void Start();
93 
102  virtual bool OnStartMediaPatch();
103 
109  virtual void Close();
110 
115  PBoolean AddSink(
116  const OpalMediaStreamPtr & stream
117  );
118 
123  void RemoveSink(
124  const OpalMediaStream & stream
125  );
126 
129  OpalMediaStream & GetSource() const { return m_source; }
130 
133  OpalMediaStreamPtr GetSink(PINDEX i = 0) const;
134 
137  OpalMediaFormat GetSinkFormat(PINDEX i = 0) const;
138 
143  void AddFilter(
144  const PNotifier & filter,
145  const OpalMediaFormat & stage = OpalMediaFormat()
146  );
147 
150  bool RemoveFilter(
151  const PNotifier & filter,
152  const OpalMediaFormat & stage = OpalMediaFormat()
153  );
154 
157  virtual void FilterFrame(
158  RTP_DataFrame & frame,
159  const OpalMediaFormat & mediaFormat
160  );
161 
171  virtual bool UpdateMediaFormat(
172  const OpalMediaFormat & mediaFormat
173  );
174 
184  virtual bool ExecuteCommand(
185  const OpalMediaCommand & command
186  );
187 
190  virtual bool InternalSetPaused(
191  bool pause,
192  bool fromUser
193  );
194 
197  virtual PBoolean PushFrame(
198  RTP_DataFrame & frame
199  );
200 
220  bool SetBypassPatch(
221  const OpalMediaPatchPtr & patch
222  );
223 
224  bool IsBypassed() const { return m_bypassToPatch != NULL || m_bypassFromPatch != NULL; }
225 
228  virtual OpalTranscoder * GetAndLockSinkTranscoder(PINDEX i = 0) const;
229  virtual void UnLockSinkTranscoder() const;
230 
231  virtual bool ResetTranscoders();
232  bool EnableJitterBuffer(bool enab = true);
233 
234 #if OPAL_STATISTICS
235  virtual void GetStatistics(OpalMediaStatistics & statistics, bool fromSink) const;
236 #endif
237 
238 
239  protected:
240  PDECLARE_NOTIFIER(OpalMediaCommand, OpalMediaPatch, InternalOnMediaCommand1);
242 
243  bool CanStart() const;
244 
246  virtual void Main();
247  void StopThread();
248  bool DispatchFrame(RTP_DataFrame & frame);
249  bool DispatchFrameLocked(RTP_DataFrame & frame, bool bypassing);
250 
252 
253  class Sink : public PObject {
254  PCLASSINFO(Sink, PObject);
255  public:
256  Sink(OpalMediaPatch & p, const OpalMediaStreamPtr & s);
257  ~Sink();
258  bool CreateTranscoders();
259  bool UpdateMediaFormat(const OpalMediaFormat & mediaFormat);
260  bool ExecuteCommand(const OpalMediaCommand & command, bool atLeastOne);
261  bool WriteFrame(RTP_DataFrame & sourceFrame, bool bypassing);
262 #if OPAL_STATISTICS
263  void GetStatistics(OpalMediaStatistics & statistics, bool fromSource) const;
264 #endif
265 
270  RTP_DataFrameList m_intermediateFrames;
271  RTP_DataFrameList m_finalFrames;
272 
273 #if OPAL_STATISTICS
276  struct AudioStats {
277  unsigned m_silent;
278  unsigned m_FEC;
279  AudioStats() : m_silent(0), m_FEC(0) { }
280  };
281  typedef map<RTP_SyncSourceId, AudioStats> AudioStatsMap;
283 #if OPAL_VIDEO
286  typedef map<RTP_SyncSourceId, OpalVideoStatistics> VideoStatsMap;
288 #endif // OPAL_VIDEO
289  PDECLARE_MUTEX(m_statsMutex);
290 #endif // OPAL_STATISTICS
291  };
292  PList<Sink> m_sinks;
293 
294  class Filter : public PObject {
295  PCLASSINFO(Filter, PObject);
296  public:
297  Filter(const PNotifier & n, const OpalMediaFormat & s) : m_notifier(n), m_stage(s) { }
298 
299  PNotifier m_notifier;
301  };
302  PList<Filter> m_filters;
303 
304  OpalMediaPatchPtr m_bypassToPatch;
305  OpalMediaPatchPtr m_bypassFromPatch;
306  PSyncPoint m_bypassEnded;
307 
308  PThread * m_patchThread;
309  PDECLARE_MUTEX(m_patchThreadMutex);
310 #if OPAL_STATISTICS
311  PThreadIdentifier m_patchThreadId;
312 #endif
313 
314 
316 
317  private:
318  P_REMOVE_VIRTUAL(bool, OnPatchStart(), false);
319 };
320 
329 {
331  public:
332 
334  OpalMediaStream & source
335  );
336 
337  virtual void Start();
338  virtual void Close();
339 
340  protected:
341  bool m_started;
342 };
343 
344 
345 #endif // OPAL_OPAL_PATCH_H
346 
347 
348 // End of File ///////////////////////////////////////////////////////////////
virtual bool UpdateMediaFormat(const OpalMediaFormat &mediaFormat)
OpalTranscoder * m_secondaryCodec
Definition: patch.h:269
Filter(const PNotifier &n, const OpalMediaFormat &s)
Definition: patch.h:297
bool WriteFrame(RTP_DataFrame &sourceFrame, bool bypassing)
bool EnableJitterBuffer(bool enab=true)
virtual bool InternalSetPaused(bool pause, bool fromUser)
OpalMediaStreamPtr m_stream
Definition: patch.h:267
bool DispatchFrameLocked(RTP_DataFrame &frame, bool bypassing)
void AddFilter(const PNotifier &filter, const OpalMediaFormat &stage=OpalMediaFormat())
bool m_transcoderChanged
Definition: patch.h:315
Definition: mediacmd.h:43
PList< Sink > m_sinks
Definition: patch.h:292
Definition: patch.h:328
Definition: patch.h:294
PAutoPtr< FrameDetector > FrameDetectorPtr
Definition: mediafmt.h:1448
virtual bool ExecuteCommand(const OpalMediaCommand &command)
PSafePtr< OpalMediaStream > OpalMediaStreamPtr
Definition: mediastrm.h:493
VideoStatsMap m_videoStatistics
Definition: patch.h:287
OpalMediaStream & GetSource() const
Definition: patch.h:129
void RemoveSink(const OpalMediaStream &stream)
OpalMediaPatchPtr m_bypassFromPatch
Definition: patch.h:305
OpalMediaPatch(OpalMediaStream &source)
OpalMediaFormat GetSinkFormat(PINDEX i=0) const
PThread * m_patchThread
Definition: patch.h:308
PDECLARE_MUTEX(m_statsMutex)
bool CanStart() const
unsigned m_silent
Definition: patch.h:277
bool UpdateMediaFormat(const OpalMediaFormat &mediaFormat)
unsigned m_FEC
Definition: patch.h:278
void InternalOnMediaCommand2(OpalMediaCommand *command)
AudioStats()
Definition: patch.h:279
virtual void UnLockSinkTranscoder() const
PBoolean AddSink(const OpalMediaStreamPtr &stream)
PSyncPoint m_bypassEnded
Definition: patch.h:306
RTP_DataFrameList m_finalFrames
Definition: patch.h:271
OpalMediaPatchPtr m_bypassToPatch
Definition: patch.h:304
virtual bool OnStartMediaPatch()
AudioStatsMap m_audioStatistics
Definition: patch.h:282
virtual void GetStatistics(OpalMediaStatistics &statistics, bool fromSink) const
virtual OpalTranscoder * GetAndLockSinkTranscoder(PINDEX i=0) const
Definition: rtp.h:540
Definition: mediafmt.h:1395
Definition: patch.h:56
Definition: mediafmt.h:806
bool IsBypassed() const
Definition: patch.h:224
map< RTP_SyncSourceId, OpalVideoStatistics > VideoStatsMap
Definition: patch.h:286
virtual PBoolean PushFrame(RTP_DataFrame &frame)
virtual void Start()
virtual void FilterFrame(RTP_DataFrame &frame, const OpalMediaFormat &mediaFormat)
Definition: transcoders.h:134
bool RemoveFilter(const PNotifier &filter, const OpalMediaFormat &stage=OpalMediaFormat())
OpalMediaFormat m_stage
Definition: patch.h:300
RTP_DataFrameList m_intermediateFrames
Definition: patch.h:270
virtual void Close()
virtual void Start()
virtual void Main()
PNotifier m_notifier
Definition: patch.h:299
void PrintOn(ostream &strm) const
OpalAudioFormat m_audioFormat
Definition: patch.h:274
bool ExecuteCommand(const OpalMediaCommand &command, bool atLeastOne)
virtual void Close()
OpalVideoFormat m_videoFormat
Definition: patch.h:284
bool m_started
Definition: patch.h:341
void GetStatistics(OpalMediaStatistics &statistics, bool fromSource) const
bool DispatchFrame(RTP_DataFrame &frame)
OpalTranscoder * m_primaryCodec
Definition: patch.h:268
PThreadIdentifier m_patchThreadId
Definition: patch.h:311
PAutoPtr< FrameDetector > FrameDetectorPtr
Definition: mediafmt.h:1567
Definition: mediastrm.h:110
OpalPassiveMediaPatch(OpalMediaStream &source)
Definition: patch.h:253
Definition: patch.h:276
Definition: mediasession.h:210
OpalMediaStreamPtr GetSink(PINDEX i=0) const
Definition: mediafmt.h:1481
virtual bool ResetTranscoders()
PList< Filter > m_filters
Definition: patch.h:302
OpalMediaStream & m_source
Definition: patch.h:251
bool SetBypassPatch(const OpalMediaPatchPtr &patch)
OpalVideoFormat::FrameDetectorPtr m_videoFrameDetector
Definition: patch.h:285
PDECLARE_MUTEX(m_patchThreadMutex)
OpalMediaPatch & m_patch
Definition: patch.h:266
Sink(OpalMediaPatch &p, const OpalMediaStreamPtr &s)
map< RTP_SyncSourceId, AudioStats > AudioStatsMap
Definition: patch.h:281
PDECLARE_NOTIFIER(OpalMediaCommand, OpalMediaPatch, InternalOnMediaCommand1)
OpalAudioFormat::FrameDetectorPtr m_audioFrameDetector
Definition: patch.h:275