00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _MEDIA_SINK_HH
00022 #define _MEDIA_SINK_HH
00023
00024 #ifndef _FRAMED_SOURCE_HH
00025 #include "FramedSource.hh"
00026 #endif
00027
00028 class MediaSink: public Medium {
00029 public:
00030 static Boolean lookupByName(UsageEnvironment& env, char const* sinkName,
00031 MediaSink*& resultSink);
00032
00033 typedef void (afterPlayingFunc)(void* clientData);
00034 Boolean startPlaying(MediaSource& source,
00035 afterPlayingFunc* afterFunc,
00036 void* afterClientData);
00037 virtual void stopPlaying();
00038
00039
00040 virtual Boolean isRTPSink() const;
00041
00042 FramedSource* source() const {return fSource;}
00043
00044 protected:
00045 MediaSink(UsageEnvironment& env);
00046 virtual ~MediaSink();
00047
00048 virtual Boolean sourceIsCompatibleWithUs(MediaSource& source);
00049
00050 virtual Boolean continuePlaying() = 0;
00051
00052
00053 static void onSourceClosure(void* clientData);
00054
00055
00056
00057 FramedSource* fSource;
00058
00059 private:
00060
00061 virtual Boolean isSink() const;
00062
00063 private:
00064
00065 afterPlayingFunc* fAfterFunc;
00066 void* fAfterClientData;
00067 };
00068
00069
00070 class OutPacketBuffer {
00071 public:
00072 OutPacketBuffer(unsigned preferredPacketSize, unsigned maxPacketSize);
00073 ~OutPacketBuffer();
00074
00075 static unsigned maxSize;
00076
00077 unsigned char* curPtr() const {return &fBuf[fPacketStart + fCurOffset];}
00078 unsigned totalBytesAvailable() const {
00079 return fLimit - (fPacketStart + fCurOffset);
00080 }
00081 unsigned totalBufferSize() const { return fLimit; }
00082 unsigned char* packet() const {return &fBuf[fPacketStart];}
00083 unsigned curPacketSize() const {return fCurOffset;}
00084
00085 void increment(unsigned numBytes) {fCurOffset += numBytes;}
00086
00087 void enqueue(unsigned char const* from, unsigned numBytes);
00088 void enqueueWord(u_int32_t word);
00089 void insert(unsigned char const* from, unsigned numBytes, unsigned toPosition);
00090 void insertWord(u_int32_t word, unsigned toPosition);
00091 void extract(unsigned char* to, unsigned numBytes, unsigned fromPosition);
00092 u_int32_t extractWord(unsigned fromPosition);
00093
00094 void skipBytes(unsigned numBytes);
00095
00096 Boolean isPreferredSize() const {return fCurOffset >= fPreferred;}
00097 Boolean wouldOverflow(unsigned numBytes) const {
00098 return (fCurOffset+numBytes) > fMax;
00099 }
00100 unsigned numOverflowBytes(unsigned numBytes) const {
00101 return (fCurOffset+numBytes) - fMax;
00102 }
00103 Boolean isTooBigForAPacket(unsigned numBytes) const {
00104 return numBytes > fMax;
00105 }
00106
00107 void setOverflowData(unsigned overflowDataOffset,
00108 unsigned overflowDataSize,
00109 struct timeval const& presentationTime,
00110 unsigned durationInMicroseconds);
00111 unsigned overflowDataSize() const {return fOverflowDataSize;}
00112 struct timeval overflowPresentationTime() const {return fOverflowPresentationTime;}
00113 unsigned overflowDurationInMicroseconds() const {return fOverflowDurationInMicroseconds;}
00114 Boolean haveOverflowData() const {return fOverflowDataSize > 0;}
00115 void useOverflowData();
00116
00117 void adjustPacketStart(unsigned numBytes);
00118 void resetPacketStart();
00119 void resetOffset() { fCurOffset = 0; }
00120 void resetOverflowData() { fOverflowDataOffset = fOverflowDataSize = 0; }
00121
00122 private:
00123 unsigned fPacketStart, fCurOffset, fPreferred, fMax, fLimit;
00124 unsigned char* fBuf;
00125
00126 unsigned fOverflowDataOffset, fOverflowDataSize;
00127 struct timeval fOverflowPresentationTime;
00128 unsigned fOverflowDurationInMicroseconds;
00129 };
00130
00131 #endif