00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "VP8VideoRTPSource.hh"
00022
00023 VP8VideoRTPSource*
00024 VP8VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs,
00025 unsigned char rtpPayloadFormat,
00026 unsigned rtpTimestampFrequency) {
00027 return new VP8VideoRTPSource(env, RTPgs, rtpPayloadFormat,
00028 rtpTimestampFrequency);
00029 }
00030
00031 VP8VideoRTPSource
00032 ::VP8VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs,
00033 unsigned char rtpPayloadFormat,
00034 unsigned rtpTimestampFrequency)
00035 : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency) {
00036 }
00037
00038 VP8VideoRTPSource::~VP8VideoRTPSource() {
00039 }
00040
00041 Boolean VP8VideoRTPSource
00042 ::processSpecialHeader(BufferedPacket* packet,
00043 unsigned& resultSpecialHeaderSize) {
00044 unsigned char* headerStart = packet->data();
00045 unsigned packetSize = packet->dataSize();
00046
00047
00048 if (packetSize == 0) return False;
00049 resultSpecialHeaderSize = 1;
00050
00051 u_int8_t const byte1 = headerStart[0];
00052 Boolean const X = (byte1&0x80) != 0;
00053 Boolean const S = (byte1&0x10) != 0;
00054 u_int8_t const PartID = byte1&0x0F;
00055
00056 fCurrentPacketBeginsFrame = S && PartID == 0;
00057 fCurrentPacketCompletesFrame = packet->rtpMarkerBit();
00058
00059 if (X) {
00060 ++resultSpecialHeaderSize;
00061
00062 u_int8_t const byte2 = headerStart[1];
00063 Boolean const I = (byte2&0x80) != 0;
00064 Boolean const L = (byte2&0x40) != 0;
00065 Boolean const T = (byte2&0x20) != 0;
00066 Boolean const K = (byte2&0x10) != 0;
00067
00068 if (I) {
00069 ++resultSpecialHeaderSize;
00070 if (headerStart[2]&0x80) {
00071 ++resultSpecialHeaderSize;
00072 }
00073 }
00074
00075 if (L) ++resultSpecialHeaderSize;
00076 if (T||K) ++resultSpecialHeaderSize;
00077 }
00078
00079 return True;
00080 }
00081
00082 char const* VP8VideoRTPSource::MIMEtype() const {
00083 return "video/VP8";
00084 }