camerauis/cameraxui/cxengine/src/cxestillcapturecontroldesktop.cpp
author hgs
Fri, 06 Aug 2010 10:03:37 +0300
changeset 46 c826656d6714
child 55 0da2a5b56583
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QPixmap>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include "cxestillcapturecontroldesktop.h"
hgs
parents:
diff changeset
    21
#include "cxeimagedataitemdesktop.h"
hgs
parents:
diff changeset
    22
#include "cxeimagedataqueuedesktop.h"
hgs
parents:
diff changeset
    23
#include "cxefilenamegenerator.h"
hgs
parents:
diff changeset
    24
#include "cxefilesavethreaddesktop.h"
hgs
parents:
diff changeset
    25
#include "cxutils.h"
hgs
parents:
diff changeset
    26
#include "cxecameradevicecontrol.h"
hgs
parents:
diff changeset
    27
#include "cxestillimagedesktop.h"
hgs
parents:
diff changeset
    28
#include "cxeviewfindercontrol.h"
hgs
parents:
diff changeset
    29
#include "cxeviewfindercontroldesktop.h"
hgs
parents:
diff changeset
    30
#include "cxeautofocuscontrol.h"
hgs
parents:
diff changeset
    31
#include "cxestate.h"
hgs
parents:
diff changeset
    32
#include "cxecameradevicedesktop.h"
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// constants
hgs
parents:
diff changeset
    35
const int KMaintainAspectRatio = false;
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
/**
hgs
parents:
diff changeset
    40
 * Constructor.
hgs
parents:
diff changeset
    41
 */
hgs
parents:
diff changeset
    42
CxeStillCaptureControlDesktop::CxeStillCaptureControlDesktop(
hgs
parents:
diff changeset
    43
        CxeCameraDeviceDesktop &cameraDevice,
hgs
parents:
diff changeset
    44
        CxeViewfinderControl &viewfinderControl,
hgs
parents:
diff changeset
    45
        CxeCameraDeviceControl &cameraDeviceControl,
hgs
parents:
diff changeset
    46
        CxeFilenameGenerator &nameGenerator,
hgs
parents:
diff changeset
    47
        CxeAutoFocusControl &autoFocusControl,
hgs
parents:
diff changeset
    48
        CxeFileSaveThread &saveThread) :
hgs
parents:
diff changeset
    49
  mCameraDevice(cameraDevice),
hgs
parents:
diff changeset
    50
  mState(CxeStillCaptureControl::Uninitialized),
hgs
parents:
diff changeset
    51
  mViewfinderControl(viewfinderControl),
hgs
parents:
diff changeset
    52
  mCameraDeviceControl(cameraDeviceControl),
hgs
parents:
diff changeset
    53
  mFilenameGenerator(nameGenerator),
hgs
parents:
diff changeset
    54
  mAutoFocusControl(autoFocusControl),
hgs
parents:
diff changeset
    55
  mMode(SingleImageCapture),
hgs
parents:
diff changeset
    56
  mAfState(CxeAutoFocusControl::Unknown),
hgs
parents:
diff changeset
    57
  mSaveThread(saveThread)
hgs
parents:
diff changeset
    58
{
hgs
parents:
diff changeset
    59
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
    qRegisterMetaType<CxeStillCaptureControl::State>();
hgs
parents:
diff changeset
    62
    initializeStates();
hgs
parents:
diff changeset
    63
    reset();
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
    mImageDataQueue = new CxeImageDataQueueDesktop();
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    68
}
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
/**
hgs
parents:
diff changeset
    71
 * Destructor.
hgs
parents:
diff changeset
    72
 */
hgs
parents:
diff changeset
    73
CxeStillCaptureControlDesktop::~CxeStillCaptureControlDesktop()
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    deinit();
hgs
parents:
diff changeset
    78
    reset();
hgs
parents:
diff changeset
    79
    mSupportedImageQualities.clear();
