diff -r 000000000000 -r 71ca22bcf22a mmserv/voipaudioservices/JitterBufferUtility/inc/JitterBufferImpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/voipaudioservices/JitterBufferUtility/inc/JitterBufferImpl.h Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,336 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Jitter buffer for Audio frames. +* Interface : VoIPJitterBuffer.lib +* +*/ + + + +#ifndef __VOIPJITTERBUFFERIMPL_H +#define __VOIPJITTERBUFFERIMPL_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CVoIPCNGenerator; +class MJitterBufferObserver; + +// CLASS DECLARATION + +/** + * Jitter buffer element including packet received. + * + * @lib VoIPJitterBuffer.lib + * @since Series 60 5.0 + */ +class TJitterBufferElement + { +public: // Constructor + inline TJitterBufferElement() : iDataFrame(NULL), + iSequenceNumber(-1), + iTimeStamp(-1) {} + +public: // Methods + + /** + * Compares two elements based on their sequence number + * @since Series 60 5.0 + * @param aElem1 First element + * @param aElem2 Second element + * @return TInt + */ + static TInt CompareSeqNum(const TJitterBufferElement& aElem1, + const TJitterBufferElement& aElem2); + + /** + * Compares two elements based on their stamps + * @since Series 60 5.0 + * @param aElem1 First element + * @param aElem2 Second element + * @return TInt + */ + static TInt CompareStamp(const TJitterBufferElement& aElem1, + const TJitterBufferElement& aElem2); + +public: // Data members + // Data + CMMFDataBuffer* iDataFrame; + + // Data packet number + TInt64 iSequenceNumber; + + // Time stamp + TInt64 iTimeStamp; + + }; + + +/** + * Jitter buffer. + * + * @lib VoIPJitterBuffer.lib + * @since Series 60 5.0 + */ +class CVoIPJitterBufferImpl : public CBase + { +public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVoIPJitterBufferImpl* NewL(MJitterBufferObserver* aObserver); + + /** + * Destructor. + */ + virtual ~CVoIPJitterBufferImpl(); + +public: // Methods + + /** + * Setup jitterbuffer + * @since Series 60 5.0 + * @param parameters + * @return void + */ + void SetupL(const TFourCC aCodec, const TVoIPJBConfig& aJBConfig); + + /** + * Reset buffer + * @since Series 60 5.0 + * @param aPlayTone ETrue, if tone is to played + * @return void + */ + void ResetBuffer(TBool aPlayTone = ETrue); + + /** + * Add DataFrame to buffer + * @since Series 60 5.0 + * @param aBuffer Buffer to read data from + * @return void + */ + TInt AddDataFrame(CMMFBuffer* aDataBuffer); + + /** + * Get DataFrame from buffer + * @since Series 60 5.0 + * @param aBuffer Buffer to write data to + * @return TInt + */ + TInt GetDataFrame(CMMFBuffer* aBuffer); + + /** + * Get Current Codec + * @since Series 60 5.0 + * @param None + * @return TFourCC + */ + TFourCC CurrentCodec() const; + + /** + * Delay Up + * @since Series 60 5.0 + * @param None + * @return void + */ + void DelayUpL(); + + /** + * Decreases jitter buffer delay + * @since Series 60 5.0 + * @param None + * @return void + */ + void DelayDownL(); + + /** + * ?Description + * @since Series 60 5.0 + * @param None + * @return TTimeIntervalMicroSeconds32 + */ + TTimeIntervalMicroSeconds32 CalculateDelay() const; + + /** + * Get the length of jitter buffer, in terms of number of packets. + * @since Series 60 5.0 + * @param none + * @return buffer lenght. + */ + TInt BufferLength() const; + + /** + * Get number of packets that are currently inside the buffer. + * @since Series 60 5.0 + * @param none + * @return Number of packet in buffer. + */ + TInt PacketCount() const; + + /** + * Fills the given event with statistics of the jitterbuffer + * @since Series 60 5.0 + * @param aEvent Event into which set the statistics + * @return void + */ + void GenerateStatistics(/*TJBStats& aStats*/) const; + +private: + + /** + * C++ default constructor. + */ + CVoIPJitterBufferImpl(MJitterBufferObserver* aObserver); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + +private: // New functions + + /** + * Is sequence number wrapped around TUint16 65535->0 + * @since Series 60 5.0 + * @param TInt aSeqNum1 is oldest packet sequence number in buffer + * @param TInt aSeqNum2 is new element sequence number to buffer + * @return detect the wrap-around condition. + */ + TBool IsSeqNumWrappedAround(TInt64 aSeqNum1, TInt64 aSeqNum2) const; + + /** + * Find Largest SequenceNumber + * @since Series 60 5.0 + * @param None + * @return TUint Largest sequence number + */ + TUint FindLargestSeqNum(); + + /** + * Inserts a databuffer into the jitter buffer + * @since Series 60 5.0 + * @param aBuffer Buffer containing the data + * @param aLargestSeqNum Largest sequence number returned by + * FindLargestSeqNum() + * @return void + */ + void InsertBufferElement(const TDesC8& aBuffer, TInt64 aLargestSeqNum); + + /** + * Is jitter buffer full? + * @since Series 60 5.0 + * @param none + * @return True if full. + */ + TBool IsFull() const; + + /** + * Is jitter buffer empty? + * @since Series 60 5.0 + * @param none + * @return True if empty. + */ + TBool IsEmpty() const; + + /** + * CheckThresholdBufferLength + * @since Series 60 5.0 + * @param none + * @return void + */ + void CheckThresholdBufferLength(TInt& aBufferLength, + const TInt aTreshhold) const; + +private: // Data + + // Playout thresholds + TInt iCurrentPlayThreshold; + TInt iOriginalPlayThreshold; + + // Buffer length + TInt iBufferLength; + + // Jitter buffer array (queue) + RArray iBuffer; + + // Instance of comfort noise generator + CVoIPCNGenerator* iCNGenerator; + + // Frame SequenceNumber + TInt64 iCurrentSeqNum; + + // Sequence number of previously played frame + TInt64 iLastPlayedSeqNum; + TInt64 iLargestSeqNum; + + // Jitter buffer sorting objects + TLinearOrder iBufStampSorter; + TLinearOrder iBufSequenceSorter; + + // JB configuration parameters + TVoIPJBConfig iJBConfig; + + // Codec frame size + TInt iFrameSize; + + // Encoded frame sample interval + TInt iSampleInterval; + + // Increment in frame sequence number + TUint iSeqNumIncrement; + + TBool iIsWrappedAround; + + MJitterBufferObserver* iObserver; + CMMFDataBuffer* iDataBuffer; + +// These are mainly for statistical purpose + + // Number of frames totally lost + TUint iFramesLost; + + // Number of frames received + TUint iFramesReceived; + + // Number of frames removed by adaptation or because of overflows + TUint iFramesRemoved; + + // Number of frames played + TUint iFramesPlayed; + + // Number of frames arrived late + TUint iNumOfLateFrames; + + // Number of packets in buffer + TInt iPacketsInBuffer; + + // Buffer overflow counter + TUint iOverflowCounter; + + // Jitter buffer inctivity time + TInt iInactivityTime; + +// These are for tone playback + TInt iPlayToneInterval; + TTime iTonePlayTime; + TInt iSampleRate; + TBool iPlay; + + }; + +#endif //__VOIPJITTERBUFFERIMPL_H + +// End of file