
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 |
| FrameDescriptor * | fFrames [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 |
Definition at line 380 of file AMRAudioRTPSource.cpp.
| 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 }
| 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 }
unsigned AMRDeinterleavingBuffer::fNumChannels [private] |
unsigned AMRDeinterleavingBuffer::fMaxInterleaveGroupSize [private] |
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] |
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().
u_int16_t AMRDeinterleavingBuffer::fLastPacketSeqNumForGroup [private] |
unsigned char* AMRDeinterleavingBuffer::fInputBuffer [private] |
Definition at line 419 of file AMRAudioRTPSource.cpp.
Referenced by deliverIncomingFrame(), and ~AMRDeinterleavingBuffer().
struct timeval AMRDeinterleavingBuffer::fLastRetrievedPresentationTime [read, private] |
unsigned AMRDeinterleavingBuffer::fNumSuccessiveSyncedFrames [private] |
unsigned char AMRDeinterleavingBuffer::fILL [private] |
Definition at line 422 of file AMRAudioRTPSource.cpp.
Referenced by deliverIncomingFrame(), and retrieveFrame().
1.5.2