00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "H263plusVideoRTPSink.hh"
00022
00023 H263plusVideoRTPSink
00024 ::H263plusVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs,
00025 unsigned char rtpPayloadFormat,
00026 u_int32_t rtpTimestampFrequency)
00027 : VideoRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, "H263-1998") {
00028 }
00029
00030 H263plusVideoRTPSink::~H263plusVideoRTPSink() {
00031 }
00032
00033 H263plusVideoRTPSink*
00034 H263plusVideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs,
00035 unsigned char rtpPayloadFormat,
00036 u_int32_t rtpTimestampFrequency) {
00037 return new H263plusVideoRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency);
00038 }
00039
00040 Boolean H263plusVideoRTPSink
00041 ::frameCanAppearAfterPacketStart(unsigned char const* ,
00042 unsigned ) const {
00043
00044 return False;
00045 }
00046
00047 void H263plusVideoRTPSink
00048 ::doSpecialFrameHandling(unsigned fragmentationOffset,
00049 unsigned char* frameStart,
00050 unsigned numBytesInFrame,
00051 struct timeval framePresentationTime,
00052 unsigned numRemainingBytes) {
00053 if (fragmentationOffset == 0) {
00054
00055
00056 unsigned short specialHeader = 0x0400;
00057
00058
00059
00060 if (numBytesInFrame < 2) {
00061 envir() << "H263plusVideoRTPSink::doSpecialFrameHandling(): bad frame size "
00062 << numBytesInFrame << "\n";
00063 return;
00064 }
00065 if (frameStart[0] != 0 || frameStart[1] != 0) {
00066 envir() << "H263plusVideoRTPSink::doSpecialFrameHandling(): unexpected non-zero first two bytes: "
00067 << (void*)(frameStart[0]) << "," << (void*)(frameStart[1]) << "\n";
00068 }
00069 frameStart[0] = specialHeader>>8;
00070 frameStart[1] = (unsigned char)specialHeader;
00071 } else {
00072 unsigned short specialHeader = 0;
00073 setSpecialHeaderBytes((unsigned char*)&specialHeader, 2);
00074 }
00075
00076 if (numRemainingBytes == 0) {
00077
00078
00079 setMarkerBit();
00080 }
00081
00082
00083 setTimestamp(framePresentationTime);
00084 }
00085
00086
00087 unsigned H263plusVideoRTPSink::specialHeaderSize() const {
00088
00089
00090
00091 return (curFragmentationOffset() == 0) ? 0 : 2;
00092 }