00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "H263plusVideoRTPSource.hh"
00022
00023 H263plusVideoRTPSource*
00024 H263plusVideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs,
00025 unsigned char rtpPayloadFormat,
00026 unsigned rtpTimestampFrequency) {
00027 return new H263plusVideoRTPSource(env, RTPgs, rtpPayloadFormat,
00028 rtpTimestampFrequency);
00029 }
00030
00031 H263plusVideoRTPSource
00032 ::H263plusVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs,
00033 unsigned char rtpPayloadFormat,
00034 unsigned rtpTimestampFrequency)
00035 : MultiFramedRTPSource(env, RTPgs,
00036 rtpPayloadFormat, rtpTimestampFrequency),
00037 fNumSpecialHeaders(0), fSpecialHeaderBytesLength(0) {
00038 }
00039
00040 H263plusVideoRTPSource::~H263plusVideoRTPSource() {
00041 }
00042
00043 Boolean H263plusVideoRTPSource
00044 ::processSpecialHeader(BufferedPacket* packet,
00045 unsigned& resultSpecialHeaderSize) {
00046 unsigned char* headerStart = packet->data();
00047 unsigned packetSize = packet->dataSize();
00048
00049
00050
00051 unsigned expectedHeaderSize = 2;
00052 if (packetSize < expectedHeaderSize) return False;
00053
00054
00055 Boolean P = (headerStart[0]&0x4) != 0;
00056 Boolean V = (headerStart[0]&0x2) != 0;
00057 unsigned char PLEN = ((headerStart[0]&0x1)<<5)|(headerStart[1]>>3);
00058
00059
00060 if (V) {
00061
00062 ++expectedHeaderSize;
00063 if (packetSize < expectedHeaderSize) return False;
00064 }
00065
00066 if (PLEN > 0) {
00067
00068 expectedHeaderSize += PLEN;
00069 if (packetSize < expectedHeaderSize) return False;
00070 }
00071
00072 fCurrentPacketBeginsFrame = P;
00073 if (fCurrentPacketBeginsFrame) {
00074 fNumSpecialHeaders = fSpecialHeaderBytesLength = 0;
00075 }
00076
00077
00078
00079 unsigned bytesAvailable
00080 = SPECIAL_HEADER_BUFFER_SIZE - fSpecialHeaderBytesLength - 1;
00081 if (expectedHeaderSize <= bytesAvailable) {
00082 fSpecialHeaderBytes[fSpecialHeaderBytesLength++] = expectedHeaderSize;
00083 for (unsigned i = 0; i < expectedHeaderSize; ++i) {
00084 fSpecialHeaderBytes[fSpecialHeaderBytesLength++] = headerStart[i];
00085 }
00086 fPacketSizes[fNumSpecialHeaders++] = packetSize;
00087 }
00088
00089 if (P) {
00090
00091
00092 expectedHeaderSize -= 2;
00093 headerStart[expectedHeaderSize] = 0;
00094 headerStart[expectedHeaderSize+1] = 0;
00095 }
00096
00097
00098 fCurrentPacketCompletesFrame = packet->rtpMarkerBit();
00099
00100 resultSpecialHeaderSize = expectedHeaderSize;
00101 return True;
00102 }
00103
00104 char const* H263plusVideoRTPSource::MIMEtype() const {
00105 return "video/H263-1998";
00106 }