camerauis/cameraxui/cxengine/src/cxequalitypresetssymbian.cpp
changeset 43 0e652f8f1fbd
parent 28 3075d9b614e6
child 45 24fd82631616
--- 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.