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
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 #ifndef __OPAL_MEDIASTRM_H
00131 #define __OPAL_MEDIASTRM_H
00132
00133 #ifdef P_USE_PRAGMA
00134 #pragma interface
00135 #endif
00136
00137
00138 #include <opal/buildopts.h>
00139 #include <opal/mediafmt.h>
00140 #include <opal/mediacmd.h>
00141
00142
00143 class RTP_Session;
00144 class OpalMediaPatch;
00145 class OpalLine;
00146
00147
00153 class OpalMediaStream : public PObject
00154 {
00155 PCLASSINFO(OpalMediaStream, PObject);
00156 protected:
00161 OpalMediaStream(
00162 const OpalMediaFormat & mediaFormat,
00163 unsigned sessionID,
00164 BOOL isSource
00165 );
00166
00167 public:
00171 ~OpalMediaStream();
00173
00174 public:
00181 void PrintOn(
00182 ostream & strm
00183 ) const;
00185
00195 virtual OpalMediaFormat GetMediaFormat() const;
00196
00205 virtual BOOL UpdateMediaFormat(
00206 const OpalMediaFormat & mediaFormat
00207 );
00208
00215 virtual BOOL ExecuteCommand(
00216 const OpalMediaCommand & command
00217 );
00218
00226 virtual void SetCommandNotifier(
00227 const PNotifier & notifier
00228 );
00229
00234 virtual BOOL Open();
00235
00241 virtual BOOL Start();
00242
00247 virtual BOOL Close();
00248
00253 virtual BOOL WritePackets(
00254 RTP_DataFrameList & packets
00255 );
00256
00262 virtual BOOL ReadPacket(
00263 RTP_DataFrame & packet
00264 );
00265
00271 virtual BOOL WritePacket(
00272 RTP_DataFrame & packet
00273 );
00274
00280 virtual BOOL ReadData(
00281 BYTE * data,
00282 PINDEX size,
00283 PINDEX & length
00284 );
00285
00291 virtual BOOL WriteData(
00292 const BYTE * data,
00293 PINDEX length,
00294 PINDEX & written
00295 );
00296
00302 virtual BOOL SetDataSize(
00303 PINDEX dataSize
00304 );
00305
00309 PINDEX GetDataSize() const { return defaultDataSize; }
00310
00317 virtual BOOL IsSynchronous() const = 0;
00318
00322 virtual BOOL RequiresPatchThread() const;
00323
00328 virtual void EnableJitterBuffer() const;
00330
00335 BOOL IsSource() const { return isSource; }
00336
00339 BOOL IsSink() const { return !isSource; }
00340
00343 unsigned GetSessionID() const { return sessionID; }
00344
00347 unsigned GetTimestamp() const { return timestamp; }
00348
00351 void SetTimestamp(unsigned ts) { timestamp = ts; }
00352
00355 BOOL GetMarker() const { return marker; }
00356
00359 void SetMarker(BOOL m) { marker = m; }
00360
00363 BOOL IsPaused() const { return paused; }
00364
00367 void SetPaused(BOOL p) { paused = p; }
00368
00371 BOOL IsOpen() { return isOpen; }
00372
00375 void SetPatch(
00376 OpalMediaPatch * patch
00377 );
00378
00381 OpalMediaPatch * GetPatch() const { return patchThread; }
00383
00386 PMutex & GetDeleteMutex() const { return deleteMutex; }
00387
00388 protected:
00389 OpalMediaFormat mediaFormat;
00390 unsigned sessionID;
00391 BOOL paused;
00392 BOOL isSource;
00393 BOOL isOpen;
00394 PINDEX defaultDataSize;
00395 unsigned timestamp;
00396 BOOL marker;
00397 unsigned mismatchedPayloadTypes;
00398
00399 OpalMediaPatch * patchThread;
00400 PMutex patchMutex;
00401 PNotifier commandNotifier;
00402
00403 mutable PMutex deleteMutex;
00404 };
00405
00406 PLIST(OpalMediaStreamList, OpalMediaStream);
00407
00408
00411 class OpalNullMediaStream : public OpalMediaStream
00412 {
00413 PCLASSINFO(OpalNullMediaStream, OpalMediaStream);
00414 public:
00419 OpalNullMediaStream(
00420 const OpalMediaFormat & mediaFormat,
00421 unsigned sessionID,
00422 BOOL isSource
00423 );
00425
00431 virtual BOOL ReadData(
00432 BYTE * data,
00433 PINDEX size,
00434 PINDEX & length
00435 );
00436
00440 virtual BOOL WriteData(
00441 const BYTE * data,
00442 PINDEX length,
00443 PINDEX & written
00444 );
00445
00449 virtual BOOL RequiresPatchThread() const;
00450
00454 virtual BOOL IsSynchronous() const;
00456 };
00457
00458
00462 class OpalRTPMediaStream : public OpalMediaStream
00463 {
00464 PCLASSINFO(OpalRTPMediaStream, OpalMediaStream);
00465 public:
00470 OpalRTPMediaStream(
00471 const OpalMediaFormat & mediaFormat,
00472 BOOL isSource,
00473 RTP_Session & rtpSession,
00474 unsigned minAudioJitterDelay,
00475 unsigned maxAudioJitterDelay
00476 );
00478
00485 virtual BOOL Open();
00486
00491 virtual BOOL Close();
00492
00496 virtual BOOL ReadPacket(
00497 RTP_DataFrame & packet
00498 );
00499
00503 virtual BOOL WritePacket(
00504 RTP_DataFrame & packet
00505 );
00506
00510 virtual BOOL IsSynchronous() const;
00511
00516 virtual void EnableJitterBuffer() const;
00518
00519 protected:
00520 RTP_Session & rtpSession;
00521 unsigned minAudioJitterDelay;
00522 unsigned maxAudioJitterDelay;
00523 };
00524
00525
00526
00529 class OpalRawMediaStream : public OpalMediaStream
00530 {
00531 PCLASSINFO(OpalRawMediaStream, OpalMediaStream);
00532 protected:
00537 OpalRawMediaStream(
00538 const OpalMediaFormat & mediaFormat,
00539 unsigned sessionID,
00540 BOOL isSource,
00541 PChannel * channel,
00542 BOOL autoDelete
00543 );
00544
00547 ~OpalRawMediaStream();
00549
00550 public:
00556 virtual BOOL ReadData(
00557 BYTE * data,
00558 PINDEX size,
00559 PINDEX & length
00560 );
00561
00565 virtual BOOL WriteData(
00566 const BYTE * data,
00567 PINDEX length,
00568 PINDEX & written
00569 );
00570
00573 PChannel * GetChannel() { return channel; }
00574
00575
00580 virtual BOOL Close();
00582
00583 protected:
00584 PChannel * channel;
00585 BOOL autoDelete;
00586 };
00587
00588
00589
00592 class OpalFileMediaStream : public OpalRawMediaStream
00593 {
00594 PCLASSINFO(OpalFileMediaStream, OpalRawMediaStream);
00595 public:
00600 OpalFileMediaStream(
00601 const OpalMediaFormat & mediaFormat,
00602 unsigned sessionID,
00603 BOOL isSource,
00604 PFile * file,
00605 BOOL autoDelete = TRUE
00606 );
00607
00610 OpalFileMediaStream(
00611 const OpalMediaFormat & mediaFormat,
00612 unsigned sessionID,
00613 BOOL isSource,
00614 const PFilePath & path
00615 );
00617
00623 virtual BOOL IsSynchronous() const;
00625
00626 protected:
00627 PFile file;
00628 };
00629
00630
00634 class OpalAudioMediaStream : public OpalRawMediaStream
00635 {
00636 PCLASSINFO(OpalAudioMediaStream, OpalRawMediaStream);
00637 public:
00642 OpalAudioMediaStream(
00643 const OpalMediaFormat & mediaFormat,
00644 unsigned sessionID,
00645 BOOL isSource,
00646 PINDEX buffers,
00647 PSoundChannel * channel,
00648 BOOL autoDelete = TRUE
00649 );
00650
00653 OpalAudioMediaStream(
00654 const OpalMediaFormat & mediaFormat,
00655 unsigned sessionID,
00656 BOOL isSource,
00657 PINDEX buffers,
00658 const PString & deviceName
00659 );
00661
00669 virtual BOOL SetDataSize(
00670 PINDEX dataSize
00671 );
00672
00676 virtual BOOL IsSynchronous() const;
00678
00679 protected:
00680 PINDEX soundChannelBuffers;
00681 };
00682
00683
00687 class OpalVideoMediaStream : public OpalMediaStream
00688 {
00689 PCLASSINFO(OpalVideoMediaStream, OpalMediaStream);
00690 public:
00695 OpalVideoMediaStream(
00696 const OpalMediaFormat & mediaFormat,
00697 unsigned sessionID,
00698 PVideoInputDevice * inputDevice,
00699 PVideoOutputDevice * outputDevice,
00700 BOOL autoDelete = TRUE
00701 );
00702
00705 ~OpalVideoMediaStream();
00707
00715 virtual BOOL Open();
00716
00722 virtual BOOL ReadData(
00723 BYTE * data,
00724 PINDEX size,
00725 PINDEX & length
00726 );
00727
00733 virtual BOOL WriteData(
00734 const BYTE * data,
00735 PINDEX length,
00736 PINDEX & written
00737 );
00738
00742 virtual BOOL IsSynchronous() const;
00743
00746 virtual BOOL SetDataSize(
00747 PINDEX dataSize
00748 );
00749
00751
00752 protected:
00753 PVideoInputDevice * inputDevice;
00754 PVideoOutputDevice * outputDevice;
00755 BOOL autoDelete;
00756 PTimeInterval lastGrabTime;
00757 };
00758
00759
00760
00761 #endif //__OPAL_MEDIASTRM_H
00762
00763
00764