--- /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 <e32base.h>
+#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<CMccVideoPacket> 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
+