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
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 #ifndef __OPAL_PATCH_H
00096 #define __OPAL_PATCH_H
00097
00098 #ifdef P_USE_PRAGMA
00099 #pragma interface
00100 #endif
00101
00102 #include <opal/buildopts.h>
00103
00104 #include <opal/mediafmt.h>
00105 #include <opal/mediacmd.h>
00106
00107
00108 class OpalMediaStream;
00109 class OpalTranscoder;
00110
00111
00123 class OpalMediaPatch : public PObject
00124 {
00125 PCLASSINFO(OpalMediaPatch, PObject);
00126 public:
00132 OpalMediaPatch(
00133 OpalMediaStream & source
00134 );
00135
00138 ~OpalMediaPatch();
00140
00147 void PrintOn(
00148 ostream & strm
00149 ) const;
00151
00157 virtual void Start();
00158
00164 virtual void Close();
00165
00170 BOOL AddSink(
00171 OpalMediaStream * stream,
00172 const RTP_DataFrame::PayloadMapType & rtpMap
00173 );
00174
00179 void RemoveSink(
00180 OpalMediaStream * stream
00181 );
00182
00185 OpalMediaStream & GetSource() const { return source; }
00186
00189 OpalMediaFormat GetSinkFormat(PINDEX i = 0) const;
00190
00195 void AddFilter(
00196 const PNotifier & filter,
00197 const OpalMediaFormat & stage = OpalMediaFormat()
00198 );
00199
00202 BOOL RemoveFilter(
00203 const PNotifier & filter,
00204 const OpalMediaFormat & stage = OpalMediaFormat()
00205 );
00206
00209 virtual void FilterFrame(
00210 RTP_DataFrame & frame,
00211 const OpalMediaFormat & mediaFormat
00212 );
00213
00222 virtual BOOL UpdateMediaFormat(
00223 const OpalMediaFormat & mediaFormat,
00224 BOOL fromSink
00225 );
00226
00234 virtual BOOL ExecuteCommand(
00235 const OpalMediaCommand & command,
00236 BOOL fromSink
00237 );
00238
00246 virtual void SetCommandNotifier(
00247 const PNotifier & notifier,
00248 BOOL fromSink
00249 );
00250
00251 virtual BOOL PushFrame(RTP_DataFrame & ) { return FALSE; };
00252
00255 virtual OpalTranscoder * GetAndLockSinkTranscoder(PINDEX i = 0) const;
00256 virtual void UnLockSinkTranscoder() const;
00258
00259 protected:
00260
00262 virtual void Main();
00263 void DispatchFrame(RTP_DataFrame & frame);
00264
00265 OpalMediaStream & source;
00266
00267 class Sink : public PObject {
00268 PCLASSINFO(Sink, PObject);
00269 public:
00270 Sink(OpalMediaPatch & p, OpalMediaStream * s, const RTP_DataFrame::PayloadMapType & m);
00271 ~Sink();
00272 bool UpdateMediaFormat(const OpalMediaFormat & mediaFormat);
00273 bool ExecuteCommand(const OpalMediaCommand & command);
00274 void SetCommandNotifier(const PNotifier & notifier);
00275 bool WriteFrame(RTP_DataFrame & sourceFrame);
00276
00277 OpalMediaPatch & patch;
00278 OpalMediaStream * stream;
00279 RTP_DataFrame::PayloadMapType payloadTypeMap;
00280 OpalTranscoder * primaryCodec;
00281 OpalTranscoder * secondaryCodec;
00282 RTP_DataFrameList intermediateFrames;
00283 RTP_DataFrameList finalFrames;
00284 bool writeSuccessful;
00285 };
00286 PList<Sink> sinks;
00287
00288 class Filter : public PObject {
00289 PCLASSINFO(Filter, PObject);
00290 public:
00291 Filter(const PNotifier & n, const OpalMediaFormat & s) : notifier(n), stage(s) { }
00292 PNotifier notifier;
00293 OpalMediaFormat stage;
00294 };
00295 PList<Filter> filters;
00296
00297 class Thread : public PThread {
00298 PCLASSINFO(Thread, PThread);
00299 public:
00300 Thread(OpalMediaPatch & p);
00301 virtual void Main() { patch.Main(); };
00302 OpalMediaPatch & patch;
00303 };
00304
00305 Thread * patchThread;
00306 PMutex patchThreadMutex;
00307 mutable PTimedMutex inUse;
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 virtual BOOL PushFrame(RTP_DataFrame & frame);
00328 };
00329
00330
00331 #endif // __OPAL_PATCH_H
00332
00333
00334