00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "AC3AudioRTPSink.hh"
00022
00023 AC3AudioRTPSink::AC3AudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs,
00024 u_int8_t rtpPayloadFormat,
00025 u_int32_t rtpTimestampFrequency)
00026 : AudioRTPSink(env, RTPgs, rtpPayloadFormat,
00027 rtpTimestampFrequency, "AC3") {
00028 }
00029
00030 AC3AudioRTPSink::~AC3AudioRTPSink() {
00031 }
00032
00033 AC3AudioRTPSink*
00034 AC3AudioRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs,
00035 u_int8_t rtpPayloadFormat,
00036 u_int32_t rtpTimestampFrequency) {
00037 return new AC3AudioRTPSink(env, RTPgs,
00038 rtpPayloadFormat, rtpTimestampFrequency);
00039 }
00040
00041 Boolean AC3AudioRTPSink
00042 ::frameCanAppearAfterPacketStart(unsigned char const* ,
00043 unsigned ) const {
00044
00045 return False;
00046 }
00047
00048 void AC3AudioRTPSink
00049 ::doSpecialFrameHandling(unsigned fragmentationOffset,
00050 unsigned char* frameStart,
00051 unsigned numBytesInFrame,
00052 struct timeval frameTimestamp,
00053 unsigned numRemainingBytes) {
00054
00055
00056
00057
00058 unsigned char headers[2];
00059 headers[0] = numFramesUsedSoFar() + 1;
00060
00061 Boolean isFragment = numRemainingBytes > 0 || fragmentationOffset > 0;
00062 unsigned const totalFrameSize
00063 = fragmentationOffset + numBytesInFrame + numRemainingBytes;
00064 unsigned const fiveEighthsPoint = totalFrameSize/2 + totalFrameSize/8;
00065 Boolean haveFiveEighths
00066 = fragmentationOffset == 0 && numBytesInFrame >= fiveEighthsPoint;
00067 headers[1] = (isFragment<<5)|(haveFiveEighths<<4);
00068
00069
00070 setSpecialHeaderBytes(headers, sizeof headers);
00071
00072 if (numRemainingBytes == 0) {
00073
00074
00075 setMarkerBit();
00076 }
00077
00078
00079
00080 MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset,
00081 frameStart, numBytesInFrame,
00082 frameTimestamp,
00083 numRemainingBytes);
00084 }
00085
00086 unsigned AC3AudioRTPSink::specialHeaderSize() const {
00087
00088
00089
00090
00091 return 1 + 1;
00092 }