multimediacommsengine/mmceshared/src/mcecomvideocodec.cpp
changeset 0 1bce908db942
child 49 64c62431ac08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmceshared/src/mcecomvideocodec.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,480 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+#include "mcecomvideocodec.h"
+
+#include "mceserial.h"
+#include "mceevents.h"
+
+#include "mcecomrtpsource.h"
+#include "mcertpsource.h"
+
+#ifdef MCE_COMMON_SERVER_SIDE
+
+#include <mmcccodecinformation.h>
+#include "mcesrvstream.h"
+#include "mcesrvsource.h"
+
+
+#endif//MCE_COMMON_SERVER_SIDE
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+    
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::NewL
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec* CMceComVideoCodec::NewL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComVideoCodec* self = NewLC( aSdpName );
+    CleanupStack::Pop( self );
+    return self;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::NewLC
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec* CMceComVideoCodec::NewLC( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComVideoCodec* self = new (ELeave) CMceComVideoCodec();
+    CleanupStack::PushL( self );
+    self->ConstructL( aSdpName );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::~CMceComAMRCodec
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec::~CMceComVideoCodec()
+    {
+    delete iConfigKey;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::CMceComVideoCodec
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec::CMceComVideoCodec()
+    :CMceComCodec(),
+     iFrameRate( 0 ),
+     iMaxBitRate( 0 ),
+     iAllowedResolutions( 0 ),
+     iResolutionWidth( 0 ),
+     iResolutionHeight( 0 ),
+     iAllowedFrameRates( 0 ),
+     iClockRate( 0 ),
+     iReceiveFrameRate( 0 ),
+     iEncodingDecodingDevice( KNullUid )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+CMceComVideoCodec* CMceComVideoCodec::CloneL()
+    {
+    CMceComVideoCodec* copy = new (ELeave) CMceComVideoCodec();
+    CleanupStack::PushL( copy );
+    copy->ConstructL( *this );
+    CleanupStack::Pop( copy );
+    return copy;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::ConstructL( TBuf8<KMceMaxSdpNameLength> aSdpName )
+    {
+    CMceComCodec::ConstructL( aSdpName );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::ConstructL( CMceComVideoCodec& aCodec )
+    {
+    CMceComCodec::ConstructL( aCodec );
+    
+    iFrameRate = aCodec.iFrameRate;
+    iMaxBitRate = aCodec.iMaxBitRate;
+    iAllowedResolutions = aCodec.iAllowedResolutions;
+    iResolutionWidth = aCodec.iResolutionWidth;
+    iResolutionHeight = aCodec.iResolutionHeight;
+    iAllowedFrameRates = aCodec.iAllowedFrameRates;
+    iClockRate = aCodec.iClockRate;
+    iReceiveFrameRate = aCodec.iReceiveFrameRate;
+    
+    SetConfigKeyL( aCodec.iConfigKey );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::InternalizeFlatL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::InternalizeFlatL( RReadStream& aReadStream )
+    {
+    CMceComCodec::InternalizeFlatL( aReadStream );
+
+    iFrameRate = aReadStream.ReadReal64L();
+    iMaxBitRate = aReadStream.ReadUint32L();
+    iAllowedResolutions = aReadStream.ReadUint32L();
+    iResolutionWidth = aReadStream.ReadInt32L();
+    iResolutionHeight = aReadStream.ReadInt32L();
+    iAllowedFrameRates = aReadStream.ReadUint32L();
+    iClockRate = aReadStream.ReadUint32L();
+    iReceiveFrameRate = aReadStream.ReadReal64L();
+    
+    MceSerial::DecodeL( iConfigKey, aReadStream );
+    
+    iEncodingDecodingDevice.iUid = aReadStream.ReadUint32L();
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::ExternalizeFlatL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::ExternalizeFlatL( RWriteStream& aWriteStream )
+    {
+    CMceComCodec::ExternalizeFlatL( aWriteStream );
+    
+    aWriteStream.WriteReal64L( iFrameRate );
+    aWriteStream.WriteUint32L( iMaxBitRate );
+    aWriteStream.WriteUint32L( iAllowedResolutions );
+    aWriteStream.WriteInt32L( iResolutionWidth );
+    aWriteStream.WriteInt32L( iResolutionHeight );
+    aWriteStream.WriteUint32L( iAllowedFrameRates );
+    aWriteStream.WriteUint32L( iClockRate );
+    aWriteStream.WriteReal64L( iReceiveFrameRate );
+    
+    MceSerial::EncodeL( iConfigKey, aWriteStream );
+    
+    aWriteStream.WriteUint32L( iEncodingDecodingDevice.iUid );
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::UpdateL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::UpdateL( CMceComCodec& aCodec )
+    {
+    CMceComCodec::UpdateL( aCodec );
+
+    CMceComVideoCodec& codec = static_cast<CMceComVideoCodec&>( aCodec );
+
+    iMaxBitRate = codec.iMaxBitRate;
+    iAllowedResolutions = codec.iAllowedResolutions;
+    iAllowedFrameRates = codec.iAllowedFrameRates;
+    
+    if ( IS_RECEIVESTREAM( iStream ) )
+        {
+        iFrameRate = codec.iFrameRate;
+        iResolutionWidth = codec.iResolutionWidth;
+        iResolutionHeight = codec.iResolutionHeight;
+        iClockRate = codec.iClockRate;
+        }
+    else
+        {       
+        SetConfigKeyL( codec.iConfigKey );
+        }
+        
+    iEncodingDecodingDevice = codec.iEncodingDecodingDevice;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::Factory
+// -----------------------------------------------------------------------------
+//
+TMceComVideoCodecFactory CMceComVideoCodec::Factory()
+    {
+    return TMceComVideoCodecFactory();
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::SetMaxBitrate
+// -----------------------------------------------------------------------------
+//
+TInt CMceComVideoCodec::SetMaxBitrate( TUint aMaxBitrate )
+    {
+    if ( aMaxBitrate )
+        {
+        iMaxBitRate = aMaxBitrate;
+        return KErrNone;
+        }
+    else
+        {
+        return KErrArgument;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::GetMaxBitRate
+// -----------------------------------------------------------------------------
+//
+TUint CMceComVideoCodec::GetMaxBitRate()
+    {
+    return iMaxBitRate > 0 ? iMaxBitRate : iBitrate;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::CompareSdpIndex
+// -----------------------------------------------------------------------------
+//
+TInt CMceComVideoCodec::CompareSdpIndex( 
+    const CMceComVideoCodec& aIndex1, 
+    const CMceComVideoCodec& aIndex2 )
+    {
+    // NOTE: if zero (equals) is returned from here, order is strangely anyway
+    // changed. Returning positive value if indexes are equal is for avoiding
+    // this quirk.
+
+    if ( aIndex1.iCodecSdpIndex >= aIndex2.iCodecSdpIndex )
+        {
+        return (1);
+        }
+    else if ( aIndex1.iCodecSdpIndex < aIndex2.iCodecSdpIndex )
+        {
+        return (-1);
+        }
+    else
+        {
+        return (0);
+        } 
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::SetConfigKeyL
+// -----------------------------------------------------------------------------
+//                                 
+TBool CMceComVideoCodec::SetConfigKeyL( HBufC8* aConfigKey )
+    {
+    TBool updated( EFalse );
+    if ( IsConfigKeyValid( aConfigKey ) )
+        {
+        // Set key only if none exists or new key differs from existing one
+        if ( !iConfigKey || ( iConfigKey->Compare( *aConfigKey ) != 0 ) )
+            { 
+            HBufC8* configKey = aConfigKey->AllocL();
+            delete iConfigKey;
+            iConfigKey = configKey;
+            updated = ETrue;
+            }
+        }
+    return updated;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::IsConfigKeyValid
+// -----------------------------------------------------------------------------
+// 
+TBool CMceComVideoCodec::IsConfigKeyValid() const
+    {
+    return IsConfigKeyValid( iConfigKey );
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::IsConfigKeyValid
+// -----------------------------------------------------------------------------
+//    
+TBool CMceComVideoCodec::IsConfigKeyValid( HBufC8* aConfigKey )
+    {
+    return ( aConfigKey && aConfigKey->Length() > 0 );
+    }
+    
+#ifdef MCE_COMMON_SERVER_SIDE
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::operator=
+// -----------------------------------------------------------------------------
+//
+/*lint -e1539 */
+
+CMceComCodec& CMceComVideoCodec::operator=( CMccCodecInformation& aMccCodec )
+    {
+
+	iPayloadType = aMccCodec.PayloadType();
+	iBitrate = aMccCodec.Bitrate();
+	iAllowedBitrates = aMccCodec.AllowedBitrates();
+	iCodecMode = aMccCodec.CodecMode();
+	iFourCC = aMccCodec.FourCC();
+	iFrameSize = aMccCodec.FrameSize();
+
+    iFrameRate = aMccCodec.Framerate();
+    iMaxBitRate = aMccCodec.MaxBitrate();
+    iResolutionWidth = aMccCodec.FrameWidth();
+    iResolutionHeight = aMccCodec.FrameHeight();
+    iClockRate = aMccCodec.SamplingFreq();
+    
+    HBufC8* configKey = NULL;
+    TRAPD( err, configKey = aMccCodec.ConfigKeyL() );
+    if ( !err )
+    	{
+    	TRAP_IGNORE( SetConfigKeyL( configKey ) )	
+    	}
+    delete configKey;
+    iEncodingDecodingDevice = aMccCodec.PreferredEncodingDecodingDevice();
+
+    return *this;
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::DoMccDecodeL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::DoMccDecodeL( CMccCodecInformation& aMccCodec )
+    {
+    // copy values, which are not explicitely in SDP, from mcc codec
+	iClockRate = aMccCodec.SamplingFreq();
+    iResolutionWidth = aMccCodec.FrameWidth();
+    iResolutionHeight = aMccCodec.FrameHeight();
+    iMaxBitRate = aMccCodec.MaxBitrate();
+    HBufC8* configKey = aMccCodec.ConfigKeyL();
+    CleanupStack::PushL( configKey );
+    SetConfigKeyL( configKey );
+    CleanupStack::PopAndDestroy( configKey );
+    iEncodingDecodingDevice = aMccCodec.PreferredEncodingDecodingDevice();	
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::DoMccEncodeL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::DoMccEncodeL( CMccCodecInformation& aMccCodec,
+                                      CMceSrvStream& aStream )
+    {
+    User::LeaveIfError( aMccCodec.SetSamplingFreq( iClockRate ) );
+    User::LeaveIfError( aMccCodec.SetFrameWidth( iResolutionWidth ) );
+    User::LeaveIfError( aMccCodec.SetFrameHeight( iResolutionHeight ) );
+	User::LeaveIfError( aMccCodec.SetMaxBitrate( iMaxBitRate ) );
+    User::LeaveIfError( aMccCodec.SetAverageBitrate( iBitrate ) );
+    User::LeaveIfError( aMccCodec.SetFramerate( iFrameRate ) );
+    if ( IsConfigKeyValid() )
+        {
+        aMccCodec.SetConfigKeyL( *iConfigKey );
+        }
+    if ( aStream.Source().Data().iType == KMceRTPSource )
+        {
+        
+		CMceComRtpSource& rtpSource = 
+		    static_cast<CMceComRtpSource&> ( aStream.Source().Data() );
+	    
+    	User::LeaveIfError( 
+    	    aMccCodec.SetJitterBufInactivityTimeOut( rtpSource.iInactivityTimer ) );
+    	User::LeaveIfError( 
+    	    aMccCodec.SetJitterBufThreshold( rtpSource.iBufferTreshold ) );
+    	User::LeaveIfError( 
+    	    aMccCodec.SetJitterBufBufferLength( rtpSource.iBufferLength ) );
+        }
+    aMccCodec.SetPreferredEncodingDecodingDevice(iEncodingDecodingDevice);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::DoMccValidateL
+// -----------------------------------------------------------------------------
+//
+CMceComCodec* CMceComVideoCodec::DoMccValidateL( CMccCodecInformation& aMccCodec,
+                                         CMceSrvStream& aStream,
+                                         TMceNegotiationRole aRole )
+    {	
+    // TBD: validate frame width and height
+    // Explicitly call default implementation of DoMccValidateL in base class
+    // to enable the check for codecMode
+    return CMceComCodec::DoMccValidateL( aMccCodec, aStream, aRole );
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComAudioCodec::DoMccRequireSignalling
+// -----------------------------------------------------------------------------
+//
+TInt CMceComVideoCodec::DoMccRequireSignalling( 
+    const CMceSrvStream& aStream,
+    const CMccCodecInformation& aMccCurentCodec, 
+    const CMccCodecInformation& aMccUpdateCodec ) const
+    {
+    TInt action = KMceNoSignalling;
+
+    if ( aStream.StreamType() == CMceComMediaStream::EReceiveStream ||
+         aStream.StreamType() == CMceComMediaStream::EReceiveOnlyStream )
+        {
+        if ( aMccCurentCodec.Framerate() != aMccUpdateCodec.Framerate() )
+            {
+            action = KMceRequiresSignalling;
+            }
+        }
+    
+    if ( aMccCurentCodec.FrameWidth() != aMccUpdateCodec.FrameWidth() ||
+         aMccCurentCodec.FrameHeight() != aMccUpdateCodec.FrameHeight() )
+        {
+        action = KMceRequiresSignalling;
+        }
+        
+    return action;
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::DoMccAdjustL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::DoMccAdjustL( CMccCodecInformation& aMccCodec,
+                                      CMceSrvStream& aStream )
+    {
+	if( aStream.Data().iStreamType == CMceComMediaStream::ESendStream ||
+        aStream.Data().iStreamType == CMceComMediaStream::ESendOnlyStream )
+		{
+		User::LeaveIfError( aMccCodec.SetFramerate( iFrameRate ) );
+		User::LeaveIfError( aMccCodec.SetAverageBitrate( iBitrate ) );
+		}
+    User::LeaveIfError( aMccCodec.SetFrameWidth( iResolutionWidth ) );
+    User::LeaveIfError( aMccCodec.SetFrameHeight( iResolutionHeight ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceComVideoCodec::DoSetDefaultFmtpAttributeL
+// -----------------------------------------------------------------------------
+//
+void CMceComVideoCodec::DoSetDefaultFmtpAttributeL()
+    {
+    // NOP
+    }
+        
+#endif// MCE_COMMON_SERVER_SIDE
+