/*
* 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 <e32base.h>
#include <in_sock.h>
// 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