diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmceshared/src/mcecomvideocodec.cpp --- /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 +#include "mcesrvstream.h" +#include "mcesrvsource.h" + + +#endif//MCE_COMMON_SERVER_SIDE + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CMceComVideoCodec::NewL +// ----------------------------------------------------------------------------- +// +CMceComVideoCodec* CMceComVideoCodec::NewL( TBuf8 aSdpName ) + { + CMceComVideoCodec* self = NewLC( aSdpName ); + CleanupStack::Pop( self ); + return self; + + } + +// ----------------------------------------------------------------------------- +// CMceComVideoCodec::NewLC +// ----------------------------------------------------------------------------- +// +CMceComVideoCodec* CMceComVideoCodec::NewLC( TBuf8 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 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( 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 ( 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 +