diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccvideosourcesink/inc/mccvideosinkuser.h --- /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 +#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 +