diff -r 3075d9b614e6 -r 0e652f8f1fbd camerauis/cameraxui/cxengine/src/cxequalitypresetssymbian.cpp --- a/camerauis/cameraxui/cxengine/src/cxequalitypresetssymbian.cpp Thu May 13 21:30:19 2010 +0300 +++ b/camerauis/cameraxui/cxengine/src/cxequalitypresetssymbian.cpp Thu Jul 15 01:55:05 2010 +0300 @@ -17,6 +17,7 @@ * */ +#include #include // For Symbian types used in mmsenginedomaincrkeys.h #include @@ -35,15 +36,24 @@ 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 PRIMARY_CAMERA_DISPLAY_ID = 2; + const int SECONDARY_CAMERA_DISPLAY_ID = 3; - const int ONE_MILLION = 1000000; - const qreal ASPECT_16_BY_9 = (16/9.0); - const qreal DELTA_ERROR = 0.20; + 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; + 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; } @@ -54,6 +64,7 @@ : mSettings(settings) { CX_DEBUG_ENTER_FUNCTION(); + OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_1, "msg: e_CX_QUALITYPRESETS_NEW 1"); TRAPD(err, mIcm = CImagingConfigManager::NewL()); @@ -62,8 +73,8 @@ mIcm = NULL; } + OstTrace0(camerax_performance, CXEQUALITYPRESETSSYMBIAN_2, "msg: e_CX_QUALITYPRESETS_NEW 0"); CX_DEBUG_EXIT_FUNCTION(); - } /* ! @@ -98,7 +109,7 @@ int totalLevels = mIcm->NumberOfImageQualityLevels(); CX_DEBUG(("Total image quality levels = %d", totalLevels)); - CArrayFixFlat* levels= new CArrayFixFlat(totalLevels); + CArrayFixFlat* levels = new CArrayFixFlat(totalLevels); // Get camera display id based on camera index int displayId = cameraId == Cxe::SecondaryCameraIndex @@ -235,6 +246,7 @@ */ CxeVideoDetails CxeQualityPresetsSymbian::createVideoPreset(TVideoQualitySet set) { + CX_DEBUG_ENTER_FUNCTION(); CxeVideoDetails newPreset; // set setting values from quality set newPreset.mWidth = set.iVideoWidth; @@ -272,6 +284,7 @@ // set audiotype newPreset.mAudioType = toString(fourCCBuf); + CX_DEBUG_EXIT_FUNCTION(); return newPreset; } @@ -295,14 +308,20 @@ { Cxe::AspectRatio aspectRatio = Cxe::AspectRatio4to3; - qreal ratio = 0; - if (height != 0) { - ratio = (1.0 * width) / height; + // 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())); - qreal delta16by9 = ratio - ASPECT_16_BY_9; - if (abs(delta16by9) < DELTA_ERROR) { - aspectRatio = Cxe::AspectRatio16to9; - } + // 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; @@ -341,6 +360,48 @@ } +/*! +* 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; + } + + int muteSetting = 0; // audio enabled + mSettings.get(CxeSettingIds::VIDEO_MUTE_SETTING, muteSetting); + + int avgVideoBitRate = (details.mVideoBitRate * scaler); + int avgAudioBitRate = (muteSetting == 1) ? 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.