hgs
parents:
diff changeset
    80
    delete mImageDataQueue;
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    83
}
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
/**
hgs
parents:
diff changeset
    86
 * Return the current state.
hgs
parents:
diff changeset
    87
 */
hgs
parents:
diff changeset
    88
CxeStillCaptureControl::State CxeStillCaptureControlDesktop::state() const
hgs
parents:
diff changeset
    89
{
hgs
parents:
diff changeset
    90
    return mState;
hgs
parents:
diff changeset
    91
}
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
/**
hgs
parents:
diff changeset
    94
 * Initialize the control states.
hgs
parents:
diff changeset
    95
 */
hgs
parents:
diff changeset
    96
void CxeStillCaptureControlDesktop::initializeStates()
hgs
parents:
diff changeset
    97
{
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
    // addState( id, name, allowed next states )
hgs
parents:
diff changeset
   100
}
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
/**
hgs
parents:
diff changeset
   103
 * Initialize the still image capture control.
hgs
parents:
diff changeset
   104
 */
hgs
parents:
diff changeset
   105
void CxeStillCaptureControlDesktop::init()
hgs
parents:
diff changeset
   106
{
hgs
parents:
diff changeset
   107
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    if (state() == Uninitialized) {
hgs
parents:
diff changeset
   110
        CxeImageDetails dummyDetails;
hgs
parents:
diff changeset
   111
        dummyDetails.mAspectRatio = Cxe::AspectRatio4to3;
hgs
parents:
diff changeset
   112
        dummyDetails.mEstimatedSize = 10000;
hgs
parents:
diff changeset
   113
        dummyDetails.mHeight = 360;
hgs
parents:
diff changeset
   114
        dummyDetails.mWidth = 640;
hgs
parents:
diff changeset
   115
        mSupportedImageQualities.append(dummyDetails);
hgs
parents:
diff changeset
   116
        prepare();
hgs
parents:
diff changeset
   117
    }
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   120
}
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
/**
hgs
parents:
diff changeset
   123
 * Un-initialize the image mode.
hgs
parents:
diff changeset
   124
 */
hgs
parents:
diff changeset
   125
void CxeStillCaptureControlDesktop::deinit()
hgs
parents:
diff changeset
   126
{
hgs
parents:
diff changeset
   127
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    if (state() == Uninitialized) {
hgs
parents:
diff changeset
   130
        // nothing to do
hgs
parents:
diff changeset
   131
        CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   132
        return;
hgs
parents:
diff changeset
   133
    }
hgs
parents:
diff changeset
   134
    mState = Uninitialized;
hgs
parents:
diff changeset
   135
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   136
}
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
/*!
hgs
parents:
diff changeset
   140
 * Prepare still capture mode.
hgs
parents:
diff changeset
   141
 */
hgs
parents:
diff changeset
   142
