diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccjitterbuffer/inc/mccjitterbufferimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccjitterbuffer/inc/mccjitterbufferimpl.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,367 @@ +/* +* Copyright (c) 2004-2007 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 : +* +*/ + + + + +#ifndef MCCJITTERBUFFERIMPL_H +#define MCCJITTERBUFFERIMPL_H + +// INCLUDES +#include +#include "mccinternalcodecs.h" +#include "mmccevents.h" + +// FORWARD DECLARATIONS +class CMccCnGenerator; +class CMMFDevSound; +class TMccJitterBufferEventData; +class MAsyncEventHandler; +class MDataSink; +class MJitterBufferObserver; + +// CLASS DECLARATION + +/** +* Jitter buffer element including packet received. +* +* @lib MMccJitterBuffer.lib +* @since Series 60 3.0 +*/ +NONSHARABLE_CLASS( TJitterBufferElement ) + { +public: // Constructor + inline TJitterBufferElement() : iDataFrame( NULL ), + iSequenceNumber( -1 ), iStamp( -1 ) + { }; + +public: // Data members + // Data + CMMFDataBuffer* iDataFrame; + + // Data packet number + TInt64 iSequenceNumber; + + TInt64 iStamp; + + /** + * Compares two elements based on their sequence number + * @since Series 60 3.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 3.0 + * @param aElem1 First element + * @param aElem2 Second element + * @return TInt + */ + static TInt CompareStamp( const TJitterBufferElement& aElem1, + const TJitterBufferElement& aElem2 ); + }; + +/** +* Jitter buffer. +* +* @lib MMccJitterBuffer.lib +* @since Series 60 3.0 +*/ +NONSHARABLE_CLASS( CMccJitterBufferImpl ) : public CBase + { +public: // Enumerations + + enum TMccJitterBufferImplState + { + EUnknown, + EIdle, + EPlaying, + EBuffering, + EDetermining + }; + +public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CMccJitterBufferImpl* NewL( MJitterBufferObserver* aObserver = NULL ); + + /** + * Destructor. + */ + virtual ~CMccJitterBufferImpl(); + +public: // Methods + + /** + * Setup jitterbuffer + * @since Series 60 3.0 + * @param parameters + * @return void + */ + void SetupL( TInt aPlayoutThreshold, + const TMccCodecInfo& aCInfo, + CMMFDevSound& aDevSound, + MAsyncEventHandler* aEventHandler, + TUint32 aEndpointId ); + + /** + * Reset buffer + * @since Series 60 3.0 + * @param aPlayTone ETrue, if tone is to played + * @param aNotifyUser ETrue, if state change should be notified + * @return void + */ + void ResetBuffer( TBool aPlayTone = ETrue, TBool aNotifyUser = ETrue ); + + /** + * Add DataFrame to buffer + * @since Series 60 3.0 + * @param aBuffer Buffer to read data from + * @return void + */ + void AddDataFrameL( CMMFBuffer* aDataBuffer ); + + /** + * Get DataFrame from buffer + * @since Series 60 3.0 + * @param aBuffer Buffer to write data to + * @return void + */ + void GetDataFrameL( CMMFBuffer* aBuffer ); + + /** + * Get Current Codec + * @since Series 60 3.0 + * @param None + * @return TFourCC + */ + TFourCC CurrentCodec() const; + + /** + * Delay Up + * @since Series 60 3.0 + * @param None + * @return void + */ + void DelayUpL(); + + /** + * Decreases jitter buffer delay + * @since Series 60 3.0 + * @param None + * @return void + */ + void DelayDownL(); + + /** + * ?Description + * @since Series 60 3.0 + * @param None + * @return TTimeIntervalMicroSeconds32 + */ + TTimeIntervalMicroSeconds32 CalculateDelay() const; + + /** + * Get the length of jitter buffer, in terms of number of packets. + * @since Series 60 3.0 + * @param none + * @return buffer lenght. + */ + TInt BufferLength() const; + + /** + * Fills the given event with statistics of the jitterbuffer + * @since Series 60 3.0 + * @param aEvent Event into which set the statistics + * @return void + */ + void GenerateStatistics( TMccJitterBufferEventData& aEvent ) const; + +private: + + /** + * C++ default constructor. + */ + CMccJitterBufferImpl( 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 3.0 + * @param TInt aSeqNum1 is oldest packet sequence numper in buffer + * @param TInt aSeqNum2 is new element sequence numper to buffer + * @return detect the wrap-around condition. + */ + TBool IsSeqNumWrappedAround( TInt64 aSeqNum1, TInt64 aSeqNum2 ) const; + + /** + * Find Largest SequenceNumber + * @since Series 60 3.0 + * @param None + * @return TInt Largest sequence number + */ + TInt FindLargestSeqNum() const; + + /** + * Inserts a databuffer into the jitter buffer + * @since Series 60 3.0 + * @param aBuffer Buffer containing the data + * @param aLargestSeqNum Largest sequence number returned by + * FindLargestSeqNum() + * @param aFrameNumber Sequence number of frame to be inserted. + * @return void + */ + void InsertBufferElement( const TDesC8& aBuffer, TInt64 aLargestSeqNum, + TInt64 aFrameNumber ); + + /** + * Is jitter buffer full? + * @since Series 60 3.0 + * @param none + * @return True if full. + */ + TBool IsFull() const; + + /** + * Is jitter buffer empty? + * @since Series 60 3.0 + * @param none + * @return True if empty. + */ + TBool IsEmpty() const; + + void HandleNotifications( TBool aBuffering ); + + void CheckThresholdBufferLength( TInt& aBufferLength, const TInt aTreshhold ) const; + + void SendStreamEventToClient( TMccEventType aEventType, + TBool aAllEndpoints = EFalse ); + + void SetBufferState( TMccJitterBufferImplState aState ); + + TMccJitterBufferImplState BufferState() const; + +private: // Data + + // Playout thresholds for storing the original threshold and current + // threshold + TInt iCurrentPlayThreshold; + TInt iOriginalPlayThreshold; + + // Number of packets in buffer + TInt iPacketsInBuffer; + + // Jitterbuffer RArray. + RArray iBuffer; + + // instance of comfortnoise generator. + CMccCnGenerator* iCnGenerator; + + // Sequence number of packet that is played out last time + TInt64 iLastGetSeqNum; + + // Function object for jitterbuffer sorting + TLinearOrder iBufStampSorter; + + // Function object for jitterbuffer sorting + TLinearOrder iBufSequenceSorter; + + // Number of frames arrived late + TUint iNumOfLateFrames; + + // Count of sequential late frames + TUint iNumOfSequentialLateFrames; + + // 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; + + // Codec information + TMccCodecInfo iCInfo; + + // Codec frame size + TInt iFrameSize; + + // Codec frame time + TInt iFrameTime; + + // Increment in frame sequence number + TUint iSeqNumIncrement; + + TBool iPlay; + + TInt iInactivityTime; + + MJitterBufferObserver* iObserver; + + TUint iOverflowCounter; + + TInt iPlayToneInterval; + TTime iTonePlayTime; + + MAsyncEventHandler* iEventHandler; + + // Endpoint identifier + TUint32 iEndpointId; + + TMccEvent iMccEvent; + + TBool iNotifyUser; + + TMccJitterBufferImplState iBufferState; + + TMccEventType iLatestNotifiedEvent; + + TInt iSampleRate; + + /** + * Flag to determine whether frame removal or frame drop should be done in + * overflow situation. + */ + TBool iDropNextFrame; + + private: + #ifdef TEST_EUNIT + friend class UT_CMccJitterBufferImpl; + #endif + }; + +#endif //MCCJITTERBUFFERIMPL_H + +// End of File +