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 OnPatchStart();
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
00201 virtual PBoolean PushFrame(RTP_DataFrame & ) { return PFalse; };
00202
00205 virtual OpalTranscoder * GetAndLockSinkTranscoder(PINDEX i = 0) const;
00206 virtual void UnLockSinkTranscoder() const;
00207
00208 #if OPAL_STATISTICS
00209 virtual void GetStatistics(OpalMediaStatistics & statistics, bool fromSink) const;
00210 #endif
00211
00212
00213 protected:
00214
00216 virtual void Main();
00217 bool DispatchFrame(RTP_DataFrame & frame);
00218
00219 OpalMediaStream & source;
00220
00221 class Sink : public PObject {
00222 PCLASSINFO(Sink, PObject);
00223 public:
00224 Sink(OpalMediaPatch & p, const OpalMediaStreamPtr & s);
00225 ~Sink();
00226 bool UpdateMediaFormat(const OpalMediaFormat & mediaFormat);
00227 bool ExecuteCommand(const OpalMediaCommand & command);
00228 void SetCommandNotifier(const PNotifier & notifier);
00229 bool WriteFrame(RTP_DataFrame & sourceFrame);
00230 #if OPAL_STATISTICS
00231 void GetStatistics(OpalMediaStatistics & statistics, bool fromSource) const;
00232 #endif
00233
00234 OpalMediaPatch & patch;
00235 OpalMediaStreamPtr stream;
00236 OpalTranscoder * primaryCodec;
00237 OpalTranscoder * secondaryCodec;
00238 RTP_DataFrameList intermediateFrames;
00239 RTP_DataFrameList finalFrames;
00240 bool writeSuccessful;
00241
00242 #if OPAL_VIDEO
00243 void SetRateControlParameters(const OpalMediaFormat & mediaFormat);
00244 bool RateControlExceeded(bool & forceIFrame);
00245 OpalVideoRateController * rateController;
00246 #endif
00247 };
00248 PList<Sink> sinks;
00249
00250 class Filter : public PObject {
00251 PCLASSINFO(Filter, PObject);
00252 public:
00253 Filter(const PNotifier & n, const OpalMediaFormat & s) : notifier(n), stage(s) { }
00254 PNotifier notifier;
00255 OpalMediaFormat stage;
00256 };
00257 PList<Filter> filters;
00258
00259 class Thread : public PThread {
00260 PCLASSINFO(Thread, PThread);
00261 public:
00262 Thread(OpalMediaPatch & p);
00263 virtual void Main() { patch.Main(); };
00264 OpalMediaPatch & patch;
00265 };
00266
00267 Thread * patchThread;
00268 PMutex patchThreadMutex;
00269 mutable PReadWriteMutex inUse;
00270 };
00271
00279 class OpalPassiveMediaPatch : public OpalMediaPatch
00280 {
00281 PCLASSINFO(OpalPassiveMediaPatch, OpalMediaPatch);
00282 public:
00283
00284 OpalPassiveMediaPatch(
00285 OpalMediaStream & source
00286 );
00287
00288 virtual void Start();
00289 virtual PBoolean PushFrame(RTP_DataFrame & frame);
00290 };
00291
00292
00293 #endif // OPAL_OPAL_PATCH_H
00294
00295
00296