void CxeStillCaptureControlDesktop::prepare()
hgs
parents:
diff changeset
   143
{
hgs
parents:
diff changeset
   144
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    if (state() != Uninitialized) {
hgs
parents:
diff changeset
   147
        // wrong state and we return
hgs
parents:
diff changeset
   148
        return;
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
    int err = 0;
hgs
parents:
diff changeset
   152
    CxeError::Id cxErr = getImageQualityDetails(mCurrentImageDetails);
hgs
parents:
diff changeset
   153
    int ecamStillResolutionIndex = 0;
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
    if (cxErr == CxeError::None) {
hgs
parents:
diff changeset
   156
        int imageWidth =  mCurrentImageDetails.mWidth;
hgs
parents:
diff changeset
   157
        int imageHeight = mCurrentImageDetails.mHeight;
hgs
parents:
diff changeset
   158
        CX_DEBUG(("CxeStillCaptureControlSymbian::prepare <> resolution = (%d, %d)", imageWidth, imageHeight));
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
        if (ecamStillResolutionIndex < 0) {
hgs
parents:
diff changeset
   161
            CX_DEBUG(("CxeStillCaptureControlSymbian::prepare - WARNING! resolution not supported, falling back to index 0"));
hgs
parents:
diff changeset
   162
            ecamStillResolutionIndex = 0;
hgs
parents:
diff changeset
   163
        }
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
        CX_DEBUG(("PrepareImageCaptureL done, err=%d, resolution index = %d", err, ecamStillResolutionIndex));
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
        if (!err) {
hgs
parents:
diff changeset
   168
            // still capture prepare went fine, try preparing snapshot
hgs
parents:
diff changeset
   169
            err = prepareStillSnapshot();
hgs
parents:
diff changeset
   170
        }
hgs
parents:
diff changeset
   171
    } else {
hgs
parents:
diff changeset
   172
        err = 0;
hgs
parents:
diff changeset
   173
    }
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
    if (!err) {
hgs
parents:
diff changeset
   176
        // If viewfinder is already running, this call does nothing
hgs
parents:
diff changeset
   177
        mViewfinderControl.start();
hgs
parents:
diff changeset
   178
        // inform zoom control to prepare zoom
hgs
parents:
diff changeset
   179
        emit prepareZoomForStill(ecamStillResolutionIndex);
hgs
parents:
diff changeset
   180
    } else {
hgs
parents:
diff changeset
   181
        CX_DEBUG(("Image Prepare FAILED! symbian error = %d", err));
hgs
parents:
diff changeset
   182
    }
hgs
parents:
diff changeset
   183
    mState = Ready;
hgs
parents:
diff changeset
   184
    emit imagePrepareComplete(CxeError::None);
hgs
parents:
diff changeset
   185
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   186
}
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
/*!
hgs
parents:
diff changeset
   191
 Prepare still snapshot
hgs
parents:
diff changeset
   192
 Returns symbian error code.
hgs
parents:
diff changeset
   193
 */
hgs
parents:
diff changeset
   194
int CxeStillCaptureControlDesktop::prepareStillSnapshot()
hgs
parents:
diff changeset
   195
{
hgs
parents:
diff changeset
   196
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
    handleSnapshotEvent(CxeError::None);
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
    return 0;
hgs
parents:
diff changeset
   203
}
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
/*!
hgs
parents:
diff changeset
   207
 imageInfo contains image qualities details
hgs
parents:
diff changeset
   208
 Returns CxeError error code.
hgs
parents:
diff changeset
   209
 */
hgs
parents:
diff changeset
   210
CxeError::Id CxeStillCaptureControlDesktop::getImageQualityDetails(CxeImageDetails &imageInfo)
hgs
parents:
diff changeset
   211
{
hgs
parents:
diff changeset
   212
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
    int imageQuality = 0;
hgs
parents:
diff changeset
   215
    CxeError::Id err = CxeError::None;
hgs
parents:
diff changeset
   216
    if (mCameraDeviceControl.cameraIndex() == Cxe::PrimaryCameraIndex) {
hgs
parents:
diff changeset
   217
        bool validQuality = (imageQuality >= 0 && imageQuality < mSupportedImageQualities.count());
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
        if (err == CxeError::None && validQuality ) {
hgs
parents:
diff changeset
   220
            // get image quality details
hgs
parents:
diff changeset
   221
            imageInfo = mSupportedImageQualities.at(imageQuality);
hgs
parents:
diff changeset
   222
        } else {
hgs
parents:
diff changeset
   223
            err = CxeError::NotFound;
hgs
parents:
diff changeset
   224
            CX_DEBUG(("Invalid ImageQuality = %d", imageQuality));
hgs
parents:
diff changeset
   225
        }
hgs
parents:
diff changeset
   226
    } else {
hgs
parents:
diff changeset
   227
        // we are in secondary camera
hgs
parents:
diff changeset
   228
        // get secondary camera image quality details
hgs
parents:
diff changeset
   229
       imageInfo = mSupportedImageQualities.at(imageQuality);
hgs
parents:
diff changeset
   230
    }
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   233
    return err;
hgs
parents:
diff changeset
   234
}
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
/**
hgs
parents:
diff changeset
   238
 * Command to start image capture now.
hgs
parents:
diff changeset
   239
 */
hgs
parents:
diff changeset
   240
void CxeStillCaptureControlDesktop::capture()
hgs
parents:
diff changeset
   241
{
hgs
parents:
diff changeset
   242
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
    //! @todo: NOTE: This call may not stay here. It can move depending on the implementation for burst capture.
hgs
parents:
diff changeset
   245
    if (mMode == BurstCapture) {
hgs
parents:
diff changeset
   246
        // Start a new filename sequence
hgs
parents:
diff changeset
   247
        mFilenameGenerator.startNewImageFilenameSequence();
hgs
parents:
diff changeset
   248
    }
hgs
parents:
diff changeset
   249
    emit imageCaptured(CxeError::None, 0);
hgs
parents:
diff changeset
   250
    handleSnapshotEvent(CxeError::None);
hgs
parents:
diff changeset
   251
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   252
}
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
/**
hgs
parents:
diff changeset
   256
 * Snapshot ready notification. Ask the snapshot from snapshot interface.
hgs
parents:
diff changeset
   257
 * NB: Typically snapshot arrives before image data but can be in reverse
hgs
parents:
diff changeset
   258
 * order as well.
hgs
parents:
diff changeset
   259
 */
hgs
parents:
diff changeset
   260
void CxeStillCaptureControlDesktop::handleSnapshotEvent(CxeError::Id error)
hgs
parents:
diff changeset
   261
{
hgs
parents:
diff changeset
   262
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
    if (state() == CxeStillCaptureControl::Uninitialized) {
hgs
parents:
diff changeset
   265
        // we ignore this event, when we are not active
hgs
parents:
diff changeset
   266
        return;
hgs
parents:
diff changeset
   267
    }
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
    if (error) {
hgs
parents:
diff changeset
   270
        emit snapshotReady(error, QImage(), 0);
hgs
parents:
diff changeset
   271
    }
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
    // Get image container for current snapshot index.
hgs
parents:
diff changeset
   274
    // Remember to increment counter.
hgs
parents:
diff changeset
   275
    CxeStillImageDesktop* stillImage = getImageForIndex(mNextSnapshotIndex++);
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
    // When the snapshot ready event is handled, prepare new filename.
hgs
parents:
diff changeset
   278
    if (stillImage->filename().isEmpty()) {
hgs
parents:
diff changeset
   279
        // Error ignored at this point, try again when image data arrives.
hgs
parents:
diff changeset
   280
        prepareFilename(stillImage);
hgs
parents:
diff changeset
   281
    }
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
    CxeImageDataItem* dataItem = new CxeImageDataItemDesktop(mNextImageDataIndex++, stillImage->snapshot(), stillImage->filename(), stillImage->id());
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
    stillImage->setDataItem(dataItem);
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
    mSaveThread.save(dataItem);
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
    emit snapshotReady(CxeError::None, QImage(), stillImage->id());
hgs
parents:
diff changeset
   290
    emit imageCaptured(CxeError::None, stillImage->id());
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
    mState = Ready;
hgs
parents:
diff changeset
   293
    emit stateChanged(mState, CxeError::None);
hgs
parents:
diff changeset
   294
hgs
parents:
diff changeset
   295
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   296
}
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
/**
hgs
parents:
diff changeset
   301
 * Settings changed, needs updated
hgs
parents:
diff changeset
   302
 */
hgs
parents:
diff changeset
   303
void CxeStillCaptureControlDesktop::handleSettingValueChanged(const QString& settingId,QVariant newValue)
hgs
parents:
diff changeset
   304
{
hgs
parents:
diff changeset
   305
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    if (settingId == CxeSettingIds::FLASH_MODE) {
hgs
parents:
diff changeset
   308
        updateFlashSetting(newValue);
hgs
parents:
diff changeset
   309
    } else if (settingId == CxeSettingIds::LIGHT_SENSITIVITY) {
hgs
parents:
diff changeset
   310
        updateISOSetting(newValue);
hgs
parents:
diff changeset
   311
    } else if (settingId == CxeSettingIds::EV_COMPENSATION_VALUE) {
hgs
parents:
diff changeset
   312
        updateEVCompensationSetting(newValue);
hgs
parents:
diff changeset
   313
    } else if (settingId == CxeSettingIds::IMAGE_QUALITY) {
hgs
parents:
diff changeset
   314
        // re-prepare for still
hgs
parents:
diff changeset
   315
        deinit();
hgs
parents:
diff changeset
   316
        init();
hgs
parents:
diff changeset
   317
    } else {
hgs
parents:
diff changeset
   318
        // do nothing
hgs
parents:
diff changeset
   319
    }
hgs
parents:
diff changeset
   320
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   321
}
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
/**
hgs
parents:
diff changeset
   324
 * Image Scene mode changed, needs updated
hgs
parents:
diff changeset
   325
 */
hgs
parents:
diff changeset
   326
void CxeStillCaptureControlDesktop::handleSceneChanged(CxeScene& scene)
hgs
parents:
diff changeset
   327
{
hgs
parents:
diff changeset
   328
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    if (mCameraDeviceControl.cameraIndex() == Cxe::PrimaryCameraIndex){
hgs
parents:
diff changeset
   331
        CX_DEBUG_ASSERT(scene.count() != 0);
hgs
parents:
diff changeset
   332
        // we are interested only in the following settings in this class scope
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
        if(scene.contains(CxeSettingIds::FLASH_MODE)) {
hgs
parents:
diff changeset
   335
            CX_DEBUG(("CxeStillCaptureControlSymbian::handleSceneChanged scene->mFlashMode = %d", scene[CxeSettingIds::FLASH_MODE].toInt()));
hgs
parents:
diff changeset
   336
            updateFlashSetting(scene[CxeSettingIds::FLASH_MODE]);
hgs
parents:
diff changeset
   337
        }
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
        if(scene.contains(CxeSettingIds::LIGHT_SENSITIVITY)) {
hgs
parents:
diff changeset
   340
            updateISOSetting(scene[CxeSettingIds::LIGHT_SENSITIVITY]);
hgs
parents:
diff changeset
   341
        }
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
        if(scene.contains(CxeSettingIds::EV_COMPENSATION_VALUE)) {
hgs
parents:
diff changeset
   344
            updateEVCompensationSetting(scene[CxeSettingIds::EV_COMPENSATION_VALUE]);
hgs
parents:
diff changeset
   345
        }
hgs
parents:
diff changeset
   346
    }
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   349
}
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
/**
hgs
parents:
diff changeset
   352
 * UpdateFlashSetting
hgs
parents:
diff changeset
   353
 */
hgs
parents:
diff changeset
   354
void CxeStillCaptureControlDesktop::updateFlashSetting(QVariant newValue)
hgs
parents:
diff changeset
   355
{
hgs
parents:
diff changeset
   356
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
    Q_UNUSED(newValue);
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   361
}
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
/**
hgs
parents:
diff changeset
   364
 * UpdateISOSetting
hgs
parents:
diff changeset
   365
 */
hgs
parents:
diff changeset
   366
void CxeStillCaptureControlDesktop::updateISOSetting(QVariant newValue)
hgs
parents:
diff changeset
   367
{
hgs
parents:
diff changeset
   368
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   369
hgs
parents:
diff changeset
   370
    Q_UNUSED(newValue);
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   373
}
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
/**
hgs
parents:
diff changeset
   376
 * UpdateEVCompensationSetting
hgs
parents:
diff changeset
   377
 */
hgs
parents:
diff changeset
   378
void CxeStillCaptureControlDesktop::updateEVCompensationSetting(QVariant newValue)
hgs
parents:
diff changeset
   379
{
hgs
parents:
diff changeset
   380
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
    Q_UNUSED(newValue);
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   386
}
hgs
parents:
diff changeset
   387
hgs
parents:
diff changeset
   388
hgs
parents:
diff changeset
   389
/**
hgs
parents:
diff changeset
   390
 * ECam reference changing, release resources
hgs
parents:
diff changeset
   391
 */
hgs
parents:
diff changeset
   392
void CxeStillCaptureControlDesktop::prepareForCameraDelete()
hgs
parents:
diff changeset
   393
{
hgs
parents:
diff changeset
   394
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   395
    deinit();
hgs
parents:
diff changeset
   396
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   397
}
hgs
parents:
diff changeset
   398
hgs
parents:
diff changeset
   399
/**
hgs
parents:
diff changeset
   400
 * Camera being released. Cancel ongoing capture, if any.
hgs
parents:
diff changeset
   401
 */
hgs
parents:
diff changeset
   402
void CxeStillCaptureControlDesktop::prepareForRelease()
hgs
parents:
diff changeset
   403
{
hgs
parents:
diff changeset
   404
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   405
    deinit();
hgs
parents:
diff changeset
   406
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   407
}
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
/**
hgs
parents:
diff changeset
   410
 *  New camera available,
hgs
parents:
diff changeset
   411
 */
hgs
parents:
diff changeset
   412
void CxeStillCaptureControlDesktop::handleCameraAllocated(CxeError::Id error)
hgs
parents:
diff changeset
   413
{
hgs
parents:
diff changeset
   414
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
    if (error == CxeError::None) {
hgs
parents:
diff changeset
   417
        // load all still resoultions supported by ecam
hgs
parents:
diff changeset
   418
        // load all still qualities supported by icm
hgs
parents:
diff changeset
   419
        mSupportedImageQualities.clear();
hgs
parents:
diff changeset
   420
        // get list of supported image qualities based on camera index
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
    }
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   425
}
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
/**
hgs
parents:
diff changeset
   428
 * Return number of images captured (during current capture operation only).
hgs
parents:
diff changeset
   429
 */
hgs
parents:
diff changeset
   430
int CxeStillCaptureControlDesktop::imageCount() const
hgs
parents:
diff changeset
   431
{
hgs
parents:
diff changeset
   432
    return mImages.count();
hgs
parents:
diff changeset
   433
}
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
/**
hgs
parents:
diff changeset
   436
 * Reset the image array.
hgs
parents:
diff changeset
   437
 */
hgs
parents:
diff changeset
   438
void CxeStillCaptureControlDesktop::reset()
hgs
parents:
diff changeset
   439
{
hgs
parents:
diff changeset
   440
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
    qDeleteAll(mImages);
hgs
parents:
diff changeset
   443
    mImages.clear();
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
    mNextSnapshotIndex = 0;
hgs
parents:
diff changeset
   446
    mNextImageDataIndex = 0;
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   449
}
hgs
parents:
diff changeset
   450
hgs
parents:
diff changeset
   451
/**
hgs
parents:
diff changeset
   452
 * This should cancel any ongoing image captures.
hgs
parents:
diff changeset
   453
 */
hgs
parents:
diff changeset
   454
void CxeStillCaptureControlDesktop::cancelAll()
hgs
parents:
diff changeset
   455
{
hgs
parents:
diff changeset
   456
    mImageDataQueue->clear();
hgs
parents:
diff changeset
   457
    reset();
hgs
parents:
diff changeset
   458
}
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
/**
hgs
parents:
diff changeset
   461
 * Sets the current capture mode: SingleImageCapture / BurstCapture.
hgs
parents:
diff changeset
   462
 */
hgs
parents:
diff changeset
   463
void CxeStillCaptureControlDesktop::setMode(CaptureMode mode)
hgs
parents:
diff changeset
   464
{
hgs
parents:
diff changeset
   465
    mMode = mode;
hgs
parents:
diff changeset
   466
}
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
/**
hgs
parents:
diff changeset
   469
 * Returns the current capture mode.
hgs
parents:
diff changeset
   470
 */
hgs
parents:
diff changeset
   471
CxeStillCaptureControl::CaptureMode CxeStillCaptureControlDesktop::mode() const
hgs
parents:
diff changeset
   472
{
hgs
parents:
diff changeset
   473
    return mMode;
hgs
parents:
diff changeset
   474
}
hgs
parents:
diff changeset
   475
hgs
parents:
diff changeset
   476
/**
hgs
parents:
diff changeset
   477
 * Operator [] - returns the indexed image from capture array.
hgs
parents:
diff changeset
   478
 */
hgs
parents:
diff changeset
   479
CxeStillImage &CxeStillCaptureControlDesktop::operator[](int index)
hgs
parents:
diff changeset
   480
{
hgs
parents:
diff changeset
   481
    return *mImages[ index ];
hgs
parents:
diff changeset
   482
}
hgs
parents:
diff changeset
   483
hgs
parents:
diff changeset
   484
/**
hgs
parents:
diff changeset
   485
 * Getter for image data queue.
hgs
parents:
diff changeset
   486
 */
hgs
parents:
diff changeset
   487
CxeImageDataQueue &CxeStillCaptureControlDesktop::imageDataQueue()
hgs
parents:
diff changeset
   488
{
hgs
parents:
diff changeset
   489
    return *mImageDataQueue;
hgs
parents:
diff changeset
   490
}
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
/**
hgs
parents:
diff changeset
   493
 * Generates a filename and sets it in the still image object.
hgs
parents:
diff changeset
   494
 * Skips the process if filename already copied exists in the object. This
hgs
parents:
diff changeset
   495
 * behaviour is required in rare cases where image data arrives before snapshot.
hgs
parents:
diff changeset
   496
 */
hgs
parents:
diff changeset
   497
CxeError::Id CxeStillCaptureControlDesktop::prepareFilename(CxeStillImageDesktop *stillImage)
hgs
parents:
diff changeset
   498
{
hgs
parents:
diff changeset
   499
    CxeError::Id err = CxeError::None;
hgs
parents:
diff changeset
   500
    if (stillImage->filename().isEmpty()) {
hgs
parents:
diff changeset
   501
        QString path;
hgs
parents:
diff changeset
   502
hgs
parents:
diff changeset
   503
        QString fileExt = mCurrentImageDetails.mImageFileExtension;
hgs
parents:
diff changeset
   504
hgs
parents:
diff changeset
   505
        if (mMode == SingleImageCapture) {
hgs
parents:
diff changeset
   506
            err = mFilenameGenerator.generateFilename(path, fileExt);
hgs
parents:
diff changeset
   507
        }
hgs
parents:
diff changeset
   508
        else {
hgs
parents:
diff changeset
   509
            err = mFilenameGenerator.nextImageFilenameInSequence(path, fileExt);
hgs
parents:
diff changeset
   510
        }
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
        if (!err) {
hgs
parents:
diff changeset
   513
            CX_DEBUG(( "Next image file path: %s", path.toAscii().constData() ));
hgs
parents:
diff changeset
   514
            stillImage->setFilename(path);
hgs
parents:
diff changeset
   515
        }
hgs
parents:
diff changeset
   516
        else {
hgs
parents:
diff changeset
   517
            //! @todo: Error ID can be returned by this function.
hgs
parents:
diff changeset
   518
            // Also error can be detected from empty filename string.
hgs
parents:
diff changeset
   519
            CX_DEBUG(("ERROR in filename generation. err:%d", err));
hgs
parents:
diff changeset
   520
        }
hgs
parents:
diff changeset
   521
    }
hgs
parents:
diff changeset
   522
    return err;
hgs
parents:
diff changeset
   523
}
hgs
parents:
diff changeset
   524
hgs
parents:
diff changeset
   525
/*!
hgs
parents:
diff changeset
   526
* Helper method to set orientation data from the orientation sensor
hgs
parents:
diff changeset
   527
*/
hgs
parents:
diff changeset
   528
void CxeStillCaptureControlDesktop::setOrientation(QVariant sensorData)
hgs
parents:
diff changeset
   529
{
hgs
parents:
diff changeset
   530
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
    Q_UNUSED(sensorData);
hgs
parents:
diff changeset
   533
hgs
parents:
diff changeset
   534
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   535
}
hgs
parents:
diff changeset
   536
hgs
parents:
diff changeset
   537
/**
hgs
parents:
diff changeset
   538
 * Get the image container at given index or create a new one if needed.
hgs
parents:
diff changeset
   539
 */
hgs
parents:
diff changeset
   540
CxeStillImageDesktop* CxeStillCaptureControlDesktop::getImageForIndex(int index)
hgs
parents:
diff changeset
   541
{
hgs
parents:
diff changeset
   542
    CxeStillImageDesktop* image(NULL);
hgs
parents:
diff changeset
   543
hgs
parents:
diff changeset
   544
    if (mImages.count() <= index) {
hgs
parents:
diff changeset
   545
        image = new CxeStillImageDesktop();
hgs
parents:
diff changeset
   546
        image->setSnapshot(mCameraDevice.currentSnaphot());
hgs
parents:
diff changeset
   547
        mImages.append(image);
hgs
parents:
diff changeset
   548
    } else {
hgs
parents:
diff changeset
   549
        CX_DEBUG_ASSERT( mNextImageDataIndex >= 0 && index < mImages.count() );
hgs
parents:
diff changeset
   550
        image = mImages[index];
hgs
parents:
diff changeset
   551
    }
hgs
parents:
diff changeset
   552
    return image;
hgs
parents:
diff changeset
   553
}
hgs
parents:
diff changeset
   554
hgs
parents:
diff changeset
   555
hgs
parents:
diff changeset
   556
/*!
hgs
parents:
diff changeset
   557
* Slot to handle Autofocus events.
hgs
parents:
diff changeset
   558
*/
hgs
parents:
diff changeset
   559
void CxeStillCaptureControlDesktop::handleAutofocusStateChanged(
hgs
parents:
diff changeset
   560
                                         CxeAutoFocusControl::State newState,
hgs
parents:
diff changeset
   561
                                         CxeError::Id /*error*/ )
hgs
parents:
diff changeset
   562
{
hgs
parents:
diff changeset
   563
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   564
hgs
parents:
diff changeset
   565
    mAfState = newState;
hgs
parents:
diff changeset
   566
    CxeAutoFocusControl::Mode mode = mAutoFocusControl.mode();
hgs
parents:
diff changeset
   567
hgs
parents:
diff changeset
   568
    // if focused and in correct mode, play sound
hgs
parents:
diff changeset
   569
    if  (newState == CxeAutoFocusControl::Ready &&
hgs
parents:
diff changeset
   570
         mode != CxeAutoFocusControl::Hyperfocal &&
hgs
parents:
diff changeset
   571
         mode != CxeAutoFocusControl::Infinity) {
hgs
parents:
diff changeset
   572
    }
hgs
parents:
diff changeset
   573
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   574
}
hgs
parents:
diff changeset
   575
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
/*!
hgs
parents:
diff changeset
   578
* Returns supported image qualities based on the camera index
hgs
parents:
diff changeset
   579
* (primary/secondary).
hgs
parents:
diff changeset
   580
*/
hgs
parents:
diff changeset
   581
QList<CxeImageDetails> CxeStillCaptureControlDesktop::supportedImageQualities()
hgs
parents:
diff changeset
   582
{
hgs
parents:
diff changeset
   583
    return QList<CxeImageDetails>();
hgs
parents:
diff changeset
   584
}
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
/*!
hgs
parents:
diff changeset
   587
* Returns the number of images left for the current image quality setting
hgs
parents:
diff changeset
   588
*/
hgs
parents:
diff changeset
   589
int CxeStillCaptureControlDesktop::imagesLeft()
hgs
parents:
diff changeset
   590
{
hgs
parents:
diff changeset
   591
    return 100; // Stub: Dummy value
hgs
parents:
diff changeset
   592
}
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
// end of file