OPAL  Version 3.10.10
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  * $Revision: 27949 $
28  * $Author: rjongbloed $
29  * $Date: 2012-06-30 22:55:05 -0500 (Sat, 30 Jun 2012) $
30  */
31 
32 #ifndef OPAL_OPAL_PATCH_H
33 #define OPAL_OPAL_PATCH_H
34 
35 #ifdef P_USE_PRAGMA
36 #pragma interface
37 #endif
38 
39 #include <opal/buildopts.h>
40 
41 #include <opal/mediastrm.h>
42 #include <opal/mediacmd.h>
43 #include <codec/ratectl.h>
44 
45 #include <list>
46 
47 class OpalTranscoder;
48 
60 class OpalMediaPatch : public PSafeObject
61 {
62  PCLASSINFO(OpalMediaPatch, PObject);
63  public:
71  );
72 
77 
84  void PrintOn(
85  ostream & strm
86  ) const;
88 
94  virtual void Start();
95 
104  virtual bool OnStartMediaPatch();
105 
111  virtual void Close();
112 
117  PBoolean AddSink(
118  const OpalMediaStreamPtr & stream
119  );
120 
125  void RemoveSink(
126  const OpalMediaStreamPtr & stream
127  );
128 
131  OpalMediaStream & GetSource() const { return source; }
132 
135  OpalMediaStreamPtr GetSink(PINDEX i = 0) const;
136 
139  OpalMediaFormat GetSinkFormat(PINDEX i = 0) const;
140 
145  void AddFilter(
146  const PNotifier & filter,
147  const OpalMediaFormat & stage = OpalMediaFormat()
148  );
149 
152  bool RemoveFilter(
153  const PNotifier & filter,
154  const OpalMediaFormat & stage = OpalMediaFormat()
155  );
156 
159  virtual void FilterFrame(
160  RTP_DataFrame & frame,
161  const OpalMediaFormat & mediaFormat
162  );
163 
173  virtual bool UpdateMediaFormat(
174  const OpalMediaFormat & mediaFormat
175  );
176 
186  virtual PBoolean ExecuteCommand(
187  const OpalMediaCommand & command,
188  PBoolean fromSink
189  );
190 
193  virtual bool SetPaused(
194  bool pause
195  );
196 
199  virtual PBoolean PushFrame(
200  RTP_DataFrame & frame
201  );
202 
222  bool SetBypassPatch(
223  OpalMediaPatch * patch
224  );
225 
228  virtual OpalTranscoder * GetAndLockSinkTranscoder(PINDEX i = 0) const;
229  virtual void UnLockSinkTranscoder() const;
230 
231 #if OPAL_STATISTICS
232  virtual void GetStatistics(OpalMediaStatistics & statistics, bool fromSink) const;
233 #endif
234 
235 
237 
238  protected:
239 
241  virtual void Main();
242  void StopThread();
243  bool DispatchFrame(RTP_DataFrame & frame);
244  bool EnableJitterBuffer();
245 
247 
248  class Sink : public PObject {
249  PCLASSINFO(Sink, PObject);
250  public:
251  Sink(OpalMediaPatch & p, const OpalMediaStreamPtr & s);
252  ~Sink();
253  bool UpdateMediaFormat(const OpalMediaFormat & mediaFormat);
254  bool ExecuteCommand(const OpalMediaCommand & command);
255  bool WriteFrame(RTP_DataFrame & sourceFrame);
256 #if OPAL_STATISTICS
257  void GetStatistics(OpalMediaStatistics & statistics, bool fromSource) const;
258 #endif
259 
264  RTP_DataFrameList intermediateFrames;
265  RTP_DataFrameList finalFrames;
267 
270  bool CannotTranscodeFrame(OpalTranscoder & codec, RTP_DataFrame & frame);
271 
272 #if OPAL_VIDEO
273  void SetRateControlParameters(const OpalMediaFormat & mediaFormat);
274  bool RateControlExceeded(bool & forceIFrame);
276 #endif
277  };
278  PList<Sink> sinks;
279 
280  class Filter : public PObject {
281  PCLASSINFO(Filter, PObject);
282  public:
283  Filter(const PNotifier & n, const OpalMediaFormat & s) : notifier(n), stage(s) { }
284  PNotifier notifier;
286  };
287  PList<Filter> filters;
288 
291  PSyncPoint m_bypassEnded;
292 
293  class Thread : public PThread {
294  PCLASSINFO(Thread, PThread);
295  public:
296  Thread(OpalMediaPatch & p);
297  virtual void Main() { patch.Main(); };
299  };
300 
303 
304  private:
305  P_REMOVE_VIRTUAL(bool, OnPatchStart(), false);
306 };
307 
316 {
318  public:
319 
321  OpalMediaStream & source
322  );
323 
324  virtual void Start();
325 
326  protected:
327  bool m_started;
328 };
329 
330 
331 #endif // OPAL_OPAL_PATCH_H
332 
333 
334 // End of File ///////////////////////////////////////////////////////////////
virtual bool UpdateMediaFormat(const OpalMediaFormat &mediaFormat)
OpalTranscoder * secondaryCodec
Definition: patch.h:263
virtual PBoolean ExecuteCommand(const OpalMediaCommand &command, PBoolean fromSink)
unsigned m_consecutivePayloadTypeMismatches
Definition: patch.h:269
Filter(const PNotifier &n, const OpalMediaFormat &s)
Definition: patch.h:283
Thread(OpalMediaPatch &p)
OpalTranscoder * primaryCodec
Definition: patch.h:262
OpalMediaPatch & patch
Definition: patch.h:297
bool writeSuccessful
Definition: patch.h:266
OpalMediaPatch * m_bypassFromPatch
Definition: patch.h:290
void AddFilter(const PNotifier &filter, const OpalMediaFormat &stage=OpalMediaFormat())
Definition: mediacmd.h:43
OpalVideoRateController * rateController
Definition: patch.h:275
Definition: patch.h:315
Definition: patch.h:280
void RemoveSink(const OpalMediaStreamPtr &stream)
PSafePtr< OpalMediaStream > OpalMediaStreamPtr
Definition: mediastrm.h:442
OpalMediaStream & GetSource() const
Definition: patch.h:131
bool ExecuteCommand(const OpalMediaCommand &command)
OpalMediaPatch(OpalMediaStream &source)
OpalMediaFormat GetSinkFormat(PINDEX i=0) const
bool CannotTranscodeFrame(OpalTranscoder &codec, RTP_DataFrame &frame)
bool UpdateMediaFormat(const OpalMediaFormat &mediaFormat)
PayloadTypes
Definition: rtp.h:86
virtual void UnLockSinkTranscoder() const
PBoolean AddSink(const OpalMediaStreamPtr &stream)
PSyncPoint m_bypassEnded
Definition: patch.h:291
virtual void Main()
Definition: patch.h:297
virtual bool OnStartMediaPatch()
Definition: patch.h:293
virtual void GetStatistics(OpalMediaStatistics &statistics, bool fromSink) const
virtual OpalTranscoder * GetAndLockSinkTranscoder(PINDEX i=0) const
Definition: rtp.h:71
Definition: patch.h:60
Definition: mediafmt.h:724
virtual PBoolean PushFrame(RTP_DataFrame &frame)
OpalMediaStreamPtr stream
Definition: patch.h:261
virtual void Start()
OpalMediaPatch & patch
Definition: patch.h:260
virtual void FilterFrame(RTP_DataFrame &frame, const OpalMediaFormat &mediaFormat)
Definition: transcoders.h:137
bool RemoveFilter(const PNotifier &filter, const OpalMediaFormat &stage=OpalMediaFormat())
PDECLARE_NOTIFIER(OpalMediaCommand, OpalMediaPatch, OnMediaCommand)
RTP_DataFrameList intermediateFrames
Definition: patch.h:264
virtual void Start()
RTP_DataFrame::PayloadTypes m_lastPayloadType
Definition: patch.h:268
virtual void Main()
void PrintOn(ostream &strm) const
RTP_DataFrameList finalFrames
Definition: patch.h:265
OpalMediaPatch * m_bypassToPatch
Definition: patch.h:289
virtual void Close()
Thread * patchThread
Definition: patch.h:301
bool m_started
Definition: patch.h:327
void GetStatistics(OpalMediaStatistics &statistics, bool fromSource) const
bool DispatchFrame(RTP_DataFrame &frame)
Definition: mediastrm.h:111
OpalPassiveMediaPatch(OpalMediaStream &source)
PList< Sink > sinks
Definition: patch.h:278
Definition: patch.h:248
bool EnableJitterBuffer()
PNotifier notifier
Definition: patch.h:284
bool RateControlExceeded(bool &forceIFrame)
Definition: rtp.h:370
PMutex patchThreadMutex
Definition: patch.h:302
PList< Filter > filters
Definition: patch.h:287
OpalMediaStreamPtr GetSink(PINDEX i=0) const
virtual bool SetPaused(bool pause)
bool WriteFrame(RTP_DataFrame &sourceFrame)
bool SetBypassPatch(OpalMediaPatch *patch)
OpalMediaFormat stage
Definition: patch.h:285
void SetRateControlParameters(const OpalMediaFormat &mediaFormat)
Sink(OpalMediaPatch &p, const OpalMediaStreamPtr &s)
OpalMediaStream & source
Definition: patch.h:246
Definition: ratectl.h:169