diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccrtpsourcesink/inc/mccrtpsender.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccrtpsourcesink/inc/mccrtpsender.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2002-2004 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: RTP sender +* +*/ + + + + + +#ifndef MCCRTPSENDER_H +#define MCCRTPSENDER_H + +// INCLUDES +#include +#include "rtpapi.h" +#include "rtpheader.h" +#include "mccexpirationhandler.h" + + +// FORWARD DECLARATIONS +class CMccRtpSendItem; +class CMccTimerManager; + +// CLASS DECLARATION +// + +class MMccRtpSenderObserver + { +public: + virtual void SendErrorOccured( TInt aError ) = 0; + }; + +class CMccRtpSender : public CActive, public MMccExpirationHandler + { +public: + + /** + * Create asynchronous rtp sender. + * + * @param aObserver + * @param aRtpApi + * @param aSessionId + * @param aDoMarkerBasedCleanup + */ + static CMccRtpSender* NewL( MMccRtpSenderObserver& aObserver, + CRtpAPI& aRtpApi, + TRtpId aSessionId, + TBool aDoMarkerBasedCleanup ); + + ~CMccRtpSender(); + + /** + * Send rtp packet asynchronously. If previous send is pending, packet + * is queued unless the queue is full. In that case the packet is discarded. + * + * @param aRtpStreamId + * @param aRtpHeader + * @param aData + */ + void SendRtpPacketL( TRtpId aRtpStreamId, + const TRtpSendHeader& aRtpHeader, + const TDesC8& aData ); + + /** + * Send a non-RTP (control) data packet. + * @param aSessionId RTP Session ID + * @param aUseRtpSocket Whether to use RTP or RTCP socket + * @param aData Non-RTP data packet to send + */ + void SendDataL( TRtpId aSessionId, TBool aUseRtpSocket, + const TDesC8& aData ); + + /** + * Cancels pending send operation and empties the queue. + */ + void Clear(); + +protected: // From CActive + + void RunL(); + + void DoCancel(); + + TInt RunError( TInt aError ); + +protected: // From MMccExpirationHandler + + void TimerExpiredL( TMccTimerId aTimerId, TAny* aTimerParam ); + +private: + + void ConstructL(); + + CMccRtpSender( MMccRtpSenderObserver& aObserver, + CRtpAPI& aRtpApi, + TRtpId aSessionId, + TBool aDoMarkerBasedCleanup ); + + void SendPacketL(); + + void RemovePacket( TBool aDoQueueCleanup = EFalse ); + + TBool ErrorReport( TInt aError ); + + TBool CheckDiscarding( const TRtpSendHeader& aRtpHeader ); + + /** + * If packet for which aRtpHeader belongs was zero marker frame, + * that packet and everything related to that frame is removed from + * queue. If full frame couldn't yet be removed, upcoming parts + * of the frame are discarded once they are tried to be sent. + * + * @param aItemIndex + * @param aRtpHeader + * @return ETrue if queue item in aItemIndex was deleted, otherwise + * return EFalse + */ + TBool DoQueueCleanup( TInt aItemIndex, const TRtpSendHeader& aRtpHeader ); + +private: + + MMccRtpSenderObserver& iObserver; + + CRtpAPI& iRtpApi; + + TRtpId iSessionId; + + CMccTimerManager* iTimeoutTimer; + + RPointerArray iSendQueue; + + TBool iDoMarkerBasedCleanup; + + TBool iDiscarding; + + TUint32 iTimeoutTimeMilliseconds; + + TMccTimerId iTimerId; + +#ifdef TEST_EUNIT +public: + friend class UT_CMccRtpSender; +#endif + + }; + +class CMccRtpSendItem : public CBase + { +public: + + static CMccRtpSendItem* NewLC( TRtpId aRtpStreamId, + const TRtpSendHeader& aRtpHeader, + const TDesC8& aData ); + + static CMccRtpSendItem* NewLC( TRtpId aSessionId, + TBool aUseRtpSocket, const TDesC8& aData ); + + ~CMccRtpSendItem(); + + const TDesC8& DataPtr() const; + + TRtpId RtpStreamId() const; + + const TRtpSendHeader& RtpHeader() const; + + TRtpId SessionId() const; + + TBool UseRtpSocket() const; + +private: + + void ConstructL( const TDesC8& aData ); + + CMccRtpSendItem( TRtpId aRtpStreamId, const TRtpSendHeader& aRtpHeader ); + + CMccRtpSendItem( TRtpId aSessionId, TBool aUseRtpSocket ); + +private: + + HBufC8* iData; + + TRtpId iRtpStreamId; + TRtpSendHeader iRtpHeader; + + TPtrC8 iDataPtr; + + TRtpId iSessionId; + TBool iUseRtpSocket; + +private: // Friend classes + + #ifdef TEST_EUNIT + friend class UT_CMccRtpSender; + #endif + }; + +#endif // MCCRTPSENDER_H + +// End of File