diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccvideosourcesink/inc/mccvideojitterbuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccvideosourcesink/inc/mccvideojitterbuffer.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,262 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + + + +#ifndef MCCVIDEOJITTERBUFFER_H +#define MCCVIDEOJITTERBUFFER_H + +// INCLUDES +#include +#include "rtpdef.h" +#include "rtpheader.h" + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CXPSPacketSink; + +// CONSTANTS + +const TInt KMccJitterBufferDefaultMaxSize = 1200; +const TInt KMccJitterBufferDefaultPlayThreshold = 600; +const TInt KMccJitterBufferDefaultLowLimit = 200; +const TInt KMccJitterBufferDefaultHighLimit = 900; + +// CLASS DECLARATION + +/** +* Callback interface for buffer user. +*/ +class MMccVideoJitterBufferObserver + { + public: + virtual void ErrorOccured( TInt aError ) = 0; + }; + +/** +* Buffer for queueuing video packets before posting them towards Helix. +* Buffer is used to fight against network abnormalities (e.g. bursts). +* +*/ +class CMccVideoJitterBuffer : public CTimer + { + +public: + + /** + * Buffering status + */ + enum TMccPacketBufferingStatus + { + EBuffering, + EPlayingStarted, + EPlaying + }; + + + /** + * Storing data of single packet + */ + class CMccVideoPacket : public CBase + { + public: + + static CMccVideoPacket* NewLC( TUint aStreamId, + const TRtpRecvHeader& aHeaderInfo, + const TDesC8& aPayloadData, + TBool aImportantData ); + ~CMccVideoPacket(); + + TUint StreamId(); + + TRtpRecvHeader& HeaderInfo(); + + const TDesC8& PayloadData(); + + static TInt InsertInSeqNumOrder( const CMccVideoPacket& aPacket1, + const CMccVideoPacket& aPacket2 ); + + TBool DroppingAllowed() const; + + private: + + CMccVideoPacket( TUint aStreamId, + const TRtpRecvHeader& aHeaderInfo, + TBool aImportantData ); + + void ConstructL( const TDesC8& aPayloadData ); + + private: + + TUint iStreamId; + + TRtpRecvHeader iHeaderInfo; + + TBool iImportantData; + + HBufC8* iPayloadData; + + }; + + /** + * Two-phased constructor. + * @param aObserver + * @param aPacketSink + * @param aInactivityTimeout in milliseconds + */ + static CMccVideoJitterBuffer* NewL( MMccVideoJitterBufferObserver& aObserver, + CXPSPacketSink& aPacketSink, + TUint aInactivityTimeoutInMs ); + + /** + * Two-phased constructor. + * @param aObserver + * @param aPacketSink + * @param aInactivityTimeout in milliseconds + */ + static CMccVideoJitterBuffer* NewLC( MMccVideoJitterBufferObserver& aObserver, + CXPSPacketSink& aPacketSink, + TUint aInactivityTimeoutInMs ); + + /** + * Destructor. + */ + ~CMccVideoJitterBuffer(); + + /** + * Configure behavior of jitter buffer + * @param aLowLimitMs + * @param aHighLimitMs + * @param aPlayThresholdMs + * @param aMaxSizeMs + * @param aFrameRateFps + */ + void ConfigureL( TUint aLowLimitMs, + TUint aHighLimitMs, + TUint aPlayThresholdMs, + TUint aMaxSizeMs, + TUint aFrameRateFps ); + + /** + * Enqueu packet + * @param aStreamId + * @param aHeaderInfo + * @param aPayloadData + * @param aImportantData, ETrue if packet cannot be dropped + * @return buffering status + */ + TMccPacketBufferingStatus EnqueueL( TUint aStreamId, + const TRtpRecvHeader& aHeaderInfo, + const TDesC8& aPayloadData, + TBool aImportantData ); + + /** + * Start/resume packet posting + */ + void Play(); + + /** + * Pause packet posting + */ + void Pause(); + + /** + * Get play threshold in milliseconds + * @return play threshold in milliseconds + */ + TInt PlayThresholdInMs(); + +protected: // from base class CActive + + void RunL(); + +private: + + CMccVideoJitterBuffer( MMccVideoJitterBufferObserver& aObserver, + CXPSPacketSink& aPacketSink, + TUint aInactivityTimeoutInMs ); + + void ConstructL(); + + void Start(); + + TBool PlayThresholdExceeded(); + + TTimeIntervalMicroSeconds32 CheckCurrentInterval(); + + void UpdateFrameCount( CMccVideoPacket& aPacket, TBool aIsAdded ); + + TBool PostFirstFrame(); + + void MakeRoom(); + + TBool MaxSizeExceeded(); + + void CheckPostingInactivity( TInt64 aTimeFromPreviousFrame ); + + CMccVideoJitterBuffer::TMccPacketBufferingStatus PlayingStatus(); + + void DoRtpHeaderModify( TRtpRecvHeader& aRecvHeader ); + +private: // data + + MMccVideoJitterBufferObserver& iObserver; + CXPSPacketSink& iPacketSink; + TUint iInactivityTimeoutInMicroSecs; + + RPointerArray iQueue; + + TUint iLowLimitMicroSecs; + TUint iHighLimitMicroSecs; + TUint iPlayThresholdMicroSecs; + TUint iMaxSizeMicroSecs; + TUint iFrameRate; + + TTimeIntervalMicroSeconds32 iCurrentInterval; + TTimeIntervalMicroSeconds32 iNormalInterval; + TTimeIntervalMicroSeconds32 iLowLimitInterval; + TTimeIntervalMicroSeconds32 iHighLimitInterval; + + TUint iFrameCount; + + TBool iPlayThresholdExeeced; + + TBool iPlaybackStarted; + + TUint16 iSeqNum; + + TUint32 iCurrentRealtimeTimestamp; + TUint32 iPreviousReceivedTimestamp; + TTime iPreviousTime; + + private: + #ifdef TEST_EUNIT + friend class UT_CMccVideoJitterBuffer; + friend class UT_CMccVideoSinkUser; + #endif + }; + + + +#endif // MCCVIDEOJITTERBUFFER_H +