multimediacommscontroller/mmccvideosourcesink/inc/mccvideojitterbuffer.h
changeset 0 1bce908db942
--- /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
+