--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/mccstub/src/mmcccodecavc.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,872 @@
+/*
+* 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:
+*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include "mmcccodecavc.h"
+#include "mccuids.hrh"
+#include "mmccinterfacelogs.h"
+
+#include "CMccController_stub.h"
+#include <delimitedpathsegment8.h>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KMaxFmtpAttrLength( 200 );
+const TInt KAvcDefaultFrameSize( 10000 );
+const TInt KAvcLevel1Bitrate( 64000 );
+const TInt KAvcLevel1bBitrate( 128000 );
+const TInt KAvcLevel11Bitrate( 192000 );
+const TInt KAvcLevel12Bitrate( 384000 );
+const TInt KAvcLevel13Bitrate( 768000 );
+const TInt KAvcLevel2Bitrate( 2000000 );
+const TInt KAvcDefaultFreq( 90000 );
+
+const TInt KAvcProfileLevelIdStrLen = 6;
+const TInt KAvcProfileLevelIdValLen = 2;
+const TUint KAvcProfileIopValueShift = 5;
+const TUint KAvcProfileIopFlagForLevel1b = 0x10;
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::CMccCodecAVC
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMccCodecAVC::CMccCodecAVC() : CMccCodecInformation()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::ConstructL()
+ {
+ iSdpName.Copy( KAVCSdpName );
+
+ iBitrateMask = KMccAvcCodecProfileIdBaseline |
+ KMccAvcCodecProfileIopConstraintSet |
+ KMccAvcBitrateLevel1;
+
+ iType = KUidMediaTypeVideo;
+ iFmtpAttr = HBufC8::NewL( KMaxFmtpAttrLength );
+ iFourCC = KMccFourCCIdAVC;
+ iSamplingFreq = KAvcDefaultFreq;
+
+ iPayloadFormatEncoder = KImplUidAvcPayloadFormatEncode;
+ iPayloadFormatDecoder = 0;
+
+ SetCodecMode( KAvcFormatModeSingleNal );
+ SetPTime( KAvcPTime );
+ SetPayloadType( KAvcPayloadType );
+ SetFramerate( KAvcFramerate );
+ SetLevelBasedBitrate( KAvcLevel1Bitrate );
+ SetMaxBitrate( KAvcLevel1Bitrate );
+ SetFrameHeight( KAvcFrameHeight );
+ SetFrameWidth( KAvcFrameWidth );
+ iFrameSize = KAvcDefaultFrameSize;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMccCodecAVC* CMccCodecAVC::NewL()
+ {
+ CMccCodecAVC* self = new( ELeave ) CMccCodecAVC;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::~CMccCodecAVC
+//
+// -----------------------------------------------------------------------------
+//
+CMccCodecAVC::~CMccCodecAVC()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::RequireSignalling
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::RequireSignalling(
+ const CMccCodecInformation& aCandidate ) const
+ {
+ return CMccCodecInformation::RequireSignalling( aCandidate );
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::GetFmtpL
+// Gets the fmtp attribute
+// -----------------------------------------------------------------------------
+//
+TDesC8& CMccCodecAVC::GetFmtpL()
+ {
+ return CMccCodecInformation::GetFmtpL();
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::CreateFmtpAttrListL
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::CreateFmtpAttrListL()
+ {
+ HBufC8* buf = HBufC8::NewLC( KMaxFmtpAttrLength );
+ TPtr8 bufPtr = buf->Des();
+
+ TBool previousParamAdded( EFalse );
+
+ if ( CreateFmtpProfileLevelId( bufPtr ) )
+ {
+ previousParamAdded = ETrue;
+ }
+
+ TInt semicolonPos( bufPtr.Length() );
+
+ if ( CreateFmtpPacketizationMode( bufPtr ) )
+ {
+ // Previous param was added, so we need a semi-colon and a space
+ if ( previousParamAdded )
+ {
+ bufPtr.Insert( semicolonPos, KSemicolonSpace );
+ }
+ previousParamAdded = ETrue;
+ }
+
+ semicolonPos = bufPtr.Length();
+
+ if ( CreateFmtpSpropParameterSets( bufPtr ) )
+ {
+ // Previous param was added, so we need a semi-colon and a space
+ if ( previousParamAdded )
+ {
+ bufPtr.Insert( semicolonPos, KSemicolonSpace );
+ }
+ previousParamAdded = ETrue;
+ }
+
+ // Update iFmtpAttr
+ SetFmtpAttrL( bufPtr, EFalse );
+
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::ParseFmtpAttrL
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::ParseFmtpAttrL( const TDesC8& aFmtp )
+ {
+ // These booleans needed in FMTP parsing to handle where parameters
+ // not present in FMTP
+
+ iProfileLevelIdParamExists = EFalse;
+ iPacketizationModeParamExists = EFalse;
+
+ //Remove all white space from begining and end,
+ //Convert the content of the descriptor to lower case
+ const TUint8* pointerC = aFmtp.Ptr();
+ TUint8* pointer = const_cast<TUint8*>( pointerC );
+ TPtr8 descriptor( pointer, aFmtp.Length(), aFmtp.Length() );
+ descriptor.Trim();
+
+ /*
+ TDelimitedPathSegmentParser8 Parses path segments whose
+ components are delimited by the ';' character,
+ as defined in RFC2396.
+ */
+ TDelimitedPathSegmentParser8 parser;
+ parser.Parse( aFmtp );
+ TPtrC8 segment;
+ TBool updated( EFalse );
+
+ while ( parser.GetNext( segment ) != KErrNotFound )
+ {
+ if ( ParseFmtpSegmentL( segment ) )
+ {
+ updated = ETrue;
+ }
+ }
+
+ if ( !iProfileLevelIdParamExists )
+ {
+ SetProfileLevelIdL( KMccAvcCodecProfileIdBaselineVal,
+ DefaultProfileIopVal(),
+ KMccAvcCodecProfileLevel1Val );
+ }
+
+ if ( !iPacketizationModeParamExists )
+ {
+ User::LeaveIfError( SetCodecMode( KAvcFormatModeSingleNal ) );
+ }
+
+ return updated;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::ParseFmtpSegmentL
+// Parse and updates the matched param
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::ParseFmtpSegmentL( const TDesC8& aSeg )
+ {
+ TBool update( EFalse );
+ _LIT8( KEqualSign, "=" );
+
+ // Check for first '=' sign
+ TInt index = aSeg.Find( KEqualSign );
+
+ if ( index > 0 )
+ {
+ // Check if match mode-set
+ if ( aSeg.Left( index ).Match( KMatchProfileLevelId ) != KErrNotFound )
+ {
+ update = ParseFmtpProfileLevelIdL(
+ aSeg.Right( aSeg.Length() - ( index + 1 ) ) );
+ iProfileLevelIdParamExists = ETrue;
+ }
+ else if ( aSeg.Left( index ).Match( KMatchSpropParameterSets ) != KErrNotFound )
+ {
+ update = ParseFmtpSpropParameterSetsL(
+ aSeg.Right( aSeg.Length() - ( index + 1 ) ) );
+ }
+ else if ( aSeg.Left( index ).Match( KMatchPacketizationMode ) != KErrNotFound )
+ {
+ update = ParseFmtpPacketizationModeL(
+ aSeg.Right( aSeg.Length() - ( index + 1 ) ) );
+ iPacketizationModeParamExists = ETrue;
+ }
+ else
+ {
+ }
+ }
+
+ return update;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::ParseFmtpProfileLevelIdL
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::ParseFmtpProfileLevelIdL( const TDesC8& aProfileLevelId )
+ {
+ // A base16 [6] (hexadecimal) representation of
+ // the following three bytes in the sequence
+ // parameter set NAL unit specified in [1]: 1)
+ // profile_idc, 2) a byte herein referred to as
+ // profile-iop, composed of the values of
+ // constraint_set0_flag, constraint_set1_flag,
+ // constraint_set2_flag, and reserved_zero_5bits
+ // in bit-significance order, starting from the
+ // most significant bit, and 3) level_idc. Note
+ // that reserved_zero_5bits is required to be
+ // equal to 0 in [1], but other values for it may
+ // be specified in the future by ITU-T or ISO/IEC.
+
+ __ASSERT_ALWAYS( aProfileLevelId.Length() == KAvcProfileLevelIdStrLen,
+ User::Leave( KErrArgument ) );
+
+ TInt startPos( 0 );
+ TLex8 profileIdLex( aProfileLevelId.Mid( startPos, KAvcProfileLevelIdValLen ) );
+ startPos += KAvcProfileLevelIdValLen;
+ TUint profileId( 0 );
+ User::LeaveIfError( profileIdLex.Val( profileId, EHex ) );
+
+
+ TLex8 profileIopLex( aProfileLevelId.Mid( startPos, KAvcProfileLevelIdValLen ) );
+ startPos += KAvcProfileLevelIdValLen;
+ TUint profileIop( 0 );
+ User::LeaveIfError( profileIopLex.Val( profileIop, EHex ) );
+
+
+ TLex8 profileLevelLex( aProfileLevelId.Mid( startPos, KAvcProfileLevelIdValLen ) );
+ TUint profileLevel( 0 );
+ User::LeaveIfError( profileLevelLex.Val( profileLevel, EHex ) );
+
+ SetProfileLevelIdL( profileId, profileIop, profileLevel );
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::ParseFmtpSpropParameterSetsL
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::ParseFmtpSpropParameterSetsL( const TDesC8& aSpropParameterSets )
+ {
+ const TInt KMccMaxSpropParameterSetLen = 100;
+ __ASSERT_ALWAYS( aSpropParameterSets.Length() > 0 &&
+ aSpropParameterSets.Length() <= KMccMaxSpropParameterSetLen,
+ User::Leave( KErrArgument ) );
+
+ HBufC8* sprop = aSpropParameterSets.AllocL();
+ delete iConfigKey;
+ iConfigKey = sprop;
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::ParseFmtpPacketizationModeL
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::ParseFmtpPacketizationModeL( const TDesC8& aPacketizationMode )
+ {
+ // Convert descriptor to integer
+ TLex8 myLex( aPacketizationMode );
+ TInt packetizationMode;
+ User::LeaveIfError( myLex.Val( packetizationMode ) );
+
+ User::LeaveIfError( SetCodecMode( packetizationMode ) );
+
+ return ETrue;
+ }
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetBitrate
+// Sets the bitrate used with AMR codec.
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetBitrate( TUint aBitrate )
+ {
+ if ( aBitrate > 0 && aBitrate <= KAvcLevel2Bitrate )
+ {
+ iBitrate = aBitrate;
+ iBitrateSet = ETrue;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetSamplingFreq
+// Sets the sampling frequency.
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetSamplingFreq( TUint32 /*aSamplingFreq*/ )
+ {
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetSdpName
+// Sets the SDP name
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetSdpName( const TDesC8& aSdpName )
+ {
+ if ( 0 == aSdpName.CompareF( KAVCSdpName ) )
+ {
+ iSdpName.Copy( aSdpName );
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::PayloadType
+// Sets the payload type
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetPayloadType( TUint8 aPayloadType )
+ {
+ if ( aPayloadType < KMinDynamicPT ||
+ aPayloadType > KMaxPayloadType )
+ {
+ return KErrNotSupported;
+ }
+ else
+ {
+ iPayloadType = aPayloadType;
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetCodecMode
+// Sets the codec mode
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetCodecMode( TCodecMode aCodecMode )
+ {
+ if ( KAvcFormatModeSingleNal == aCodecMode ||
+ KAvcFormatModeNonInterleaved == aCodecMode )
+ {
+ iCodecMode = aCodecMode;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetFmtpAttrL
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::SetFmtpAttrL( const TDesC8& /*aFmtp*/, TBool /*parseFmtp*/ )
+ {
+ if ( CMccControllerStub::Stub() && CMccControllerStub::Stub()->iSetFmtpFailure )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ }
+
+
+TInt CMccCodecAVC::SetAllowedBitrates( TUint aBitrateMask )
+ {
+ //Confirm that the bitrate mask is valid
+ //I.e. after all the valid bitrates are set to zero the value should be zero
+ if ( (aBitrateMask >> 16 ) > 0 )
+ {
+ return KErrArgument;
+ }
+ else
+ {
+ SetBitrateMask( KMccAllowedAvcBitrateAll & aBitrateMask );
+ SetBitrateMaskAdditionalInfo( aBitrateMask );
+
+ SetBitrateFromBitrateMask( iBitrateMask );
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::EnableVAD
+// Enable / Disable VAD
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::EnableVAD( TBool /*aEnableVAD*/ )
+ {
+ return KErrNotSupported;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetPTime
+// Set PTime
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetPTime( TUint aPTime )
+ {
+ if ( ( aPTime <= 200 ) && (( aPTime % 10 ) == 0 ))
+ {
+ iPTime = aPTime;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetMaxPTime
+// Set Max PTime
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetMaxPTime( TUint aMaxPTime )
+ {
+ if ( ( aMaxPTime <= 200 ) && (( aMaxPTime % 10 ) == 0 ))
+ {
+ iMaxPTime = aMaxPTime;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotSupported;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetConfigKeyL
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::SetConfigKeyL( const TDesC8& aConfigKey )
+ {
+ __ASSERT_ALWAYS( aConfigKey.Length() > 0, User::Leave( KErrArgument ) );
+
+ HBufC8* key = aConfigKey.AllocL();
+ delete iConfigKey;
+ iConfigKey = key;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetPreferredEncodingDecodingDevice
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::SetPreferredEncodingDecodingDevice(
+ TUid aEncodingDecodingDevice )
+ {
+ __INTERFACE( "CMccCodecAVC::SetPreferredEncodingDecodingDevice" )
+ __INTERFACE_INT1("CMccCodecAVC::SetPreferredEncodingDecodingDevice aEncodingDecodingDevice:",aEncodingDecodingDevice.iUid)
+ iEncodingDecodingDevice = aEncodingDecodingDevice;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::CloneDefaultsL
+// Make a default setting clone from this codec
+// -----------------------------------------------------------------------------
+//
+CMccCodecInformation* CMccCodecAVC::CloneDefaultsL()
+ {
+ return CMccCodecAVC::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::CloneDetailedL
+// Make a detailed clone from this codec
+// -----------------------------------------------------------------------------
+//
+CMccCodecInformation* CMccCodecAVC::CloneDetailedL()
+ {
+ CMccCodecAVC* newCodec = CMccCodecAVC::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;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC:SetBitrateMask
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::SetBitrateMask( TUint aBitrateMask, TBool aKeepAdditionalInfo )
+ {
+ __INTERFACE_INT1( "CMccCodecAVC::SetBitrateMask, entry mask ", aBitrateMask )
+ TUint oldBitrateMask = iBitrateMask;
+ iBitrateMask = aBitrateMask;
+
+ if ( aKeepAdditionalInfo )
+ {
+ iBitrateMask |= ( oldBitrateMask & KMccAllowedAvcAdditionalInfo );
+ }
+ else
+ {
+ SetBitrateMaskAdditionalInfo( aBitrateMask );
+ }
+
+ __INTERFACE_INT1( "CMccCodecAVC::SetBitrateMask, exit mask ", iBitrateMask )
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC:SetBitrateMaskAdditionalInfo
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::SetBitrateMaskAdditionalInfo( TUint aAdditionalInfo )
+ {
+ iBitrateMask |= ( aAdditionalInfo & KMccAllowedAvcAdditionalInfo );
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC:SetProfileLevelIdL
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::SetProfileLevelIdL(
+ TUint aProfileId, TUint aProfileIop, TUint aProfileLevel )
+ {
+ TUint allowedBitrates( 0 );
+ __ASSERT_ALWAYS( aProfileId == KMccAvcCodecProfileIdBaselineVal,
+ User::Leave( KErrNotSupported ) );
+ allowedBitrates |= KMccAvcCodecProfileIdBaseline;
+
+ const TUint KProfileIopValueReservedBitsMask = 0xF;
+ if ( aProfileIop & KProfileIopValueReservedBitsMask )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ TUint profileIop = aProfileIop >> KAvcProfileIopValueShift;
+
+ __ASSERT_ALWAYS( profileIop == KMccAvcCodecProfileIopConstraintSetVal,
+ User::Leave( KErrNotSupported ) );
+ allowedBitrates |= KMccAvcCodecProfileIopConstraintSet;
+
+ if ( aProfileLevel == KMccAvcCodecProfileLevel1Val )
+ {
+ allowedBitrates |= KMccAvcBitrateLevel1;
+ }
+ else if ( aProfileLevel == KMccAvcCodecProfileLevel1_1Val )
+ {
+ // Level 1b is differentiated from level 1.1 by iop constraint flag 3
+ if( aProfileIop & KAvcProfileIopFlagForLevel1b )
+ {
+ allowedBitrates |= KMccAvcBitrateLevel1b;
+ }
+ else
+ {
+ allowedBitrates |= KMccAvcBitrateLevel1_1;
+ }
+ }
+ else if ( aProfileLevel == KMccAvcCodecProfileLevel1_2Val )
+ {
+ allowedBitrates |= KMccAvcBitrateLevel1_2;
+ }
+ else if ( aProfileLevel == KMccAvcCodecProfileLevel1_3Val )
+ {
+ allowedBitrates |= KMccAvcBitrateLevel1_3;
+ }
+ else if ( aProfileLevel == KMccAvcCodecProfileLevel2Val )
+ {
+ allowedBitrates |= KMccAvcBitrateLevel2;
+ }
+ else
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ User::LeaveIfError( SetAllowedBitrates( allowedBitrates ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC:ProfileLevelIdVals
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::ProfileLevelIdVals(
+ TUint& aProfileId, TUint& aProfileIop, TUint& aProfileLevel )
+ {
+ TInt retVal( KErrNone );
+ if ( iBitrateMask & KMccAvcCodecProfileIdBaseline )
+ {
+ aProfileId = KMccAvcCodecProfileIdBaselineVal;
+ }
+ else
+ {
+ retVal = KErrNotSupported;
+ }
+
+ if ( iBitrateMask & KMccAvcCodecProfileIopConstraintSet )
+ {
+ aProfileIop = KMccAvcCodecProfileIopConstraintSetVal << KAvcProfileIopValueShift;
+ }
+ else
+ {
+ retVal = KErrNotSupported;
+ }
+
+ if ( iBitrateMask & KMccAvcBitrateLevel1 )
+ {
+ aProfileLevel = KMccAvcCodecProfileLevel1Val;
+ }
+ else if ( iBitrateMask & KMccAvcBitrateLevel1b )
+ {
+ // Level 1b information is divided to level and iop fields
+ //
+
+ // Level 1.1
+ aProfileLevel = KMccAvcCodecProfileLevel1_1Val;
+
+ // And iop constraint_flag 3
+ aProfileIop |= KAvcProfileIopFlagForLevel1b;
+ }
+ else if ( iBitrateMask & KMccAvcBitrateLevel1_1 )
+ {
+ aProfileLevel = KMccAvcCodecProfileLevel1_1Val;
+ }
+ else if ( iBitrateMask & KMccAvcBitrateLevel1_2 )
+ {
+ aProfileLevel = KMccAvcCodecProfileLevel1_2Val;
+ }
+ else if ( iBitrateMask & KMccAvcBitrateLevel1_3 )
+ {
+ aProfileLevel = KMccAvcCodecProfileLevel1_3Val;
+ }
+ else if ( iBitrateMask & KMccAvcBitrateLevel2 )
+ {
+ aProfileLevel = KMccAvcCodecProfileLevel2Val;
+ }
+ else
+ {
+ retVal = KErrNotSupported;
+ }
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetBitrateFromBitrateMask
+// -----------------------------------------------------------------------------
+//
+TInt CMccCodecAVC::SetBitrateFromBitrateMask( TUint aBitrateMask )
+ {
+ TInt ret( KErrNone );
+ if ( aBitrateMask & KMccAvcBitrateLevel1 )
+ {
+ SetMaxBitrate( KAvcLevel1Bitrate );
+ SetLevelBasedBitrate( KAvcLevel1Bitrate );
+ }
+ else if ( aBitrateMask & KMccAvcBitrateLevel1b )
+ {
+ SetMaxBitrate( KAvcLevel1bBitrate );
+ SetLevelBasedBitrate( KAvcLevel1bBitrate );
+ }
+ else if ( aBitrateMask & KMccAvcBitrateLevel1_1 )
+ {
+ SetMaxBitrate( KAvcLevel11Bitrate );
+ SetLevelBasedBitrate( KAvcLevel11Bitrate );
+ }
+ else if ( aBitrateMask & KMccAvcBitrateLevel1_2 )
+ {
+ SetMaxBitrate( KAvcLevel12Bitrate );
+ // Don't use max bitrate as it is way too high
+ SetLevelBasedBitrate( KAvcLevel11Bitrate );
+ }
+ else if ( aBitrateMask & KMccAvcBitrateLevel1_3 )
+ {
+ SetMaxBitrate( KAvcLevel13Bitrate );
+ // Don't use max bitrate as it is way too high
+ SetLevelBasedBitrate( KAvcLevel11Bitrate );
+ }
+ else if ( aBitrateMask & KMccAvcBitrateLevel2 )
+ {
+ SetMaxBitrate( KAvcLevel2Bitrate );
+ // Don't use max bitrate as it is way too high
+ SetLevelBasedBitrate( KAvcLevel11Bitrate );
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::CreateFmtpProfileLevelId
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::CreateFmtpProfileLevelId( TDes8& aBuf )
+ {
+ TBool profileLevelIdAdded( EFalse );
+ TUint profileId( 0 );
+ TUint profileIop( 0 );
+ TUint profileLevel( 0 );
+ if ( ProfileLevelIdVals( profileId, profileIop, profileLevel ) == KErrNone )
+ {
+ aBuf.Append( KTxtProfileLevelId );
+ aBuf.AppendNumFixedWidthUC( profileId, EHex, KAvcProfileLevelIdValLen );
+ aBuf.AppendNumFixedWidthUC( profileIop, EHex, KAvcProfileLevelIdValLen );
+ aBuf.AppendNumFixedWidthUC( profileLevel, EHex, KAvcProfileLevelIdValLen );
+ profileLevelIdAdded = ETrue;
+ }
+ return profileLevelIdAdded;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::CreateFmtpPacketizationMode
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::CreateFmtpPacketizationMode( TDes8& aBuf )
+ {
+ TBool packetizationModeAdded( EFalse );
+ if ( iCodecMode != KAvcFormatModeSingleNal )
+ {
+ aBuf.Append( KTxtPacketizationMode );
+ aBuf.AppendNum( iCodecMode );
+ packetizationModeAdded = ETrue;
+ }
+
+ return packetizationModeAdded;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::CreateFmtpSpropParameterSets
+// -----------------------------------------------------------------------------
+//
+TBool CMccCodecAVC::CreateFmtpSpropParameterSets( TDes8& aBuf )
+ {
+ TBool spropParameterSetsAdded( EFalse );
+ if ( iConfigKey )
+ {
+ aBuf.Append( KTxtSpropParameterSets );
+ aBuf.Append( *iConfigKey );
+ spropParameterSetsAdded = ETrue;
+ }
+
+ return spropParameterSetsAdded;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::DefaultProfileIopVal
+// -----------------------------------------------------------------------------
+//
+TUint CMccCodecAVC::DefaultProfileIopVal()
+ {
+ TUint profileIop =
+ KMccAvcCodecProfileIopConstraintSetVal << KAvcProfileIopValueShift;
+ return profileIop;
+ }
+
+// -----------------------------------------------------------------------------
+// CMccCodecAVC::SetLevelBasedBitrate
+// -----------------------------------------------------------------------------
+//
+void CMccCodecAVC::SetLevelBasedBitrate( TUint aBitrate )
+ {
+ // Set level based bitrate only if bitrate value has not been set
+ if ( !iBitrateSet )
+ {
+ iBitrate = aBitrate;
+ }
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// End of File