00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _H264_VIDEO_RTP_SINK_HH
00022 #define _H264_VIDEO_RTP_SINK_HH
00023
00024 #ifndef _VIDEO_RTP_SINK_HH
00025 #include "VideoRTPSink.hh"
00026 #endif
00027 #ifndef _FRAMED_FILTER_HH
00028 #include "FramedFilter.hh"
00029 #endif
00030
00031 class H264FUAFragmenter;
00032
00033 class H264VideoRTPSink: public VideoRTPSink {
00034 public:
00035 static H264VideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat);
00036 static H264VideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat,
00037 u_int8_t const* sps, unsigned spsSize, u_int8_t const* pps, unsigned ppsSize);
00038
00039 static H264VideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat,
00040 char const* sPropParameterSetsStr);
00041
00042
00043 protected:
00044 H264VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat,
00045 u_int8_t const* sps = NULL, unsigned spsSize = 0, u_int8_t const* pps = NULL, unsigned ppsSize = 0);
00046
00047
00048 virtual ~H264VideoRTPSink();
00049
00050 protected:
00051 virtual char const* auxSDPLine();
00052
00053 private:
00054 virtual Boolean sourceIsCompatibleWithUs(MediaSource& source);
00055 virtual Boolean continuePlaying();
00056 virtual void doSpecialFrameHandling(unsigned fragmentationOffset,
00057 unsigned char* frameStart,
00058 unsigned numBytesInFrame,
00059 struct timeval framePresentationTime,
00060 unsigned numRemainingBytes);
00061 virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart,
00062 unsigned numBytesInFrame) const;
00063
00064 protected:
00065 H264FUAFragmenter* fOurFragmenter;
00066
00067 private:
00068 char* fFmtpSDPLine;
00069 u_int8_t* fSPS; unsigned fSPSSize; u_int8_t* fPPS; unsigned fPPSSize;
00070 };
00071
00072
00074
00075
00076
00077
00078
00079
00080
00081
00082 class H264FUAFragmenter: public FramedFilter {
00083 public:
00084 H264FUAFragmenter(UsageEnvironment& env, FramedSource* inputSource,
00085 unsigned inputBufferMax, unsigned maxOutputPacketSize);
00086 virtual ~H264FUAFragmenter();
00087
00088 Boolean lastFragmentCompletedNALUnit() const { return fLastFragmentCompletedNALUnit; }
00089
00090 private:
00091 virtual void doGetNextFrame();
00092
00093 private:
00094 static void afterGettingFrame(void* clientData, unsigned frameSize,
00095 unsigned numTruncatedBytes,
00096 struct timeval presentationTime,
00097 unsigned durationInMicroseconds);
00098 void afterGettingFrame1(unsigned frameSize,
00099 unsigned numTruncatedBytes,
00100 struct timeval presentationTime,
00101 unsigned durationInMicroseconds);
00102
00103 private:
00104 unsigned fInputBufferSize;
00105 unsigned fMaxOutputPacketSize;
00106 unsigned char* fInputBuffer;
00107 unsigned fNumValidDataBytes;
00108 unsigned fCurDataOffset;
00109 unsigned fSaveNumTruncatedBytes;
00110 Boolean fLastFragmentCompletedNALUnit;
00111 };
00112
00113
00114 #endif