rtp/rtpstack/inc/rtptranstream.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:27:36 +0100
branchRCL_3
changeset 20 0dcb073356a5
parent 19 b5e99d8877c7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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 RtpTranStream_H
#define RtpTranStream_H

#include "rtpstream.h"


/**
*  Derived class for RTP transmit stream. 
*
*  @lib RtpService.dll
*/
class CRtpTranStream : public CRtpStream
    {
    #if defined( _DEBUG ) && defined( RTP_UNIT_TEST )
	    //Friend class used for testing
	    friend class CRtpUtRtpStream; 
    #endif 
    public:
        static CRtpTranStream* NewL( const TRtpPayloadType aPayloadType,
                                     const TRtpId aSessionID,
                                     const TRtpId aTranStreamID,
                                     const TRtpSSRC aSSRC,
                                     MRtcpObserver* aObserver,
                                     const TUint32* aProfileRTPTimeRates );
        ~CRtpTranStream();

        TInt BuildRtpPacket( const TRtpSendHeader& aHeaderInfo,
                             const TDesC8& aPayloadData,
                             TRtpSequence aSeqNum,
                             TBool aSetSeqNum,
                             CRtpPacket* aPktSnd );

        TInt BuildRtcpBYEPacket( const TDesC8& aReason,
                                 CRtpPacket* aPktRtcpSnd );

        TInt BuildRtcpAPPPacket( const TRtcpApp& aApp,
                                 CRtpPacket* aPktRtcpSnd );

        inline TBool SentRTPPackets() const { return iFlagSentRTPPackets; };
        inline void SetSentRTPPackets( TBool aFlag )
            {
            iFlagSentRTPPackets = aFlag;
            };

        inline TBool SentRtcpReport() { return iFSentRtcpReport; };
        inline void SetRtcpReportFlag() { iFSentRtcpReport = ETrue; };
        inline void ResetRtcpReportFlag() { iFSentRtcpReport = EFalse; };
        inline void SetBandwidth( TUint32 aBandwidth ) 
            { 
            iRtcpStats.iRtcpReceiverStats.iTxBandwidth = aBandwidth;
            }; 

    public: // from CRtpStream
        TInt ResetStreamStat();
        TInt GetStreamStat( TRtpPeerStat& aStat );
        TRtpRtcpEnum RtpStreamProcessRtcpReportSectionL( CRtpPacket* aPkt );
        void RtpStreamCreateRtcpReportSection( CRtpPacket* aPkt );

    private:
        CRtpTranStream( const TRtpPayloadType aPayloadType,
                        const TRtpId aSessionId,
                        const TRtpId aStreamId,
                        const TRtpSSRC aSSRC,
                        MRtcpObserver* aRtcpObserver,
                        const TUint32* aProfileRTPTimeRates );
        void ConstructL();

        inline void IncCumNumOctetsSent( TUint32 aInc ) 
            {
            iCumNumOctetsSent += aInc;
            iSN_size[iSeqNum % KSNMaxArray] = iCumNumOctetsSent;
            };

        void RtpStreamSyncInit( TRtpTimeStamp initTimeStamp );
        TUint32 RtpStreamSyncGetRoundTripDelay( TUint32 lastSRTimeStamp,
                                                TUint32 delaySinceLSR );
        void RtpStreamSyncCurrent( TRtpTimeSync* aSyncInfoCurrent );

        /**
         * Makes an estimate of the Tx and Rx bandwidths.
         * NOTE: This is just a simple estimate, which assumes the following:
         * - this is an end-to-end session
         * - the sessions and streams are set up before traffic starts
         * - the payload bitrate is constant
         * The result of this estimation should not be used in any other
         * contexts.
         */
        void EstimateBandWidths( TUint32 aCurrentTime );

    private:
        // flag to indicate if a packet was sent since last RTCP packet
        TBool iFlagSentRTPPackets;

        // time of previous RTCP packet sent
        TUint32 iPreviousTime;

        // remote bandwidth
        TUint32 iRemoteBandwidth;

        // previous remote sequence number
        TUint32 iPreviousRemoteSN;

        // time of previous RTCP packet received
        TUint32 iPrevRemoteTime;

        // number of bytes sent
        TUint32 iCumNumOctetsSent;

        // keeps track of how many bytes were received by the receiver
        TUint32 iCumNumOctetsReceived;

        // previous value of cumNumOctetsSent
        TUint32 iCumNumOctetsSent_last;

        // keeps track of the total bytes sent
        TUint32 iSN_size[KSNMaxArray];

        // if ETrue, then packet sequence number is given by application
        TBool iFSetSeqNum;

        // flag that indicates if an RTCP Packet has been sent
        TBool iFSentRtcpReport; 
     private:    
	    #ifdef EUNIT_TESTING
		  	friend class UT_CRtpSession;
			friend class UT_CRtpStream;
			friend class UT_CRtpSessionSrtp;
		#endif     	    
            
    };


#endif	// RtpTranStream_H