00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "AC3AudioRTPSource.hh"
00022
00023 AC3AudioRTPSource*
00024 AC3AudioRTPSource::createNew(UsageEnvironment& env,
00025 Groupsock* RTPgs,
00026 unsigned char rtpPayloadFormat,
00027 unsigned rtpTimestampFrequency) {
00028 return new AC3AudioRTPSource(env, RTPgs, rtpPayloadFormat,
00029 rtpTimestampFrequency);
00030 }
00031
00032 AC3AudioRTPSource::AC3AudioRTPSource(UsageEnvironment& env,
00033 Groupsock* rtpGS,
00034 unsigned char rtpPayloadFormat,
00035 unsigned rtpTimestampFrequency)
00036 : MultiFramedRTPSource(env, rtpGS,
00037 rtpPayloadFormat, rtpTimestampFrequency) {
00038 }
00039
00040 AC3AudioRTPSource::~AC3AudioRTPSource() {
00041 }
00042
00043 Boolean AC3AudioRTPSource
00044 ::processSpecialHeader(BufferedPacket* packet,
00045 unsigned& resultSpecialHeaderSize) {
00046 unsigned char* headerStart = packet->data();
00047 unsigned packetSize = packet->dataSize();
00048
00049
00050
00051 if (packetSize < 2) return False;
00052 unsigned char numFrames = headerStart[0];
00053 if (numFrames == 0) return False;
00054
00055
00056 if (numFrames > 1) {
00057 envir() << "AC3AudioRTPSource::processSpecialHeader(): packet contains "
00058 << numFrames << " frames (we can't handle this!)\n";
00059 return False;
00060 }
00061
00062
00063 unsigned char typ_field = headerStart[1] >> 6;
00064 if (typ_field >= 2) return False;
00065
00066 fCurrentPacketBeginsFrame = fCurrentPacketCompletesFrame;
00067
00068
00069
00070 fCurrentPacketCompletesFrame = packet->rtpMarkerBit();
00071
00072 resultSpecialHeaderSize = 2;
00073 return True;
00074 }
00075
00076 char const* AC3AudioRTPSource::MIMEtype() const {
00077 return "audio/AC3";
00078 }
00079