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
00131
00132
00133
00134
00135
00136
00137 #ifndef __OPAL_MEDIASTRM_H
00138 #define __OPAL_MEDIASTRM_H
00139
00140 #ifdef P_USE_PRAGMA
00141 #pragma interface
00142 #endif
00143
00144
00145 #include <opal/buildopts.h>
00146 #include <opal/mediafmt.h>
00147 #include <opal/mediacmd.h>
00148
00149 #include <ptlib/sound.h>
00150 #include <ptlib/videoio.h>
00151
00152 class RTP_Session;
00153 class OpalMediaPatch;
00154 class OpalLine;
00155
00156
00162 class OpalMediaStream : public PObject
00163 {
00164 PCLASSINFO(OpalMediaStream, PObject);
00165 protected:
00170 OpalMediaStream(
00171 const OpalMediaFormat & mediaFormat,
00172 unsigned sessionID,
00173 BOOL isSource
00174 );
00175
00176 public:
00180 ~OpalMediaStream();
00182
00183 public:
00190 void PrintOn(
00191 ostream & strm
00192 ) const;
00194
00204 virtual OpalMediaFormat GetMediaFormat() const;
00205
00214 virtual BOOL UpdateMediaFormat(
00215 const OpalMediaFormat & mediaFormat
00216 );
00217
00224 virtual BOOL ExecuteCommand(
00225 const OpalMediaCommand & command
00226 );
00227
00235 virtual void SetCommandNotifier(
00236 const PNotifier & notifier
00237 );
00238
00243 virtual BOOL Open();
00244
00250 virtual BOOL Start();
00251
00256 virtual BOOL Close();
00257
00262 virtual BOOL WritePackets(
00263 RTP_DataFrameList & packets
00264 );
00265
00271 virtual BOOL ReadPacket(
00272 RTP_DataFrame & packet
00273 );
00274
00280 virtual BOOL WritePacket(
00281 RTP_DataFrame & packet
00282 );
00283
00289 virtual BOOL ReadData(
00290 BYTE * data,
00291 PINDEX size,
00292 PINDEX & length
00293 );
00294
00300 virtual BOOL WriteData(
00301 const BYTE * data,
00302 PINDEX length,
00303 PINDEX & written
00304 );
00305
00311 virtual BOOL SetDataSize(
00312 PINDEX dataSize
00313 );
00314
00318 PINDEX GetDataSize() const { return defaultDataSize; }
00319
00326 virtual BOOL IsSynchronous() const = 0;
00327
00331 virtual BOOL RequiresPatchThread() const;
00332
00337 virtual void EnableJitterBuffer() const;
00339
00344 BOOL IsSource() const { return isSource; }
00345
00348 BOOL IsSink() const { return !isSource; }
00349
00352 unsigned GetSessionID() const { return sessionID; }
00353
00356 unsigned GetTimestamp() const { return timestamp; }
00357
00360 void SetTimestamp(unsigned ts) { timestamp = ts; }
00361
00364 BOOL GetMarker() const { return marker; }
00365
00368 void SetMarker(BOOL m) { marker = m; }
00369
00372 BOOL IsPaused() const { return paused; }
00373
00376 void SetPaused(BOOL p) { paused = p; }
00377
00380 BOOL IsOpen() { return isOpen; }
00381
00384 void SetPatch(
00385 OpalMediaPatch * patch
00386 );
00387
00390 OpalMediaPatch * GetPatch() const { return patchThread; }
00392
00395 void AddFilter(const PNotifier & Filter, const OpalMediaFormat & Stage = OpalMediaFormat());
00396
00399 BOOL RemoveFilter(const PNotifier & Filter, const OpalMediaFormat & Stage);
00400
00403 PMutex & GetDeleteMutex() const { return deleteMutex; }
00404
00405 protected:
00406 OpalMediaFormat mediaFormat;
00407 unsigned sessionID;
00408 BOOL paused;
00409 BOOL isSource;
00410 BOOL isOpen;
00411 PINDEX defaultDataSize;
00412 unsigned timestamp;
00413 BOOL marker;
00414 unsigned mismatchedPayloadTypes;
00415
00416 OpalMediaPatch * patchThread;
00417 PMutex patchMutex;
00418 PNotifier commandNotifier;
00419
00420 mutable PMutex deleteMutex;
00421 };
00422
00423 PLIST(OpalMediaStreamList, OpalMediaStream);
00424
00425
00428 class OpalNullMediaStream : public OpalMediaStream
00429 {
00430 PCLASSINFO(OpalNullMediaStream, OpalMediaStream);
00431 public:
00436 OpalNullMediaStream(
00437 const OpalMediaFormat & mediaFormat,
00438 unsigned sessionID,
00439 BOOL isSource
00440 );
00442
00448 virtual BOOL ReadData(
00449 BYTE * data,
00450 PINDEX size,
00451 PINDEX & length
00452 );
00453
00457 virtual BOOL WriteData(
00458 const BYTE * data,
00459 PINDEX length,
00460 PINDEX & written
00461 );
00462
00466 virtual BOOL RequiresPatchThread() const;
00467
00471 virtual BOOL IsSynchronous() const;
00473 };
00474
00475
00479 class OpalRTPMediaStream : public OpalMediaStream
00480 {
00481 PCLASSINFO(OpalRTPMediaStream, OpalMediaStream);
00482 public:
00487 OpalRTPMediaStream(
00488 const OpalMediaFormat & mediaFormat,
00489 BOOL isSource,
00490 RTP_Session & rtpSession,
00491 unsigned minAudioJitterDelay,
00492 unsigned maxAudioJitterDelay
00493 );
00495
00502 virtual BOOL Open();
00503
00508 virtual BOOL Close();
00509
00513 virtual BOOL ReadPacket(
00514 RTP_DataFrame & packet
00515 );
00516
00520 virtual BOOL WritePacket(
00521 RTP_DataFrame & packet
00522 );
00523
00526 virtual BOOL SetDataSize(
00527 PINDEX dataSize
00528 );
00529
00533 virtual BOOL IsSynchronous() const;
00534
00539 virtual void EnableJitterBuffer() const;
00540
00543 virtual RTP_Session & GetRtpSession() const
00544 { return rtpSession; }
00545
00547
00548 protected:
00549 RTP_Session & rtpSession;
00550 unsigned minAudioJitterDelay;
00551 unsigned maxAudioJitterDelay;
00552 };
00553
00554
00555
00558 class OpalRawMediaStream : public OpalMediaStream
00559 {
00560 PCLASSINFO(OpalRawMediaStream, OpalMediaStream);
00561 protected:
00566 OpalRawMediaStream(
00567 const OpalMediaFormat & mediaFormat,
00568 unsigned sessionID,
00569 BOOL isSource,
00570 PChannel * channel,
00571 BOOL autoDelete
00572 );
00573
00576 ~OpalRawMediaStream();
00578
00579 public:
00585 virtual BOOL ReadData(
00586 BYTE * data,
00587 PINDEX size,
00588 PINDEX & length
00589 );
00590
00594 virtual BOOL WriteData(
00595 const BYTE * data,
00596 PINDEX length,
00597 PINDEX & written
00598 );
00599
00602 PChannel * GetChannel() { return channel; }
00603
00608 virtual BOOL Close();
00609
00612 virtual unsigned GetAverageSignalLevel();
00614
00615 protected:
00616 PChannel * channel;
00617 PMutex channel_mutex;
00618 BOOL autoDelete;
00619
00620 PUInt64 averageSignalSum;
00621 unsigned averageSignalSamples;
00622 void CollectAverage(const BYTE * buffer, PINDEX size);
00623 };
00624
00625
00626
00629 class OpalFileMediaStream : public OpalRawMediaStream
00630 {
00631 PCLASSINFO(OpalFileMediaStream, OpalRawMediaStream);
00632 public:
00637 OpalFileMediaStream(
00638 const OpalMediaFormat & mediaFormat,
00639 unsigned sessionID,
00640 BOOL isSource,
00641 PFile * file,
00642 BOOL autoDelete = TRUE
00643 );
00644
00647 OpalFileMediaStream(
00648 const OpalMediaFormat & mediaFormat,
00649 unsigned sessionID,
00650 BOOL isSource,
00651 const PFilePath & path
00652 );
00654
00660 virtual BOOL IsSynchronous() const;
00662
00663 protected:
00664 PFile file;
00665 };
00666
00667 class OpalMediaFormat;
00668 class PSoundChannel;
00669
00673 class OpalAudioMediaStream : public OpalRawMediaStream
00674 {
00675 PCLASSINFO(OpalAudioMediaStream, OpalRawMediaStream);
00676 public:
00681 OpalAudioMediaStream(
00682 const OpalMediaFormat & mediaFormat,
00683 unsigned sessionID,
00684 BOOL isSource,
00685 PINDEX buffers,
00686 PSoundChannel * channel,
00687 BOOL autoDelete = TRUE
00688 );
00689
00692 OpalAudioMediaStream(
00693 const OpalMediaFormat & mediaFormat,
00694 unsigned sessionID,
00695 BOOL isSource,
00696 PINDEX buffers,
00697 const PString & deviceName
00698 );
00700
00708 virtual BOOL SetDataSize(
00709 PINDEX dataSize
00710 );
00711
00715 virtual BOOL IsSynchronous() const;
00717
00718 protected:
00719 PINDEX soundChannelBuffers;
00720 };
00721
00722
00726 class OpalVideoMediaStream : public OpalMediaStream
00727 {
00728 PCLASSINFO(OpalVideoMediaStream, OpalMediaStream);
00729 public:
00734 OpalVideoMediaStream(
00735 const OpalMediaFormat & mediaFormat,
00736 unsigned sessionID,
00737 PVideoInputDevice * inputDevice,
00738 PVideoOutputDevice * outputDevice,
00739 BOOL autoDelete = TRUE
00740 );
00741
00744 ~OpalVideoMediaStream();
00746
00754 virtual BOOL Open();
00755
00761 virtual BOOL ReadData(
00762 BYTE * data,
00763 PINDEX size,
00764 PINDEX & length
00765 );
00766
00772 virtual BOOL WriteData(
00773 const BYTE * data,
00774 PINDEX length,
00775 PINDEX & written
00776 );
00777
00781 virtual BOOL IsSynchronous() const;
00782
00785 virtual BOOL SetDataSize(
00786 PINDEX dataSize
00787 );
00788
00790
00791 protected:
00792 PVideoInputDevice * inputDevice;
00793 PVideoOutputDevice * outputDevice;
00794 BOOL autoDelete;
00795 PTimeInterval lastGrabTime;
00796 };
00797
00798
00799
00800 #endif //__OPAL_MEDIASTRM_H
00801
00802
00803