diff -r 000000000000 -r 1bce908db942 multimediacommsengine/tsrc/mccstub/src/MmccCodecRed.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/tsrc/mccstub/src/MmccCodecRed.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,399 @@ +/* +* 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: MCC Redundancy CodecInformation +* +*/ + + + + +// INCLUDE FILES +#include "mmcccodecred.h" +#include "mccuids.hrh" +#include "mmccinterfacelogs.h" +#include "mccinternalcodecs.h" + + +// ============================= LOCAL FUNCTIONS =============================== + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMccCodecRed::CMccCodecRed +// default constructor +// ----------------------------------------------------------------------------- +// +CMccCodecRed::CMccCodecRed() : CMccCodecInformation() + { + + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMccCodecRed::ConstructL() + { + iSdpName.Copy( KRedSdpName ); + + iFmtpAttr = HBufC8::NewL( 1 ); + TPtr8 ptr = iFmtpAttr->Des(); + ptr.Append( KNullDesC ); + + SetSamplingFreq( KRedSamplingFreq ); + EnableVAD( EFalse ); + SetMaxPTime( KRedMaxPTime ); // recommended "limit" 200ms + SetPTime( KRedPTime ); // default 20ms + SetPayloadType( KDefaultRedPT ); + + iFourCC = KMccFourCCIdRed; + iCodecMode = ENothing; + + iPayloadFormatEncoder = KImplUidRedPayloadFormatEncode; + iPayloadFormatDecoder = KImplUidRedPayloadFormatDecode; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::NewLC +// Static constructor. +// ----------------------------------------------------------------------------- +// +CMccCodecRed* CMccCodecRed::NewL() + { + CMccCodecRed* self = new (ELeave) CMccCodecRed; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::~CMccCodecRed +// Destructor +// ----------------------------------------------------------------------------- +// +CMccCodecRed::~CMccCodecRed() + { + iRedPayloads.Reset(); + iRedPayloads.Close(); + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::RequireSignalling +// ----------------------------------------------------------------------------- +// +TBool CMccCodecRed::RequireSignalling( + const CMccCodecInformation& aCandidate ) const + { + return CMccCodecInformation::RequireSignalling( aCandidate ); + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetBitrate +// Sets the bitrate used with Redundacy codec. +// ----------------------------------------------------------------------------- +// +TInt CMccCodecRed::SetBitrate( TUint aBitrate ) + { + iBitrate = aBitrate; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetSamplingFreq +// Sets the sampling frequency. +// ----------------------------------------------------------------------------- +// +TInt CMccCodecRed::SetSamplingFreq( TUint32 aSamplingFreq ) + { + iSamplingFreq = aSamplingFreq; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetSdpName +// Sets the SDP name +// ----------------------------------------------------------------------------- +TInt CMccCodecRed::SetSdpName( const TDesC8& aSdpName ) + { + if ( !aSdpName.CompareF( KRedSdpName ) ) + { + iSdpName.Copy( aSdpName ); + } + else + { + return KErrNotSupported; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::PayloadType +// Sets the payload type +// ----------------------------------------------------------------------------- +TInt CMccCodecRed::SetPayloadType( TUint8 aPayloadType ) + { + if ( aPayloadType < KMinDynamicPT || + aPayloadType > KMaxPayloadType ) + { + return KErrNotSupported; + } + else + { + iPayloadType = aPayloadType; + return KErrNone; + } + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetCodecMode +// Sets the codec mode +// ----------------------------------------------------------------------------- +TInt CMccCodecRed::SetCodecMode( TCodecMode aCodecMode ) + { + if ( ENothing == aCodecMode ) + { + iCodecMode = aCodecMode; + return KErrNone; + } + else + { + return KErrNotSupported; + } + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::EnableVAD +// +// ----------------------------------------------------------------------------- +TInt CMccCodecRed::EnableVAD( TBool aEnableVAD ) + { + iEnableVAD = aEnableVAD; + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetPTime +// +// ----------------------------------------------------------------------------- +// +TInt CMccCodecRed::SetPTime( TUint aPTime ) + { + if ( aPTime && ( KMinPtime <= aPTime ) && ( aPTime <= KMaxPtime ) && + (( aPTime % KMinPtime ) == 0 )) + { + iPTime = aPTime; + return KErrNone; + } + else + { + return KErrNotSupported; + } + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetMaxPTime +// +// ----------------------------------------------------------------------------- +// +TInt CMccCodecRed::SetMaxPTime( TUint aMaxPTime ) + { + if ( aMaxPTime && ( iPTime <= aMaxPTime )&& ( KMinPtime <= aMaxPTime ) && + ( aMaxPTime <= KMaxPtime ) && (( aMaxPTime % KMinPtime ) == 0 ) ) + { + iMaxPTime = aMaxPTime; + return KErrNone; + } + else + { + return KErrNotSupported; + } + } + +// ----------------------------------------------------------------------------- +// CMccCodecInformation::ParseFmtpAttr +// Parses the fmtp attribute +// ----------------------------------------------------------------------------- +// +TBool CMccCodecRed::ParseFmtpAttrL( const TDesC8& aFmtp ) + { + // Parse codecs used for primary and secondary etc. codecs from the + // fmtp attribute + // example fmtp attribute: + // a=fmtp:99 0/103 + // 99 is the redundancy format payload type + // 0 is the primary codecs payload type + // 103 is the secondary codecs payload type + + // NOTE: currently redundancy is allowed only for single payload type + + TBool updated( EFalse ); + + TInt nextIndex = 0; + TInt prevIndex = 0; + TUint8 prevPayloadFormat = KMccPayloadTypeMax; + HBufC8* modifyBuf = HBufC8::NewLC( aFmtp.Length() ); + TPtr8 pFmtpValue( modifyBuf->Des() ); + pFmtpValue = aFmtp; + + if( aFmtp.Length() > 0 ) + { + // Search for all the slashes and convert number strings between them + // to integers + TBool found = ETrue; + while( EFalse != found ) + { + pFmtpValue = modifyBuf->Mid( nextIndex ); + nextIndex = pFmtpValue.Locate( KCharSlash ); + if( ( KErrNotFound == nextIndex ) ) + { + found = EFalse; + if( 0 != pFmtpValue.Length() ) + { + nextIndex = pFmtpValue.Length(); // Handle last payload value + } + } + if( 0 != pFmtpValue.Length() ) + { + TLex8 lex = pFmtpValue.Mid( prevIndex, (nextIndex - prevIndex) ); + TUint8 payloadFormat; + TInt err = lex.Val( payloadFormat, EDecimal ); + if( KErrNone == err ) + { + if ( prevPayloadFormat != KMccPayloadTypeMax && + prevPayloadFormat != payloadFormat ) + { + iRedPayloads.Reset(); + User::Leave( KErrNotSupported ); + } + + iRedPayloads.AppendL( static_cast( payloadFormat ) ); + updated = ETrue; + prevPayloadFormat = payloadFormat; + } + + nextIndex++; + prevIndex = 0; + } + } + } + + CleanupStack::PopAndDestroy( modifyBuf ); + + return updated; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetAllowedBitrates +// ----------------------------------------------------------------------------- +// +TInt CMccCodecRed::SetAllowedBitrates( TUint /*aBitrateMask*/ ) + { + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::SetRedCodecs +// Set the payload types used in redundancy +// ----------------------------------------------------------------------------- +// +void CMccCodecRed::SetRedPayloadsL( RArray& aRedPayloads ) + { + iRedPayloads.Reset(); + TInt i; + for( i = 0; i < aRedPayloads.Count(); i++ ) + { + iRedPayloads.AppendL( aRedPayloads[ i ] ); + } + + // Convert parsed payload formats back to string and set + // the iFmtpAttr variable + const TInt KCharsPerPayload( 4 ); + delete iFmtpAttr; + iFmtpAttr = NULL; + iFmtpAttr = HBufC8::NewL( iRedPayloads.Count() * KCharsPerPayload ); + + TPtr8 descPtr = iFmtpAttr->Des(); + for( i = 0; i < iRedPayloads.Count(); i++ ) + { + descPtr.AppendNum( static_cast( iRedPayloads[i] ), EDecimal ); + descPtr.Append( KCharSlash ); + } + + // Remove the last slash character + descPtr.SetLength( descPtr.Length() - 1 ); + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::RedPayloadsL +// Fills array with red payload type values +// ----------------------------------------------------------------------------- +// +void CMccCodecRed::RedPayloadsL( RArray& aRedPayloads ) const + { + for ( TInt i = 0; i < iRedPayloads.Count(); i++ ) + { + aRedPayloads.AppendL( iRedPayloads[ i ] ); + } + } + +// ----------------------------------------------------------------------------- +// CMccCodecInformation::RedPayloads +// Return the reference to the redundancy codecs array +// ----------------------------------------------------------------------------- +// +const RArray& CMccCodecRed::RedPayloads() const + { + return iRedPayloads; + } + +// ----------------------------------------------------------------------------- +// CMccCodecRed::CloneDefaultsL +// Make a default setting clone from this Redundancy codec +// ----------------------------------------------------------------------------- +// +CMccCodecInformation* CMccCodecRed::CloneDefaultsL() + { + return CMccCodecRed::NewL(); + } + +// ----------------------------------------------------------------------------- +// CMCCAMRCodec::CloneDetailedL +// Make a detailed clone from this Redundancy codec +// ----------------------------------------------------------------------------- +// +CMccCodecInformation* CMccCodecRed::CloneDetailedL() + { + CMccCodecRed* newCodec = CMccCodecRed::NewL(); + CleanupStack::PushL( newCodec ); + newCodec->SetBitrate( this->Bitrate() ); + newCodec->SetCodecMode( this->CodecMode() ); + newCodec->SetMaxPTime( this->MaxPTime() ); + newCodec->SetPayloadType( this->PayloadType() ); + newCodec->SetPTime( this->PTime() ); + newCodec->SetSamplingFreq( this->SamplingFreq() ); + newCodec->SetSdpName( this->SdpName() ); + newCodec->ParseFmtpAttrL( this->GetFmtpL() ); + CleanupStack::Pop( newCodec ); + return newCodec; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + + +// End of File