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,
00036 Groupsock* RTPgs,
00037 unsigned char rtpPayloadFormat,
00038 unsigned profile_level_id,
00039 char const* sprop_parameter_sets_str);
00040
00041 protected:
00042 H264VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs,
00043 unsigned char rtpPayloadFormat,
00044 unsigned profile_level_id,
00045 char const* sprop_parameter_sets_str);
00046
00047
00048 virtual ~H264VideoRTPSink();
00049
00050 private:
00051 virtual Boolean sourceIsCompatibleWithUs(MediaSource& source);
00052 virtual Boolean continuePlaying();
00053 virtual void stopPlaying();
00054 virtual void doSpecialFrameHandling(unsigned fragmentationOffset,
00055 unsigned char* frameStart,
00056 unsigned numBytesInFrame,
00057 struct timeval frameTimestamp,
00058 unsigned numRemainingBytes);
00059 virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart,
00060 unsigned numBytesInFrame) const;
00061 virtual char const* auxSDPLine();
00062
00063 protected:
00064 H264FUAFragmenter* fOurFragmenter;
00065
00066 private:
00067 char* fFmtpSDPLine;
00068 };
00069
00070
00072
00073
00074
00075
00076
00077
00078
00079
00080 class H264FUAFragmenter: public FramedFilter {
00081 public:
00082 H264FUAFragmenter(UsageEnvironment& env, FramedSource* inputSource,
00083 unsigned inputBufferMax, unsigned maxOutputPacketSize);
00084 virtual ~H264FUAFragmenter();
00085
00086 Boolean lastFragmentCompletedNALUnit() const { return fLastFragmentCompletedNALUnit; }
00087
00088 private:
00089 virtual void doGetNextFrame();
00090
00091 private:
00092 static void afterGettingFrame(void* clientData, unsigned frameSize,
00093 unsigned numTruncatedBytes,
00094 struct timeval presentationTime,
00095 unsigned durationInMicroseconds);
00096 void afterGettingFrame1(unsigned frameSize,
00097 unsigned numTruncatedBytes,
00098 struct timeval presentationTime,
00099 unsigned durationInMicroseconds);
00100
00101 private:
00102 unsigned fInputBufferSize;
00103 unsigned fMaxOutputPacketSize;
00104 unsigned char* fInputBuffer;
00105 unsigned fNumValidDataBytes;
00106 unsigned fCurDataOffset;
00107 unsigned fSaveNumTruncatedBytes;
00108 Boolean fLastFragmentCompletedNALUnit;
00109 };
00110
00111
00112 #endif