AMRDeinterleavingBuffer Class Reference

Collaboration diagram for AMRDeinterleavingBuffer:

Collaboration graph
[legend]

Public Member Functions

 AMRDeinterleavingBuffer (unsigned numChannels, unsigned maxInterleaveGroupSize)
virtual ~AMRDeinterleavingBuffer ()
void deliverIncomingFrame (unsigned frameSize, RawAMRRTPSource *source, struct timeval presentationTime)
Boolean retrieveFrame (unsigned char *to, unsigned maxSize, unsigned &resultFrameSize, unsigned &resultNumTruncatedBytes, u_int8_t &resultFrameHeader, struct timeval &resultPresentationTime, Boolean &resultIsSynchronized)
unsigned char * inputBuffer ()
unsigned inputBufferSize () const

Private Member Functions

unsigned char * createNewBuffer ()

Private Attributes

unsigned fNumChannels
unsigned fMaxInterleaveGroupSize
FrameDescriptorfFrames [2]
unsigned char fIncomingBankId
unsigned char fIncomingBinMax
unsigned char fOutgoingBinMax
unsigned char fNextOutgoingBin
Boolean fHaveSeenPackets
u_int16_t fLastPacketSeqNumForGroup
unsigned char * fInputBuffer
timeval fLastRetrievedPresentationTime
unsigned fNumSuccessiveSyncedFrames
unsigned char fILL

Data Structures

class  FrameDescriptor

Detailed Description

Definition at line 380 of file AMRAudioRTPSource.cpp.


Constructor & Destructor Documentation

AMRDeinterleavingBuffer::AMRDeinterleavingBuffer ( unsigned  numChannels,
unsigned  maxInterleaveGroupSize 
)

Definition at line 510 of file AMRAudioRTPSource.cpp.

00511   : fNumChannels(numChannels), fMaxInterleaveGroupSize(maxInterleaveGroupSize),
00512     fIncomingBankId(0), fIncomingBinMax(0),
00513     fOutgoingBinMax(0), fNextOutgoingBin(0),
00514     fHaveSeenPackets(False), fNumSuccessiveSyncedFrames(0), fILL(0) {
00515   // Use two banks of descriptors - one for incoming, one for outgoing
00516   fFrames[0] = new FrameDescriptor[fMaxInterleaveGroupSize];
00517   fFrames[1] = new FrameDescriptor[fMaxInterleaveGroupSize];
00518   fInputBuffer = createNewBuffer();
00519 }

AMRDeinterleavingBuffer::~AMRDeinterleavingBuffer (  )  [virtual]

Definition at line 521 of file AMRAudioRTPSource.cpp.

References fFrames, and fInputBuffer.

00521                                                   {
00522   delete[] fInputBuffer;
00523   delete[] fFrames[0]; delete[] fFrames[1];
00524 }


Member Function Documentation

void AMRDeinterleavingBuffer::deliverIncomingFrame ( unsigned  frameSize,
RawAMRRTPSource source,
struct timeval  presentationTime 
)

Definition at line 527 of file AMRAudioRTPSource.cpp.

References createNewBuffer(), RTPSource::curPacketRTPSeqNum(), Medium::envir(), fFrames, fHaveSeenPackets, fILL, fIncomingBankId, fIncomingBinMax, fInputBuffer, AMRDeinterleavingBuffer::FrameDescriptor::fIsSynchronized, fLastPacketSeqNumForGroup, fMaxInterleaveGroupSize, fNextOutgoingBin, fNumChannels, fOutgoingBinMax, AMRDeinterleavingBuffer::FrameDescriptor::frameData, AMRDeinterleavingBuffer::FrameDescriptor::frameHeader, RawAMRRTPSource::frameIndex(), AMRDeinterleavingBuffer::FrameDescriptor::frameSize, FT_NO_DATA, RawAMRRTPSource::ILL(), RawAMRRTPSource::ILP(), UsageEnvironment::internalError(), NULL, AMRDeinterleavingBuffer::FrameDescriptor::presentationTime, seqNumLT(), RawAMRRTPSource::TOC(), RawAMRRTPSource::TOCSize(), True, and uSecsPerFrame.

Referenced by AMRDeinterleaver::afterGettingFrame1().

