00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _MULTI_FRAMED_RTP_SINK_HH
00023 #define _MULTI_FRAMED_RTP_SINK_HH
00024
00025 #ifndef _RTP_SINK_HH
00026 #include "RTPSink.hh"
00027 #endif
00028
00029 class MultiFramedRTPSink: public RTPSink {
00030 public:
00031 void setPacketSizes(unsigned preferredPacketSize, unsigned maxPacketSize);
00032
00033 typedef void (onSendErrorFunc)(void* clientData);
00034 void setOnSendErrorFunc(onSendErrorFunc* onSendErrorFunc, void* onSendErrorFuncData) {
00035
00036 fOnSendErrorFunc = onSendErrorFunc;
00037 fOnSendErrorData = onSendErrorFuncData;
00038 }
00039
00040 protected:
00041 MultiFramedRTPSink(UsageEnvironment& env,
00042 Groupsock* rtpgs, unsigned char rtpPayloadType,
00043 unsigned rtpTimestampFrequency,
00044 char const* rtpPayloadFormatName,
00045 unsigned numChannels = 1);
00046
00047
00048 virtual ~MultiFramedRTPSink();
00049
00050 virtual void doSpecialFrameHandling(unsigned fragmentationOffset,
00051 unsigned char* frameStart,
00052 unsigned numBytesInFrame,
00053 struct timeval framePresentationTime,
00054 unsigned numRemainingBytes);
00055
00056 virtual Boolean allowFragmentationAfterStart() const;
00057
00058
00059 virtual Boolean allowOtherFramesAfterLastFragment() const;
00060
00061
00062 virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart,
00063 unsigned numBytesInFrame) const;
00064
00065 virtual unsigned specialHeaderSize() const;
00066
00067 virtual unsigned frameSpecificHeaderSize() const;
00068
00069
00070 virtual unsigned computeOverflowForNewFrame(unsigned newFrameSize) const;
00071
00072
00073
00074
00075
00076
00077 Boolean isFirstPacket() const { return fIsFirstPacket; }
00078 Boolean isFirstFrameInPacket() const { return fNumFramesUsedSoFar == 0; }
00079 Boolean curFragmentationOffset() const { return fCurFragmentationOffset; }
00080 void setMarkerBit();
00081 void setTimestamp(struct timeval framePresentationTime);
00082 void setSpecialHeaderWord(unsigned word,
00083 unsigned wordPosition = 0);
00084 void setSpecialHeaderBytes(unsigned char const* bytes, unsigned numBytes,
00085 unsigned bytePosition = 0);
00086 void setFrameSpecificHeaderWord(unsigned word,
00087 unsigned wordPosition = 0);
00088 void setFrameSpecificHeaderBytes(unsigned char const* bytes, unsigned numBytes,
00089 unsigned bytePosition = 0);
00090 void setFramePadding(unsigned numPaddingBytes);
00091 unsigned numFramesUsedSoFar() const { return fNumFramesUsedSoFar; }
00092 unsigned ourMaxPacketSize() const { return fOurMaxPacketSize; }
00093
00094 public:
00095 virtual void stopPlaying();
00096
00097 protected:
00098 virtual Boolean continuePlaying();
00099
00100 private:
00101 void buildAndSendPacket(Boolean isFirstPacket);
00102 void packFrame();
00103 void sendPacketIfNecessary();
00104 static void sendNext(void* firstArg);
00105 friend void sendNext(void*);
00106
00107 static void afterGettingFrame(void* clientData,
00108 unsigned numBytesRead, unsigned numTruncatedBytes,
00109 struct timeval presentationTime,
00110 unsigned durationInMicroseconds);
00111 void afterGettingFrame1(unsigned numBytesRead, unsigned numTruncatedBytes,
00112 struct timeval presentationTime,
00113 unsigned durationInMicroseconds);
00114 Boolean isTooBigForAPacket(unsigned numBytes) const;
00115
00116 static void ourHandleClosure(void* clientData);
00117
00118 private:
00119 OutPacketBuffer* fOutBuf;
00120
00121 Boolean fNoFramesLeft;
00122 unsigned fNumFramesUsedSoFar;
00123 unsigned fCurFragmentationOffset;
00124 Boolean fPreviousFrameEndedFragmentation;
00125
00126 Boolean fIsFirstPacket;
00127 struct timeval fNextSendTime;
00128 unsigned fTimestampPosition;
00129 unsigned fSpecialHeaderPosition;
00130 unsigned fSpecialHeaderSize;
00131 unsigned fCurFrameSpecificHeaderPosition;
00132 unsigned fCurFrameSpecificHeaderSize;
00133 unsigned fTotalFrameSpecificHeaderSizes;
00134 unsigned fOurMaxPacketSize;
00135
00136 onSendErrorFunc* fOnSendErrorFunc;
00137 void* fOnSendErrorData;
00138 };
00139
00140 #endif