diff -r 000000000000 -r b8ed18f6c07b devsound/a3fdevsound/src/a3ffourcclookup/a3ffourcclookup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devsound/a3fdevsound/src/a3ffourcclookup/a3ffourcclookup.cpp Thu Oct 07 22:34:12 2010 +0100 @@ -0,0 +1,234 @@ +//a3ffourcclookup.cpp + +// Copyright (c) 2007-2009 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 +#include "a3ffourcclookup.hrh" +#include +#include + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +_LIT8(KHexPrefix, "0x"); +_LIT8(KHexPrefix2, "0X"); +_LIT8(uTag,""); +_LIT8(mTag,""); +_LIT8(fTag,""); + +const TInt KUidLength = 10; +const TInt KTagLength = 3; +const TInt KFourCCLength = 4; + +// --------------------------------------------------------------------------- +// Function to compute Hash value +// --------------------------------------------------------------------------- +TUint32 TIntegerHash(const TUint32& aInt) + { + return DefaultHash::Integer(aInt); + } + +// --------------------------------------------------------------------------- +// Function to Check similar identities from Hash Table +// --------------------------------------------------------------------------- +TBool TIntegerIdent(const TUint32& /*aL*/, const TUint32& /*aR*/) + { + return ETrue; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +CFourCCConvertor::~CFourCCConvertor() + { + if(iHashFourCCToFormat) + { + iHashFourCCToFormat->Close(); + delete iHashFourCCToFormat; + iHashFourCCToFormat = NULL; + } + if(iHashFormatToFourCC) + { + iHashFormatToFourCC->Close(); + delete iHashFormatToFourCC; + iHashFormatToFourCC = NULL; + } + } + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +CFourCCConvertor::CFourCCConvertor() + { + TRACE_CREATE(); + DP_CONTEXT(CFourCCConvertor::CFourCCConvertor *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// CFourCCConvertor::NewL +// --------------------------------------------------------------------------- +EXPORT_C CFourCCConvertor* CFourCCConvertor::NewL() + { + DP_STATIC_CONTEXT(CFourCCConvertor::NewL *CD0*, CtxDevSound, DPLOCAL); + DP_IN(); + CFourCCConvertor* self = new(ELeave) CFourCCConvertor(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + DP0_RET(self, "0x%x"); + } + +// --------------------------------------------------------------------------- +// Second Phase Constructor +// --------------------------------------------------------------------------- +void CFourCCConvertor::ConstructL() + { + DP_CONTEXT(CCFourCCConvertor::ConstructL *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + iHashFourCCToFormat = new(ELeave) RHashMap(&TIntegerHash,&TIntegerIdent); + iHashFormatToFourCC = new(ELeave) RHashMap(&TIntegerHash,&TIntegerIdent); + LoadL(); + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// CFourCCConvertor::LoadL +// --------------------------------------------------------------------------- +void CFourCCConvertor::LoadL() + { + DP_CONTEXT(CCFourCCConvertor::LoadL *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TUid KFourCCInterfaceDefinitionUid = {KUidA3fFourCCConvertorPlugin}; + + RImplInfoPtrArray ecomArray; + REComSession::ListImplementationsL(KFourCCInterfaceDefinitionUid, ecomArray); + CleanupResetAndDestroyPushL(ecomArray); + + ASSERT(iHashFourCCToFormat); + ASSERT(iHashFormatToFourCC); + + TInt index; + index = ecomArray.Count(); + + if(index == 0) + { + User::Leave(KErrNotFound); + } + TInt tagPosition=0; + TUint32 formatIdValue = 0; + + // Construct the hash map + for (TInt i=0; iOpaqueData()); + TInt length = opaquedata.Length(); + + // Extracting format uid + tagPosition = opaquedata.Find(uTag); + + if( (tagPosition >= 0) && ( (length-tagPosition) >= (KUidLength + KTagLength) ) ) + { + // Format Uid + if(((((opaquedata).Mid(tagPosition + KTagLength, KUidLength) ).Length()) == KUidLength) && + ((((opaquedata).Mid(tagPosition + KTagLength, KUidLength)).Find(KHexPrefix)) ==0) || + ((((opaquedata).Mid(tagPosition + KTagLength, KUidLength)).Find(KHexPrefix2)) ==0)) + { + TLex8 lexFormatUid(((opaquedata).Mid(tagPosition + KTagLength, KUidLength)).Right(8)); + User::LeaveIfError(lexFormatUid.Val(formatIdValue,EHex)); + } + // Check if this is master FourCC + TInt tagMasterFourCC=0; + tagMasterFourCC= (opaquedata).Find(mTag); + + // Extract fourCC + tagPosition = (opaquedata).Find(fTag); + if((tagPosition >=0) && (length-tagPosition>=(KFourCCLength + KTagLength))) + { + TFourCC tempFourCC((opaquedata).Mid(tagPosition + KTagLength, KFourCCLength)); + if(tempFourCC.FourCC() != 0) + { + iHashFourCCToFormat->InsertL(tempFourCC.FourCC(),formatIdValue); + } + // Only fourCC master should be inserted + if(tagMasterFourCC >= 0) + { + iHashFormatToFourCC->InsertL(formatIdValue, tempFourCC.FourCC()); + } + } + else + { + DP0(DLINFO,"CCFourCCConvertor:: tag not found or tag should have four characters entry in resource file "); + } + } + else + { + DP0(DLINFO,"CCFourCCConvertor:: tag not found or tag should have ten characters e.g. 0X12122121 entry in resource file"); + } + } + + CleanupStack::PopAndDestroy(&ecomArray); + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// CFourCCConvertor::FormatToFourCC +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CFourCCConvertor::FormatToFourCC(TUid aFormat,TFourCC &aFourCC) + { + DP_CONTEXT(CCFourCCConvertor::FormatToFourCC *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + + ASSERT(iHashFormatToFourCC); + + TInt err = KErrNone; + TUint32 *mime = iHashFormatToFourCC->Find(aFormat.iUid); + if(mime == NULL) + { + err = KErrNotFound; + } + else + { + aFourCC.Set(*mime); + } + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// CFourCCConvertor::FourCCToFormat +// --------------------------------------------------------------------------- +EXPORT_C TInt CFourCCConvertor::FourCCToFormat(TFourCC aFourCC, TUid &aFormat) const + { + DP_CONTEXT(CCFourCCConvertor::FourCCToFormat *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + + ASSERT(iHashFourCCToFormat); + + TInt err = KErrNone; + TUint32 *mime= iHashFourCCToFormat->Find(aFourCC.FourCC()); + if(mime == NULL) + { + err = KErrNotFound; + } + else + { + aFormat.iUid = *mime; + } + DP0_RET(err, "%d"); + }