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 fTotNumFragmentsUsed(0) {
00029 }
00030
00031 AC3AudioRTPSink::~AC3AudioRTPSink() {
00032 }
00033
00034 AC3AudioRTPSink*
00035 AC3AudioRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs,
00036 u_int8_t rtpPayloadFormat,
00037 u_int32_t rtpTimestampFrequency) {
00038 return new AC3AudioRTPSink(env, RTPgs,
00039 rtpPayloadFormat, rtpTimestampFrequency);
00040 }
00041
00042 Boolean AC3AudioRTPSink
00043 ::frameCanAppearAfterPacketStart(unsigned char const* ,
00044 unsigned ) const {
00045
00046 return False;
00047 }
00048
00049 void AC3AudioRTPSink
00050 ::doSpecialFrameHandling(unsigned fragmentationOffset,
00051 unsigned char* frameStart,
00052 unsigned numBytesInFrame,
00053 struct timeval framePresentationTime,
00054 unsigned numRemainingBytes) {
00055
00056 unsigned char headers[2];
00057
00058 Boolean isFragment = numRemainingBytes > 0 || fragmentationOffset > 0;
00059 if (!isFragment) {
00060 headers[0] = 0;
00061 headers[1] = 1;
00062 } else {
00063 if (fragmentationOffset > 0) {
00064 headers[0] = 3;
00065 } else {
00066
00067 unsigned const totalFrameSize = fragmentationOffset + numBytesInFrame + numRemainingBytes;
00068 unsigned const fiveEighthsPoint = totalFrameSize/2 + totalFrameSize/8;
00069 headers[0] = numBytesInFrame >= fiveEighthsPoint ? 1 : 2;
00070
00071
00072
00073 fTotNumFragmentsUsed = (totalFrameSize + (numBytesInFrame-1))/numBytesInFrame;
00074 }
00075
00076 headers[1] = fTotNumFragmentsUsed;
00077 }
00078
00079 setSpecialHeaderBytes(headers, sizeof headers);
00080
00081 if (numRemainingBytes == 0) {
00082
00083
00084 setMarkerBit();
00085 }
00086
00087
00088
00089 MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset,
00090 frameStart, numBytesInFrame,
00091 framePresentationTime,
00092 numRemainingBytes);
00093 }
00094
00095 unsigned AC3AudioRTPSink::specialHeaderSize() const {
00096 return 2;
00097 }