rtp/rtpstack/inc/rtpsession.h
changeset 0 307788aac0a8
child 29 5f12516512fa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rtp/rtpstack/inc/rtpsession.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,479 @@
+/*
+* Copyright (c) 2004-2005 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 __RTPSESSION_H
+#define __RTPSESSION_H
+
+// INCLUDES
+#include <e32base.h>
+#include <rtpheader.h>
+#include "rtputil.h"
+#include "rtptimer.h"
+#include "rtpsdes.h"
+#include "rtpsessiondef.h"
+
+//Packet
+#include "rtppacket.h"
+#include "rtppacketext.h"
+#include "rtppacketparam.h"
+
+//Stream
+#include "rtpstreamdef.h"
+#include "rtptranstream.h"
+#include "rtprecvstream.h"
+#include "rtpasignuniqueid.h"
+
+//Comm
+#include "rtpcomm.h"
+#include "rtpcommdef.h"
+
+
+/**
+*  class for rtp session. 
+*
+*  @lib RtpService.dll
+*/
+class CRtpSession :
+    public CBase,
+    public MReceivedNotify,
+    public MTimeOutNotify,
+    public MSsrcCheckCallback
+    {
+    
+    public:
+
+        enum TStreamType
+            {
+            ETxStream       = 0,
+            ERxStream
+            };
+
+        enum
+            {
+            ECallBack,
+            ETimeOut
+            };
+       
+    public: // new functions
+        static CRtpSession* NewL( const TCreateSessionParams& aParams,
+                                  TUint& aPort,
+                                  TBool aEnableRtcp,
+                                  const TRtcpParams* aRtcpParams,
+                                  RSocketServ& aSocketServ,
+                                  RConnection& aRConn,
+                                  const TRtpId aSessionId,
+                                  const CRtpSDES* aSdes,
+                                  const TUint32* aProfileRTPTimeRates,
+                                  const TBool aStandardRtp,
+                                  const RLibrary& aLibrary,
+                                  MRtpErrNotify& aErrNotify,
+                                  MRtpAsignUniqueID& aAssignUniqueID );
+                                  
+        ~CRtpSession();
+
+        TRtpSSRC SSRC() const;
+
+        TInt StartSession();
+
+        TInt SetRemoteAddress( TInetAddr& aRemoteAddr );
+        TInt SetRemoteRtcpAddress( TInetAddr& aRemoteAddr );
+
+        TInt CreateReceiveStreamL( TRtpId aStreamId, const TRtpPayloadType aPayloadType );
+
+        TInt CreateTransmitStreamL( TRtpId aStreamId, const TRtpPayloadType aPayloadType, TUint32& aSSRC );
+
+        TInt CreateTransmitStreamExtL( TRtpId aStreamId, const TRtpPayloadType aPayloadType, const TUint32 aSSRC );
+
+        void CloseStream( TRtpId aStreamId );
+
+        void ResetTxStreamStats();
+        void ResetRxStreamStats();
+
+        TInt RegisterRtpObserver( MRtpObserver& aObserver );
+        void UnregisterRtpObserver();
+
+        TInt SetNonRTPDataObserver( MNonRTPDataObserver* aNonRTPDataObserver );
+
+        TInt SendRtpPacket( TRtpId aTranStreamId, const TRtpSendHeader& aHeaderInfo, 
+                            const TDesC8& aPayloadData );
+
+        TInt SendRtpPacket( TRtpId aTranStreamId,
+                            const TRtpSendHeader& aHeaderInfo,
+                            const TDesC8& aPayloadData,
+                            TRequestStatus& aStatus );
+
+        TInt SendRtpPacket( const TRtpSendHeader& aHeaderInfo, const TDesC8& aPayloadData );
+
+        TInt SendRtpPacket( const TRtpSendHeader& aHeaderInfo, const TDesC8& aPayloadData, 
+                            TRequestStatus& aStatus );
+
+        TInt SendRtpPacket( TRtpId aTranStreamId,
+                            TRtpSequence aSequenceNum,
+                            const TRtpSendHeader& aHeaderInfo,
+                            const TDesC8& aPayloadData,
+                            TRequestStatus& aStatus );
+
+        void SendData( TBool aUseRTPSocket,
+                            const TDesC8& aData, 
+                            TRequestStatus& aStatus );
+
+        void CancelSend();
+
+        TInt RegisterRtcpObserver( MRtcpObserver& aObserver );
+        void UnregisterRtcpObserver();
+        TInt SendRtcpByePacketL( TRtpId aTranStreamId, const TDesC8& aReason );
+        TInt SendRtcpAppPacketL( TRtpId aTranStreamId, const TRtcpApp& aApp );
+        TInt SendRtcpSrPacketL( TRtpId aTranStreamId );
+        TInt SendRtcpRrPacketL( TRtpId aRecvStreamId );
+
+        RSocket* GetRtpSocket();
+        RSocket* GetRtcpSocket();
+
+        TInt GetStreamStatistics( TRtpId aStreamId, TRtpPeerStat& aStat );
+        TInt SetRtcpParameters( const TRtcpParams& aRtcpParams );
+
+        TRtpId GetSessionId();
+
+        TInt StopRtcpSending();
+        TInt ResumeRtcpSending();
+
+		/**
+        * Gets the status of automatic RTCP sending.
+        * @param TBool& aAutoSending - ETrue: RTCP atuo sending is on
+        *                             EFalse: RTCP auto sending is off
+ 		* @return TInt - KErrNone if successful; KErrNotSupported if RTCP
+        * disabled; system wide error code otherwise
+        */
+        TInt IsRtcpSendingSuspended( TBool& aAutoSending );
+
+    public: // from MSsrcCheckCallback
+        /**
+         * Checks if a newly received SSRC collides with the SSRC's of the
+         * existing Tx streams in this session, and reacts appropriately.
+         * This is SSRC collision handling.
+         * @param aSSRC a newly received SSRC
+         */
+        TInt CheckRemoteSsrcL( TRtpSSRC& aSSRC );
+      	TBool CheckRemoteAddr();
+        
+    public: // from MTimeOutNotify
+        void OnExpiredL( TInt aStatus );
+
+    public: // from MReceivedNotify
+        void OnRtpReceivedL();
+        void OnRtcpReceivedL();
+        void OnReceptionError( TPortType aPort, TInt aError );
+        void OnPacketRejected(TPortType aPort);
+        TBool IsSrtp();
+    protected: // construction
+        CRtpSession( const TRtpId aSessionId,
+                     const TUint32* aProfileRTPTimeRates,
+                     const TBool aStandardRtp,
+                     MRtpErrNotify& aErrNotify,
+                     const CRtpSDES* aSdesInfo,
+                     MRtpAsignUniqueID& aAssignUniqueID );
+
+        void ConstructL( const TCreateSessionParams& aParams,
+                         TUint& aPort,
+                         TBool aEnableRtcp,
+                         const TRtcpParams* aRtcpParams,
+                         RSocketServ& aSocketServ,
+                         RConnection& aRConn,
+                         const RLibrary& aLibrary,
+                         MRtpErrNotify& aErrNotify );
+        void FindRtpRxStreamSSRC(TRtpSSRC& aSSRC);                 
+		TInt FindStream( const TRtpId aMagicKey, TUint& aStreamAddress );
+		TInt IssueRtpRecv();
+		virtual void SendSRTCPReportL(TRtpSSRC aSSRC);
+		void AverageRtcpSize( TUint aRtcpReportSize );
+       TInt IssueRtcpRecv();
+       		
+    private:
+        TInt InitialiseRtcp( const TRtcpParams* aParams );
+
+        
+ 
+        void ScheduleRtcpSendL();
+        void StartReceiveRtcpPacket();
+        void StopReceiveRtcpPacket();
+
+        TBool DoBuildSendRTCPReportIfNotSentL();
+        void DoBuildSendRTCPReportL();
+        TBool ShouldBuildEmptyRR( CRtpTranStream* aTempTranStream );
+
+        /**
+        * Determines the source count and length before an RTCP report is sent
+        * @param aSourceCount reference to the source count variable to update
+        * @param aLength reference to the packet length variable to update
+        * @param aRxActive a list of active/not active streams
+        * @return None
+        */
+        void DetermineSourceCountAndLength( TInt& aSourceCount,
+                                            TInt& aLength,
+                                            TBool aRxActive[] );
+
+        /**
+        * Determines parameters before an RTCP report with SR (RR) and SDES
+        * sections is sent.
+        * @param aTranStream The stream that will send the RTCP report
+        * @param aStreamParam pointer to the stream parameters
+        * @param aInitParam pointer to the initialisation parameters
+        * @param aRxActive a list of active/not active streams
+        * @return None
+        */
+        void SetParamsForFullRTCPReport( CRtpTranStream* aTranStream,
+                       TRtpPacketStreamParam* aStreamParam,
+                       TRtpPacketIOParam* aInitParam,
+                       TBool aRxActive[] );
+        void BuildSendRTCPReportL();
+        TInt BuildRTCPReport( CRtpTranStream* tempStream, TInt aLastReport );
+        void BuildSrSection( CRtpTranStream* aTempTranStream );
+        void BuildRrSection( TInt aNumRcvStreams,
+                             TBool aRxActive[KMaxNumActiveRcvStreams],
+                             TInt aLastReport );
+        void BuildEmptyRr( CRtpTranStream* aTempTranStream );
+        void BuildSdesSection( CRtpTranStream* aTempTranStream );
+        void SendRTCPReport();
+        void CreateSDES( TInt aFCNameOnly, TRtpSSRC aSSRC );
+
+
+        /**
+        * Launches the processing of individual sections of RTCP reports.
+        * @param extractParam pointer to the stream parameters
+        * @param aSourceSSRC The synchronisation source value of the sender
+        * @return Symbian OS error code
+        */
+        TRtpRtcpEnum ProcessOneRTCPReportSectionL(
+                              const TRtpPacketIOParam& aExtractParam,
+                              TRtpSSRC aSourceSSRC );
+        /**
+        * Processes an RTCP report.
+        * @return An RTP-specific error code
+        */
+        TRtpRtcpEnum ProcessRTCPReportL(); 
+
+        /**
+        * Processes the SR section of an RTCP report.
+        * @return An RTP-specific error code
+        */
+        TRtpRtcpEnum ProcessSRSectionL( TInt aSourceCount );
+
+        /**
+        * Processes the RR section of an RTCP report.
+        * @return An RTP-specific error code
+        */
+        TRtpRtcpEnum ProcessRRSectionL( TInt aSourceCount );
+
+        /**
+        * Processes the SDES section of an RTCP report.
+        * @return An RTP-specific error code
+        */
+        TRtpRtcpEnum ProcessSDESSectionL( TRtpSSRC aSourceSSRC );
+
+        /**
+        * Processes the BYE section of an RTCP report.
+        * @return An RTP-specific error code
+        */
+        TRtpRtcpEnum ProcessBYESectionL();
+
+        /**
+        * Processes the APP section of an RTCP report.
+        * @return An RTP-specific error code
+        */
+        TRtpRtcpEnum ProcessAPPSectionL( TInt aTotalPacketLen, TInt aSubType );
+
+        /**
+        * Processes the data contained in an SDES section.
+        * @return An RTP-specific error code
+        */
+        TRtpRtcpEnum ProcessSDESDataL( TRtpPacketStreamParam& aStreamParam,
+                                      TRtpPacketIOParam& aExtractParam,
+                                      TRtpSSRC aSourceSSRC );
+
+        /**
+        * Gets the SDES values from the data contained in an SDES section.
+        * Either aRecvStream or aSourceSdes is always NULL.
+        * @param aTargetSdes the SDES in which the data will be stored
+        * @param aRecvStream the stream that contains the SDES
+        * @param aSourceSdes the SDES in which the data resides
+        * @return KErrNone if successful, a system-wide error code otherwise
+        */
+        TInt GetSDESFromSDESData( TRtpSdesParams* aTargetSdes,
+                                  const CRtpRecvStream* aRecvStream,
+                                  CRtpSDES* aSourceSdes );
+
+        /**
+        * Logs the SDES data from the data contained in an SDES section.
+        * @param aStreamParam stream parameters
+        * @param aRecvStream the receiving stream
+        * @param aSdes the new SDES
+        * @param aSdesSession indicates whether the SDES was assigned to the
+        * session
+        */
+#ifdef _DEBUG         
+        void LogSDESData( const TRtpPacketStreamParam& aStreamParam,
+                          const CRtpRecvStream* aRecvStream,
+                          const CRtpSDES* aSdes,
+                          const TBool aSdesSession );
+#endif
+        TRtpSSRC GetUniqueSSRC();
+        TRtpSSRC GenerateSSRC();
+        TInt AddStream( const TStream aArrayID, TStreamType aStreamType );
+        
+        TInt FindStream( const TRtpId aMagicKey, TUint& aStreamAddress, 
+                         TStreamType& aStreamType );
+        TInt RemoveStream( const TRtpId aMagicKey, TStreamType& aStreamType );
+        void RemoveAllStreams();
+        TInt MatchSSRCToStream( TUint& aRcvStreamAddress, TRtpSSRC aSSRC, 
+                                TStreamType& aStreamType );
+        TInt FindRtpRxStreamL();
+        TInt AssignRtpRxStreamL();
+        
+        TInt StreamSendBYEPacket();
+        TInt StreamSendAPPPacket();
+        TBool FindStreamForSSRC( TRtpSSRC aSSRC );
+        /**
+         * Finds if a send stream is already using the given SSRC
+         * @param aSSRC the synchronisation source value
+         * @param a pointer to a stream pointer. If a Tx stream is found for
+         * the specified SSRC, the stream pointer contains the address of the
+         * Tx stream when this function returns.
+         */
+        TBool FindTxStreamForSSRC( TRtpSSRC aSSRC,
+                                   CRtpTranStream** streamPointerPointer );
+
+        TBool RcvStreamActive( TInt aIndex );
+        TBool AnyRcvStreamReceivedRtpPacket();
+        TBool RcvStreamReceivedRtpPacket( TInt aIndex );
+        CRtpRecvStream* GetRcvStreamByIndex( TInt aIndex );
+        
+        void RedistributeBandwidth();
+        
+        CRtpSDES* DoAddSdesToArrayL( TRtpPacketIOParam* aExtractParam );
+        TBool AddSdesToArrayL( TUint& aSdesAddress, TRtpPacketIOParam* extractParam );
+
+        /**
+         * Compares the specified SDES values with the ones in the parameters
+         * and updates the SDES where the values differ
+         * @param aTempSdes the target SDES
+         * @param aExtractParam the parameters to compare with
+         * @param aUpdateCName indicates whether to include the CName
+         * @return ETrue if the SDES was updated
+         */
+        TBool CompareAndUpdateSdes( CRtpSDES* aTempSdes,
+                                    TRtpPacketIOParam* aExtractParam,
+                                    TBool aUpdateCName );
+        TInt RemoveSdesFromArray( TRtpSSRC aSSRC );
+
+        void NextRtcpInterval();
+        
+        void DeallocateMemoryForSdes( TRtpPacketIOParam* aParam );
+
+        // Methods for getting random numbers
+        TInt Random();
+        TReal Random64();
+        void SendRTCPByewithBanedSSRCL();
+        TBool CheckifBanded();
+        void CreateNewRecvStreamL();
+
+
+    private:  
+        TBool iStandardRtp;
+        TRtpId iSessionId;   // session ID value
+        
+        
+        TInetAddr iRemoteAddr[KMaxPorts]; // store here remote addresses
+        TBool iRemoteAddrSet;
+
+        // default values for this session when no transmit stream has been created.
+        TRtpSSRC iDefaultSSRC;      // default SSRC value
+
+        const CRtpSDES* iLocalSdes; // iManager->GetSdes();
+        TRtpSdesParams* iNewSdes;   // Sdes to send to observer
+        TInt iSendSdesCounter;      // keeps track of SDES packets sent
+
+	 protected:
+		CRtpPacket* iPktSnd;
+        CRtpPacket* iPktRcv;
+        TPtr8 iRtpRecvBuf;  // receive buf of iPktRtpRcv;
+        TPtr8 iRtcpRecvBuf; // receive buf of iPktRtcpRcv;
+        CRtpComm* iCommNet;
+        MRtpPacketExt* iPktExtSnd;
+        TBool iIsSrtp;
+        TBool iRtcpEnabled;
+        CRtpTimer* iSndRtcpTimer;     // timer for period sending RTCP packets
+
+        // packets allocated for reporting, sending, receiving
+        CRtpPacket* iPktRtcpSnd;
+        CRtpPacket* iPktRtcpRcv;
+        
+
+  
+
+        // packets allocated for extended rtp packet
+        
+        MRtpPacketExt* iPktExtRcv;
+
+        // Flags
+        TBool iFirstRTCPSent;        // flag that indicates if the first RTCP Packet has been sent 
+        TBool iFPortsInit;           // indicates if the local port has been initialized 
+
+        TUint16 iNumOfTxStreams;    // total number of send streams
+        TUint16 iNumOfRxStreams;    // total number of receive streams
+        CArrayFixFlat<TStream>* iStreamTxArray; //array to keep Transmit stream objects
+        CArrayFixFlat<TStream>* iStreamRxArray; //array to keep Receive stream objects
+        CArrayPtrFlat<CRtpSDES>* iSdesArray;     //array to keep remote participants SDES object
+        RArray<TRtpSSRC> iRxSSRCArray; //array to keep ReceiveStreamSSRC Array
+
+        const TUint32* iProfileRTPTimeRates;
+        TReal iAverageRtcpSize;         // average RTCP report size updated everytime a RTCP report is send or/and received
+        TUint iBandWidth;               // session bandwidth
+        TReal iFraction;                // fraction of the session bandwidth to be used for RTCP report
+        TUint iRtcpTimeInterval;        // RTCP report interval (milliseconds)
+        TUint iTotalParticipantsSession;// keeps track of total participants in session
+
+        MRtpObserver* iRtpObserver;
+        MRtcpObserver* iRtcpObserver;
+        MNonRTPDataObserver* iNonRTPDataObserver;
+        MRtpErrNotify& iErrNotify;
+        MRtpAsignUniqueID& iAssignUniqueID;
+        
+        
+        TBool iSessionStarted;
+        TInt iSSRCJumps;
+        TInt iRtcpErrors;
+        
+        TBool iRtcpSendingSuspended;
+        TInt64 iSeed;
+        
+    private:    
+	    #ifdef EUNIT_TESTING
+		  friend class UT_CRtpAPI;
+		  friend class UT_CRtpSession;
+		  friend class UT_CRtpSessionSrtp;
+		#endif   
+		#if defined( _DEBUG ) && defined( RTP_UNIT_TEST )
+        friend class CRtpUtRtpSession;
+    	#endif   	    
+    };
+
+#endif   // __RTPSESSION_H
+ 
+// End of File