00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "MPEG1or2VideoRTPSource.hh"
00022
00023 MPEG1or2VideoRTPSource*
00024 MPEG1or2VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs,
00025 unsigned char rtpPayloadFormat,
00026 unsigned rtpTimestampFrequency) {
00027 return new MPEG1or2VideoRTPSource(env, RTPgs, rtpPayloadFormat,
00028 rtpTimestampFrequency);
00029 }
00030
00031 MPEG1or2VideoRTPSource::MPEG1or2VideoRTPSource(UsageEnvironment& env,
00032 Groupsock* RTPgs,
00033 unsigned char rtpPayloadFormat,
00034 unsigned rtpTimestampFrequency)
00035 : MultiFramedRTPSource(env, RTPgs,
00036 rtpPayloadFormat, rtpTimestampFrequency){
00037 }
00038
00039 MPEG1or2VideoRTPSource::~MPEG1or2VideoRTPSource() {
00040 }
00041
00042 Boolean MPEG1or2VideoRTPSource
00043 ::processSpecialHeader(BufferedPacket* packet,
00044 unsigned& resultSpecialHeaderSize) {
00045
00046 if (packet->dataSize() < 4) return False;
00047
00048 u_int32_t header = ntohl(*(u_int32_t*)(packet->data()));
00049
00050 u_int32_t sBit = header&0x00002000;
00051 u_int32_t bBit = header&0x00001000;
00052 u_int32_t eBit = header&0x00000800;
00053
00054 fCurrentPacketBeginsFrame = (sBit|bBit) != 0;
00055 fCurrentPacketCompletesFrame = ((sBit&~bBit)|eBit) != 0;
00056
00057 resultSpecialHeaderSize = 4;
00058 return True;
00059 }
00060
00061 Boolean MPEG1or2VideoRTPSource
00062 ::packetIsUsableInJitterCalculation(unsigned char* packet,
00063 unsigned packetSize) {
00064
00065 if (packetSize < 4) return False;
00066
00067
00068
00069 unsigned header = ntohl(*(u_int32_t*)packet);
00070
00071 unsigned short pictureType = (header>>8)&0x7;
00072 if (pictureType == 1) {
00073 return True;
00074 } else {
00075 return False;
00076 }
00077 }
00078
00079 char const* MPEG1or2VideoRTPSource::MIMEtype() const {
00080 return "video/MPEG";
00081 }
00082