diff -r 826cea16efd9 -r 13a33d82ad98 dvrengine/CommonRecordingEngine/inc/CCRRtspSink.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvrengine/CommonRecordingEngine/inc/CCRRtspSink.h Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,427 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Packet sink where real one player gets media stream.* +*/ + + + + +#ifndef CCRRTSPSINK_H +#define CCRRTSPSINK_H + +// INCLUDES +#include "CCRSock.h" +#include "CCRRtspCommand.h" +#include "CCRRtspResponse.h" +#include "CCRPacketBuffer.h" +#include "CCRStreamingSession.h" +#include "CCRPacketSinkBase.h" +#include + +// CONSTANTS +// None. + +// MACROS +// None + +// DATA TYPES +// None + +// FORWARD DECLARATIONS +class CDvrSdpParser; +class CCRConnection; +class RSocketServ; +class CCRStreamingSession; + +// CLASS DECLARATION +/** +* Packet sink that forwards stream to rop plugin via rtsp. +* Implements rtsp server. +* +* @lib CommonRecordingEngine.lib +* @since Series 60 3.0 + */ +class CCRRtspSink : public CCRPacketSinkBase, + public MCRSockObserver + { + +public: + + /** + * Enum for 5 socket to use to play to rop plugin. + */ + enum TCRROPSockId + { + EROPControl = 0, /**< control sock, rtsp in tcp spoken here */ + EROPVideoSend1, /**< RTP video payload */ + EROPVideoSend2, /**< RTCP video */ + EROPAudioSend1, /**< RTP audio payload */ + EROPAudioSend2, /**< RTCP audio */ + EROPMaxSockets /**< Just max value, no real socket assigned for this */ + }; + +public: // Constructors and destructors + + /** + * Two-phased constructor. + * @param aConnection a connection rerefrence. + * @param aSockServer a socket server refrence. + * @param aSinkId a id of this sink. + * @param aOwningSession a reference to owning session. + * @param aLoopbackPort a RTSP port for loopback socket. + * @return CCRRtspSink pointer. + */ + static CCRRtspSink* NewL( CCRConnection& aConnection, + RSocketServ& aSockServer, + CCRStreamingSession::TCRSinkId aSinkId, + const TInt& aLoopbackPort, + CCRStreamingSession& aOwningSession ); + + /** + * Destructor + */ + virtual ~CCRRtspSink(); + +private: // Methods from base classes + + /** + * From CCRPacketSinkBase. + * Connects the given buffer with this sink. + * @since Series 60 3.0 + * @param aBuffer is the buffer to connect with. + * @return none. + */ + void SetBuffer( CCRPacketBuffer* aBuffer ); + + /** + * From CCRPacketSinkBase. + * Adds packet to the sink. + * @since Series 60 3.0 + * @return none. + */ + void NewPacketAvailable(); + + /** + * From CCRPacketSinkBase. + * Method for setting the sdp in use + * @since Series 60 3.0 + * @param aSdp is the new sdp + * @return none + */ + void SetSdpL( const TDesC8& aSdp ); + + /** + * From CCRPacketSinkBase. + * Method for setting initial seq+ts _before_ the stream is played. + * @since Series 60 3.0 + * @param aAudioSeq is the initial rtp seq number for audio packets. + * @param aAudioTS is the initial rtp timestamp number for audio packets. + * @param aVideoSeq is the initial rtp seq number for video packets. + * @param aVideoTS is the initial rtp timestamp number for video packets. + * @return none. + */ + void SetSeqAndTS( TUint& aAudioSeq, + TUint& aAudioTS, + TUint& aVideoSeq, + TUint& aVideoTS ); + + /** + * From CCRPacketSinkBase. + * method for setting play range before the stream is played. + * @since Series 60 3.0 + * @param aLower is where clip range begins, in seconds. + * @param aUpper is where clip range ends, usually clip end, in seconds. + * @return none. + */ + void SetRange( TReal aLower, + TReal aUpper ); + + /** + * From CCRPacketSinkBase. + * Method that source uses to communicate its status. + * @since Series 60 3.0 + * @param aNewState is the new state of the source. + * @return none. + */ + void StatusChanged( MCRPacketSource::TCRPacketSourceState aNewState ); + + /** + * From MCRSockObserver. + * This method is called after some data has been received from socket. + * @since Series 60 3.0 + * @param aData is descriptor containing the data received. + * ownership of data is not passed via this call. + * @return none. + */ + void DataReceived( TInt aSockId, const TDesC8 &aData ); + + /** + * From MCRSockObserver. + * This method is called after status of socket changes. + * @param aSockId + * @param aStatus is sock status. + * @param aError + * @return none. + */ + void SockStatusChange( TInt aSockId, + CCRSock::TCRSockStatus aStatus, + TInt aError ); + +public: // Constructors and destructors + + /** + * By default default constructor is private + * @param aConnection is the IAP representative that we need to use + * @param aSockServer is the socketserver to use when opening socks + * @param aSinkId that this class needs to use when reporting progress back to owner + * @param aOwningSession is the streaming session that owns this instance + */ + CCRRtspSink( CCRConnection& aConnection, + RSocketServ& aSockServer, + CCRStreamingSession::TCRSinkId aSinkId, + CCRStreamingSession& aOwningSession ); + + /** + * second phase of 2-phased construction + * @param aLoopbackPort a RTSP port for loopback socket. + */ + void ConstructL( const TInt& aLoopbackPort ); + +protected: // New methods + + /** + * Method that produces sdp for rop plugin consumption. + * Needs to have iSDP and parser. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ProduceSDPForRopL(); + + /** + * Method for doing something with commands rop has sent to us + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ProcessRtspCommandL(); + + /** + * Method for doing something after rop has said something to use. + * @since Series 60 3.0 + * @param aLastCommand is the last command rop has sent + * @return none. + */ + void ProduceRtspReplyL( CCRRtspCommand::TCommand aLastCommand ); + + /** + * Method for replying to "options" command. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ReplyToOptionsL(); + + /** + * Method for replying to "describe" command. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ReplyToDescribeL(); + + /** + * Method for replying to "setup" command + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ReplyToSetupL(); + + /** + * Method for replying to "play" command, reply is sent to rop. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ReplyToPlayL(); + + /** + * Method for replying to "pause" command. + * @since Series 60 3.0 + * @param symbian error code telling if pausing was ok. + * @return none. + */ + void ReplyToPauseL( TInt aErrorCode ); + + /** + * Method for replying to "teardown" command. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ReplyToTearDownL(); + +private: // New methods + + /** + * Getter for socket sink id basing on stream. + * @since Series 60 3.0 + * @param aStreamId a stream id of packet. + * @return a socket sink id. + */ + TCRROPSockId SocketFromStream( MCRPacketSource::TCRPacketStreamId aStreamId ); + + /** + * Appends string to the buffer. + * @since Series 60 3.0 + * @param aBuffer a buffer where to add text. + * @param aTxt a string to append. + * @return none. + */ + void AppendL( HBufC8*& aBuffer, + const TDesC8& aTxt ); + + /** + * Appends integer value as text to the buffer. + * @since Series 60 3.0 + * @param aBuffer a buffer where to add text. + * @param aNum a numerical value to append. + * @return none. + */ + void AppendNumL( HBufC8*& aBuffer, + const TInt aNum ); + + /** + * Appends formatted text to the buffer. + * @since Series 60 3.0 + * @param aBuffer a buffer where to add text. + * @param aFmt a format string to use. + * @return none. + */ + void AppendFormatL( HBufC8*& aBuffer, + TRefByValue aFmt, ... ); + + /** + * Sends control data to the player. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void SendControlData(); + + /** + * This meyhod is called after received data from EROPControl socket. + * @since Series 60 3.1 + * @param aData is descriptor containing the data received. + */ + void HandleReceivedEROPControlL( const TDesC8& aData ); + +private: // Data + + /** + * RConnection wrapper we use for sockets. no ownership. + */ + CCRConnection& iConnection; + + /** + * Socket server we use for sockets. no ownership. + */ + RSocketServ& iSockServer; + + /** + * When TBool in iPacketPendingInBuffer is ETrue it means that the buffer + * in iBuffers having same array index. As said TBool has a packet + * waiting to be sent to rop. + */ + TBool iPacketPendingInBuffer; + + /** + * Have our own sdp parser for parsing the sdp. + */ + CDvrSdpParser* iSdpParser; + + /** + * SDP to give to rop. + */ + HBufC8* iSdpForRop; + + /** + * Sockets for speaking with rop. + */ + CCRSock* iSockArr[EROPMaxSockets]; + + /** + * Stage in rtsp discussions with rop plugin. + */ + TCRRTSPStage iStage; + + /** + * Stage for setup repply received. + */ + TInt iSetupReceived; + + /** + * Pointer to data sent to us via socket from rop. + */ + HBufC8* iReceivedData; + + /** + * Pointers to commands sent by rop in various stages. + */ + CCRRtspCommand *iCommands[CCRRtspCommand::ERTSPCommandNOCOMMAND]; + + /** + * Pointer to string sent to rop. + */ + HBufC8* iRopResponse; + + /** + * Audio seq to begin with. + */ + TUint32 iAudioSeq; + + /** + * Audio TS to begin with. + */ + TUint32 iAudioTS; + + /** + * Video seq to begin with. + */ + TUint32 iVideoSeq; + + /** + * Video TS to begin with + */ + TUint32 iVideoTS; + + /** + * TBool telling if above 4 things (seq+ts*2) has been seen. + */ + TBool iSeqAndTSSet; + + /** + * Range begin pos in play command header. + */ + TReal iLowerRange; + + /** + * Range end pos in play command header. + */ + TReal iUpperRange; + + }; + +#endif // CCRRTSPSINK_H