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 #ifndef __OPAL_MEDIASTRM_H
00128 #define __OPAL_MEDIASTRM_H
00129
00130 #ifdef P_USE_PRAGMA
00131 #pragma interface
00132 #endif
00133
00134
00135 #include <opal/buildopts.h>
00136 #include <opal/mediafmt.h>
00137 #include <opal/mediacmd.h>
00138
00139
00140 class RTP_Session;
00141 class OpalMediaPatch;
00142 class OpalLine;
00143
00144
00150 class OpalMediaStream : public PObject
00151 {
00152 PCLASSINFO(OpalMediaStream, PObject);
00153 protected:
00158 OpalMediaStream(
00159 const OpalMediaFormat & mediaFormat,
00160 unsigned sessionID,
00161 BOOL isSource
00162 );
00163
00164 public:
00168 ~OpalMediaStream();
00170
00171 public:
00178 void PrintOn(
00179 ostream & strm
00180 ) const;
00182
00192 virtual OpalMediaFormat GetMediaFormat() const;
00193
00202 virtual BOOL UpdateMediaFormat(
00203 const OpalMediaFormat & mediaFormat
00204 );
00205
00212 virtual BOOL ExecuteCommand(
00213 const OpalMediaCommand & command
00214 );
00215
00223 virtual void SetCommandNotifier(
00224 const PNotifier & notifier
00225 );
00226
00231 virtual BOOL Open();
00232
00238 virtual BOOL Start();
00239
00244 virtual BOOL Close();
00245
00250 virtual BOOL WritePackets(
00251 RTP_DataFrameList & packets
00252 );
00253
00259 virtual BOOL ReadPacket(
00260 RTP_DataFrame & packet
00261 );
00262
00268 virtual BOOL WritePacket(
00269 RTP_DataFrame & packet
00270 );
00271
00277 virtual BOOL ReadData(
00278 BYTE * data,
00279 PINDEX size,
00280 PINDEX & length
00281 );
00282
00288 virtual BOOL WriteData(
00289 const BYTE * data,
00290 PINDEX length,
00291 PINDEX & written
00292 );
00293
00299 virtual BOOL SetDataSize(
00300 PINDEX dataSize
00301 );
00302
00306 PINDEX GetDataSize() const { return defaultDataSize; }
00307
00314 virtual BOOL IsSynchronous() const = 0;
00315
00319 virtual BOOL RequiresPatchThread() const;
00320
00325 virtual void EnableJitterBuffer() const;
00327
00332 BOOL IsSource() const { return isSource; }
00333
00336 BOOL IsSink() const { return !isSource; }
00337
00340 unsigned GetSessionID() const { return sessionID; }
00341
00344 unsigned GetTimestamp() const { return timestamp; }
00345
00348 void SetTimestamp(unsigned ts) { timestamp = ts; }
00349
00352 BOOL GetMarker() const { return marker; }
00353
00356 void SetMarker(BOOL m) { marker = m; }
00357
00360 BOOL IsPaused() const { return paused; }
00361
00364 void SetPaused(BOOL p) { paused = p; }
00365
00368 BOOL IsOpen() { return isOpen; }
00369
00372 void SetPatch(
00373 OpalMediaPatch * patch
00374 );
00375
00378 OpalMediaPatch * GetPatch() const { return patchThread; }
00380
00381 protected:
00382 OpalMediaFormat mediaFormat;
00383 unsigned sessionID;
00384 BOOL paused;
00385 BOOL isSource;
00386 BOOL isOpen;
00387 PINDEX defaultDataSize;
00388 unsigned timestamp;
00389 BOOL marker;
00390 unsigned mismatchedPayloadTypes;
00391
00392 OpalMediaPatch * patchThread;
00393 PMutex patchMutex;
00394 PNotifier commandNotifier;
00395 };
00396
00397 PLIST(OpalMediaStreamList, OpalMediaStream);
00398
00399
00402 class OpalNullMediaStream : public OpalMediaStream
00403 {
00404 PCLASSINFO(OpalNullMediaStream, OpalMediaStream);
00405 public:
00410 OpalNullMediaStream(
00411 const OpalMediaFormat & mediaFormat,
00412 unsigned sessionID,
00413 BOOL isSource
00414 );
00416
00422 virtual BOOL ReadData(
00423 BYTE * data,
00424 PINDEX size,
00425 PINDEX & length
00426 );
00427
00431 virtual BOOL WriteData(
00432 const BYTE * data,
00433 PINDEX length,
00434 PINDEX & written
00435 );
00436
00440 virtual BOOL RequiresPatchThread() const;
00441
00445 virtual BOOL IsSynchronous() const;
00447 };
00448
00449
00453 class OpalRTPMediaStream : public OpalMediaStream
00454 {
00455 PCLASSINFO(OpalRTPMediaStream, OpalMediaStream);
00456 public:
00461 OpalRTPMediaStream(
00462 const OpalMediaFormat & mediaFormat,
00463 BOOL isSource,
00464 RTP_Session & rtpSession,
00465 unsigned minAudioJitterDelay,
00466 unsigned maxAudioJitterDelay
00467 );
00469
00476 virtual BOOL Open();
00477
00482 virtual BOOL Close();
00483
00487 virtual BOOL ReadPacket(
00488 RTP_DataFrame & packet
00489 );
00490
00494 virtual BOOL WritePacket(
00495 RTP_DataFrame & packet
00496 );
00497
00501 virtual BOOL IsSynchronous() const;
00502
00507 virtual void EnableJitterBuffer() const;
00509
00510 protected:
00511 RTP_Session & rtpSession;
00512 unsigned minAudioJitterDelay;
00513 unsigned maxAudioJitterDelay;
00514 };
00515
00516
00517
00520 class OpalRawMediaStream : public OpalMediaStream
00521 {
00522 PCLASSINFO(OpalRawMediaStream, OpalMediaStream);
00523 protected:
00528 OpalRawMediaStream(
00529 const OpalMediaFormat & mediaFormat,
00530 unsigned sessionID,
00531 BOOL isSource,
00532 PChannel * channel,
00533 BOOL autoDelete
00534 );
00535
00538 ~OpalRawMediaStream();
00540
00541 public:
00547 virtual BOOL ReadData(
00548 BYTE * data,
00549 PINDEX size,
00550 PINDEX & length
00551 );
00552
00556 virtual BOOL WriteData(
00557 const BYTE * data,
00558 PINDEX length,
00559 PINDEX & written
00560 );
00561
00564 PChannel * GetChannel() { return channel; }
00565
00566
00571 virtual BOOL Close();
00573
00574 protected:
00575 PChannel * channel;
00576 BOOL autoDelete;
00577 };
00578
00579
00580
00583 class OpalFileMediaStream : public OpalRawMediaStream
00584 {
00585 PCLASSINFO(OpalFileMediaStream, OpalRawMediaStream);
00586 public:
00591 OpalFileMediaStream(
00592 const OpalMediaFormat & mediaFormat,
00593 unsigned sessionID,
00594 BOOL isSource,
00595 PFile * file,
00596 BOOL autoDelete = TRUE
00597 );
00598
00601 OpalFileMediaStream(
00602 const OpalMediaFormat & mediaFormat,
00603 unsigned sessionID,
00604 BOOL isSource,
00605 const PFilePath & path
00606 );
00608
00614 virtual BOOL IsSynchronous() const;
00616
00617 protected:
00618 PFile file;
00619 };
00620
00621
00625 class OpalAudioMediaStream : public OpalRawMediaStream
00626 {
00627 PCLASSINFO(OpalAudioMediaStream, OpalRawMediaStream);
00628 public:
00633 OpalAudioMediaStream(
00634 const OpalMediaFormat & mediaFormat,
00635 unsigned sessionID,
00636 BOOL isSource,
00637 PINDEX buffers,
00638 PSoundChannel * channel,
00639 BOOL autoDelete = TRUE
00640 );
00641
00644 OpalAudioMediaStream(
00645 const OpalMediaFormat & mediaFormat,
00646 unsigned sessionID,
00647 BOOL isSource,
00648 PINDEX buffers,
00649 const PString & deviceName
00650 );
00652
00660 virtual BOOL SetDataSize(
00661 PINDEX dataSize
00662 );
00663
00667 virtual BOOL IsSynchronous() const;
00669
00670 protected:
00671 PINDEX soundChannelBuffers;
00672 };
00673
00674
00678 class OpalVideoMediaStream : public OpalMediaStream
00679 {
00680 PCLASSINFO(OpalVideoMediaStream, OpalMediaStream);
00681 public:
00686 OpalVideoMediaStream(
00687 const OpalMediaFormat & mediaFormat,
00688 unsigned sessionID,
00689 PVideoInputDevice * inputDevice,
00690 PVideoOutputDevice * outputDevice,
00691 BOOL autoDelete = TRUE
00692 );
00693
00696 ~OpalVideoMediaStream();
00698
00706 virtual BOOL Open();
00707
00713 virtual BOOL ReadData(
00714 BYTE * data,
00715 PINDEX size,
00716 PINDEX & length
00717 );
00718
00724 virtual BOOL WriteData(
00725 const BYTE * data,
00726 PINDEX length,
00727 PINDEX & written
00728 );
00729
00733 virtual BOOL IsSynchronous() const;
00734
00737 virtual BOOL SetDataSize(
00738 PINDEX dataSize
00739 );
00740
00742
00743 protected:
00744 PVideoInputDevice * inputDevice;
00745 PVideoOutputDevice * outputDevice;
00746 BOOL autoDelete;
00747 PTimeInterval lastGrabTime;
00748 };
00749
00750
00751
00752 #endif //__OPAL_MEDIASTRM_H
00753
00754
00755