00528                                                         {
00529   fILL = source->ILL();
00530   unsigned char const ILP = source->ILP();
00531   unsigned frameIndex = source->frameIndex();
00532   unsigned short packetSeqNum = source->curPacketRTPSeqNum();
00533 
00534   // First perform a sanity check on the parameters:
00535   // (This is overkill, as the source should have already done this.)
00536   if (ILP > fILL || frameIndex == 0) {
00537 #ifdef DEBUG
00538     fprintf(stderr, "AMRDeinterleavingBuffer::deliverIncomingFrame() param sanity check failed (%d,%d,%d,%d)\n", frameSize, fILL, ILP, frameIndex);
00539 #endif
00540     source->envir().internalError();
00541   }
00542 
00543   --frameIndex; // because it was incremented by the source when this frame was read
00544   u_int8_t frameHeader;
00545   if (frameIndex >= source->TOCSize()) { // sanity check
00546     frameHeader = FT_NO_DATA<<3;
00547   } else {
00548     frameHeader = source->TOC()[frameIndex];
00549   }
00550 
00551   unsigned frameBlockIndex = frameIndex/fNumChannels;
00552   unsigned frameWithinFrameBlock = frameIndex%fNumChannels;
00553 
00554   // The input "presentationTime" was that of the first frame-block in this
00555   // packet.  Update it for the current frame:
00556   unsigned uSecIncrement = frameBlockIndex*(fILL+1)*uSecsPerFrame;
00557   presentationTime.tv_usec += uSecIncrement;
00558   presentationTime.tv_sec += presentationTime.tv_usec/1000000;
00559   presentationTime.tv_usec = presentationTime.tv_usec%1000000;
00560 
00561   // Next, check whether this packet is part of a new interleave group
00562   if (!fHaveSeenPackets
00563       || seqNumLT(fLastPacketSeqNumForGroup, packetSeqNum + frameBlockIndex)) {
00564     // We've moved to a new interleave group
00565 #ifdef DEBUG
00566     fprintf(stderr, "AMRDeinterleavingBuffer::deliverIncomingFrame(): new interleave group\n");
00567 #endif
00568     fHaveSeenPackets = True;
00569     fLastPacketSeqNumForGroup = packetSeqNum + fILL - ILP;
00570 
00571     // Switch the incoming and outgoing banks:
00572     fIncomingBankId ^= 1;
00573     unsigned char tmp = fIncomingBinMax;
00574     fIncomingBinMax = fOutgoingBinMax;
00575     fOutgoingBinMax = tmp;
00576     fNextOutgoingBin = 0;
00577   }
00578 
00579   // Now move the incoming frame into the appropriate bin:
00580   unsigned const binNumber
00581     = ((ILP + frameBlockIndex*(fILL+1))*fNumChannels + frameWithinFrameBlock)
00582       % fMaxInterleaveGroupSize; // the % is for sanity
00583 #ifdef DEBUG
00584   fprintf(stderr, "AMRDeinterleavingBuffer::deliverIncomingFrame(): frameIndex %d (%d,%d) put in bank %d, bin %d (%d): size %d, header 0x%02x, presentationTime %lu.%06ld\n", frameIndex, frameBlockIndex, frameWithinFrameBlock, fIncomingBankId, binNumber, fMaxInterleaveGroupSize, frameSize, frameHeader, presentationTime.tv_sec, presentationTime.tv_usec);
00585 #endif
00586   FrameDescriptor& inBin = fFrames[fIncomingBankId][binNumber];
00587   unsigned char* curBuffer = inBin.frameData;
00588   inBin.frameData = fInputBuffer;
00589   inBin.frameSize = frameSize;
00590   inBin.frameHeader = frameHeader;
00591   inBin.presentationTime = presentationTime;
00592   inBin.fIsSynchronized = ((RTPSource*)source)->RTPSource::hasBeenSynchronizedUsingRTCP();
00593 
00594   if (curBuffer == NULL) curBuffer = createNewBuffer();
00595   fInputBuffer = curBuffer;
00596 
00597   if (binNumber >= fIncomingBinMax) {
00598     fIncomingBinMax = binNumber + 1;
00599   }
00600 }

Boolean AMRDeinterleavingBuffer::retrieveFrame ( unsigned char *  to,
unsigned  maxSize,
unsigned &  resultFrameSize,
unsigned &  resultNumTruncatedBytes,
u_int8_t &  resultFrameHeader,
struct timeval &  resultPresentationTime,
Boolean resultIsSynchronized 
)

Definition at line 603 of file AMRAudioRTPSource.cpp.

References False, fFrames, fILL, fIncomingBankId, AMRDeinterleavingBuffer::FrameDescriptor::fIsSynchronized, fLastRetrievedPresentationTime, fNextOutgoingBin, fNumSuccessiveSyncedFrames, fOutgoingBinMax, AMRDeinterleavingBuffer::FrameDescriptor::frameData, AMRDeinterleavingBuffer::FrameDescriptor::frameHeader, AMRDeinterleavingBuffer::FrameDescriptor::frameSize, FT_NO_DATA, AMRDeinterleavingBuffer::FrameDescriptor::presentationTime, True, and uSecsPerFrame.

Referenced by AMRDeinterleaver::doGetNextFrame().

