diff -r 826cea16efd9 -r 13a33d82ad98 videoutils_plat/dvrengine_api/inc/ipvideo/CDvrSdpParser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CDvrSdpParser.h Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,671 @@ +/* +* 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: Class for parsing a SDP.* +*/ + + + + +#ifndef CDVRSDPPARSER_H +#define CDVRSDPPARSER_H + +// INCLUDES +#include + +// CONSTANTS +// None + +// MACROS +// None + +// DATA TYPES +// None + +// FORWARD DECLARATIONS +// None + +// CLASS DECLARATION + +/** +* Class that parses SDP. Not fully but enough to set up a +* rtp stream from rtsp based on information extracted by this class. +* +* @lib CommonRecordingEngine.lib +* @since Series 60 3.0 +*/ +class CDvrSdpParser : public CBase + { + +public: // Data types + + /** + * Enum for indicating contents of the rtp stream(s). + */ + enum TDvrPacketProvidings + { + EDvrAudioOnly = 0, /**< This packet source feeds only audio stream */ + EDvrVideoOnly, /**< This packet source feeds only video stream */ + EDvrBothAudioAndVideo, /**< This packet source feeds audio and video */ + EDvrNoProgramAtAll, /**< Nothing useful found */ + EDvrSourceCount /**< Final number of different sources */ + }; + + /** + * Defines media point struct. + */ + struct SMediaPoint + { + /* + * Start point of media in SDP. + */ + TInt iStart; + + /* + * Length in bytes of media in SDP. + */ + TInt iLength; + + }; + +public: // Constructors and destructor + + /** + * Two-phased constructor. + * @return CDvrSdpParser pointer to CDvrSdpParser class. + */ + IMPORT_C static CDvrSdpParser* NewL(); + + /** + * Two-phased constructor. + */ + IMPORT_C static CDvrSdpParser* NewLC(); + + /** + * Destructor. + */ + IMPORT_C virtual ~CDvrSdpParser(); + +public: // New functions + + /** + * Method that is used to give SDP to this class. + * "PLAY rtsp://vishnu.wipsl.com/oops/winter_fun.mp4/ RTSP/1.0\r\n..." + * @since Series 60 3.0 + * @param aSDP is the SDP data. + * @param aBaseUrl is the rtsp url used to fetch this sdp. + * If it is not available, a (NULL,0) descriptor needs to be passed. + * It will be used to construct media urls in case where there is no + * absolute media urls in the sdp. + * @return none. + */ + IMPORT_C void TryParseL( const TDesC8 &aSdp , + const TDesC8 &aBaseUrl ); + + /** + * Parses SDP file. + * @since Series 60 3.0 + * @param aSDP is the SDP data. + * @return none. + */ + IMPORT_C void TryParseL( const TDesC8& aSdp ); + + /** + * Method for adding new SDP line. + * @since Series 60 3.0 + * @param aStreamId a section where to add the string. + * KErrNotFound: common part + * 0 (usually) : video + * 1 (usually) : audio + * 2 (usually) : subtitle (not supported yet) + * @param aLine a string to add. + * @rerturn a system wide error code. + */ + IMPORT_C void NewLineL( const TInt aStreamId, + const TDesC8& aLine ); + + /** + * Method for getting SDP data. + * @since Series 60 3.0 + * @param aSdp a pointer to SDP data. + * @rerturn KErrNone if SDP available, otherwise KErrNotFound. + */ + IMPORT_C TInt GetSdp( TPtrC8& aSdp ); + + /** + * Method for asking whether audio and/or video is included. + * @since Series 60 3.0 + * @param none. + * @return indication about stream contents. + */ + IMPORT_C CDvrSdpParser::TDvrPacketProvidings SupportedContent( void ); + + /** + * Method for getting attributes related to session. + * @since Series 60 3.0 + * @param none. + * @rerturn array of strings, may be empty. + */ + IMPORT_C RArray& SessionAttributes( void ); + + /** + * Method for getting attributes related to session. + * @since Series 60 3.0 + * @param none. + * @rerturn array of strings, may be empty. + */ + IMPORT_C RArray& VideoAttributes( void ); + + /** + * Method for getting attributes related to session. + * @since Series 60 3.0 + * @param none. + * @rerturn array of strings, may be empty. + */ + IMPORT_C RArray& AudioAttributes( void ); + + /** + * Method for getting all data streams related to session. + * @since Series 60 3.0 + * @param none. + * @rerturn array of strings, may be empty. + */ + IMPORT_C RArray& DataStreams( void ); + + /** + * Method for getting Ipv6 of the SDP having been parsed. + * @since Series 60 3.0 + * @param none. + * @return ETrue if SDP had Ipv6 address in it. + */ + IMPORT_C TBool IsIpv4Sdp( void ); + + /** + * Method for getting multicastness of the SDP having been parsed. + * @since Series 60 3.0 + * @param none. + * @return ETrue if SDP had multicast characteristics in it. + */ + IMPORT_C TBool IsMultiCastSdp( void ); + + /** + * Method for getting audio control addr e.g. the text from sdp line + * that begins with a=control: and is located in audio media block + * @since Series 60 3.0 + * @param none. + * @return a audio control addr. + */ + IMPORT_C TPtrC8 AudioControlAddr( void ); + + /** + * Method for getting video control addr e.g. the text from sdp line + * that begins with a=control: and is located in video media block + * @since Series 60 3.0 + * @param none. + * @return a video control addr. + */ + IMPORT_C TPtrC8 VideoControlAddr( void ); + + /** + * Method for getting audio ip addr e.g. the text from sdp line + * that begins with c=IN IP... : and is located in audio media block + * @since Series 60 3.0 + * @param none. + * @return video control addr. ownership is NOT transferred. may be NULL. + */ + IMPORT_C TPtrC8 AudioIpAddr( void ); + + /** + * Method for getting video ip addr e.g. the text from sdp line + * that begins with c=IN IP... : and is located in video media block + * @since Series 60 3.0 + * @param none. + * @return video control addr. ownership is NOT transferred. may be NULL. + */ + IMPORT_C TPtrC8 VideoIpAddr( void ); + + /** + * Getter for audio port. + * @since Series 60 3.0 + * @param none. + * @return a audio port number. + */ + IMPORT_C TInt AudioPort( void ); + + /** + * Getter for video port. + * @since Series 60 3.0 + * @param none. + * @return a video port number. + */ + IMPORT_C TInt VideoPort( void ); + + /** + * Getter for audio bitrate. + * @since Series 60 3.0 + * @param none. + * @return a audio bit rate. + */ + IMPORT_C TInt AudioBitrate( void ); + + /** + * Getter for video bitrate. + * @since Series 60 3.0 + * @param none. + * @return a video bit rate. + */ + IMPORT_C TInt VideoBitrate( void ); + + /** + * Getter for audio stream id. + * @since Series 60 3.0 + * @param none. + * @return a audio stream id. + */ + IMPORT_C TInt AudioStreamId( void ); + + /** + * Getter for video stream id. + * @since Series 60 3.0 + * @param none. + * @return a video stream id. + */ + IMPORT_C TInt VideoStreamId( void ); + + /** + * Getter for video timer granularity + * @since Series 60 3.0 + * @param none. + * @return Video stream timestamp granularity as 1/s. + */ + IMPORT_C TUint32 VideoTimerGranularity( void ); + + /** + * Getter for audio timer granularity + * @since Series 60 3.0 + * @param none. + * @return Audio stream timestamp granularity as 1/s. + */ + IMPORT_C TUint32 AudioTimerGranularity( void ); + + /** + * Checker method for SDP representing realnetworks realmedia content + * @since Series 60 3.0 + * @param none. + * @return ETrue if sdp presents realmedia stream. + */ + IMPORT_C TBool IsRealMediaContent( void ); + + /** + * Media identifier for audio. From a=rtpmap:96 H264/90000 + * the number 96. Usually value is 96 for video and + * 97 for audio but might be other + * @since Series 60 3.0 + * @param none. + * @return Media id + */ + IMPORT_C TInt MediaIdentifierAudio( void ); + /** + * Media identifier for video. From a=rtpmap:96 H264/90000 + * the number 96. Usually value is 96 for video and + * 97 for audio but might be other + * @since Series 60 3.0 + * @param none. + * @return Media id. + */ + IMPORT_C TInt MediaIdentifierVideo( void ); + + /** + * Checker method for SDP representing livestream. + * @since Series 60 3.0 + * @param none. + * @return ETrue if sdp presents livestream. + */ + IMPORT_C TBool IsLiveStream( void ); + +protected: // Constructors and destructor + + /** + * C++ default constructor. + */ + CDvrSdpParser(); + + /** + * By default Symbian 2nd phase constructor is private. + * @param a a reference to socket server . + */ + void ConstructL(); + +private: // New methods + + /** + * Finds media(s) from SDP file. + * @since Series 60 3.0 + * @param aSDP is the SDP data. + * @return none. + */ + void FindMediasL( const TDesC8& aSdp ); + + /** + * Finds media(s) from SDP file. + * @since Series 60 3.0 + * @param aPoints a array for media points. + * @return none. + */ + void MakeMediaBuffersL( RArray& aPoints ); + + /** + * Finds session attributes from SDP file. + * @since Series 60 3.0 + * @param aPoints a array for media points. + * @return none. + */ + void FindSessionAttributesL( RArray& aPoints ); + + /** + * Finds media(s) from SDP file. + * @since Series 60 3.0 + * @param aStreamId a section where to add the string. + * @param aLine a string to add. + * @return none. + */ + void InserNewLineL( TInt aStreamId, + const TDesC8& aLine ); + + /** + * Method for finding points of medias in SDP. + * @since Series 60 3.0 + * @param aPoints a array for media points. + * @rerturn none. + */ + void FindMediaPointsL( RArray& aPoints ); + + /** + * Method for finding next media section start in SDP. + * @since Series 60 3.0 + * @param aPtr a pointer to buffer where serch from. + * @rerturn a next media section start point. + */ + TInt MediaSectionStart( const TDesC8& aPtr ); + + /** + * Append media info from media section to array. + * @since Series 60 3.0 + * @param aMediaPtr a pointer to buffer of media section. + * @param aAddress a IP address of media. + * @return none. + */ + void UpdateMediaInfoL( const TDesC8& aMediaPtr, + HBufC8*& aAddress ); + + /** + * Finds IP addr from a buffer. + * @since Series 60 3.0 + * @param aPtr a pointer to buffer where to search. + * @return a IP address if found. + */ + HBufC8* GetIpAddrL( const TDesC8& aPtr ); + + /** + * Getter for clock rate of media. + * @since Series 60 3.0 + * @param aPtr a pointer to buffer where serch from. + * @return a clock rate value of the media. + */ + TUint GetClockRateL( const TDesC8& aPtr ); + + /** + * Append media info from media section to array. + * @since Series 60 3.0 + * @param aMediaPtr a pointer to buffer of media section. + * @param aControlAddr a control address of media. + * @return none. + */ + void GetControlL( const TDesC8& aMediaPtr, + HBufC8*& aControlAddr ); + + /** + * Method for checking if addr is multicast addr. + * @since Series 60 3.0 + * @param aCLine is c= line from SDP. + * @return none. + */ + void CheckForMulticast( const TDesC8& aLine ); + + /** + * Method that picks up all attribute lines from sdp + * block and stores them in given array + * @since Series 60 3.0 + * @param aSdpSection is section from sdp. In practice m=video section + * or m=audio section or the common section from beginning. + * @aAttributeList is an array where each attribute-line is stored. + */ + void FindAttributesL ( const TDesC8& aSdpSection, + RArray& aAttributeList ); + + /** + * Method that picks up all data stream lines from sdp. + * @since Series 60 3.0 + * @param aSdpSection is section from sdp. In practice m=video section + * or m=audio section or the common section from beginning. + * @aStreamsList is an array where each data stream-line is stored. + * @return none. + */ + void FindDataStreamsL( const TDesC8& aSdpSection, + RArray& aStreamsList ); + + /** + * Reads integer value from a buffer. + * @since Series 60 3.0 + * @param aPtr a pointer to buffer where serch from. + * @param aKeyword a keyword for line. + * @return a integer value base on keyword. + */ + TInt GetIntL( const TDesC8& aPtr, + const TDesC8& aKeyword ); + + /** + * Reads string value from a buffer. + * @since Series 60 3.0 + * @param aPtr a pointer to buffer where serch from. + * @param aKeyword a keyword for line. + * @return a buffer base on keyword. + */ + HBufC8* GetStringL( const TDesC8& aPtr, + const TDesC8& aKeyword ); + + /** + * Finds location where keyword data start. + * @since Series 60 3.0 + * @param aPtr a pointer to buffer where serch from. + * @param aKeyword a keyword for line. + * @return a point in buffer where keyword data start. + */ + TInt FindStart( const TDesC8& aPtr, + const TDesC8& aKeyword ); + + /** + * Finds location where keyword data ends. + * @since Series 60 3.0 + * @param aPtr a pointer to buffer where serch from. + * @param aStart a point where keyword data starts. + * Return a point to line change. + * @param aIgnoreSpace if true, points to the line feed only if. + * @return a point in buffer where keyword data end. + */ + TInt GetLen( const TDesC8& aPtr, + const TInt aStart, + const TBool aIgnoreSpace = EFalse ); + + /** + * Finds smaller non error value integer. + * @since Series 60 3.0 + * @param aValue1 a value 1 for comparison. + * @param aValue2 a value 2 for comparison. + * @return smaller integer if one or both inputs are positive, + otherwise return KErrNotFound. + */ + TInt MinNonError( const TInt aValue1, + const TInt aValue2 ); + + /** + * Convert a string to unsigned integer. + * @since Series 60 3.0 + * @param aString a string to convert. + * @return a integer value base on string. + */ + TUint StrToUint( const TDesC8& aString ); + + /** + * Delete variables. + * @since Series 60 3.0 + * @param none. + * @return none. + */ + void DeleteVariables( void ); + +private: // Data + + /** + * Pointer to actual SDP text being parsed. + */ + HBufC8* iSdp; + + /** + * String containing (possible) base url. + */ + HBufC8* iBaseUrl; + + /** + * IP in common section. + */ + HBufC8* iCommonIp; + + /** + * Media section buffer(s) + */ + RArray iMediaBuf; + + /** + * Media attributes for both audio and video. + */ + RArray iSessionAttributes; + + /** + * Media attributes for audio not containing a=control attr. + */ + RArray iAudioAttributes; + + /** + * Media attributes for video not containing a=control attr. + */ + RArray iVideoAttributes; + + /** + * Data streams found from SDP. + */ + RArray iDataStreams; + + /** + * Url that may be used to SETUP iAudioControlAddr RTSP/1.0\r. + */ + HBufC8* iAudioControlAddr; + + /** + * Url that may be used to SETUP iVideoControlAddr RTSP/1.0\r. + */ + HBufC8* iVideoControlAddr; + + /** + * Ip number from audio block from c=IP.. line. + */ + HBufC8* iAudioIpAddr; + + /** + * Ip number from video block from c=IP.. line. + */ + HBufC8* iVideoIpAddr; + + /** + * Audio port or KErrNotFound if not available. + */ + TInt iAudioPort; + + /** + * Video port or KErrNotFound if not available. + */ + TInt iVideoPort; + + /** + * Subtitle port or KErrNotFound if not available. + */ + TInt iTitlePort; + + /** + * Audio bitrate or KErrNotFound if not available. + */ + TInt iAudioBitrate; + + /** + * Video bitrate or KErrNotFound if not available. + */ + TInt iVideoBitrate; + + /** + * Audio strema id. + */ + TInt iAudioStreamId; + + /** + * Video stream id. + */ + TInt iVideoStreamId; + + /** + * How much is one video rtp timer tick in wall clock time + * (usually 1/90000 seconds). + */ + TUint32 iVideoTimerGranularity; + + /** + * How much is one audio rtp timer tick in wall clock time + * (usually 1/ seconds). + */ + TUint32 iAudioTimerGranularity; + + /** + * If the sdp parsed was Ipv4 or not. + */ + TBool iIsIpv4; + + /** + * If the sdp parsed was multicast or not. + */ + TBool iIsMulticast; + + /** + * Media identifier for audio. From a=rtpmap:96 H264/90000 the number 96. + * Usually value 96 is for video and 97 for audio, but might be other. + */ + TInt iMediaIdentifierAudio; + + /** + * Media identifier for video. + */ + TInt iMediaIdentifierVideo; + + }; + +#endif // CDVRSDPPARSER_H + +// End of file