diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/common/src/camconfiguration.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/common/src/camconfiguration.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,1198 @@ +/* +* Copyright (c) 2007 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: Implementation of Dynamic Configuration +* +*/ + + +#include // RDebug +#include "camconfiguration.h" +#include "camconfigurationutility.h" +#include "imagingconfigmanager.h" +#include "CamUtility.h" +#include "camconfigurationconstants.h" + +const TInt KReserveedSpace = 160000; + +// --------------------------------------------------------------------------- +// CCamConfiguration::CCamConfiguration +// --------------------------------------------------------------------------- +// +CCamConfiguration::CCamConfiguration(): + iPrimaryCameraDisplayId( KCamPrimaryCameraDisplayId ), + iSecondaryCameraDisplayId( KCamSecondaryCameraDisplayId ) + { + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::~CCamConfiguration +// --------------------------------------------------------------------------- +// +CCamConfiguration::~CCamConfiguration() + { + // Quality data arrays + iPrimaryCameraPhotoQualities.Close(); + iSecondaryCameraPhotoQualities.Close(); + iVideoQualities.Close(); + + delete iIcm; + + // String data + for( TInt i=iStrings8.Count()-1; i>=0; i-- ) + { + HBufC8* str = iStrings8[i]; + iStrings8.Remove( i ); + delete str; + } + iStrings8.Close(); + for( TInt i=iStrings16.Count()-1; i>=0; i-- ) + { + HBufC16* str = iStrings16[i]; + iStrings16.Remove( i ); + delete str; + } + iStrings16.Close(); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::NewL +// --------------------------------------------------------------------------- +// +CCamConfiguration* +CCamConfiguration::NewL() + { + CCamConfiguration* self = new (ELeave) CCamConfiguration; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::ConstructL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::ConstructL() + { + PRINT( _L("Camera => CCamConfiguration::ConstructL") ); + + PRINT( _L("Camera <> CCamConfiguration::ConstructL - Instantiate ICM") ); + iIcm = CImagingConfigManager::NewL(); + + PRINT( _L("Camera <> CCamConfiguration::ConstructL - Init image qualities") ); + InitializeImageQualitiesL(); + + PRINT( _L("Camera <> CCamConfiguration::ConstructL - Init video qualities") ); + InitializeVideoQualitiesL(); + + PRINT( _L("Camera <= CCamConfiguration::ConstructL") ); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::InitializeImageQualitiesL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::InitializeImageQualitiesL() + { + PRINT( _L("Camera => CCamConfiguration::InitializeImageQualitiesL") ); + TInt totalLevels = iIcm->NumberOfImageQualityLevels(); + + CArrayFixFlat* levels + = new (ELeave) CArrayFixFlat( totalLevels ); + CleanupStack::PushL( levels ); + TImageQualitySet set; + TCamImageQualityData data; + + // Get primary camera levels + if( iPrimaryCameraDisplayId ) + { + PRINT( _L("Camera <> CCamConfiguration::InitializeImageQualitiesL *** Primary camera qualities ***") ); + iIcm->GetImageQualityLevelsL( *levels, iPrimaryCameraDisplayId ); + TInt numLevels( levels->Count() ); + PRINT1(_L("Camera <> CCamConfiguration::InitializeImageQualitiesL - Total number of levels: %d"), numLevels ); + + for( int i=0; iGetImageQualitySet( set, levels->At( i ), iPrimaryCameraDisplayId ); + if( set.iCamcorderVisible > 0 ) + { + PRINT1( _L("Camera <> CCamConfiguration::InitializeImageQualitiesL - Set %d CamcorderVisible"), i ); + + InitializeImageQualityL( set, data ); + AddToOrderedImageQualitiesArrayL( data, iPrimaryCameraPhotoQualities ); + } + } + } + + // Adjust print qualities - print => print high/print/print low + CamConfigurationUtility::AdjustPrintQualities( iPrimaryCameraPhotoQualities ); + TInt numQualities = iPrimaryCameraPhotoQualities.Count(); + + // Get secondary camera levels + if( iSecondaryCameraDisplayId ) + { + PRINT( _L("Camera <> CCamConfiguration::InitializeImageQualitiesL() *** Secondary camera qualities ***") ); + iIcm->GetImageQualityLevelsL( *levels, iSecondaryCameraDisplayId ); + TInt numLevels( levels->Count() ); + PRINT1( _L("Camera <> CCamConfiguration::InitializeImageQualitiesL - Total number of levels: %d"), numLevels ); + + for( int i=0; iGetImageQualitySet( set, levels->At( i ), iSecondaryCameraDisplayId ); + if( set.iCamcorderVisible > 0 ) + { + PRINT1( _L("Camera <> CCamConfiguration::InitializeImageQualitiesL - Set %d CamcorderVisible"), i ); + + InitializeImageQualityL( set, data ); + + // Force image quality to secondary + // data.iPhotoQualitySetting.iPhotoQualityId = EImageQualitySecondary; + data.iPhotoQualitySetting.iPhotoQualityId + = static_cast( numQualities++ ); + data.iPhotoSize.iQualitySettingId = ECamImageQualitySecondary; + + AddToOrderedImageQualitiesArrayL( data, iSecondaryCameraPhotoQualities ); + } + } + } + + CleanupStack::PopAndDestroy( levels ); + + PRINT( _L("Camera <= CCamConfiguration::InitializeImageQualitiesL") ); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::InitializeVideoQualitiesL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::InitializeVideoQualitiesL() + { + PRINT(_L("Camera => CCamConfiguration::InitializeVideoQualitiesL") ); + TInt totalLevels = iIcm->NumberOfVideoQualityLevels(); + CArrayFixFlat* levels + = new (ELeave) CArrayFixFlat( totalLevels ); + CleanupStack::PushL( levels ); + TVideoQualitySet set; + + // Get primary camera levels + if( iPrimaryCameraDisplayId ) + { + iIcm->GetVideoQualityLevelsL( *levels, iPrimaryCameraDisplayId ); + TInt numLevels( levels->Count() ); + PRINT1(_L("Camera <> CCamConfiguration::InitializeVideoQualitiesL - Total number of levels: %d"), numLevels ); + + for( int i=0; iGetVideoQualitySet( set, levels->At( i ), iPrimaryCameraDisplayId ); + if( set.iCamcorderVisible > 0 ) + { + PRINT1(_L("Camera <> CCamConfiguration::InitializeVideoQualitiesL - Set %d CamcorderVisible"), i ); + + TCamVideoQualityData data( CreateVideoQualityDataL( set ) ); + AddToOrderedVideoQualitiesArrayL( data, iVideoQualities ); + } + } + + // Set the video quality values now that we have all data in sorted array + CamConfigurationUtility::SetVideoQualityLevels( iVideoQualities ); + } + + // Secondary camera video qualities from ICM are ignored. + // The last primary camera quality is used in seconcary camera as well. + + CleanupStack::PopAndDestroy( levels ); + + // Get the average video bitrate scaler + TCamcorderMMFPluginSettings mmfPluginSettings; + User::LeaveIfError( iIcm->GetCamcorderMMFPluginSettings( mmfPluginSettings ) ); + iCMRAvgVideoBitRateScaler = mmfPluginSettings.iCMRAvgVideoBitRateScaler; + + PRINT( _L("Camera <= CCamConfiguration::InitializeVideoQualitiesL") ); + } + + +// --------------------------------------------------------------------------- +// CCamConfiguration::InitializeVideoQualitiesL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::AddToOrderedImageQualitiesArrayL( TCamImageQualityData& aQuality, + RArray& aArray ) + { + TBool added = EFalse; + TInt numQualities = aArray.Count(); + TInt numPixels = aQuality.iPhotoSize.iWidth*aQuality.iPhotoSize.iHeight; + + for( TInt i=0; i& aArray ) + { + TBool added( EFalse ); + const TInt numQualities( aArray.Count() ); + const TInt currValue( aQuality.iDescription ); + + for( TInt i=0; i currValue ) + { + // aQuality should be before quality aArray[i] + aArray.InsertL( aQuality, i ); + added = ETrue; + break; + } + } + + if( !added ) + { + // Item is to be last in the array + aArray.AppendL( aQuality ); + } + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::InitializeImageQualityL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::InitializeImageQualityL( const TImageQualitySet& aSet, TCamImageQualityData& aData ) + { + PRINT3( _L("Camera => CCamConfiguration::InitializeImageQualityL - res: (%d, %d), compression: %d" ), + aSet.iImageWidth, aSet.iImageHeight, aSet.iCompressionQuality ); + // Find out the image quality/resolution id for the set + TInt index = KErrNotFound; + for( int i=0; i not supported + User::Leave( KErrNotSupported ); + } + + aData.iPhotoQualitySetting.iPhotoQualityId = KCamImageQualityMappings[index][type].iQuality; + aData.iQualityIcons = KCamImageIcons[ aData.iDescription ]; + + PRINT( _L("Camera <= CCamConfiguration::InitializeImageQualityL") ); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::GetPsiIntArrayL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::GetPsiIntArrayL( TCamPsiKey aKey, RArray& aArray ) const + { + PRINT1( _L("Camera => CCamConfiguration::GetPsiIntArrayL Key: %d"), aKey ); + switch( aKey ) + { + case ECamPsiSupportedStillResolutions: + { + // Despite the name, returns array of TCamPhotoSizeId + // The array contents must be ordered in TCamPhotoSizeId enum order + for( TInt i=0; i CCamConfiguration::GetPsiIntArrayL - Unknown key!") ); + User::Panic( KCamConfigPanicId, ECamConfigPanicUnknownKey ); + } + + } + PRINT( _L("Camera <= CCamConfiguration::GetPsiIntArrayL") ); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::AppendIfSupportedL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::AppendIfSupportedL( TCamItemType aCheckType, TInt aValue, + RArray&aArray, TCamItemType aAppendType ) const + { + TInt n( iPrimaryCameraPhotoQualities.Count() ); + for( TInt i=0; i&aArray, const TCamImageQualityData& aData ) + { + switch( aType ) + { + case ECamItemSettingsIconId: + { + aArray.AppendL( aData.iQualityIcons.iSettingsIconId ); + aArray.AppendL( aData.iQualityIcons.iSettingsIconMask ); + break; + } + case ECamItemPrecapIconId: + { + aArray.AppendL( aData.iQualityIcons.iPrecapIconId ); + aArray.AppendL( aData.iQualityIcons.iPrecapIconMask ); + break; + } + case ECamItemPhotoJpegSize: + { + aArray.AppendL( aData.iFileSize ); + break; + } + case ECamItemSeqPostProcSize: + { + aArray.AppendL( aData.iFileSize ); + break; + } + default: + { + User::Panic( KCamConfigPanicId, ECamConfigPanicUnknownType ); + } + } + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::NumImageQualities +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::NumImageQualities() const + { + TInt count( iPrimaryCameraPhotoQualities.Count() ); + if( iSecondaryCameraPhotoQualities.Count() > 0 ) + { + // Only one quality currently supported for secondary cam + count++; + // count += iSecondaryCameraPhotoQualities.Count(); + } + + return count; + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::SecondaryCameraImageQuality +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::MmsImageQuality() const + { + // As the primary camera image qualities are sorted, MMS quality is the + // last one in the qualities array. + TInt index = iPrimaryCameraPhotoQualities.Count()-1; + + return index < 0 ? + KErrNotFound : + iPrimaryCameraPhotoQualities[index].iPhotoQualitySetting.iPhotoQualityId; + } + + +// --------------------------------------------------------------------------- +// CCamConfiguration::SecondaryCameraImageQuality +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::SecondaryCameraImageQuality() const + { + if( iSecondaryCameraPhotoQualities.Count() > 0 ) + { + return iSecondaryCameraPhotoQualities[0].iPhotoQualitySetting.iPhotoQualityId; + } + + return KErrNotFound; + } + + +// --------------------------------------------------------------------------- +// CCamConfiguration::ImageQuality +// --------------------------------------------------------------------------- +// +const TCamPhotoQualitySetting& +CCamConfiguration::ImageQuality( TInt aIndex ) const + { + const TInt count( iPrimaryCameraPhotoQualities.Count() ); + if( aIndex >= 0 && aIndex < count ) + { + return iPrimaryCameraPhotoQualities[aIndex].iPhotoQualitySetting; + } + else + { + TInt secIndex = aIndex - count; + if( secIndex >= 0 && + secIndex < iSecondaryCameraPhotoQualities.Count() ) + { + return iSecondaryCameraPhotoQualities[secIndex].iPhotoQualitySetting; + } + + User::Panic( KCamConfigPanicId, ECamConfigPanicNoQuality ); + return iPrimaryCameraPhotoQualities[0].iPhotoQualitySetting; // Get rid of warning + } + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::ImageQualityData +// --------------------------------------------------------------------------- +// +const TCamImageQualityData& +CCamConfiguration::ImageQualityData( TInt aIndex ) const + { + const TInt count( iPrimaryCameraPhotoQualities.Count() ); + if( aIndex >= 0 && aIndex < count ) + { + return iPrimaryCameraPhotoQualities[aIndex]; + } + else + { + TInt secIndex = aIndex - count; + if( secIndex >= 0 && + secIndex < iSecondaryCameraPhotoQualities.Count() ) + { + return iSecondaryCameraPhotoQualities[secIndex]; + } + + User::Panic( KCamConfigPanicId, ECamConfigPanicNoQuality ); + return iPrimaryCameraPhotoQualities[0]; // Get rid of warning + } + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::NumVideoQualities +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::NumVideoQualities() const + { + return iVideoQualities.Count(); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::NumPrimaryImageQualities +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::NumPrimaryImageQualities() const + { + return iPrimaryCameraPhotoQualities.Count(); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::SecondaryCameraVideoQuality +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::SecondaryCameraVideoQuality() const + { + // Currently always the last of the video qualities + // Currently always the last of the video qualities + // As the camera video qualities are sorted, sharing quality is the + // last one in the qualities array. + TInt index = NumVideoQualities()-1; + + return index < 0 ? + KErrNotFound : + iVideoQualities[index].iQualitySettings.iQualityLevel; + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::VideoQualitySetting +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::VideoQualitySetting( TInt aIndex ) const + { + return iVideoQualities[aIndex].iQualitySetting; + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::VideoQuality +// --------------------------------------------------------------------------- +// +const TVideoQualitySettings& +CCamConfiguration::VideoQuality( TInt aIndex ) const + { + return iVideoQualities[aIndex].iQualitySettings; + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::MapSupportedQualityToQualityDescriptor +// --------------------------------------------------------------------------- +// +TInt +CCamConfiguration::MapSupportedQualityToQualityDescriptor( TBool aVideoMode, + TInt aQualityVal ) const + { + if( aVideoMode ) + { + // Video mode + TInt n = iVideoQualities.Count(); + for( TInt i=0; i Not supported + User::Panic( KCamConfigPanicId, ECamConfigPanicNoDescription ); + return KErrNotSupported; + } + else + { + // Image mode + TInt n = iPrimaryCameraPhotoQualities.Count(); + for( TInt i=0; i Not supported + User::Panic( KCamConfigPanicId, ECamConfigPanicNoDescription ); + return KErrNotSupported; + } + + } + + +// --------------------------------------------------------------------------- +// CCamConfiguration::MapPhotoSizeToResolution +// --------------------------------------------------------------------------- +// +TCamImageResolution +CCamConfiguration::MapPhotoSizeToResolution( TCamPhotoSizeId aSizeId ) + { + for( TInt i=0; i CamUtility::ImagesRemaining") ); + TInt64 memoryfree = 0; + + // Get the current amount of free memory on the phone. + switch ( aStorage ) + { + case ECamMediaStoragePhone: + memoryfree + = CamUtility::MemoryFree( DriveInfo::EDefaultPhoneMemory, + aCriticalLevel ); + break; + + case ECamMediaStorageCard: + PRINT( _L("Camera => CamUtility::ImagesRemaining, ECamMediaStorageCard") ); + memoryfree + = CamUtility::MemoryFree( DriveInfo::EDefaultRemovableMassStorage, + aCriticalLevel ); + break; + + case ECamMediaStorageMassStorage: + PRINT( _L("Camera => CamUtility::ImagesRemaining, ECamMediaStorageMassStorage") ); + memoryfree + = CamUtility::MemoryFree( DriveInfo::EDefaultMassStorage, + aCriticalLevel ); + break; + default: + PRINT( _L("Camera => CamUtility::ImagesRemaining, default") ); + break; + }; + + TInt size = 1; + + TInt n=NumImageQualities(); + for( TInt i=0; i( images ); // (nothing greater than TInt) + } + + +// --------------------------------------------------------------------------- +// CCamConfiguration::AllocString8L +// --------------------------------------------------------------------------- +// +const TUint8* +CCamConfiguration::AllocString8L( const TUint8* aData ) + { + TPtrC8 ptr( aData ); + HBufC8* data = HBufC8::NewLC( ptr.Length() + 1 ); + data->Des().Copy( ptr ); + data->Des().Append( '\0' ); + + iStrings8.AppendL( data ); + + CleanupStack::Pop( data ); + + return data->Ptr(); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::AllocString16L +// --------------------------------------------------------------------------- +// +const TUint16* +CCamConfiguration::AllocString16L( const TUint8* aData ) + { + TPtrC8 ptr( aData ); + HBufC16* data = HBufC16::NewLC( ptr.Length() + 1 ); + data->Des().Copy( ptr ); + data->Des().Append( '\0' ); + + iStrings16.AppendL( data ); + + CleanupStack::Pop( data ); + + return data->Ptr(); + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::CreateVideoQualityDataL +// --------------------------------------------------------------------------- +// +TCamVideoQualityData +CCamConfiguration::CreateVideoQualityDataL( const TVideoQualitySet& aSet ) + { + PRINT3( _L("Camera => CCamConfiguration::CreateVideoQualityDataL - res: (%d, %d), video bitrate: %d" ), + aSet.iVideoWidth, aSet.iVideoHeight, aSet.iVideoBitRate ); + + TInt resIndex( CamConfigurationUtility::VideoSizeIndex( + aSet.iVideoWidth, aSet.iVideoHeight ) ); + if( resIndex < 0 ) + { + User::Panic( KCamConfigPanicId, ECamConfigPanicNoVideoRes ); + } + + TCamVideoQualityDescription descType + = CamConfigurationUtility::VideoDescId( aSet.iCamcorderVisible ); + + TInt videoType = CamConfigurationUtility::VideoType( aSet.iVideoFileMimeType ); + + // Convert FourCC value from TFourCC to asciiz string + const TInt KFourCCLength = 5; // 4 characters + '\0' + TText8 fourCCBuf[KFourCCLength ]; + TPtr8 fourCC( fourCCBuf, KFourCCLength ); + aSet.iAudioFourCCType.FourCC( &fourCC ); + fourCC.Append( '\0' ); + + // Initialized as here to avoid const_casts for the text pointers + TCamVideoQualityData data = + { + // TVideoQualitySettings: + { + 0, // iQualityLevel - defined later + KCamVideoSizes[resIndex].iCamVideoRes, // iVideoResolution + aSet.iVideoFrameRate, // iVideoFrameRate + aSet.iVideoBitRate, // iVideoBitRate + aSet.iAudioBitRate, // iAudioBitRate + AllocString8L( aSet.iVideoFileMimeType ), // iVideoMimeType + AllocString16L( aSet.iPreferredSupplier ), // iPreferredSupplier + AllocString8L( aSet.iVideoCodecMimeType ), // iVideoCodec + AllocString8L( fourCCBuf ), // iAudioCodec + CamConfigurationUtility::VideoType( aSet.iVideoFileMimeType ), // iVideoFileType + ECamVideoClipMax // iVideoLength - changed later if necessary + }, + + KCamVideoSizes[resIndex].iCamVideoRes, // iVideoResolution + ECamVideoQualitySharing, // iQualitySetting - replaced later + descType, // iDescription + KCamVideoIcons[descType], + KCamVideoTypeIcons[videoType] + }; + + PRINT( _L("Camera <= CCamConfiguration::CreateVideoQualityDataL" ) ); + return data; + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::AppendVideoResIfSupportedL +// --------------------------------------------------------------------------- +// +void +CCamConfiguration::AppendVideoResIfSupportedL( TInt aValue, RArray&aArray ) const + { + TInt n( iVideoQualities.Count() ); + for( TInt i=0; i CCamConfiguration::MapRequiredResolutionToActualResolutionPhoto aRequiredResolution: (%d,%d)"), aRequiredResolution.iWidth, aRequiredResolution.iHeight ); + TInt MaxCount = NumPrimaryImageQualities(); + TCamImageQualityData QData; + TSize Reso( 0, 0 ); + TBool found = EFalse; + for ( TInt i = 0; i < MaxCount; i++ ) + { + QData = ImageQualityData( i ); + PRINT3(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionPhoto index: %d PhotoSize: (%d,%d)"), i,QData.iPhotoSize.iWidth, QData.iPhotoSize.iHeight ); + if ( QData.iPhotoSize.iWidth == aRequiredResolution.iWidth + && QData.iPhotoSize.iHeight == aRequiredResolution.iHeight ) + { + Reso = aRequiredResolution; + found = ETrue; + } + } + if ( !found && aRequiredResolution != TSize(0,0) ) { // TSize(0,0) should be returned the same as it means the mms quality + TInt referenceQuality = aRequiredResolution.iWidth*aRequiredResolution.iHeight; + TInt currentQuality = 0; + TInt closestMatch = Abs(referenceQuality-currentQuality); + PRINT1(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionPhoto closestMatch: (%d)"), closestMatch ); + TInt currentMatch = 0; + for ( TInt i = 0; i < MaxCount; i++ ) + { + QData = ImageQualityData( i ); + PRINT3(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionPhoto index: %d PhotoSize: (%d,%d)"), i, QData.iPhotoSize.iWidth, QData.iPhotoSize.iHeight ); + currentQuality = QData.iPhotoSize.iWidth*QData.iPhotoSize.iHeight; + currentMatch = Abs(referenceQuality-currentQuality); + PRINT1(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionPhoto currentMatch: (%d)"), currentMatch ); + if ( currentMatch < closestMatch ) + { + Reso.SetSize( QData.iPhotoSize.iWidth, QData.iPhotoSize.iHeight ); + closestMatch = currentMatch; + } + } + } + PRINT2(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionPhoto return resolution: (%d,%d)"), Reso.iWidth, Reso.iHeight ); + return Reso; +} + + +// --------------------------------------------------------------------------- +// CCamConfiguration::GetRequiredVideoQualityIndex +// --------------------------------------------------------------------------- +// +TInt CCamConfiguration::GetRequiredVideoQualityIndex( const TSize& aResolution ) const + { + PRINT2(_L("Camera <=> CCamConfiguration::GetRequiredVideoQualityIndex aResolution: (%d,%d)"), aResolution.iWidth, aResolution.iHeight ); + TInt QualityIndex = 0; + TInt MaxCount = NumVideoQualities(); + PRINT1(_L("Camera <=> CCamConfiguration::GetRequiredVideoQualityIndex MaxCount: %d"), MaxCount ); + TCamVideoQualityData QData; + TSize VideoResolution(0,0); + //for ( TInt i = 0; i < MaxCount; i++ ) + for ( TInt i = MaxCount-1; i >= 0; i-- ) + { + QData = iVideoQualities[i]; + VideoResolution = CamConfigurationUtility::CamVideoResolution( QData.iVideoResolution ); + PRINT3(_L("Camera <=> CCamConfiguration::GetRequiredVideoQualityIndex index: %d VideoResolution: (%d,%d)"), i, VideoResolution.iWidth, VideoResolution.iHeight ); + if ( VideoResolution.iWidth == aResolution.iWidth + && VideoResolution.iHeight == aResolution.iHeight ) + { + QualityIndex = i; + } + } + PRINT1(_L("Camera <=> CCamConfiguration::GetRequiredVideoQualityIndex return: %d"), QualityIndex ); + return QualityIndex; + } + +// --------------------------------------------------------------------------- +// CCamConfiguration::MapRequiredResolutionToActualResolutionVideo +// --------------------------------------------------------------------------- +// +TSize CCamConfiguration::MapRequiredResolutionToActualResolutionVideo( const TSize& aRequiredResolution ) const { + PRINT2(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionVideo aRequiredResolution: (%d,%d)"), aRequiredResolution.iWidth, aRequiredResolution.iHeight ); + TInt MaxCount = NumVideoQualities(); + TCamVideoQualityData QData; + TSize Reso( 0, 0 ); + TBool found = EFalse; + TSize VideoResolution(0,0); + for ( TInt i = 0; i < MaxCount; i++ ) + { + QData = iVideoQualities[i]; + VideoResolution = CamConfigurationUtility::CamVideoResolution( QData.iVideoResolution ); + PRINT3(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionVideo index: %d VideoResolution: (%d,%d)"), i, VideoResolution.iWidth, VideoResolution.iHeight ); + if ( VideoResolution.iWidth == aRequiredResolution.iWidth + && VideoResolution.iHeight == aRequiredResolution.iHeight ) + { + Reso = aRequiredResolution; + found = ETrue; + } + } + if ( !found && aRequiredResolution != TSize(0,0) ) { // TSize(0,0) should be returned the same as it means the mms quality + TInt referenceQuality = aRequiredResolution.iWidth*aRequiredResolution.iHeight; + TInt currentQuality = 0; + TInt closestMatch = Abs(referenceQuality-currentQuality); + PRINT1(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionVideo closestMatch: (%d)"), closestMatch ); + TInt currentMatch = 0; + for ( TInt i = 0; i < MaxCount; i++ ) + { + QData = iVideoQualities[i]; + VideoResolution = CamConfigurationUtility::CamVideoResolution( QData.iVideoResolution ); + PRINT3(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionVideo index: %d VideoResolution: (%d,%d)"), i, VideoResolution.iWidth, VideoResolution.iHeight ); + currentQuality = VideoResolution.iWidth*VideoResolution.iHeight; + currentMatch = Abs(referenceQuality-currentQuality); + PRINT1(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionVideo currentMatch: (%d)"), currentMatch ); + if ( currentMatch < closestMatch ) + { + Reso.SetSize( VideoResolution.iWidth, VideoResolution.iHeight ); + closestMatch = currentMatch; + } + } + } + PRINT2(_L("Camera <=> CCamConfiguration::MapRequiredResolutionToActualResolutionVideo return resolution: (%d,%d)"), Reso.iWidth, Reso.iHeight ); + return Reso; +} + +// --------------------------------------------------------------------------- +// CCamConfiguration::GetDefaultVideoQualityFromIcmL +// --------------------------------------------------------------------------- +// +TCamVideoQualitySettings CCamConfiguration::GetDefaultVideoQualityFromIcmL() + { + PRINT(_L("Camera => CCamConfiguration::GetDefaultVideoQualityFromIcmL") ); + TInt totalLevels = iIcm->NumberOfVideoQualityLevels(); + CArrayFixFlat* levels + = new (ELeave) CArrayFixFlat( totalLevels ); + CleanupStack::PushL( levels ); + TVideoQualitySet set; + TVideoQualitySet temp; + + if( iPrimaryCameraDisplayId ) + { + iIcm->GetVideoQualityLevelsL( *levels, iPrimaryCameraDisplayId ); + TInt numLevels( levels->Count() ); + PRINT1(_L("Camera <> CCamConfiguration::GetDefaultVideoQualityFromIcmL - Total number of levels: %d"), numLevels ); + + iIcm->GetVideoQualitySet( set, levels->At( 0 ), iPrimaryCameraDisplayId ); + + for( int i=1; iGetVideoQualitySet( temp, levels->At( i ), iPrimaryCameraDisplayId ); + if( temp.iCamcorderVisible > 0 && temp.iVideoQualitySetLevel > set.iVideoQualitySetLevel ) + { + set = temp; + } + } + } + CleanupStack::PopAndDestroy( levels ); + + TInt count = iVideoQualities.Count(); + TCamVideoQualityDescription descType + = CamConfigurationUtility::VideoDescId( set.iCamcorderVisible ); + for(TInt i = 0; i < count; i++) + { + if(iVideoQualities[i].iDescription == descType ) + { + PRINT( _L("Camera <= CCamConfiguration::GetDefaultVideoQualityFromIcmL") ); + return iVideoQualities[i].iQualitySetting; + } + } + + // In normal case application should not come to here + // If could not find the exact video qulity setting, just return WidescreenHigh + // Should be fixed in other product + return ECamVideoQualityNormalHigh; + } + +// End of file +