00607                                                {
00608 
00609   if (fNextOutgoingBin >= fOutgoingBinMax) return False; // none left
00610 
00611   FrameDescriptor& outBin = fFrames[fIncomingBankId^1][fNextOutgoingBin];
00612   unsigned char* fromPtr = outBin.frameData;
00613   unsigned char fromSize = outBin.frameSize;
00614   outBin.frameSize = 0; // for the next time this bin is used
00615   resultIsSynchronized = False; // by default; can be changed by:
00616   if (outBin.fIsSynchronized) {
00617     // Don't consider the outgoing frame to be synchronized until we've received at least a complete interleave cycle of
00618     // synchronized frames.  This ensures that the receiver will be getting all synchronized frames from now on.
00619     if (++fNumSuccessiveSyncedFrames > fILL) {
00620       resultIsSynchronized = True;
00621       fNumSuccessiveSyncedFrames = fILL+1; // prevents overflow
00622     }
00623   } else {
00624     fNumSuccessiveSyncedFrames = 0;
00625   } 
00626 
00627   // Check whether this frame is missing; if so, return a FT_NO_DATA frame:
00628   if (fromSize == 0) {
00629     resultFrameHeader = FT_NO_DATA<<3;
00630 
00631     // Compute this erasure frame's presentation time via extrapolation:
00632     resultPresentationTime = fLastRetrievedPresentationTime;
00633     resultPresentationTime.tv_usec += uSecsPerFrame;
00634     if (resultPresentationTime.tv_usec >= 1000000) {
00635       ++resultPresentationTime.tv_sec;
00636       resultPresentationTime.tv_usec -= 1000000;
00637     }
00638   } else {
00639     // Normal case - a frame exists:
00640     resultFrameHeader = outBin.frameHeader;
00641     resultPresentationTime = outBin.presentationTime;
00642   }
00643 
00644   fLastRetrievedPresentationTime = resultPresentationTime;
00645 
00646   if (fromSize > maxSize) {
00647     resultNumTruncatedBytes = fromSize - maxSize;
00648     resultFrameSize = maxSize;
00649   } else {
00650     resultNumTruncatedBytes = 0;
00651     resultFrameSize = fromSize;
00652   }
00653   memmove(to, fromPtr, resultFrameSize);
00654 #ifdef DEBUG
00655   fprintf(stderr, "AMRDeinterleavingBuffer::retrieveFrame(): from bank %d, bin %d: size %d, header 0x%02x, presentationTime %lu.%06ld\n", fIncomingBankId^1, fNextOutgoingBin, resultFrameSize, resultFrameHeader, resultPresentationTime.tv_sec, resultPresentationTime.tv_usec);
00656 #endif
00657 
00658   ++fNextOutgoingBin;
00659   return True;
00660 }

unsigned char* AMRDeinterleavingBuffer::inputBuffer (  )  [inline]

Definition at line 393 of file AMRAudioRTPSource.cpp.

Referenced by AMRDeinterleaver::doGetNextFrame().

00393 { return fInputBuffer; }

unsigned AMRDeinterleavingBuffer::inputBufferSize (  )  const [inline]

Definition at line 394 of file AMRAudioRTPSource.cpp.

References AMR_MAX_FRAME_SIZE.

Referenced by createNewBuffer(), and AMRDeinterleaver::doGetNextFrame().

00394 { return AMR_MAX_FRAME_SIZE; }

unsigned char * AMRDeinterleavingBuffer::createNewBuffer (  )  [private]

Definition at line 662 of file AMRAudioRTPSource.cpp.

References inputBufferSize().

Referenced by deliverIncomingFrame().

00662                                                         {
00663   return new unsigned char[inputBufferSize()];
00664 }


Field Documentation

unsigned AMRDeinterleavingBuffer::fNumChannels [private]

Definition at line 411 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame().

unsigned AMRDeinterleavingBuffer::fMaxInterleaveGroupSize [private]

Definition at line 411 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame().

FrameDescriptor* AMRDeinterleavingBuffer::fFrames[2] [private]

Definition at line 412 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame(), retrieveFrame(), and ~AMRDeinterleavingBuffer().

unsigned char AMRDeinterleavingBuffer::fIncomingBankId [private]

Definition at line 413 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame(), and retrieveFrame().

unsigned char AMRDeinterleavingBuffer::fIncomingBinMax [private]

Definition at line 414 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame().

unsigned char AMRDeinterleavingBuffer::fOutgoingBinMax [private]

Definition at line 415 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame(), and retrieveFrame().

unsigned char AMRDeinterleavingBuffer::fNextOutgoingBin [private]

Definition at line 416 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame(), and retrieveFrame().

Boolean AMRDeinterleavingBuffer::fHaveSeenPackets [private]

Definition at line 417 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame().

u_int16_t AMRDeinterleavingBuffer::fLastPacketSeqNumForGroup [private]

Definition at line 418 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame().

unsigned char* AMRDeinterleavingBuffer::fInputBuffer [private]

Definition at line 419 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame(), and ~AMRDeinterleavingBuffer().

struct timeval AMRDeinterleavingBuffer::fLastRetrievedPresentationTime [read, private]

Definition at line 420 of file AMRAudioRTPSource.cpp.

Referenced by retrieveFrame().

unsigned AMRDeinterleavingBuffer::fNumSuccessiveSyncedFrames [private]

Definition at line 421 of file AMRAudioRTPSource.cpp.

Referenced by retrieveFrame().

unsigned char AMRDeinterleavingBuffer::fILL [private]

Definition at line 422 of file AMRAudioRTPSource.cpp.

Referenced by deliverIncomingFrame(), and retrieveFrame().


The documentation for this class was generated from the following file:
Generated on Mon Apr 29 13:31:13 2013 for live by  doxygen 1.5.2