--- 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 <algorithm>
#include <e32std.h> // For Symbian types used in mmsenginedomaincrkeys.h
#include <MmsEngineDomainCRKeys.h>
@@ -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<TUint>* levels= new CArrayFixFlat<TUint>(totalLevels);
+ CArrayFixFlat<TUint>* levels = new CArrayFixFlat<TUint>(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.