diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraxui/cxengine/src/cxequalitypresetssymbian.cpp --- a/camerauis/cameraxui/cxengine/src/cxequalitypresetssymbian.cpp Tue Aug 31 15:03:46 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,487 +0,0 @@ -/* -* Copyright (c) 2009-2010 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 and/or its subsidiary(-ies). -* -* Contributors: -* -* -* Description: -* Implementation file for CxeQualityPresetsSymbian class -* -*/ - -#include -#include // For Symbian types used in mmsenginedomaincrkeys.h -#include -#include - -#include "cxutils.h" -#include "cxenamespace.h" -#include "cxesettings.h" -#include "cxequalitydetails.h" -#include "cxequalitypresetssymbian.h" - -#include "OstTraceDefinitions.h" -#ifdef OST_TRACE_COMPILER_IN_USE -#include "cxequalitypresetssymbianTraces.h" -#endif - -// constants -namespace -{ - // Display IDs for cameras, used when requesting data from ICM - const int PRIMARY_CAMERA_DISPLAY_ID = 2; - const int SECONDARY_CAMERA_DISPLAY_ID = 3; - - const int ONE_MILLION = 1000000; - - const QSize ASPECT_RATIO_SIZE_4BY3 = QSize(4,3); - const QSize ASPECT_RATIO_SIZE_16BY9 = QSize(16, 9); - const QSize ASPECT_RATIO_SIZE_11BY9 = QSize(11, 9); - - // ICM "camcorderVisible" parameter value below this means sharing aka mms quality. - const int MMS_QUALITY_CAMCORDERVISIBLE_LIMIT = 200; - - // Average video bit rate scaler - const qreal VIDEO_AVG_BITRATE_SCALER = 0.9; - // Coefficient to estimate video metadata amount - const qreal VIDEO_METADATA_COEFF = 1.03; - // Maximum video clip duration in seconds for all qualities - const qint64 VIDEO_MAX_DURATION = 5400; -} - - -/* ! -* Intializes ImagingConfigManager -*/ -CxeQualityPresetsSymbian::CxeQualityPresetsSymbian(CxeSettings &settings) - : mSettings(settings) -{ - CX_DEBUG_ENTER_FUNCTION(); - OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_1, "msg: e_CX_QUALITYPRESETS_NEW 1"); - - TRAPD(err, mIcm = CImagingConfigManager::NewL()); - - if (err) { - CX_DEBUG(("Error during ICM initialization error code = %d", err)); - mIcm = NULL; - } - - OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_2, "msg: e_CX_QUALITYPRESETS_NEW 0"); - CX_DEBUG_EXIT_FUNCTION(); -} - -/* ! -* CxeQualityPresetsSymbian::~CxeQualityPresetsSymbian() -*/ -CxeQualityPresetsSymbian::~CxeQualityPresetsSymbian() -{ - CX_DEBUG_ENTER_FUNCTION(); - - delete mIcm; - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -This function returns sorted list of image qualities from highest to lowest resolution. -i.e. first element in the list represent highest supported image resolution and so on. -@param cameraId The CameraIndex which defines which camera we are using primary/secondary. -Returns sorted list of image qualities in descending order. -*/ -QList CxeQualityPresetsSymbian::imageQualityPresets(Cxe::CameraIndex cameraId) -{ - CX_DEBUG_ENTER_FUNCTION(); - OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_GETIMAGEPRESETS_IN, "msg: e_CX_QUALITYPRESETS_GETIMAGEPRESETS 1"); - - QList presetList; - - if (!mIcm) { - CX_DEBUG(("ICM not initialized, returning empty image qualities list")); - return presetList; - } - int totalLevels = mIcm->NumberOfImageQualityLevels(); - - CX_DEBUG(("Total image quality levels = %d", totalLevels)); - CArrayFixFlat* levels = new CArrayFixFlat(totalLevels); - - // Get camera display id based on camera index - int displayId = cameraId == Cxe::SecondaryCameraIndex - ? SECONDARY_CAMERA_DISPLAY_ID : PRIMARY_CAMERA_DISPLAY_ID; - - TRAPD(err, mIcm->GetImageQualityLevelsL(*levels, displayId)); - - if (err == KErrNone) { - CX_DEBUG(( "Reading image quality sets one by one.")); - TImageQualitySet set; - int numLevels = levels->Count(); - for(int i = 0; i < numLevels; i++) { - mIcm->GetImageQualitySet(set, levels->At(i), displayId); - if (set.iCamcorderVisible > 0) { - // create new quality preset based on the quality set values - CxeImageDetails newPreset = createImagePreset(set); - - // print debug prints - debugPrints(newPreset); - - // append to the list of presets - presetList.append(newPreset); - } - } - CX_DEBUG(( "Sorting image qualities")); - // Sorting result list according to height pixel size from highest to lowest - // i.e. descending order keeping the highest resolution first. - qSort(presetList.begin(), presetList.end(), qGreater()); - } - - delete levels; - levels = NULL; - - OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_GETIMAGEPRESETS_OUT, "msg: e_CX_QUALITYPRESETS_GETIMAGEPRESETS 0"); - CX_DEBUG_EXIT_FUNCTION(); - return presetList; -} - - - -/*! -This function returns sorted list of video qualities from highest to lowest resolution. -i.e. first element in the list represent highest supported video resolution and so on. -@param cameraId The CameraIndex which defines which camera we are using primary/secondary. -Returns sorted list if image qualities in descending order. -*/ -QList CxeQualityPresetsSymbian::videoQualityPresets(Cxe::CameraIndex cameraId) -{ - CX_DEBUG_ENTER_FUNCTION(); - OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_GETVIDEOPRESETS_IN, "msg: e_CX_QUALITYPRESETS_GETVIDEOPRESETS 1"); - - QList presetList; - - if (!mIcm) { - CX_DEBUG(("ICM not initialized, returning empty video qualities list")); - return presetList; - } - int totalLevels = mIcm->NumberOfVideoQualityLevels(); - - CX_DEBUG(("Total video quality levels = %d", totalLevels)); - CArrayFixFlat* levels= new CArrayFixFlat(totalLevels); - - int displayId = cameraId == Cxe::SecondaryCameraIndex - ? SECONDARY_CAMERA_DISPLAY_ID : PRIMARY_CAMERA_DISPLAY_ID; - - TRAPD(err, mIcm->GetVideoQualityLevelsL(*levels, displayId)); - - if (err == KErrNone) { - CX_DEBUG(( "Reading video quality sets one by one.")); - TVideoQualitySet set; - int numLevels = levels->Count(); - for(int i = 0; i < numLevels; i++) { - mIcm->GetVideoQualitySet(set, levels->At(i), displayId); - - // Disable all video sizes larger than VGA - if (set.iCamcorderVisible > 0 && set.iVideoWidth <= 864) { - // create new quality preset - CxeVideoDetails newPreset = createVideoPreset(set); - - // print debug prints - debugPrints(newPreset); - - // append to the list of presets - presetList.append(newPreset); - } - } - CX_DEBUG(( "Sorting image qualities")); - // Sorting result list according to height pixel size from highest to lowest - // i.e. descending order keeping the highest resolution first. - qSort(presetList.begin(), presetList.end(), qGreater()); - } - - delete levels; - levels = NULL; - - // Get the average video bitrate scaler - TCamcorderMMFPluginSettings mmfPluginSettings; - mIcm->GetCamcorderMMFPluginSettings(mmfPluginSettings); - mCMRAvgVideoBitRateScaler = mmfPluginSettings.iCMRAvgVideoBitRateScaler; - - OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_GETVIDEOPRESETS_OUT, "msg: e_CX_QUALITYPRESETS_GETVIDEOPRESETS 0"); - CX_DEBUG_EXIT_FUNCTION(); - return presetList; -} - - - -/*! -* Creates a new image preset based on TImageQualitySet values from ICM. -@ param set contains the ICM configuration data -@ returns CxeImageQuality struct -*/ -CxeImageDetails CxeQualityPresetsSymbian::createImagePreset(const TImageQualitySet &set) -{ - CxeImageDetails newPreset; - // set setting values from quality set - newPreset.mWidth = set.iImageWidth; - newPreset.mHeight = set.iImageHeight; - newPreset.mEstimatedSize = set.iEstimatedSize; - newPreset.mMpxCount = calculateMegaPixelCount(set.iImageWidth, - set.iImageHeight); - newPreset.mPossibleImages = CxeImageDetails::UNKNOWN; - newPreset.mImageFileExtension = toString(set.iImageFileExtension); - newPreset.mAspectRatio = calculateAspectRatio(set.iImageWidth, - set.iImageHeight); - - return newPreset; -} - - - -/*! -* Creates a new video preset based on TVideoQualitySet values from ICM. -*/ -CxeVideoDetails CxeQualityPresetsSymbian::createVideoPreset(const TVideoQualitySet &set) -{ - CX_DEBUG_ENTER_FUNCTION(); - CxeVideoDetails newPreset; - // set setting values from quality set - newPreset.mWidth = set.iVideoWidth; - newPreset.mHeight = set.iVideoHeight; - - newPreset.mRemainingTime = CxeVideoDetails::UNKNOWN; - - // Check if this is a sharing (mms) quality, and set size limit accordingly. - if (set.iCamcorderVisible < MMS_QUALITY_CAMCORDERVISIBLE_LIMIT) { - QVariant size; - mSettings.get(KCRUidMmsEngine.iUid, KMmsEngineMaximumSendSize, Cxe::Repository, size); - CX_DEBUG(("CxeQualityPresetsSymbian - Got MMS quality size limit: %d", size.toInt())); - newPreset.mMaximumSizeInBytes = size.toInt(); - } else { - // Zero means no limit. - newPreset.mMaximumSizeInBytes = 0; - } - - newPreset.mVideoBitRate = set.iVideoBitRate; - newPreset.mAudioBitRate = set.iAudioBitRate; - newPreset.mVideoFrameRate = set.iVideoFrameRate; - newPreset.mVideoFileMimeType = toString(set.iVideoFileMimeType); - newPreset.mPreferredSupplier = toString(set.iPreferredSupplier); - newPreset.mVideoCodecMimeType = toString(set.iVideoCodecMimeType); - newPreset.mAspectRatio = calculateAspectRatio(set.iVideoWidth, - set.iVideoHeight); - - // Convert FourCC value from TFourCC to ascii string - const int KFourCCLength = 5; // 4 characters + '\0' - TText8 fourCCBuf[KFourCCLength]; - TPtr8 fourCC(fourCCBuf, KFourCCLength); - set.iAudioFourCCType.FourCC(&fourCC); - fourCC.Append('\0'); - - // set audiotype - newPreset.mAudioType = toString(fourCCBuf); - - CX_DEBUG_EXIT_FUNCTION(); - return newPreset; -} - - -/*! -* Returns Aspect ratio of the image. -*/ -qreal CxeQualityPresetsSymbian::avgVideoBitRateScaler() -{ - CX_DEBUG_IN_FUNCTION(); - // Get the average video bitrate scaler - if (mIcm) { - TCamcorderMMFPluginSettings mmfPluginSettings; - mIcm->GetCamcorderMMFPluginSettings(mmfPluginSettings); - mCMRAvgVideoBitRateScaler = mmfPluginSettings.iCMRAvgVideoBitRateScaler; - } - return mCMRAvgVideoBitRateScaler; -} - - -/*! -@ param width - image/video quality width -@ param height - image/video quality height -* Returns Aspect ratio of the image/video. -*/ -Cxe::AspectRatio CxeQualityPresetsSymbian::calculateAspectRatio(int width, int height) const -{ - Cxe::AspectRatio aspectRatio = Cxe::AspectRatio4to3; - - // calculate delta error for the resolution against supported aspect ratio's - int delta16by9 = abs((width * ASPECT_RATIO_SIZE_16BY9.height()) - (height * ASPECT_RATIO_SIZE_16BY9.width())); - int delta11by9 = abs((width * ASPECT_RATIO_SIZE_11BY9.height()) - (height * ASPECT_RATIO_SIZE_11BY9.width())); - int delta4by3 = abs((width * ASPECT_RATIO_SIZE_4BY3.height()) - (height * ASPECT_RATIO_SIZE_4BY3.width())); - - // get the closest aspect ratio - int minValue = qMin(qMin(delta16by9, delta11by9), delta4by3); - - if (minValue == delta16by9) { - aspectRatio = Cxe::AspectRatio16to9; - } else if (minValue == delta11by9) { - aspectRatio = Cxe::AspectRatio11to9; - } else if (minValue == delta4by3) { - aspectRatio = Cxe::AspectRatio4to3; - } - - return aspectRatio; -} - - - -/*! -* CxeQualityPresetsSymbian::calculateMegaPixelCount -@ param imageWidth refers to the image resolution width -@ param imageHeight refers to the image resolution height -@ returns megapixel count string -*/ -QString -CxeQualityPresetsSymbian::calculateMegaPixelCount(int imageWidth, int imageHeight) -{ - QString mpxCountString; - qreal size = imageWidth * imageHeight * 1.0; - int mpxCount = (size/ONE_MILLION) * 10; - - if ((mpxCount % 10) == 0) { - int value = mpxCount / 10; - mpxCountString.setNum(value); - } else { - qreal value = mpxCount / 10.0; - if ((mpxCount % 10) < 5) { - mpxCountString.setNum(value, 'f', 1); - } else { - int temp = ceil(value); - mpxCountString.setNum(temp); - } - } - - return mpxCountString; - - -} - -/*! -* Get the available recording time with given video quality details and disk space. -* @param details Video quality details to use in calculation. -* @param space Available disk space to use in calculation. -* @return Available recording time estimate in seconds. -*/ -int CxeQualityPresetsSymbian::recordingTimeAvailable(const CxeVideoDetails& details, qint64 space) -{ - CX_DEBUG_ENTER_FUNCTION(); - int time(0); - - // Maximum clip size may be limited for mms quality. - // If mMaximumSizeInBytes == 0, no limit is specified. - if (details.mMaximumSizeInBytes > 0 && details.mMaximumSizeInBytes < space) { - space = details.mMaximumSizeInBytes; - } - - // Use average audio/video bitrates to estimate remaining time - qreal scaler(avgVideoBitRateScaler()); - if (scaler == 0) { - // video bit rate scaler is 0, use the constant value - scaler = VIDEO_AVG_BITRATE_SCALER; - } - - bool muteSetting = mSettings.get(CxeSettingIds::VIDEO_MUTE_SETTING, false); // false = audio enabled - - int avgVideoBitRate = (details.mVideoBitRate * scaler); - int avgAudioBitRate = muteSetting ? 0 : details.mAudioBitRate; - - quint32 averageBitRate = (quint32)((avgVideoBitRate + avgAudioBitRate) * VIDEO_METADATA_COEFF); - quint32 averageByteRate = averageBitRate / 8; - - // 0 <= Remaining time <= KCamCMaxClipDurationInSecs - qint64 remaining = std::max(qint64(0), space/averageByteRate); - time = std::min(remaining, VIDEO_MAX_DURATION); - - CX_DEBUG(( "remaining time from algorithm: %d", time )); - CX_DEBUG_EXIT_FUNCTION(); - return time; -} - - -/*! -Operator to sort values in ascending order. -@param s1 type of data to be sorted. -*/ -bool CxeImageDetails::operator<(const CxeImageDetails& s1) const -{ - return mHeight < s1.mHeight; -} - - -/*! -Operator to sort values in ascending order. -@param s1 type of data to be sorted. -*/ -bool CxeVideoDetails::operator<(const CxeVideoDetails& s1) const -{ - return mHeight < s1.mHeight; -} - - -/* -* Converts TUint8* to QString -*/ -QString CxeQualityPresetsSymbian::toString(const TUint8* aData) -{ - return QString::fromLatin1((char*)aData); -} - - - -/*! -* Helper method to enable debug prints. -@ param Video quality preset values are printed out for debugging -*/ -void CxeQualityPresetsSymbian::debugPrints(const CxeVideoDetails &preset) -{ - CX_DEBUG(("Video quality details")); - CX_DEBUG(("Video resolution (%d,%d)", preset.mWidth, preset.mHeight)); - CX_DEBUG(("Audio bitrate = %d)", preset.mAudioBitRate)); - CX_DEBUG(("Video bitrate = %d)", preset.mVideoBitRate)); - CX_DEBUG(("Video frame rate = %f)", preset.mVideoFrameRate)); - CX_DEBUG(("Audio type: %s", preset.mAudioType.toAscii().data())); - CX_DEBUG(("Video file MIME type: %s", preset.mVideoFileMimeType.toAscii().data())); - CX_DEBUG(("Video preferred supplier: %s", preset.mPreferredSupplier.toAscii().data())); - CX_DEBUG(("Video codec MIME type: %s", preset.mVideoCodecMimeType.toAscii().data())); - QString aspectRatio; - if (preset.mAspectRatio == Cxe::AspectRatio4to3) { - aspectRatio = QString("4:3"); - } else if (preset.mAspectRatio == Cxe::AspectRatio16to9) { - aspectRatio = QString("16:9"); - } - CX_DEBUG(("Video aspect ratio: %s", aspectRatio.toAscii().data())); -} - - -/*! -* Helper method to enable debug prints. -@ param Image quality preset values are printed out for debugging -*/ -void CxeQualityPresetsSymbian::debugPrints(const CxeImageDetails &newPreset) -{ - CX_DEBUG(("Image quality details")); - CX_DEBUG(("Image resolution (%d,%d)", newPreset.mWidth, newPreset.mHeight)); - CX_DEBUG(("Estimated size in bytes = %d)", newPreset.mEstimatedSize)); - CX_DEBUG(("Megapixels: %s", newPreset.mMpxCount.toAscii().data())); - CX_DEBUG(("Image file extension: %s", newPreset.mImageFileExtension.toAscii().data())); - - QString aspectRatio; - - if (newPreset.mAspectRatio == Cxe::AspectRatio4to3) { - aspectRatio = QString("4:3"); - } else { - aspectRatio = QString("16:9"); - } - CX_DEBUG(("Image aspect ratio: %s", aspectRatio.toAscii().data())); -}