00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef OPAL_OPAL_PATCH_H
00033 #define OPAL_OPAL_PATCH_H
00034
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038
00039 #include <opal/buildopts.h>
00040
00041 #include <opal/mediastrm.h>
00042 #include <opal/mediacmd.h>
00043 #include <codec/ratectl.h>
00044
00045 #include <list>
00046
00047 class OpalTranscoder;
00048
00060 class OpalMediaPatch : public PObject
00061 {
00062 PCLASSINFO(OpalMediaPatch, PObject);
00063 public:
00069 OpalMediaPatch(
00070 OpalMediaStream & source
00071 );
00072
00075 ~OpalMediaPatch();
00077
00084 void PrintOn(
00085 ostream & strm
00086 ) const;
00088
00094 virtual void Start();
00095
00104 virtual bool OnStartMediaPatch();
00105
00111 virtual void Close();
00112
00117 PBoolean AddSink(
00118 const OpalMediaStreamPtr & stream
00119 );
00120
00125 void RemoveSink(
00126 const OpalMediaStreamPtr & stream
00127 );
00128
00131 OpalMediaStream & GetSource() const { return source; }
00132
00135 OpalMediaStreamPtr GetSink(PINDEX i = 0) const;
00136
00139 OpalMediaFormat GetSinkFormat(PINDEX i = 0) const;
00140
00145 void AddFilter(
00146 const PNotifier & filter,
00147 const OpalMediaFormat & stage = OpalMediaFormat()
00148 );
00149
00152 PBoolean RemoveFilter(
00153 const PNotifier & filter,
00154 const OpalMediaFormat & stage = OpalMediaFormat()
00155 );
00156
00159 virtual void FilterFrame(
00160 RTP_DataFrame & frame,
00161 const OpalMediaFormat & mediaFormat
00162 );
00163
00173 virtual bool UpdateMediaFormat(
00174 const OpalMediaFormat & mediaFormat
00175 );
00176
00184 virtual PBoolean ExecuteCommand(
00185 const OpalMediaCommand & command,
00186 PBoolean fromSink
00187 );
00188
00196 virtual void SetCommandNotifier(
00197 const PNotifier & notifier,
00198 PBoolean fromSink
00199 );
00200
00203 virtual PBoolean PushFrame(
00204 RTP_DataFrame & frame
00205 );
00206
00226 bool SetBypassPatch(
00227 OpalMediaPatch * patch
00228 );
00229
00232 virtual OpalTranscoder * GetAndLockSinkTranscoder(PINDEX i = 0) const;
00233 virtual void UnLockSinkTranscoder() const;
00234
00235 #if OPAL_STATISTICS
00236 virtual void GetStatistics(OpalMediaStatistics & statistics, bool fromSink) const;
00237 #endif
00238
00239
00240 protected:
00241
00243 virtual void Main();
00244 bool DispatchFrame(RTP_DataFrame & frame);
00245
00246 OpalMediaStream & source;
00247
00248 class Sink : public PObject {
00249 PCLASSINFO(Sink, PObject);
00250 public:
00251 Sink(OpalMediaPatch & p, const OpalMediaStreamPtr & s);
00252 ~Sink();
00253 bool UpdateMediaFormat(const OpalMediaFormat & mediaFormat);
00254 bool ExecuteCommand(const OpalMediaCommand & command);
00255 void SetCommandNotifier(const PNotifier & notifier);
00256 bool WriteFrame(RTP_DataFrame & sourceFrame);
00257 #if OPAL_STATISTICS
00258 void GetStatistics(OpalMediaStatistics & statistics, bool fromSource) const;
00259 #endif
00260
00261 OpalMediaPatch & patch;
00262 OpalMediaStreamPtr stream;
00263 OpalTranscoder * primaryCodec;
00264 OpalTranscoder * secondaryCodec;
00265 RTP_DataFrameList intermediateFrames;
00266 RTP_DataFrameList finalFrames;
00267 bool writeSuccessful;
00268
00269 #if OPAL_VIDEO
00270 void SetRateControlParameters(const OpalMediaFormat & mediaFormat);
00271 bool RateControlExceeded(bool & forceIFrame);
00272 OpalVideoRateController * rateController;
00273 #endif
00274 };
00275 PList<Sink> sinks;
00276
00277 class Filter : public PObject {
00278 PCLASSINFO(Filter, PObject);
00279 public:
00280 Filter(const PNotifier & n, const OpalMediaFormat & s) : notifier(n), stage(s) { }
00281 PNotifier notifier;
00282 OpalMediaFormat stage;
00283 };
00284 PList<Filter> filters;
00285
00286 #if OPAL_VIDEO
00287 bool m_videoDecoder;
00288 #endif
00289 bool m_bypassActive;
00290 OpalMediaPatch * m_bypassToPatch;
00291 OpalMediaPatch * m_bypassFromPatch;
00292 PSyncPoint m_bypassEnded;
00293
00294 class Thread : public PThread {
00295 PCLASSINFO(Thread, PThread);
00296 public:
00297 Thread(OpalMediaPatch & p);
00298 virtual void Main() { patch.Main(); };
00299 OpalMediaPatch & patch;
00300 };
00301
00302 Thread * patchThread;
00303 PMutex patchThreadMutex;
00304 mutable PReadWriteMutex inUse;
00305
00306 private:
00307 P_REMOVE_VIRTUAL(bool, OnPatchStart(), false);
00308 };
00309
00317 class OpalPassiveMediaPatch : public OpalMediaPatch
00318 {
00319 PCLASSINFO(OpalPassiveMediaPatch, OpalMediaPatch);
00320 public:
00321
00322 OpalPassiveMediaPatch(
00323 OpalMediaStream & source
00324 );
00325
00326 virtual void Start();
00327 };
00328
00329
00330 #endif // OPAL_OPAL_PATCH_H
00331
00332
00333