diff -r 000000000000 -r 822a42b6c3f1 dvrengine/CommonRecordingEngine/inc/CRRTSPCommon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvrengine/CommonRecordingEngine/inc/CRRTSPCommon.h Thu Dec 17 09:14:38 2009 +0200 @@ -0,0 +1,610 @@ +/* +* 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: Common definitions for rtsp implementation* +*/ + + + + +#ifndef CCRRTSPCOMMON_H +#define CCRRTSPCOMMON_H + +// INCLUDES +#include +#include + +// CONSTANTS +/** Max len for synchronization source id texttual presentation. SSRC is 32-bit number + * so this needs to be able to hold 2^^32 numerical value */ +const TInt KSSRCMaxLen( 30 ); +/** Max expected RTP packet len, given to symbian rtp stack that wants to know */ +const TInt KAverageExpectedRtpPacketMaxSize( 1500 ); + +// following five are guestimates +/** Average expected audio packet size */ +const TInt KAverageAudioPacketSize( 400 ); +/** Average expected video packet size */ +const TInt KAverageVideoPacketSize( 700 ); +/** Average expected rtp control packet size */ +const TInt KAverageRTPControlPacketSize( 30 ); +/** Number of rtp packets in our buffer, max */ +const TInt KRTPDataPacketBufferLen( 100 ); +/** Number of rtpc packets in our buffer, max */ +const TInt KRTPControlPacketBufferLen( 20 ); + +// followint strings _MAY_NOT_ be localized. +_LIT8( KCR2NewLines, "\r\n\r\n" ); +_LIT8( KCRCSeq, "CSeq: " ); +_LIT8( KCRRTSP10, "RTSP/1.0" ); +_LIT8( KCROPTIONS, "OPTIONS " ); +_LIT8( KCROPTIONSNoSpace, "OPTIONS" ); +_LIT8( KCRDESCRIBE, "DESCRIBE " ); +_LIT8( KCRDESCRIBENoSpace, "DESCRIBE" ); +_LIT8( KCRTEARDOWN,"TEARDOWN " ); +_LIT8( KCRTEARDOWNNoSpace,"TEARDOWN" ); +_LIT8( KCRPAUSE,"PAUSE " ); +_LIT8( KCRPAUSENoSpace,"PAUSE" ); +_LIT8( KCRSETUP, "SETUP " ); +_LIT8( KCRSETUPNoSpace, "SETUP" ); +_LIT8( KCRClient_Port, "client_port=" ); +_LIT8( KCRInterleaved, "interleaved=" ); +_LIT8( KCRAcceptSDP, "Accept: application/sdp\r\n" ); +_LIT8( KCRPort, "port=" ); +_LIT8( KCRDestination, "destination=" ); +_LIT8( KCRPLAY, "PLAY " ); +_LIT8( KCRPLAYNoSpace, "PLAY" ); +_LIT8( KCRRTSPReplyHeader, "RTSP/1.0 " ); +_LIT8( KCRRTSPContentLength, "Content-length: " ); +_LIT8( KCRRTSPDefaultUserAgent, "NokiaVideoCenter" ); +_LIT8( KCRRTSPUserAgentHeader, "User-Agent: %S\r\n" ); +_LIT8( KCRRTSPXWapProfile, "x-wap-profile: %S\r\n" ); +_LIT8( KCRRTSPBandwidth, "Bandwidth: %d\r\n" ); +_LIT8( KCRSessionStr, "Session: " ); +_LIT8( KCRNewLine, "\r\n" ); +_LIT8( KCRSpace, " " ); +_LIT8( KCRSemiColon, ";" ); +_LIT8( KCRDash, "-" ); +_LIT8( KCRLineFeed, "\n" ); +_LIT8( KCRSDPmLine, "m=" ); +_LIT8( KCRSDPmLineIsVideo, "m=video" ); +_LIT8( KCRSDPRTPAVP, "RTP/AVP" ); +_LIT8( KCRSDPRTPAVPTCP, "RTP/AVP/TCP" ); +_LIT8( KCRSDPRTPAVPUDP, "RTP/AVP/UDP" ); +_LIT8( KCRSDPMulticast, "multicast" ); +_LIT8( KCRSDPmLineIsAudio, "m=audio" ); +_LIT8( KCRSDPcLine, "c=" ); +_LIT8( KCRSDPbLine, "b=AS" ); +_LIT8( KCRNlAndSession, "\r\nSession: " ); +_LIT8( KCRRtpInfo, "RTP-Info: " ); +_LIT8( KCRUrlStr, "url=" ); +_LIT8( KCRSeqStr, "seq=" ); +_LIT8( KCRRtptimeStr, "rtptime=" ); +_LIT8( KCRServerPort, "server_port" ); +_LIT8( KCRSSRC, ";ssrc=" ); +_LIT8( KCRTransportHeaderUDP, "Transport: RTP/AVP;unicast;" + "client_port=%d-%d;mode=play\r\n" ); +_LIT8( KCRTransportHeaderTCP, "Transport: RTP/AVP/TCP;interleaved=%d-%d\r\n" ); +_LIT8( KCRTransportHeaderMulticast, "Transport: RTP/AVP;multicast\r\n" ); +_LIT8( KCRRangeHeader, "Range: npt=" ); +_LIT8( KCRRangeHeaderLiveStream, "Range: npt=now-" ); +_LIT8( KCRRtpMap, "a=rtpmap" ); +_LIT8( KCROptionsReply, + "RTSP/1.0 200 OK\r\nCseq: %d\r\n" + "Public: DESCRIBE, SETUP, PAUSE, " + "TEARDOWN, PLAY, OPTIONS\r\n\r\n" ); + +// Authentication strings +_LIT8( KCRAuthBasic, "Basic" ); +_LIT8( KCRAuthDigest, "Digest" ); +_LIT8( KCRAuthRealm, "realm=\"" ); +_LIT8( KCRAuthNonce, "nonce=\"" ); +_LIT8( KCRAuthOpaque, "opaque=\"" ); +_LIT8( KCRAuthorizationHeader, + "Authorization: Digest username=\"%S\", realm=\"%S\"," + " nonce=\"%S\", uri=\"%S\", response=\"%S\", opaque=\"%S\"\r\n" ); +_LIT8( KCRAuthorizationHeaderNoOpaque, + "Authorization: Digest username=\"%S\"," + " realm=\"%S\", nonce=\"%S\", uri=\"%S\", response=\"%S\"\r\n" ); +_LIT8( KCRContentBaseHeader, "Content-Base: ") ; +_LIT8( KCRAuthorizationBasicHeader, "Authorization: Basic %S\r\n" ); + +// MACROS +// None + +// DATA TYPES +/** +* TCRRTSPStage is used by both RTSP packet source and ROP sink. It is used +* to indicate the stage in RTSP negotiation where the packet source or rop sink +* currently is in +*/ +enum TCRRTSPStage + { + ERTSPInit = 0, /**< nothing done yet , must have numerical id 0 */ + ERTSPOptSent, /**< Options command has been sent */ + ERTSPDescSent, /**< Describe command has been sent */ + ERTSPDelayedSetup, /**< Setup command need to be delayed */ + ERTSPSetupAudioSent, /**< Setup command for audio has been sent */ + ERTSPSetupVideoSent, /**< Setup command has video been sent */ + ERTSPReadyToPlay, /**< Everything in order with remote server */ + ERTSPPlaySent, /**< Play command has been sent */ + ERTSPPauseSent, /**< Pause command has been sent */ + ERTSPPlaying, /**< Play command has been sent and 200 OK received */ + ERTSPTearDownSent, /**< Teardown command has been sent */ + ERTSPLastStage /**< This is not a real stage, keep this identifier as item, used for indexing */ + }; + +/** + * Enum indicating which transport to use for RTP streaming + */ +enum TCRRTPTransport + { + ERTPOverUDP = 0, /**< stream RTP over UDP, default */ + ERTPOverTCP, /**< stream RTP over TCP, interleaved in RTSP stream */ + ERTPOverMulticast /**< stream RTP over multicast UDP */ + }; + +// FORWARD DECLARATIONS +// None + +// CLASS DECLARATION + +/** +* Base-class for RTSP commands and responses. +* +* @lib CommonRecordingEngine.lib +* @since Series 60 3.0 +*/ +class CCRRtspCommon : public CBase + { + +public: // Constructors and destructor + + /** + * Destructor. + */ + virtual ~CCRRtspCommon( ); + +public: // New functions + + /** + * Method that is used to give rtsp response / command to this class. + * @since Series 60 3.0 + * @param aString is the response string + * @return none. May leave with symbian error codes. At least following may be + * seen: KErrUnderflow if there is \r\n\r\n sequence in the string + * marking end of response or if there is content(like SDP) and the + * content lenght is too short; KErrNotSupported if it doesn't look + * like RTSP at all. + */ + virtual void TryParseL( const TDesC8 &aString ) = 0; + + /** + * Method for getting content len. KErrNotFound if no content. KErrNotReady + * if TryParseL previously did leave + * @since Series 60 3.0 + * @param none . + * @return content len. + */ + TInt ContentLen( void ); + + /** + * Method for getting content. Most usually the content is SDP. + * @since Series 60 3.0 + * @param none + * @return tring descriptor allocated by this class so when + * this class instance gets deleted, the buffer + * content will point to invalid data. + */ + TPtrC8& Content( void ); + + /** + * Method for getting sequence number + * @since Series 60 3.0 + * @param none. + * @return CSeq. + */ + TInt CSeq( void ); + + /** + * Method for setting sequence number + * @since Series 60 3.0 + * @param aCSeq is CSeq number. + * @return none. + */ + void SetCSeq( TInt aCSeq ); + + /** + * Method for getting session id. + * @since Series 60 3.0 + * @param aId is string descriptor allocated by caller that + * will have its content set to block allocated by instance + * of this class containing the session id. + * @return KErrNone if no error, KErrNotFound if session id is not there. + */ + TInt SessionId( TPtrC8& aId ); + + /** + * Method for setting session id. + * @since Series 60 3.0 + * @param aId is string descriptor allocated by caller that contains + * new session id and whose content(memory area pointed by pointer + * returned by Ptr() method call) will remain intact for the + * lifetime of instance of this class. + * @return none. + */ + void SetSessionId( TPtrC8& aId ); + + /** + * Method for getting client port + * @since Series 60 3.0 + * @param none. + * @return client port of KErrNotFound if none found. + */ + TInt ClientPort( void ); + + /** + * Method for setting client port + * @since Series 60 3.0 + * @param aPort is the client port number. + * @return none. + */ + void SetClientPort( TInt aPort ); + + /** + * Method for setting range + * @since Series 60 3.0 + * @param aLower is where to start from. + * @param aUpper is where to stop. Negative values mean eternity. + * @return none + */ + void SetRange( TReal aLower, TReal aUpper ); + + /** + * Method for getting range + * @since Series 60 3.0 + * @param aLower is where to start from. + * @param aUpper is where to stop. Negative values mean eternity. + * @return none. + */ + void GetRange( TReal& aLower, TReal& aUpper ); + + /** + * Method for parsing range header + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void ParseRange( void ); + + /** + * Method for getting session opaque + * @since Series 60 3.0 + * @param none. + * @return reference to opaque or NULL. + */ + TDesC8& OpaqueL( void ); + + /** + * Method for getting session realm + * @since Series 60 3.0 + * @param none. + * @return reference to realm or NULL. + */ + TDesC8& RealmL( void ); + + /** + * Method for getting authentication type. + * @since Series 60 3.0 + * @param none. + * @return Reference to auth type found from RTSP reply. + */ + TDesC8& AuthenticationTypeL( void ); + + /** + * Method for getting session Nonce + * @since Series 60 3.0 + * @param none. + * @return Reference to nonce found from RTSP reply. + */ + TDesC8& NonceL( void ); + + /** + * Method for setting session nonce + * @since Series 60 3.0 + * @param aNonce is the nonce part of authenticated RTSP command/response. + * @return none. + */ + void SetNonceL( const TDesC& aNonce ); + + /** + * Mothod for setting authentication type + * @since Series 60 3.0 + * @param aAuthType is the authentication type. + * @return none. + */ + void SetAuthenticationTypeL( const TDesC8& aAuthType ); + + /** + * Method for setting session opaque + * @since Series 60 3.0 + * @param aOpaque is the opaque part of authenticated response. + * @return none. + */ + void SetOpaqueL( const TDesC& aOpaque ); + + /** + * Method for setting session realm + * @since Series 60 3.0 + * @param aRealm is the realm part of authenticated rtsp command. + * @return none. + */ + void SetRealmL( const TDesC& aRealm ); + + /** + * Method for setting session nonce + * @since Series 60 3.0 + * @param aNonce is the new nonce that will be sent with the command. + * @return none. + */ + void SetNonceL( const TDesC8& aNonce ); + + /** + * Method for setting session opaque + * @since Series 60 3.0 + * @param aOpaque is the new opaque that will be sent with the command. + * @return none. + */ + void SetOpaqueL( const TDesC8& aOpaque ); + + /** + * Method for setting session realm + * @since Series 60 3.0 + * @param aRealm is the new realm that will be sent with the command. + * @return none. + */ + void SetRealmL( const TDesC8& aRealm ); + + /** + * Method for setting rtsp username. + * @since Series 60 3.0 + * @param aUserName is the new username + * @return none. + */ + void SetUserNameL( const TDesC& aUserName ); + + /** + * Method for setting session password. + * @since Series 60 3.0 + * @param aPassWd is the password to use when generating digest for authenticated rtsp + * @return none. + */ + void SetPassWdL( const TDesC& aPassWd ); + + /** + * Method for setting session rtsp uri. + * @since Series 60 3.0 + * @param aUri is the string that will in RTSP command be written between command and text RTSP/1.0 strings. + * @return none. + */ + void SetRtspUriL( const TDesC& aUri ); + + /** + * Gets transport method. + * @since Series 60 3.0 + * @param none. + * @return transport method, default(ERTPOverUDP) if not present on command + */ + TCRRTPTransport Transport(); + + /** + * Sets transport method. + * @since Series 60 3.0 + * @param aTransport is the transport method to. This is used when constructing + * a SETUP command. + * @return none. + */ + void SetTransport( TCRRTPTransport aTransport ); + + /** + * Gets destination IP address if present + * @since Series 60 3.0 + * @param none. + * @return destination IP address or KAFUnspec + */ + const TInetAddr& Destination(); + + /** + * Gets flag whether stream is a live stream. + * @since Series 60 3.0 + * @param none. + * @return ETrue if stream is known to be a live stream. + */ + TBool IsLiveStream( void ); + + /** + * Getter for Content-base rtsp header content + * @since Series 60 3.0 + * @param none. + * @return content of content-base header or empty string + */ + TPtrC8 ContentBase( void ); + +protected: // Constructors and destructor + + /** + * default constructor + */ + CCRRtspCommon( void ); + +protected: // New methods + + /** + * Method for digging out CSeq from response. + * @since Series 60 3.0 + * @param none. + * @return none but will leave with KErrNotSupported if CSeq is not there. + */ + void FindCSeqL( void ); + + /** + * Method for digging out session id from response. Id will be stored in instance variable for future use. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void FindSessionIdL( void ); + + /** + * Method for digging ContentBase + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void FindContentBase( void ); + + /** + * Method for digging out content/content len from response + * @since Series 60 3.0 + * @param none. + * @return none but will leave will KErrUnderflow + * if all content not yet received. + */ + void FindContentL( void ); + + /** + * method for finding client port from response or command. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void FindClientPorts( void ); + + /** + * finds transport method from response or command. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void FindTransport(); + + /** + * finds destination IP address from SETUP response or command + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void FindDestination(); + +protected: // Data + + /** + * Buffer that holds the text being parsed. + */ + HBufC8* iRtspText; + + /** + * Len of possible content. + */ + TInt iContentLen; + + /** + * Possible content, if no content, set to( NULL, 0 ). + */ + TPtrC8 iContent; + + /** + * Sequence number, must be there. + */ + TInt iCSeq; + + /** + * Possible session id. + */ + TPtrC8 iSessionId; + + /** + * Possible client_port. + */ + TInt iClientPort; + + /** + * Transport method. + */ + TCRRTPTransport iTransport; + + /** + * Destination address + */ + TInetAddr iDestination; + + /** + * Range lower limit for Range: header. + */ + TReal iLowerRange; + + /** + * Range lower limit for Range: header. + */ + TReal iUpperRange; + + /** + * Authentication type. + */ + HBufC8* iAuthType; + + /** + * Realm. + */ + HBufC8* iRealm; + + /** + * Nonce. + */ + HBufC8* iNonce; + + /** + * Opaque. + */ + HBufC8* iOpaque; + + /** + * possible username, if server requires. + */ + HBufC8* iUserName; + + /** + * rtsp URL in 8bit descriptor. + */ + HBufC8* iUri; + + /** + * possible password, if server requires. + */ + HBufC8* iPassword; + + /** + * When this is set, it indicates that rtsp command/reply + * describes a live stream that cannot be paused or position set. + */ + TBool iIsLiveStream; + + /** + * Content of Content-base -header + */ + TPtrC8 iContentBase ; + }; + +#endif // CCRRTSPCOMMON_H + +// End of file