multimediacommsengine/mmceshared/inc/mcecomcodec.h
changeset 0 1bce908db942
child 49 64c62431ac08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmceshared/inc/mcecomcodec.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,594 @@
+/*
+* Copyright (c) 2005 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 CMCECOMCODEC_H
+#define CMCECOMCODEC_H
+
+//  INCLUDES
+#include <e32base.h>
+#include "mcedefs.h"
+#include "mceclientserver.h"
+#include "mcecomfactory.h"
+#include "mcecomserializable.h"
+
+
+typedef TBuf8<KMceMaxSdpNameLength> TMceComCodecName;
+
+#ifdef MCE_COMMON_SERVER_SIDE
+#include "mcemediadefs.h"
+
+class CMccCodecInformation;
+class TMceMccComEvent;
+class CMceSrvStream;
+
+#endif//MCE_COMMON_SERVER_SIDE
+    
+class TMceComFactory;
+class TMceComAudioCodecFactory;
+
+//  CONSTANTS
+const TBool KMceCodecFmtpReset = ETrue;
+const TBool KMceCodecFmtpAppend = EFalse;
+_LIT8( KMceFmtpSeparator, "; ");
+
+const TUint8 KMinDynPayloadType( 96 );
+const TUint8 KMaxDynPayloadType( 127 );
+
+// MACROS
+
+class CMceComCodec : public CBase,
+                     public MMceComSerializable
+
+    {
+
+
+public:  // Constructors and destructor
+
+
+    /**
+    * C++ constructor
+    */
+    CMceComCodec();
+
+    /**
+    * C++ destructor
+    */
+    ~CMceComCodec();
+    
+    /**
+    * Second phase constructor
+    */
+    void ConstructL( CMceComCodec& aCodec );
+    
+    /**
+    * ID 
+    * @return ID
+    */
+	TMceMediaId Id() const;
+
+	/**
+    * Parent object
+    * @return Parent object
+    */
+	CMceComMediaStream* Stream() const;
+    
+    /**
+    * Set codec specific fmtp line
+    * @param aReset if ETrue reset fmtp, EFalse append
+    */
+    virtual void SetFmtpAttributeL( const TDesC8& aFmtpAttribute, 
+                                    TBool aReset = KMceCodecFmtpReset );
+                                                                        
+    /**
+    * Sets keep alive data
+    * @param keep alive data
+    */
+    void SetKeepAliveDataL( const TDesC8& aKeepAliveData );
+    
+    /**
+    * Sets bitrate used with codec for encoding.
+    * @param aBitrate bitrate value for encoding
+    * @return KErrNotSupported if codec doesn't support bitrate
+    *         value issued
+    */
+    virtual TInt SetBitrate( TUint aBitrate );
+    
+    /**
+    * Sets bitrates allowed with codec.
+    * @param aBitrates allowed bitrate values
+    * @return KErrNotSupported if codec doesn't support bitrate
+    *         values issued
+    */
+    virtual TInt SetAllowedBitrates( TUint aBitrates );
+
+    /**
+    * Sets the codec specific mode.
+    * @param aCodecMode mode of the codec
+    * @return KErrNotSupported if codec doesnt' support codec mode
+    *         value issued
+    */
+    virtual TInt SetCodecMode( TUint aCodecMode );
+    
+    /**
+    * Sets the payload type.
+    * @param aPayloadType type identifier of the payload
+    * @return KErrNotSupported if codec doesn't support payload type issued
+    */
+    virtual TInt SetPayloadType( TUint8 aPayloadType );
+    
+    /**
+    * Returns max bit rate
+    * @return max bit rate
+    */
+    virtual TUint GetMaxBitRate();
+    
+public: //from MMceComSerializable
+
+    /**
+    * Returns serialization id
+    * @return serialization id
+    */
+    TUint64 SerializationId() const;
+
+    /**
+    * Internalizes flat data
+    * @param aReadStream read stream
+    */
+    void InternalizeFlatL( RReadStream& aReadStream );
+
+    /**
+    * Externalizes flat data
+    * @param aWriteStream write stream
+    */
+    void ExternalizeFlatL( RWriteStream& aWriteStream );
+    
+    /**
+    * Internalizes
+    * @param aSerCtx context for serialization
+    */
+    void InternalizeL( MMceComSerializationContext& aSerCtx );
+    
+    /**
+    * Externalizes
+    * @param aSerCtx context for serialization
+    */
+    void ExternalizeL( MMceComSerializationContext& aSerCtx );
+
+
+public: //new (virtual) functions
+    
+    /**
+    * Updates this object
+    * @param aUpdate object updates this
+    */
+    virtual void UpdateL( CMceComCodec& aUpdate );
+    
+    /**
+    * Return ETrue, if this codec decodes rtpmap value
+    * @param aRtpmapValue rtp map
+    * @param aFmtpValue fmtp
+    * @param aIsStrictMatch, EFalse if matching is less strict
+    * @return ETrue, if this codec decodes rtpmap value
+    */
+    virtual TBool Decodes( const TDesC8& aRtpmapValue, 
+                           const TDesC8& aFmtpValue,
+                           TBool aIsStrictMatch = ETrue );
+
+    /**
+    * Initializes 
+    * @param aParent the parent
+    */
+    virtual void InitializeL( CMceComMediaStream& aParent );
+    
+    /**
+    * Traversal event handler
+    * @param aEvent the event
+    * @return status, if event was consumed or not or object needs update
+    */
+    virtual TInt EventReceivedL( TMceEvent& aEvent );
+    
+    /**
+    * Resolve allowed bitrates based on given bitrate value.
+    * @param aBitrate
+    * @param aAllowedBitrates, on return contains allowed bitrates
+    * @return error code
+    */
+    virtual TInt ResolveAllowedBitrates( TUint aBitrate, TUint& aAllowedBitrates );
+    
+    /**
+    * Sets codec enabled/disabled.
+    * @param aIsEnabled
+    */
+    virtual void SetEnabled( TBool aIsEnabled );
+    
+    /**
+    * Check if codec can send.
+    * @return ETrue if can send
+    */
+    virtual TBool SendSupported();
+
+public: //new functions
+
+    /**
+    * Gets enabled state.
+    * @return ETrue if enabled, EFalse if disabled
+    */
+    TBool IsEnabled() const; 
+
+    /**
+    * Factory
+    * @return factory
+    */
+    TMceComFactory BaseFactory();
+    
+    /**
+    * Gets current fmtp attribute
+    * @return fmtp attribute
+    */   
+    TPtrC8 FmtpAttr() const;
+    
+#ifdef MCE_COMMON_SERVER_SIDE
+
+public: //new functions
+
+    /**
+    * Synchronizes itself with another codec, if possible
+    * @param aCodec codec to be synchornized with
+    * @param aRoleAnswerer is answerer
+    */
+    virtual void SynchronizeL( CMceComCodec& aCodec, TBool aRoleAnswerer );
+
+    /**
+    * Assigns mcc codec
+    * @param aMccCodec mcc codec
+    * @return assigned codecs
+    */
+    virtual CMceComCodec& operator=( CMccCodecInformation& aMccCodec ) = 0;
+    
+    /**
+    * Decodes to mcc codec
+    * @param aMccCodec mcc codec
+    */
+    void MccDecodeL( CMccCodecInformation& aMccCodec );
+
+    /**
+    * Populates mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    * @param aRole role
+    */
+    void MccPopulateL( CMccCodecInformation& aMccCodec, 
+                       CMceSrvStream& aStream,
+                       TMceNegotiationRole aRole );
+
+    /**
+    * Validates codec values based on mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    * @param aRole role
+    * @return Other codec which is affected because of values or
+    *   NULL if none is affected
+    */
+    CMceComCodec* MccValidateL( CMccCodecInformation& aMccCodec,
+                                CMceSrvStream& aStream,
+                                TMceNegotiationRole aRole );
+
+    /**
+    * Adjust codec values based on mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    */
+    void MccAdjustL( CMccCodecInformation& aMccCodec, 
+                     CMceSrvStream& aStream );
+    
+    /**
+    * Checks, if signalling is required
+    * @param aStream stream
+    * @param aMccCurentCodec current mcc codec
+    * @param aMccUpdateCodec to be used mcc codec
+    */
+    TInt MccRequireSignalling( 
+                        const CMceSrvStream& aStream,
+                        const CMccCodecInformation& aMccCurentCodec, 
+                        const CMccCodecInformation& aMccUpdateCodec ) const;
+   
+    /**
+    * Sets state of codec based on event
+    * @param aEvent event
+    */
+    void SetState( TMceMccComEvent& aEvent );
+    
+    /**
+    * Set default fmtp line
+    */                                    
+    void SetDefaultFmtpAttributeL();
+
+    void Merge( CMceComCodec& aMergeWith );
+    
+    /**
+    * Used for storing fmtp proposal but the value is not set as official
+    * fmtp of the codec. Pre-check for fmtp validity
+    * @param aFmtpProposal
+    * @return ETrue if fmtp is valid
+    */
+    virtual TBool SetFmtpProposalL( const TDesC8& aFmtpProposal );
+ 
+    /**
+    * Set fmtp
+    * @param aReset if ETrue reset fmtp, EFalse append
+    */
+    virtual void SetFmtpFromIncomingSdpL( const TDesC8& aFmtpAttribute, 
+                                          TBool aRoleAnswerer,
+                                          TBool aReset = KMceCodecFmtpReset );
+    
+    /**
+    * Create fmtp for outgoing sdp
+    * @return fmtp, ownership is transferred
+    */
+    virtual HBufC8* FtmpForOutgoingSdpLC();
+
+protected://abstract methods
+
+
+    /**
+    * Decodes to mcc codec
+    * @param aMccCodec mcc codec
+    */
+    virtual void DoMccDecodeL( CMccCodecInformation& aMccCodec ) = 0;
+
+    /**
+    * Encodes from mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    */
+    virtual void DoMccEncodeL( CMccCodecInformation& aMccCodec,
+                               CMceSrvStream& aStream ) = 0;
+    
+    /**
+    * Validates codec values based on mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    * @param aRole role
+    * @return Other codec which is affected because of values or
+    *   NULL if none is affected
+    */
+    virtual CMceComCodec* DoMccValidateL( CMccCodecInformation& aMccCodec,
+                                          CMceSrvStream& aStream,
+                                          TMceNegotiationRole aRole );
+                               
+    /**
+    * Adjust codec values based on mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    */
+    virtual void DoMccAdjustL( CMccCodecInformation& aMccCodec, 
+                               CMceSrvStream& aStream ) = 0;
+                             
+    /**
+    * Checks, if signalling is required
+    * @param aStream stream
+    * @param aMccCurentCodec current mcc codec
+    * @param aMccUpdateCodec to be used mcc codec
+    */
+    virtual TInt DoMccRequireSignalling( 
+                                const CMceSrvStream& aStream,
+                                const CMccCodecInformation& aMccCurentCodec, 
+                                const CMccCodecInformation& aMccUpdateCodec ) const = 0;
+  
+    /**
+    * Set default fmtp line
+    */                                    
+    virtual void DoSetDefaultFmtpAttributeL() = 0;
+        
+    /**
+    * Encodes common values from mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    */
+    void EncodeCodecCommonL( CMccCodecInformation& aMccCodec );
+    
+    /**
+    * Decodes common values to mcc codec
+    * @param aMccCodec mcc codec
+    */
+    void DecodeCodecCommonL( CMccCodecInformation& aMccCodec );
+
+    
+private:
+
+    /**
+    * Encodes from mcc codec
+    * @param aMccCodec mcc codec
+    * @param aStream stream
+    */
+    void MccEncodeL( CMccCodecInformation& aMccCodec, CMceSrvStream& aStream );
+    
+    /**
+    * Updates codec based on mcc codec
+    * @param aMccCodec mcc codec
+    */
+    void UpdateL( CMccCodecInformation& aMccCodec );
+    
+
+#endif//MCE_COMMON_SERVER_SIDE
+
+protected: //new functions
+
+    void ConstructL( TMceComCodecName aSdpName );
+    
+
+public:// data
+    
+    /**
+     * type of session
+     */
+    TMceMediaId iID;
+	
+	/**
+     * Fmtp attribute
+     */
+    HBufC8* iFmtpAttr;
+
+	/**
+    * Sdp name used in SDP messages
+    */
+	TMceComCodecName iSdpName;		
+
+	/**
+    * Payload type
+    */
+	TUint8 iPayloadType;
+
+    /**
+     * Is enabled
+     */
+    TBool iIsEnabled;
+    
+   	/**
+    * Stream's bit rate
+    */
+	TUint iBitrate;
+
+	/**
+    * Stream's allowed bit rates
+    */
+	TUint32 iAllowedBitrates;
+
+	/**
+    * Codec mode ( e.g. PCMU, PCMA, Bandwidth efficient, octet aligned )
+    */
+	TUint32 iCodecMode;		
+	
+	/**
+	* Codec FourCC
+	*/
+	TUint32 iFourCC;
+
+	/**
+    * Codecs frame size
+    */
+	TUint iFrameSize;
+
+	/**
+    * Codecs state of the codec
+    */
+	TInt iState;
+    
+	/**
+    * MMF priority of the codec
+    */
+	TInt iPriority;
+
+	/**
+    * MMF priority preference of the codec
+    */
+	TInt iPriorityPreference;
+	
+	/**
+    * Keep alive timer
+    */
+    TUint8 iKeepAliveTimer;
+    
+	/**
+    * Keep Alive Payload Type
+    */
+    TUint8 iKeepAlivePayloadType;
+    
+	/**
+    * Keep Alive Data
+    */
+    HBufC8* iKeepAliveData;
+   
+    /**
+    *
+    */
+    TBool iIsNegotiated;
+    
+    TInt iCodecSdpIndex;
+    
+    TInt iPreference;
+    
+    /**
+     * Fmtp proposal
+     */
+    HBufC8* iFmtpProposal;
+    
+protected: // NOT owned data
+	
+	
+    /**
+     * stream
+     */
+	CMceComMediaStream* iStream;
+    
+
+public: //inner classes
+
+    class TIterator
+        {
+
+    public:
+        
+        enum TFilter
+            {
+            EFilterNone = 0,
+            EFilterIsNegotiated,
+            EFilterAssociatedLocal
+            };
+        enum TStreamStateMatchType
+            {
+            EExactMatch,
+            EOtherSdpName
+            };
+            
+    public:
+        
+            TIterator( const RPointerArray<CMceComCodec>& aCodecs, 
+                       TFilter aFilter =  EFilterNone,
+                       CMceComCodec* aCodec = NULL );
+            
+            TBool IsEof();
+            TBool Next( CMceComCodec*& aCandidate,
+                        TIterator::TStreamStateMatchType aMatchType = EExactMatch );
+            
+            void Reset();
+            TInt Count();
+            
+            void SetFilter( TFilter aFilter, CMceComCodec* aCodec = NULL );
+            
+    private:
+        
+            TFilter iFilter;
+            const RPointerArray<CMceComCodec>& iCodecs;
+            TInt iCurrentIndex;
+            CMceComCodec* iCodec;
+    
+        };
+    
+    #ifdef EUNIT_TEST
+    	friend class UT_CMceComCodec;
+	#endif
+    };
+
+
+
+#endif//CMCECOMCODEC_H
+
+// End of File
\ No newline at end of file