multimediacommscontroller/mmccvideosourcesink/inc/mccvideosinkuser.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccvideosourcesink/inc/mccvideosinkuser.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,314 @@
+/*
+* 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 MCCVIDEOSINKUSER_H
+#define MCCVIDEOSINKUSER_H
+
+// INCLUDES
+#include <e32base.h>
+#include "rtpdef.h"
+#include "mccinternalcodecs.h"
+#include "mccvideojitterbuffer.h"
+
+// N times average timestamp difference in timestamps between subsequent packets
+// is allowed
+const TInt KMccTimeStampDifferenceTreshold = 20;
+
+// Number of subsequent timestamps stored
+const TInt KMccTimeStampArraySize = 4;
+
+// Minimum size for Helix PacketSink queue
+const TInt KMccMinXPSQueueSize = 1000;
+
+// Limits for sequence number based timestamp difference threshold
+const TInt KMccSeqNumDifferenceThresholdMin = 10;
+const TInt KMccSeqNumDifferenceThresholdMax = 100;
+
+// Mininum payload buffer size
+const TInt KMccVideoSinkMinPayloadBufSize = 4096;
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CXPSPacketSink;
+
+// CLASS DECLARATION
+
+class TMccTimeStampEntry
+    {
+public:
+
+    inline TMccTimeStampEntry();
+    
+    inline TMccTimeStampEntry( TInt64 aTime, TUint16 aSeq );
+        
+    TInt64 iTime;
+    TUint16 iSeq;
+    };
+
+/**
+* Stores details of single videosink user. Is used also to detect
+* incorrect RTP timestamp usage. If other end is detected
+* to be misbehaving, timestamps are tried to be corrected as otherwise
+* video player is not able to playback the stream. 
+*
+*  @lib 
+*  @since 
+*/
+class CMccVideoSinkUser : public CBase, public MMccVideoJitterBufferObserver
+    {
+    public: // Enumerations
+    
+        enum TMccPacketOverflowState
+            {
+            ENormal,
+            EOccured,
+            ERecovered
+            };
+            
+        enum TMccTimeStampModifyMode
+            {
+            EModifyInit,
+            EModifyRequiredMonitoring,
+            EModifyRequired,
+            EModifyNotRequiredMonitoring,
+            EModifyNotRequired
+            };
+    
+    public: // Functions
+
+        /**
+        * Constructor
+        */
+        static CMccVideoSinkUser* NewL( MAsyncEventHandler* aAsyncEventHandler, 
+                                        TUid aMediaType,
+                                        TUint aStreamId,
+                                        TReal aFrameRate,
+                                        CXPSPacketSink& aPacketSink );
+                                         
+        /**
+        * Constructor
+        */
+        static CMccVideoSinkUser* NewLC( MAsyncEventHandler* aAsyncEventHandler, 
+                                         TUid aMediaType,
+                                         TUint aStreamId,
+                                         TReal aFrameRate,
+                                         CXPSPacketSink& aPacketSink );
+        
+        ~CMccVideoSinkUser();
+        
+        /**
+        * Enqueue packet
+        * @param aHeader
+        * @param aPayloadData
+        */
+        CMccVideoJitterBuffer::TMccPacketBufferingStatus 
+            EnqueueL( const TRtpRecvHeader& aHeaderInfo, 
+                      const TDesC8& aPayloadData );
+    
+        /**
+        * Set identifier values. E.g. can be used if this class is used
+        * as dummy search parameter.
+        * @param aAsyncEventHandler
+        * @param aMediaType
+        * @param aStreamId
+        */
+        void Set( MAsyncEventHandler* aAsyncEventHandler, 
+                  TUid aMediaType,
+                  TUint aStreamId );
+        
+        /**
+        * Set framerate for the user
+        * @param aFrameRate
+        */
+        void SetFrameRateL( TReal aFrameRate );
+        
+        /**
+        * Get preroll value for the user
+        * @return preroll value
+        */
+        TInt GetPreroll();
+        
+        /**
+        * Get actual preroll value for the user
+        * @return preroll value
+        */
+        TInt GetActualPreroll();
+        
+        /**
+        * User play
+        */
+        void Play();
+        
+        /**
+        * User pause
+        */
+        void Pause();
+                           
+        TBool IsQueueSizeDefined() const;
+            
+        TUint QueueSize() const;
+            
+        TMccPacketOverflowState PacketOverflowState() const;
+
+        void SetPacketOverflow( TMccPacketOverflowState aState );
+            
+        void AddTimeStamp( TInt64 aTimeStamp, TUint16 aSeq ); 
+        
+        void Reset( TBool aFullReset );
+        
+        void CalculateAverageTimeStampDifference();
+        
+        TBool IsResetNeeded( TRtpRecvHeader& aHeaderInfo );
+        
+        TBool IsResetNeeded() const;
+        
+        TBool IsModifyNeeded( TRtpRecvHeader& aHeaderInfo );
+    
+        void SetAllowFrame( TBool aAllowFrame );
+            
+        TBool AllowFrame() const;
+        
+        /**
+        * Let user know whether there's other users
+        * @param aMultipleMediaTypes
+        */
+        void SetMultipleMediaTypesL( TBool aMultipleMediaTypes );
+        
+        /**
+        * Set codec info for the user
+        * @param aCodecInfo
+        */
+        void SetCodecInfoL( const TMccCodecInfo& aCodecInfo );
+
+        TMccCodecInfo& CodecInfo();
+        
+        TInt GetPayloadSize();
+    
+    public: // From MMccVideoJitterBufferObserver
+    
+        void ErrorOccured( TInt aError );
+        
+    private:
+    
+        TInt NumTimeStamps() const;
+        
+        void RemoveFirstTimeStamp();
+        
+        void RemoveAllTimeStamps();
+        
+        TBool DoModify( TRtpRecvHeader& aHeaderInfo );
+        
+        TInt SeqNumDifToLastSeqNum( TUint16 aSeq );
+        
+       
+        void DoModifyCheckInit( const TRtpRecvHeader& aHeaderInfo );
+        
+        void DoModifyCheckMonitoring( const TRtpRecvHeader& aHeaderInfo );
+        
+        void SetModifyingState( TMccTimeStampModifyMode aModifyMode );
+        
+        TBool MonitoringModify();
+        
+        TBool ModifyRequired();
+        
+        TUint32 GetTimestampDifferenceToPrevious( TUint32 aCurrentTimestamp );
+        
+        void UpdateFirstTimestamp( TUint32 aTimestamp );
+        
+        TUint32 DifferenceThreshold( TInt aSeqNumDif ) const;
+        
+        void CheckDenyFramesMaxPeriod();
+        
+        void DecideMonitoringContinuation( TMccTimeStampModifyMode aNextState );
+        
+        TBool IsResetNeededNormalMode( TRtpRecvHeader& aHeaderInfo );
+    
+        TBool IsResetNeededRealTimeMode( TRtpRecvHeader& aHeaderInfo );
+        
+        TBool RealTimeUser();
+        
+        void CheckErrorL( TInt aError );
+        
+        TBool CodecSpecificDataHandling( const TDesC8& aPayloadData );
+    
+    private:
+    
+        CMccVideoSinkUser( MAsyncEventHandler* aAsyncEventHandler, 
+                           TUid aMediaType,
+                           TUint aStreamId,
+                           TReal aFrameRate,
+                           CXPSPacketSink& aPacketSink );
+                                                   
+    public: // Data
+    
+        MAsyncEventHandler* iAsyncEventHandler;
+        TUid iMediaType;
+        TUint iStreamId;
+        TMccTimeStampEntry iTimeStamps[ KMccTimeStampArraySize ];
+        TBool iStartedOnce;
+        TReal iFrameRate;
+        TMccCodecInfo iCodecInfo;
+        
+    private:
+    
+        CXPSPacketSink& iPacketSink;  
+        
+        TMccPacketOverflowState iPacketOverflowState;
+        TInt iNumTimeStamps;
+        TUint32 iAverageTimeStampDifference;
+        TBool iResetNeeded;
+        TMccTimeStampModifyMode iModifyMode;
+        
+        TTime iFirstModifyCheck;
+        TUint32 iFirstModifyCheckTimestamp;
+        TUint32 iFirstTimestamp;
+        
+        TBool iAllowFrame;
+        TTime iDenyFramesStarted;
+        
+        TBool iMultipleMediaTypes;
+        
+        TUint32 iPreviousPacketOriginalTimeStamp;
+        TUint32 iPreviousPacketModifiedTimeStamp;
+        TTime iPreviousPacketTime;
+        
+        TUint32 iCurrentMonitoringPeriod;
+        
+        TReal iTimestampIncreaseFactorDown;
+        TReal iTimestampIncreaseFactorUp;
+        
+        CMccVideoJitterBuffer* iJitterBuf;
+        
+        TInt iPayloadSize;
+    
+    private:
+    	#ifdef TEST_EUNIT
+			friend class UT_CMccVideoSinkImpl;
+			friend class UT_CMccVideoSinkUser;	
+   		#endif    
+    };
+
+#endif  // MCCVIDEOSINKUSER_H
+