multimediacommsengine/mmcesrv/mmcemediamanager/inc/mcemediasdpcodec.h
changeset 0 1bce908db942
child 49 64c62431ac08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmcemediamanager/inc/mcemediasdpcodec.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,513 @@
+/*
+* Copyright (c) 2006 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:    
+*
+*/
+
+
+
+
+
+#ifndef CMCEMEDIASDPCODEC_H
+#define CMCEMEDIASDPCODEC_H
+
+//  INCLUDES
+#include "mcesdpcodec.h"
+#include "mcecomcodec.h"
+
+const TInt KMceMaxPTValue = 127;
+const TInt KMceMaxPayloadTypes = 20;
+
+const TBool KMceMediaCodecUpdate = ETrue;
+const TBool KMceMediaCodecNoUpdate = EFalse;
+
+/**
+*  Class for encoding and decoding media lines and creating server streams
+*  
+*/
+class CMceMediaSdpCodec : public CMceSdpCodec
+    {
+
+    public:
+    
+        /**
+        * destructor
+        */
+        ~CMceMediaSdpCodec();
+        
+    public: //from CMceSdpCodec
+    
+    
+        /**
+        * Encodes a media line. 
+        * @param aStream media stream
+        * @param aMediaLine media line
+        * @param aSdpDocument sdp document
+        * @leave system wide error
+        */ 
+        void EncodeMediaOfferL( CMceComMediaStream& aStream,
+                                CSdpMediaField& aMediaLine, 
+                                CSdpDocument& aSdpDocument );
+        
+        /**
+        * Decodes the media answer.
+        * @param aStream media stream
+        * @param aSdpDocument sdp document
+        * @return warning if any 
+        * @leave system wide error
+        */
+        TMceSipWarningCode DecodeMediaAnswerL( CSdpMediaField& aMediaLine, 
+                                 CMceComMediaStream& aStream,
+                                 CSdpDocument& aSdpDocument );
+        
+        /**
+        * Decodes media offer and creates media stream. The stream is appended
+        * into the media session, if aStream is NULL
+        * @param aMediaLine media line
+        * @param aStream stream added to session
+        * @param aSession media session
+        * @param aSdpDocument sdp document
+        * @param aStream stream to updated, if any
+        * @return warning if any 
+        * @leave system wide error
+        */
+        TMceSipWarningCode DecodeMediaOfferL( CSdpMediaField& aMediaLine,
+                                              CMceComMediaStream*& aStream,
+                                              CMceComSession& aSession,
+                                              CSdpDocument& aSdpDocument );
+
+        /**
+        * Decodes media update by updating media stream
+        * @param aMediaLine media line
+        * @param aStream stream to be updated
+        * @param aSdpDocument sdp document
+        * @return warning if any 
+        * @leave system wide error
+        */
+        TMceSipWarningCode DecodeMediaUpdateL( CSdpMediaField& aMediaLine, 
+                                               CMceComMediaStream& aStream,
+                                               CSdpDocument& aSdpDocument );
+                                              
+
+        /**
+        * Creates a encoded media line based on the offer received earlier.
+        * @param aStream media stream
+        * @param aMediaLine media line
+        * @param aSdpDocument sdp document
+        * @leave system wide error
+        */
+        void EncodeMediaAnswerL( CMceComMediaStream& aStream,
+                                  CSdpMediaField& aMediaLine,
+                                  CSdpDocument& aSdpDocument );
+                                      
+        /**
+        * Clean attributes
+        * @param aMediaLine media line
+        */
+        void CleanAttributes( CSdpMediaField& aMediaLine );
+        
+        
+        /**
+        * Prepares media line before offer/answer will be decoded
+        * @param aMediaLine media line
+        * @param aStream media stream
+        * @leave system wide error
+        */
+        void PrepareForDecodeL( CSdpMediaField& aMediaLine,
+                                CMceComMediaStream* aStream );
+
+
+        
+    protected://abstract interface
+    
+        
+        /**
+        * Returns codecs
+        * @param aStream media stream
+        * @param return codecs
+        * @leave if stream type does not macth codecs
+        */
+        virtual const RPointerArray<CMceComCodec>& CodecsL( 
+                                        CMceComMediaStream& aStream ) const = 0;
+        /**
+        * Encodes rtpmap -attribute
+        * @param aCodec codec encoded to rtpmap
+        * @leave system wide error
+        */
+        virtual CSdpFmtAttributeField* EncodeRtpmapAttributeLC( 
+                                        CMceComCodec& aCodec ) const = 0;
+        
+        /**
+        * Encodes media related attributes
+        * @param aCodec the codec
+        * @param aMediaLine media line
+        * @param aRtpmap rtpmap attribute
+        * @leave system wide error
+        */
+        virtual void EncodeMediaAttributesL( CMceComCodec& aCodec, 
+                                             CSdpMediaField& aMediaLine, 
+                                             CSdpFmtAttributeField& aRtpmap ) const = 0;
+
+        /**
+        * Decodes media related attributes
+        * @param aMediaLine media line
+        * @param aCodec the codec
+        * @leave system wide error
+        */
+		virtual void DecodeMediaAttributesL( CSdpMediaField& aMediaLine, 
+                                             CMceComCodec& aCodec,
+                                             CSdpFmtAttributeField& aRtpmap ) const = 0;
+		                                             
+
+        /**
+        * Creates media stream based on sdp type
+        * @param aType the sdp type sendrecv, sendonly or receive only
+        * @return media stream
+        * @leave system wide error
+        */
+        virtual CMceComMediaStream* CreateStreamLC( TInt aType ) const = 0;
+        
+        /**
+        * Updates media based on received offer
+        * @param aStream media stream
+        * @param aDirection the direction 
+        * @leave system wide error
+        */
+        virtual void UpdateStreamL( CMceComMediaStream& aStream, TInt aDirection ) const = 0;
+        
+        /**
+        * Creates codec based on rtpmap line
+        * @param aRtpmap rtpmap line
+        * @return codec or NULL, if not supported
+        * @leave system wide error
+        */
+        virtual CMceComCodec* CreateCodecLC( CSdpFmtAttributeField& aRtpmap ) const = 0;
+
+        /**
+        * Creates codec based on payload type
+        * @param aPayload payload
+        * @param aMediaLine media line
+        * @return codec or NULL, if not supported
+        * @leave system wide error
+        */
+        virtual CMceComCodec* CreateCodecLC( TUint aPayload, CSdpMediaField& aMediaLine ) const = 0;
+                
+        /**
+        * Decodes session level media attributes
+        * @param aStream media stream
+        * @param aSdpDocument sdp document
+        * @return codec or NULL, if not supported
+        * @leave system wide error
+        */
+        virtual void DecodeSessionMediaAttributesL( CMceComMediaStream& aStream, 
+                                                    CSdpDocument& aSdpDocument ) const = 0;
+        
+    protected:
+    
+
+        /**
+        * validates sdp offer. Called before offer will be decoded
+        * @param aMediaLine media line
+        * @param aSdpDocument sdp document
+        * @return warning
+        */
+        virtual TMceSipWarningCode ValidateSdpL( CSdpMediaField& aMediaLine,
+                                                CSdpDocument& aSdpDocument );
+
+        /**
+        * Gets the type of session ( sendrecv, sendonly or receiveonly )
+        * @param aMediaLine media line
+        * @param aSessionAttributes all session attributes
+        * @return type
+        */
+        TInt Type( CSdpMediaField& aMediaLine,
+                    RPointerArray<CSdpAttributeField>& aSessionAttributes ) const;
+                                
+
+        /**
+        * Encodes direction attribute
+        * @param aStream media stream
+        * @param aMediaLine media line
+        * @param aSdpDocument sdp document
+        * @param aRole negotiation role
+        */
+        void EncodeDirectionL( CMceComMediaStream& aStream,
+                               CSdpMediaField& aMediaLine,
+                               CSdpDocument& aSdpDocument,
+                               TMceNegotiationRole aRole ) const;
+        
+
+        /**
+        * Encodes preconditions
+        * @param aStream media stream
+        * @param aMedia media line
+        * @param aRole negotiation role
+        * @leave system wide error
+        */
+        void EncodePreconditionsL( CMceComMediaStream& aStream,
+                                   CSdpMediaField& aMediaLine,
+                                   TMceNegotiationRole aRole ) const;
+    
+        /**
+        * Decodes preconditions
+        * @param aMedia media line
+        * @param aStream media stream
+        * @param aRole negotiation role
+        * @return warning if any 
+        * @leave system wide error
+        */
+        TMceSipWarningCode DecodePreconditionsL( CSdpMediaField& aMediaLine,
+                                   CMceComMediaStream& aStream,
+                                   TMceNegotiationRole aRole ) const;
+        
+
+        /**
+        * Decodes rmtpmap lines in answer
+        * @param aMediaLine Media line
+        * @param aStream stream
+        * @param aRole role of negotiation
+        * @return number of lines decoded
+        */
+        TInt DecodeRtpmapLinesL( CSdpMediaField& aMediaLine,
+                                 CMceComMediaStream& aStream,
+                                 TMceNegotiationRole aRole ) const;
+                                     
+
+        /**
+        * Decodes rmtpmap lines in offer, and adds codes to stream.
+        * @param aMediaLine Media line
+        * @param aStream stream
+        * @return number of lines decoded
+        */
+        TInt DecodeRtpmapLinesL( CSdpMediaField& aMediaLine,
+                                 CMceComMediaStream& aStream ) const;
+
+        /**
+        * Decodes static payloads if payload wasn't defined as rtpmap
+        * @param aMediaLine Media line
+        * @param aStream stream
+        * @param aPayloadTypes payload types as an array
+        * @param aRole role of negotiation
+        * @return number of lines decoded
+        */
+        TInt DecodeStaticPayloadsL( CSdpMediaField& aMediaLine,
+                                    CMceComMediaStream& aStream,
+                                    RArray<TUint>& aPayloadTypes, 
+                                    TMceNegotiationRole aRole ) const;
+
+        /**
+        * Decodes rtpmap line. 
+        * @param aRtpMaptLine rtpmap line
+        * @param aMediaLine media line
+        * @param aStream stream
+        * @param aFmtpValue
+        * @return decoded codec if codec was supported
+        */
+        CMceComCodec* DecodeRtpmapLineL( CSdpFmtAttributeField& aRtpMaptLine,
+                                         CSdpMediaField& aMediaLine,
+                                         CMceComMediaStream& aStream,
+                                         const TDesC8& aFmtpValue = KNullDesC8 ) const;
+ 
+        /**
+        * Decodes fmtp lines. 
+        * @pre codecs and rtpmaps are in sync 
+        * @param aMediaLine Media line
+        * @param aCodecs codecs
+        * @param aRole the role
+        */
+        void DecodeFmtpLinesL( CSdpMediaField& aMediaLine,
+                               CMceComCodec::TIterator& aCodecs,
+                               TMceNegotiationRole aRole ) const;
+                               
+
+        /**
+        * Creates fmtp attribute and appends it into media line
+        * @param aCodec the codec
+        * @param aMediaLine Media line
+        * @return None.
+        */
+        void EncodeFmtpAttributeL( CMceComCodec& aCodec,
+                                   CSdpMediaField& aMediaLine ) const;
+                                   
+
+        /**
+        * Encodes secure session
+        * @param aStream media stream
+        * @param aMediaLine Media line
+        * @param aRole the role
+        */
+        void EncodeSecureSessionL( CMceComMediaStream& aStream, 
+                                   CSdpMediaField& aMediaLine,
+                                   TMceNegotiationRole aRole );
+                                   
+                                  
+        /**
+        * Decodes secure session
+        * @param aMediaLine Media line
+        * @param aStream media stream
+        * @param aRole the role
+        * @param aUpdate is it update (role EMceRoleAnswerer )
+        */
+        void DecodeSecureSessionL( CSdpMediaField& aMediaLine,
+                                  CMceComMediaStream& aStream, 
+                                  TMceNegotiationRole aRole,
+                                  TBool aUpdate = KMceMediaCodecNoUpdate );
+                                  
+
+
+        /**
+        * Decodes direction and 'old school' hold
+        * @param aMediaLine Media line
+        * @param aStream media stream
+        * @param aSdpDocument sdp document
+        * @param aRole the role
+        * @param aUpdate is it update 
+        */
+        void DecodeDirectionL( CSdpMediaField& aMediaLine,
+                                   CMceComMediaStream& aStream,
+                                   CSdpDocument& aSdpDocument,
+                                   TMceNegotiationRole aRole ) const;
+                                  
+                                  
+        /**
+        * Update direction and 'old school' hold
+        * @param aMediaLine Media line
+        * @param aStream media stream
+        * @param aSdpDocument sdp document
+        */
+
+        void UpdateDirectionL( CSdpMediaField& aMediaLine, 
+                                              CMceComMediaStream& aStream,
+                                              CSdpDocument& aSdpDocument) const;
+
+        /**
+        * Creates fmtlist that can be used as media field fmt list -attribute
+        * @param aCodecs codecs
+        * @return fmtp list
+        */
+        HBufC8* CreateFormatListL( CMceComCodec::TIterator& aCodecs ) const;
+        
+        
+       /**
+        * decodes the remote RTCP port according to RFC 3605
+        * @param aMediaLine Media line
+        * @param aStream media stream
+        */
+        void DecodeRemoteRtcpFieldL( CSdpMediaField& aMediaLine, 
+                                     CMceComMediaStream& aStream ) const;  
+        
+        /**
+        * encodes the remote RTCP port according to RFC 3605
+        * @param aMediaLine Media line
+        * @param aStream media stream
+        */
+        void EncodelocalRtcpAttrL( CSdpMediaField& aMediaLine, 
+                                     CMceComMediaStream& aStream ) const; 
+        
+        /**
+        * Encodes media attributes client is willing to insert
+        * @param aStream media stream
+        * @param aMediaLine media line
+        */
+        void EncodeClientAttributesL( CMceComMediaStream& aStream,
+                                      CSdpMediaField& aMediaLine ) const;
+
+        /**
+        * Decodes media attributes to be sent to client
+        * @param aMediaLine Media line
+        * @param aStream media stream
+        */
+        void DecodeClientAttributesL( CSdpMediaField& aMediaLine, 
+                                      CMceComMediaStream& aStream ) const;  
+                              
+        
+        /**
+        * Decodes media line's format list to payload type array
+        * @param aMediaLine Media line
+        * @param aPayloadTypes payload types as an array
+        */
+        void DecodeFormatListL( CSdpMediaField& aMedia, 
+                                RArray<TUint>& aPayloadTypes ) const;
+
+        /**
+        * Decodes media line's format list to payload type array
+        * @param aMediaLine Media line
+        * @param aPayloadTypes payload types as an array
+        * @return  system wide error
+        */
+        TInt DecodeFormatList( CSdpMediaField& aMedia, 
+                               RArray<TUint>& aPayloadTypes ) const;
+                             
+        /**
+        * Finds codec based on payload type
+        * @param aPayloadType payload
+        * @param aStream stream containig codecs
+        * @return codec
+        */
+        CMceComCodec* FindCodec( TInt aPayloadType, 
+                                 CMceComMediaStream& aStream ) const;
+                             
+        
+        /**
+        * Decodes payloads and static payloads if payload wasn't defined
+        * as rtpmap. Additionally, codec sdp indexes are updated.
+        * @param aMediaLine Media line
+        * @param aStream stream
+        * @param aRole role of negotiation
+        * @return number of lines decoded
+        */
+        TInt DecodePayloadsL( CSdpMediaField& aMediaLine,
+                              CMceComMediaStream& aStream,
+                              TMceNegotiationRole aRole ) const;
+    
+        /**
+        * Updates streams codec sdp index values. Can be called after
+        * dynamic payload types have been updated.
+        * @param aStream stream containig codecs
+        * @param aPayloadTypes list of payload types
+        */
+        void UpdateSdpCodecIndexesL( CMceComMediaStream& aStream,
+                                     RArray<TUint>& aPayloadTypes ) const;
+    
+    
+        /**
+        * Tries to find matching fmtp line for certain rtpmap line
+        * @param aMediaLine Media line
+        * @param aRtpMapFormatLine rtpmap format line
+        * @return KNullDesC8 if fmtp line is not found
+        */
+        TPtrC8 GetCorrespondingFmtpLineL( CSdpMediaField& aMediaLine, 
+                                          CSdpFmtAttributeField& aRtpMapFormatLine ) const;
+    
+    protected:
+    
+    
+        /**
+        * C++ Constructor
+        * @param aMedia media
+        */
+        CMceMediaSdpCodec( RStringF aMedia );
+        
+
+
+    friend class UT_CMceMediaSdpCodec;
+    friend class UT_CMceMediaManager;       
+    friend class UT_CMceSdpSession;
+
+
+    };
+
+#endif      // CMCEMEDIASDPCODEC_H   
+            
+// End of File