summaryrefslogtreecommitdiffstats
path: root/src/plugins/symbian/ecam/s60imagecapturesession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/symbian/ecam/s60imagecapturesession.cpp')
-rw-r--r--src/plugins/symbian/ecam/s60imagecapturesession.cpp1884
1 files changed, 0 insertions, 1884 deletions
diff --git a/src/plugins/symbian/ecam/s60imagecapturesession.cpp b/src/plugins/symbian/ecam/s60imagecapturesession.cpp
deleted file mode 100644
index 40bc5ad86..000000000
--- a/src/plugins/symbian/ecam/s60imagecapturesession.cpp
+++ /dev/null
@@ -1,1884 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qstring.h>
-#include <QtCore/qdir.h>
-
-#include "s60imagecapturesession.h"
-#include "s60videowidgetcontrol.h"
-#include "s60cameraservice.h"
-#include "s60cameraconstants.h"
-
-#include <fbs.h> // CFbsBitmap
-#include <pathinfo.h>
-#include <imageconversion.h> // ICL Decoder (for SnapShot) & Encoder (for Bitmap Images)
-
-S60ImageCaptureDecoder::S60ImageCaptureDecoder(S60ImageCaptureSession *imageSession,
- RFs *fileSystemAccess,
- const TDesC8 *data,
- const TDesC16 *fileName) :
- CActive(CActive::EPriorityStandard),
- m_imageSession(imageSession),
- m_fs(fileSystemAccess),
- m_jpegImageData(data),
- m_jpegImageFile(fileName),
- m_fileInput(false)
-{
- CActiveScheduler::Add(this);
-}
-
-S60ImageCaptureDecoder::~S60ImageCaptureDecoder()
-{
- if (m_imageDecoder) {
- delete m_imageDecoder;
- m_imageDecoder = 0;
- }
-}
-
-S60ImageCaptureDecoder *S60ImageCaptureDecoder::FileNewL(S60ImageCaptureSession *imageSession,
- RFs *fileSystemAccess,
- const TDesC16 *fileName)
-{
- S60ImageCaptureDecoder* self = new (ELeave) S60ImageCaptureDecoder(imageSession,
- fileSystemAccess,
- 0,
- fileName);
- CleanupStack::PushL(self);
- self->ConstructL(true);
- CleanupStack::Pop(self);
- return self;
-}
-
-S60ImageCaptureDecoder *S60ImageCaptureDecoder::DataNewL(S60ImageCaptureSession *imageSession,
- RFs *fileSystemAccess,
- const TDesC8 *data)
-{
- S60ImageCaptureDecoder* self = new (ELeave) S60ImageCaptureDecoder(imageSession,
- fileSystemAccess,
- data,
- 0);
- CleanupStack::PushL(self);
- self->ConstructL(false);
- CleanupStack::Pop(self);
- return self;
-}
-
-void S60ImageCaptureDecoder::ConstructL(const bool fileInput)
-{
- if (fileInput) {
- if (!m_imageSession || !m_fs || !m_jpegImageFile)
- User::Leave(KErrGeneral);
- m_imageDecoder = CImageDecoder::FileNewL(*m_fs, *m_jpegImageFile);
- } else {
- if (!m_imageSession || !m_fs || !m_jpegImageData)
- User::Leave(KErrGeneral);
- m_imageDecoder = CImageDecoder::DataNewL(*m_fs, *m_jpegImageData);
- }
-}
-
-void S60ImageCaptureDecoder::decode(CFbsBitmap *destBitmap)
-{
- if (m_imageDecoder) {
- m_imageDecoder->Convert(&iStatus, *destBitmap, 0);
- SetActive();
- }
- else
- m_imageSession->setError(KErrGeneral, QLatin1String("Preview image creation failed."));
-}
-
-TFrameInfo *S60ImageCaptureDecoder::frameInfo()
-{
- if (m_imageDecoder) {
- m_frameInfo = m_imageDecoder->FrameInfo();
- return &m_frameInfo;
- }
- else
- return 0;
-}
-
-void S60ImageCaptureDecoder::RunL()
-{
- m_imageSession->handleImageDecoded(iStatus.Int());
-}
-
-void S60ImageCaptureDecoder::DoCancel()
-{
- if (m_imageDecoder)
- m_imageDecoder->Cancel();
-}
-
-TInt S60ImageCaptureDecoder::RunError(TInt aError)
-{
- m_imageSession->setError(aError, QLatin1String("Preview image creation failed."));
- return KErrNone;
-}
-
-//=============================================================================
-
-S60ImageCaptureEncoder::S60ImageCaptureEncoder(S60ImageCaptureSession *imageSession,
- RFs *fileSystemAccess,
- const TDesC16 *fileName,
- TInt jpegQuality) :
- CActive(CActive::EPriorityStandard),
- m_imageSession(imageSession),
- m_fileSystemAccess(fileSystemAccess),
- m_fileName(fileName),
- m_jpegQuality(jpegQuality)
-{
- CActiveScheduler::Add(this);
-}
-
-S60ImageCaptureEncoder::~S60ImageCaptureEncoder()
-{
- if (m_frameImageData) {
- delete m_frameImageData;
- m_frameImageData = 0;
- }
- if (m_imageEncoder) {
- delete m_imageEncoder;
- m_imageEncoder = 0;
- }
-}
-
-S60ImageCaptureEncoder *S60ImageCaptureEncoder::NewL(S60ImageCaptureSession *imageSession,
- RFs *fileSystemAccess,
- const TDesC16 *fileName,
- TInt jpegQuality)
-{
- S60ImageCaptureEncoder* self = new (ELeave) S60ImageCaptureEncoder(imageSession,
- fileSystemAccess,
- fileName,
- jpegQuality);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
-}
-
-void S60ImageCaptureEncoder::ConstructL()
-{
- if (!m_imageSession || !m_fileSystemAccess || !m_fileName)
- User::Leave(KErrGeneral);
-
- m_imageEncoder = CImageEncoder::FileNewL(*m_fileSystemAccess,
- *m_fileName,
- CImageEncoder::EOptionNone,
- KImageTypeJPGUid);
- CleanupStack::PushL(m_imageEncoder);
-
- // Set Jpeg Quality
- m_frameImageData = CFrameImageData::NewL();
- CleanupStack::PushL(m_frameImageData);
-
- TJpegImageData* jpegFormat = new( ELeave ) TJpegImageData;
- CleanupStack::PushL(jpegFormat);
-
- jpegFormat->iQualityFactor = m_jpegQuality;
-
- // jpegFormat (TJpegImageData) ownership transferred to m_frameImageData (CFrameImageData)
- User::LeaveIfError( m_frameImageData->AppendImageData(jpegFormat));
-
- CleanupStack::Pop(jpegFormat);
- CleanupStack::Pop(m_frameImageData);
- CleanupStack::Pop(m_imageEncoder);
-}
-
-void S60ImageCaptureEncoder::encode(CFbsBitmap *sourceBitmap)
-{
- if (m_imageEncoder) {
- m_imageEncoder->Convert(&iStatus, *sourceBitmap, m_frameImageData);
- SetActive();
- }
- else
- m_imageSession->setError(KErrGeneral, QLatin1String("Saving image to file failed."));
-}
-
-void S60ImageCaptureEncoder::RunL()
-{
- m_imageSession->handleImageEncoded(iStatus.Int());
-}
-
-void S60ImageCaptureEncoder::DoCancel()
-{
- if (m_imageEncoder)
- m_imageEncoder->Cancel();
-}
-
-TInt S60ImageCaptureEncoder::RunError(TInt aError)
-{
- m_imageSession->setError(aError, QLatin1String("Saving image to file failed."));
- return KErrNone;
-}
-
-//=============================================================================
-
-S60ImageCaptureSession::S60ImageCaptureSession(QObject *parent) :
- QObject(parent),
- m_cameraEngine(0),
- m_advancedSettings(0),
- m_cameraInfo(0),
- m_previewBitmap(0),
- m_activeScheduler(0),
- m_fileSystemAccess(0),
- m_imageDecoder(0),
- m_imageEncoder(0),
- m_error(KErrNone),
- m_activeDeviceIndex(KDefaultCameraDevice),
- m_cameraStarted(false),
- m_icState(EImageCaptureNotPrepared),
- m_currentCodec(QString()),
- m_captureSize(QSize()),
- m_symbianImageQuality(QtMultimediaKit::HighQuality * KSymbianImageQualityCoefficient),
- m_captureSettingsSet(false),
- m_stillCaptureFileName(QString()),
- m_requestedStillCaptureFileName(QString()),
- m_currentImageId(0),
- m_captureWhenReady(false),
- m_previewDecodingOngoing(false),
- m_previewInWaitLoop(false)
-{
- // Define supported image codecs
- m_supportedImageCodecs << "image/jpeg";
-
- initializeImageCaptureSettings();
-
- // Install ActiveScheduler if needed
- if (!CActiveScheduler::Current()) {
- m_activeScheduler = new CActiveScheduler;
- CActiveScheduler::Install(m_activeScheduler);
- }
-}
-
-S60ImageCaptureSession::~S60ImageCaptureSession()
-{
- // Delete AdvancedSettings (Should already be destroyed by CameraControl)
- deleteAdvancedSettings();
-
- m_formats.clear();
- m_supportedImageCodecs.clear();
-
- if (m_imageDecoder) {
- m_imageDecoder->Cancel();
- delete m_imageDecoder;
- m_imageDecoder = 0;
- }
- if (m_imageEncoder) {
- m_imageEncoder->Cancel();
- delete m_imageEncoder;
- m_imageEncoder = 0;
- }
-
- if (m_previewBitmap) {
- delete m_previewBitmap;
- m_previewBitmap = 0;
- }
-
- // Uninstall ActiveScheduler if needed
- if (m_activeScheduler) {
- CActiveScheduler::Install(0);
- delete m_activeScheduler;
- m_activeScheduler = 0;
- }
-}
-
-CCamera::TFormat S60ImageCaptureSession::defaultImageFormat()
-{
- // Primary Camera
- if (m_activeDeviceIndex == 0)
- return KDefaultImageFormatPrimaryCam;
-
- // Secondary Camera or other
- else
- return KDefaultImageFormatSecondaryCam;
-}
-
-bool S60ImageCaptureSession::isDeviceReady()
-{
-#ifdef Q_CC_NOKIAX86 // Emulator
- return true;
-#endif
-
- if (m_cameraEngine)
- return m_cameraEngine->IsCameraReady();
-
- return false;
-}
-
-void S60ImageCaptureSession::deleteAdvancedSettings()
-{
- if (m_advancedSettings) {
- delete m_advancedSettings;
- m_advancedSettings = 0;
- emit advancedSettingChanged();
- }
-}
-
-void S60ImageCaptureSession::setCameraHandle(CCameraEngine* camerahandle)
-{
- if (camerahandle) {
- m_cameraEngine = camerahandle;
- resetSession();
-
- // Set default settings
- initializeImageCaptureSettings();
- }
-}
-
-void S60ImageCaptureSession::setCurrentDevice(TInt deviceindex)
-{
- m_activeDeviceIndex = deviceindex;
-}
-
-void S60ImageCaptureSession::notifySettingsSet()
-{
- m_captureSettingsSet = true;
-}
-
-void S60ImageCaptureSession::resetSession(bool errorHandling)
-{
- // Delete old AdvancedSettings
- deleteAdvancedSettings();
-
- m_captureWhenReady = false;
- m_previewDecodingOngoing = false;
- m_previewInWaitLoop = false;
- m_stillCaptureFileName = QString();
- m_requestedStillCaptureFileName = QString();
- m_icState = EImageCaptureNotPrepared;
-
- m_error = KErrNone;
- m_currentFormat = defaultImageFormat();
-
- int err = KErrNone;
- m_advancedSettings = S60CameraSettings::New(err, this, m_cameraEngine);
- if (err == KErrNotSupported) {
- m_advancedSettings = 0;
-#ifndef S60_31_PLATFORM // Post S60 3.1 Platform
- // Adv. settings may not be supported for other than the Primary Camera
- if (m_cameraEngine->CurrentCameraIndex() == 0)
- setError(err, tr("Unexpected camera error."));
-#endif // !S60_31_PLATFORM
- } else if (err != KErrNone) { // Other errors
- m_advancedSettings = 0;
- qWarning("Failed to create camera settings handler.");
- if (errorHandling)
- emit cameraError(QCamera::ServiceMissingError, tr("Failed to recover from error."));
- else
- setError(err, tr("Unexpected camera error."));
- return;
- }
-
- if (m_advancedSettings) {
- if (m_cameraEngine)
- m_cameraEngine->SetAdvancedObserver(m_advancedSettings);
- else
- setError(KErrNotReady, tr("Unexpected camera error."));
- }
-
- updateImageCaptureFormats();
-
- emit advancedSettingChanged();
-}
-
-S60CameraSettings* S60ImageCaptureSession::advancedSettings()
-{
- return m_advancedSettings;
-}
-
-/*
- * This function can be used both internally and from Control classes using
- * this session. The error notification will go to the client application
- * either through QCameraImageCapture (if captureError is true) or QCamera (if
- * captureError is false, default) error signal.
- */
-void S60ImageCaptureSession::setError(const TInt error,
- const QString &description,
- const bool captureError)
-{
- if (error == KErrNone)
- return;
-
- m_error = error;
- QCameraImageCapture::Error cameraError = fromSymbianErrorToQtMultimediaError(error);
-
- if (captureError) {
- emit this->captureError(m_currentImageId, cameraError, description);
- if (cameraError != QCameraImageCapture::NotSupportedFeatureError)
- resetSession(true);
- } else {
- emit this->cameraError(cameraError, description);
- if (cameraError != QCamera::NotSupportedFeatureError)
- resetSession(true);
- }
-}
-
-QCameraImageCapture::Error S60ImageCaptureSession::fromSymbianErrorToQtMultimediaError(int aError)
-{
- switch(aError) {
- case KErrNone:
- return QCameraImageCapture::NoError; // No errors have occurred
- case KErrNotReady:
- return QCameraImageCapture::NotReadyError; // Not ready for operation
- case KErrNotSupported:
- return QCameraImageCapture::NotSupportedFeatureError; // The feature is not supported
- case KErrNoMemory:
- return QCameraImageCapture::OutOfSpaceError; // Out of disk space
- case KErrNotFound:
- case KErrBadHandle:
- return QCameraImageCapture::ResourceError; // No resources available
-
- default:
- return QCameraImageCapture::ResourceError; // Other error has occurred
- }
-}
-
-int S60ImageCaptureSession::currentImageId() const
-{
- return m_currentImageId;
-}
-
-void S60ImageCaptureSession::initializeImageCaptureSettings()
-{
- if (m_captureSettingsSet)
- return;
-
- m_currentCodec = KDefaultImageCodec;
- m_captureSize = QSize(-1, -1);
- m_currentFormat = defaultImageFormat();
-
- // Resolution
- if (m_cameraEngine) {
- QList<QSize> resolutions = supportedCaptureSizesForCodec(imageCaptureCodec());
- foreach (QSize reso, resolutions) {
- if ((reso.width() * reso.height()) > (m_captureSize.width() * m_captureSize.height()))
- m_captureSize = reso;
- }
- } else {
- m_captureSize = KDefaultImageResolution;
- }
-
- m_symbianImageQuality = KDefaultImageQuality;
-}
-
-/*
- * This function selects proper format to be used for the captured image based
- * on the requested image codec.
- */
-CCamera::TFormat S60ImageCaptureSession::selectFormatForCodec(const QString &codec)
-{
- CCamera::TFormat format = CCamera::EFormatMonochrome;
-
- if (codec == "image/jpg" || codec == "image/jpeg") {
- // Primary Camera
- if (m_activeDeviceIndex == 0)
- format = KDefaultImageFormatPrimaryCam;
-
- // Secondary Camera or other
- else
- format = KDefaultImageFormatSecondaryCam;
-
- return format;
- }
-
- setError(KErrNotSupported, tr("Failed to select color format to be used with image codec."));
- return format;
-}
-
-int S60ImageCaptureSession::prepareImageCapture()
-{
- if (m_cameraEngine) {
- if (!m_cameraEngine->IsCameraReady()) {
- // Reset state to make sure camera is prepared before capturing image
- m_icState = EImageCaptureNotPrepared;
- return KErrNotReady;
- }
-
- // First set the quality
- CCamera *camera = m_cameraEngine->Camera();
- if (camera)
- camera->SetJpegQuality(m_symbianImageQuality);
- else
- setError(KErrNotReady, tr("Setting image quality failed."), true);
-
- // Then prepare with correct resolution and format
- TSize captureSize = TSize(m_captureSize.width(), m_captureSize.height());
- TRAPD(symbianError, m_cameraEngine->PrepareL(captureSize, m_currentFormat));
- if (!symbianError)
- m_icState = EImageCapturePrepared;
-
- // Check if CaptureSize was modified
- if (captureSize.iWidth != m_captureSize.width() || captureSize.iHeight != m_captureSize.height())
- m_captureSize = QSize(captureSize.iWidth, captureSize.iHeight);
- emit captureSizeChanged(m_captureSize);
-
-#ifdef ECAM_PREVIEW_API
- // Subscribe previews
- MCameraPreviewObserver *observer = this;
- m_cameraEngine->EnablePreviewProvider(observer);
-#endif // ECAM_PREVIEW_API
-
- return symbianError;
- }
-
- return KErrGeneral;
-}
-
-void S60ImageCaptureSession::releaseImageCapture()
-{
- // Make sure ImageCapture is prepared the next time it is being activated
- m_icState = EImageCaptureNotPrepared;
-
-#ifdef ECAM_PREVIEW_API
- // Cancel preview subscription
- m_cameraEngine->DisablePreviewProvider();
-#endif // ECAM_PREVIEW_API
-}
-
-int S60ImageCaptureSession::capture(const QString &fileName)
-{
- if (!m_cameraStarted) {
- m_captureWhenReady = true;
- m_requestedStillCaptureFileName = fileName; // Save name, it will be processed during actual capture
- return 0;
- }
-
- if (m_icState < EImageCapturePrepared) {
- int prepareSuccess = prepareImageCapture();
- if (prepareSuccess) {
- setError(prepareSuccess, tr("Failure during image capture preparation."), true);
- return 0;
- }
- } else if (m_icState > EImageCapturePrepared) {
- setError(KErrNotReady, tr("Previous operation is still ongoing."), true);
- return 0;
- }
-
- m_icState = EImageCaptureCapturing;
-
- // Give new ID for the new image
- m_currentImageId += 1;
-
- emit readyForCaptureChanged(false);
-
- processFileName(fileName);
-
- if (m_cameraEngine) {
- TRAPD(err, m_cameraEngine->CaptureL());
- setError(err, tr("Image capture failed."), true);
- } else {
- setError(KErrNotReady, tr("Unexpected camera error."), true);
- }
-
-#ifdef Q_CC_NOKIAX86 // Emulator
- QImage *snapImage = new QImage(QLatin1String("C:/Data/testimage.jpg"));
- emit imageExposed(m_currentImageId);
- emit imageCaptured(m_currentImageId, *snapImage);
- emit imageSaved(m_currentImageId, m_stillCaptureFileName);
-#endif // Q_CC_NOKIAX86
-
- return m_currentImageId;
-}
-
-void S60ImageCaptureSession::cancelCapture()
-{
- if (m_icState != EImageCaptureCapturing)
- return;
-
- if (m_cameraEngine)
- m_cameraEngine->CancelCapture();
-
- m_icState = EImageCapturePrepared;
-}
-
-void S60ImageCaptureSession::processFileName(const QString &fileName)
-{
- // Empty FileName - Use default file name and path (C:\Data\Images\image.jpg)
- if (fileName.isEmpty()) {
- // Make sure default directory exists
- QDir videoDir(QDir::rootPath());
- if (!videoDir.exists(KDefaultImagePath))
- videoDir.mkpath(KDefaultImagePath);
- QString defaultFile = KDefaultImagePath;
- defaultFile.append("\\");
- defaultFile.append(KDefaultImageFileName);
- m_stillCaptureFileName = defaultFile;
-
- } else { // Not empty
-
- QString fullFileName;
-
- // Relative FileName
- if (!fileName.contains(":")) {
- // Extract file name and path from the URL
- fullFileName = KDefaultImagePath;
- if (fileName.at(0) != '\\')
- fullFileName.append("\\");
- fullFileName.append(QDir::toNativeSeparators(QDir::cleanPath(fileName)));
-
- // Absolute FileName
- } else {
- // Extract file name and path from the given location
- fullFileName = QDir::toNativeSeparators(QDir::cleanPath(fileName));
- }
-
- QString fileNameOnly = fullFileName.right(fullFileName.length() - fullFileName.lastIndexOf("\\") - 1);
- QString directory = fullFileName.left(fullFileName.lastIndexOf("\\"));
- if (directory.lastIndexOf("\\") == (directory.length() - 1))
- directory = directory.left(directory.length() - 1);
-
- // URL is Absolute path, not including file name
- if (!fileNameOnly.contains(".")) {
- if (fileNameOnly != "") {
- directory.append("\\");
- directory.append(fileNameOnly);
- }
- fileNameOnly = KDefaultImageFileName;
- }
-
- // Make sure absolute directory exists
- QDir imageDir(QDir::rootPath());
- if (!imageDir.exists(directory))
- imageDir.mkpath(directory);
-
- QString resolvedFileName = directory;
- resolvedFileName.append("\\");
- resolvedFileName.append(fileNameOnly);
- m_stillCaptureFileName = resolvedFileName;
- }
-}
-
-void S60ImageCaptureSession::MceoFocusComplete()
-{
- emit focusStatusChanged(QCamera::Locked, QCamera::LockAcquired);
-}
-
-void S60ImageCaptureSession::MceoCapturedDataReady(TDesC8* aData)
-{
- emit imageExposed(m_currentImageId);
-
- m_icState = EImageCaptureWritingImage;
-
- TFileName path = convertImagePath();
-
- // Try to save image and inform if it was succcesful
- TRAPD(err, saveImageL(aData, path));
- if (err) {
- if (m_previewDecodingOngoing)
- m_previewDecodingOngoing = false; // Reset
-
- setError(err, tr("Writing captured image to a file failed."), true);
- m_icState = EImageCapturePrepared;
- return;
- }
-
- m_icState = EImageCapturePrepared;
-
-}
-
-void S60ImageCaptureSession::MceoCapturedBitmapReady(CFbsBitmap* aBitmap)
-{
- emit imageExposed(m_currentImageId);
-
- m_icState = EImageCaptureWritingImage;
-
- if(aBitmap)
- {
-#ifndef ECAM_PREVIEW_API
- if (m_previewDecodingOngoing) {
- m_previewInWaitLoop = true;
- CActiveScheduler::Start(); // Wait for the completion of the previous Preview generation
- }
-
- // Delete old instances if needed
- if (m_imageDecoder) {
- delete m_imageDecoder;
- m_imageDecoder = 0;
- }
- if (m_previewBitmap) {
- delete m_previewBitmap;
- m_previewBitmap = 0;
- }
-#endif // ECAM_CAMERA_API
- if (m_imageEncoder) {
- delete m_imageEncoder;
- m_imageEncoder = 0;
- }
- if (m_fileSystemAccess) {
- m_fileSystemAccess->Close();
- delete m_fileSystemAccess;
- m_fileSystemAccess = 0;
- }
-
- TInt saveError = KErrNone;
- TFileName path = convertImagePath();
-
- // Create FileSystem access
- m_fileSystemAccess = new RFs;
- if (!m_fileSystemAccess) {
- setError(KErrNoMemory, tr("Failed to write captured image to a file."));
- return;
- }
- saveError = m_fileSystemAccess->Connect();
- if (saveError) {
- setError(saveError, tr("Failed to write captured image to a file."));
- return;
- }
-
- TRAP(saveError, m_imageEncoder = S60ImageCaptureEncoder::NewL(this,
- m_fileSystemAccess,
- &path,
- m_symbianImageQuality));
- if (saveError)
- setError(saveError, tr("Saving captured image failed."), true);
- m_previewDecodingOngoing = true;
- m_imageEncoder->encode(aBitmap);
-
- } else {
- setError(KErrBadHandle, tr("Unexpected camera error."), true);
- }
-
- m_icState = EImageCapturePrepared;
-}
-
-void S60ImageCaptureSession::MceoHandleError(TCameraEngineError aErrorType, TInt aError)
-{
- Q_UNUSED(aErrorType);
- setError(aError, tr("General camera error."));
-}
-
-TFileName S60ImageCaptureSession::convertImagePath()
-{
- TFileName path = KNullDesC();
-
- // Convert to Symbian path
- TPtrC16 attachmentPath(KNullDesC);
-
- // Path is already included in filename
- attachmentPath.Set(reinterpret_cast<const TUint16*>(QDir::toNativeSeparators(m_stillCaptureFileName).utf16()));
- path.Append(attachmentPath);
-
- return path;
-}
-
-/*
- * Creates (asynchronously) Preview Image from Jpeg ImageBuffer and also
- * writes Jpeg (synchronously) to a file.
- */
-void S60ImageCaptureSession::saveImageL(TDesC8 *aData, TFileName &aPath)
-{
- if (aData == 0)
- setError(KErrGeneral, tr("Captured image data is not available."), true);
-
- if (aPath.Size() > 0) {
-#ifndef ECAM_PREVIEW_API
- if (m_previewDecodingOngoing) {
- m_previewInWaitLoop = true;
- CActiveScheduler::Start(); // Wait for the completion of the previous Preview generation
- }
-
- // Delete old instances if needed
- if (m_imageDecoder) {
- delete m_imageDecoder;
- m_imageDecoder = 0;
- }
- if (m_previewBitmap) {
- delete m_previewBitmap;
- m_previewBitmap = 0;
- }
-#endif // ECAM_PREVIEW_API
- if (m_fileSystemAccess) {
- m_fileSystemAccess->Close();
- delete m_fileSystemAccess;
- m_fileSystemAccess = 0;
- }
-
- RFs *fileSystemAccess = new (ELeave) RFs;
- User::LeaveIfError(fileSystemAccess->Connect());
- CleanupClosePushL(*fileSystemAccess);
-
-#ifndef ECAM_PREVIEW_API
- // Generate Thumbnail to be used as Preview
- S60ImageCaptureDecoder *imageDecoder = S60ImageCaptureDecoder::DataNewL(this, fileSystemAccess, aData);
- CleanupStack::PushL(imageDecoder);
-
- // Set proper Preview Size
- TSize scaledSize((m_captureSize.width() / KSnapshotDownScaleFactor), (m_captureSize.height() / KSnapshotDownScaleFactor));
- if (scaledSize.iWidth < KSnapshotMinWidth || scaledSize.iHeight < KSnapshotMinHeight)
- scaledSize.SetSize((m_captureSize.width() / (KSnapshotDownScaleFactor/2)), (m_captureSize.height() / (KSnapshotDownScaleFactor/2)));
- if (scaledSize.iWidth < KSnapshotMinWidth || scaledSize.iHeight < KSnapshotMinHeight)
- scaledSize.SetSize((m_captureSize.width() / (KSnapshotDownScaleFactor/4)), (m_captureSize.height() / (KSnapshotDownScaleFactor/4)));
- if (scaledSize.iWidth < KSnapshotMinWidth || scaledSize.iHeight < KSnapshotMinHeight)
- scaledSize.SetSize(m_captureSize.width(), m_captureSize.height());
-
- TFrameInfo *info = imageDecoder->frameInfo();
- if (!info) {
- setError(KErrGeneral, tr("Preview image creation failed."));
- return;
- }
-
- CFbsBitmap *previewBitmap = new (ELeave) CFbsBitmap;
- CleanupStack::PushL(previewBitmap);
- TInt bitmapCreationErr = previewBitmap->Create(scaledSize, info->iFrameDisplayMode);
- if (bitmapCreationErr) {
- setError(bitmapCreationErr, tr("Preview creation failed."));
- return;
- }
-
- // Jpeg conversion completes in RunL
- m_previewDecodingOngoing = true;
- imageDecoder->decode(previewBitmap);
-#endif // ECAM_PREVIEW_API
-
- RFile file;
- TInt fileWriteErr = KErrNone;
- fileWriteErr = file.Replace(*fileSystemAccess, aPath, EFileWrite);
- if (fileWriteErr)
- User::Leave(fileWriteErr);
- CleanupClosePushL(file); // Close if Leaves
-
- fileWriteErr = file.Write(*aData);
- if (fileWriteErr)
- User::Leave(fileWriteErr);
-
- CleanupStack::PopAndDestroy(&file);
-#ifdef ECAM_PREVIEW_API
- CleanupStack::PopAndDestroy(fileSystemAccess);
-#else // !ECAM_PREVIEW_API
- // Delete when Image is decoded
- CleanupStack::Pop(previewBitmap);
- CleanupStack::Pop(imageDecoder);
- CleanupStack::Pop(fileSystemAccess);
-
- // Set member variables (Cannot leave any more)
- m_previewBitmap = previewBitmap;
- m_imageDecoder = imageDecoder;
- m_fileSystemAccess = fileSystemAccess;
-#endif // ECAM_PREVIEW_API
-
- emit imageSaved(m_currentImageId, m_stillCaptureFileName);
-
- // Inform that we can continue taking more pictures
- emit readyForCaptureChanged(true);
-
- // For custom preview generation, image buffer gets released in RunL()
-#ifdef ECAM_PREVIEW_API
- releaseImageBuffer();
-#endif // ECAM_PREVIEW_API
-
- } else {
- setError(KErrPathNotFound, tr("Invalid path given."), true);
- }
-}
-
-void S60ImageCaptureSession::releaseImageBuffer()
-{
- if (m_cameraEngine)
- m_cameraEngine->ReleaseImageBuffer();
- else
- setError(KErrNotReady, tr("Unexpected camera error."), true);
-}
-
-/*
- * Queries camera properties
- * Results are returned to member variable m_info
- *
- * @return boolean indicating if querying the info was a success
- */
-bool S60ImageCaptureSession::queryCurrentCameraInfo()
-{
- if (m_cameraEngine) {
- m_cameraInfo = m_cameraEngine->CameraInfo();
- return true;
- }
-
- return false;
-}
-
-/*
- * This function handles different camera status changes
- */
-void S60ImageCaptureSession::cameraStatusChanged(QCamera::Status status)
-{
- if (status == QCamera::ActiveStatus) {
- m_cameraStarted = true;
- if (m_captureWhenReady)
- capture(m_requestedStillCaptureFileName);
- }else if (status == QCamera::UnloadedStatus) {
- m_cameraStarted = false;
- m_icState = EImageCaptureNotPrepared;
- }
- else
- m_cameraStarted = false;
-}
-
-QSize S60ImageCaptureSession::captureSize() const
-{
- return m_captureSize;
-}
-
-QSize S60ImageCaptureSession::minimumCaptureSize()
-{
- return supportedCaptureSizesForCodec(formatMap().key(m_currentFormat)).first();
-}
-QSize S60ImageCaptureSession::maximumCaptureSize()
-{
- return supportedCaptureSizesForCodec(formatMap().key(m_currentFormat)).last();
-}
-
-void S60ImageCaptureSession::setCaptureSize(const QSize &size)
-{
- if (size.isNull() ||
- size.isEmpty() ||
- size == QSize(-1,-1)) {
- // An empty QSize indicates the encoder should make an optimal choice based on what is
- // available from the image source and the limitations of the codec.
- m_captureSize = supportedCaptureSizesForCodec(formatMap().key(m_currentFormat)).last();
- }
- else
- m_captureSize = size;
-}
-
-QList<QSize> S60ImageCaptureSession::supportedCaptureSizesForCodec(const QString &codecName)
-{
- QList<QSize> list;
-
- // If we have CameraEngine loaded and we can update CameraInfo
- if (m_cameraEngine && queryCurrentCameraInfo()) {
- CCamera::TFormat format;
- if (codecName == "")
- format = defaultImageFormat();
- else
- format = selectFormatForCodec(codecName);
-
- CCamera *camera = m_cameraEngine->Camera();
- TSize imageSize;
- if (camera) {
- for (int i = 0; i < m_cameraInfo->iNumImageSizesSupported; i++) {
- camera->EnumerateCaptureSizes(imageSize, i, format);
- list << QSize(imageSize.iWidth, imageSize.iHeight); // Add resolution to the list
- }
- }
- }
-
-#ifdef Q_CC_NOKIAX86 // Emulator
- // Add some for testing purposes
- list << QSize(50, 50);
- list << QSize(100, 100);
- list << QSize(800,600);
-#endif
-
- return list;
-}
-
-QMap<QString, int> S60ImageCaptureSession::formatMap()
-{
- QMap<QString, int> formats;
-
- // Format list copied from CCamera::TFormat (in ecam.h)
- formats.insert("Monochrome", 0x0001);
- formats.insert("16bitRGB444", 0x0002);
- formats.insert("16BitRGB565", 0x0004);
- formats.insert("32BitRGB888", 0x0008);
- formats.insert("Jpeg", 0x0010);
- formats.insert("Exif", 0x0020);
- formats.insert("FbsBitmapColor4K", 0x0040);
- formats.insert("FbsBitmapColor64K", 0x0080);
- formats.insert("FbsBitmapColor16M", 0x0100);
- formats.insert("UserDefined", 0x0200);
- formats.insert("YUV420Interleaved", 0x0400);
- formats.insert("YUV420Planar", 0x0800);
- formats.insert("YUV422", 0x1000);
- formats.insert("YUV422Reversed", 0x2000);
- formats.insert("YUV444", 0x4000);
- formats.insert("YUV420SemiPlanar", 0x8000);
- formats.insert("FbsBitmapColor16MU", 0x00010000);
- formats.insert("MJPEG", 0x00020000);
- formats.insert("EncodedH264", 0x00040000);
-
- return formats;
-}
-
-QMap<QString, QString> S60ImageCaptureSession::codecDescriptionMap()
-{
- QMap<QString, QString> formats;
-
- formats.insert("image/jpg", "JPEG image codec");
-
- return formats;
-}
-
-QStringList S60ImageCaptureSession::supportedImageCaptureCodecs()
-{
-#ifdef Q_CC_NOKIAX86 // Emulator
- return formatMap().keys();
-#endif
-
- return m_supportedImageCodecs;
-}
-
-void S60ImageCaptureSession::updateImageCaptureFormats()
-{
- m_formats.clear();
- if (m_cameraEngine && queryCurrentCameraInfo()) {
- TUint32 supportedFormats = m_cameraInfo->iImageFormatsSupported;
-
-#ifdef S60_3X_PLATFORM // S60 3.1 & 3.2
- int maskEnd = CCamera::EFormatFbsBitmapColor16MU;
-#else // S60 5.0 or later
- int maskEnd = CCamera::EFormatEncodedH264;
-#endif // S60_3X_PLATFORM
-
- for (int mask = CCamera::EFormatMonochrome; mask <= maskEnd; mask <<= 1) {
- if (supportedFormats & mask)
- m_formats << mask; // Store mask of supported format
- }
- }
-}
-
-QString S60ImageCaptureSession::imageCaptureCodec()
-{
- return m_currentCodec;
-}
-void S60ImageCaptureSession::setImageCaptureCodec(const QString &codecName)
-{
- if (!codecName.isEmpty()) {
- if (supportedImageCaptureCodecs().contains(codecName, Qt::CaseInsensitive) ||
- codecName == "image/jpg") {
- m_currentCodec = codecName;
- m_currentFormat = selectFormatForCodec(m_currentCodec);
- } else {
- setError(KErrNotSupported, tr("Requested image codec is not supported"));
- }
- } else {
- m_currentCodec = KDefaultImageCodec;
- m_currentFormat = selectFormatForCodec(m_currentCodec);
- }
-}
-
-QString S60ImageCaptureSession::imageCaptureCodecDescription(const QString &codecName)
-{
- QString description = codecDescriptionMap().value(codecName);
- return description;
-}
-
-QtMultimediaKit::EncodingQuality S60ImageCaptureSession::captureQuality() const
-{
- switch (m_symbianImageQuality) {
- case KJpegQualityVeryLow:
- return QtMultimediaKit::VeryLowQuality;
- case KJpegQualityLow:
- return QtMultimediaKit::LowQuality;
- case KJpegQualityNormal:
- return QtMultimediaKit::NormalQuality;
- case KJpegQualityHigh:
- return QtMultimediaKit::HighQuality;
- case KJpegQualityVeryHigh:
- return QtMultimediaKit::VeryHighQuality;
-
- default:
- // Return normal as default
- return QtMultimediaKit::NormalQuality;
- }
-}
-
-void S60ImageCaptureSession::setCaptureQuality(const QtMultimediaKit::EncodingQuality &quality)
-{
- // Use sensible presets
- switch (quality) {
- case QtMultimediaKit::VeryLowQuality:
- m_symbianImageQuality = KJpegQualityVeryLow;
- break;
- case QtMultimediaKit::LowQuality:
- m_symbianImageQuality = KJpegQualityLow;
- break;
- case QtMultimediaKit::NormalQuality:
- m_symbianImageQuality = KJpegQualityNormal;
- break;
- case QtMultimediaKit::HighQuality:
- m_symbianImageQuality = KJpegQualityHigh;
- break;
- case QtMultimediaKit::VeryHighQuality:
- m_symbianImageQuality = KJpegQualityVeryHigh;
- break;
-
- default:
- m_symbianImageQuality = quality * KSymbianImageQualityCoefficient;
- break;
- }
-}
-
-qreal S60ImageCaptureSession::maximumZoom()
-{
- qreal maxZoomFactor = 1.0;
-
- if (queryCurrentCameraInfo()) {
- maxZoomFactor = m_cameraInfo->iMaxZoomFactor;
-
- if (maxZoomFactor == 0.0 || maxZoomFactor == 1.0) {
- return 1.0; // Not supported
- } else {
- return maxZoomFactor;
- }
- } else {
- return 1.0;
- }
-}
-
-qreal S60ImageCaptureSession::minZoom()
-{
- qreal minZoomValue = 1.0;
-
- if (queryCurrentCameraInfo()) {
- minZoomValue = m_cameraInfo->iMinZoomFactor;
- if (minZoomValue == 0.0 || minZoomValue == 1.0)
- return 1.0; // Macro Zoom is not supported
- else {
- return minZoomValue;
- }
-
- } else {
- return 1.0;
- }
-}
-
-qreal S60ImageCaptureSession::maxDigitalZoom()
-{
- qreal maxDigitalZoomFactor = 1.0;
-
- if (queryCurrentCameraInfo()) {
- maxDigitalZoomFactor = m_cameraInfo->iMaxDigitalZoomFactor;
- return maxDigitalZoomFactor;
- } else {
- return 1.0;
- }
-}
-
-void S60ImageCaptureSession::doSetZoomFactorL(qreal optical, qreal digital)
-{
-#if !defined(USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER) & !defined(USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER)
- // Convert Zoom Factor to Zoom Value if AdvSettings are not available
- int digitalSymbian = (digital * m_cameraInfo->iMaxDigitalZoom) / maxDigitalZoom();
- if (m_cameraInfo->iMaxDigitalZoom != 0 && digital == 1.0)
- digitalSymbian = 1; // Make sure zooming out to initial value if requested
-#endif // !USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER & !USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER
-
- if (m_cameraEngine && !m_cameraEngine->IsCameraReady())
- return;
-
- if (m_cameraEngine && queryCurrentCameraInfo()) {
- CCamera *camera = m_cameraEngine->Camera();
- if (camera) {
-
- // Optical Zoom
- if (!qFuzzyCompare(optical, qreal(1.0)) && !qFuzzyCompare(optical, qreal(0.0))) {
- setError(KErrNotSupported, tr("Requested optical zoom factor is not supported."));
- return;
- }
-
- // Digital Zoom (Smooth Zoom - Zoom value set in steps)
- if (digital != digitalZoomFactor()) {
- if ((digital > 1.0 || qFuzzyCompare(digital, qreal(1.0))) &&
- digital <= m_cameraInfo->iMaxDigitalZoomFactor) {
-#if defined(USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER) | defined(USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER)
- if (m_advancedSettings) {
- qreal currentZoomFactor = m_advancedSettings->digitalZoomFactorL();
-
- QList<qreal> smoothZoomSetValues;
- QList<qreal> factors = m_advancedSettings->supportedDigitalZoomFactors();
- if (currentZoomFactor < digital) {
- for (int i = 0; i < factors.count(); ++i) {
- if (factors.at(i) > currentZoomFactor && factors.at(i) < digital)
- smoothZoomSetValues << factors.at(i);
- }
-
- for (int i = 0; i < smoothZoomSetValues.count(); i = i + KSmoothZoomStep) {
- m_advancedSettings->setDigitalZoomFactorL(smoothZoomSetValues[i]); // Using Zoom Factor
- }
-
- } else {
- for (int i = 0; i < factors.count(); ++i) {
- if (factors.at(i) < currentZoomFactor && factors.at(i) > digital)
- smoothZoomSetValues << factors.at(i);
- }
-
- for (int i = (smoothZoomSetValues.count() - 1); i >= 0; i = i - KSmoothZoomStep) {
- m_advancedSettings->setDigitalZoomFactorL(smoothZoomSetValues[i]); // Using Zoom Factor
- }
- }
-
- // Set final value
- m_advancedSettings->setDigitalZoomFactorL(digital);
- }
- else
- setError(KErrNotReady, tr("Zooming failed."));
-#else // No advanced settigns
- // Define zoom steps
- int currentZoomFactor = camera->DigitalZoomFactor();
- int difference = abs(currentZoomFactor - digitalSymbian);
- int midZoomValue = currentZoomFactor;
-
- if (currentZoomFactor < digitalSymbian) {
- while (midZoomValue < (digitalSymbian - KSmoothZoomStep)) {
- midZoomValue = midZoomValue + KSmoothZoomStep;
- camera->SetDigitalZoomFactorL(midZoomValue);
- }
- } else {
- while (midZoomValue > (digitalSymbian + KSmoothZoomStep)) {
- midZoomValue = midZoomValue - KSmoothZoomStep;
- camera->SetDigitalZoomFactorL(midZoomValue);
- }
- }
-
- // Set final and emit signal
- camera->SetDigitalZoomFactorL(digitalSymbian);
-#endif // USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER | USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER
- } else {
- setError(KErrNotSupported, tr("Requested digital zoom factor is not supported."));
- return;
- }
- }
- }
- } else {
- setError(KErrGeneral, tr("Unexpected camera error."));
- }
-}
-
-qreal S60ImageCaptureSession::opticalZoomFactor()
-{
- qreal factor = 1.0;
-
-#if defined(USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER) | defined(USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER)
- if (m_advancedSettings) {
- TRAPD(err, factor = m_advancedSettings->opticalZoomFactorL());
- if (err)
- return 1.0;
- }
-#else // No advanced settigns
- if (m_cameraEngine && m_cameraInfo) {
- if (m_cameraEngine->Camera()) {
- if (m_cameraInfo->iMaxZoom != 0)
- factor = (m_cameraEngine->Camera()->ZoomFactor()* maximumZoom()) / m_cameraInfo->iMaxZoom;
- else
- factor = 1.0;
- }
- }
-#endif // USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER | USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER
-
- if (factor == 0.0) // If not supported
- factor = 1.0;
-
- return factor;
-}
-
-qreal S60ImageCaptureSession::digitalZoomFactor()
-{
- qreal factor = 1.0;
-
-#if defined(USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER) | defined(USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER)
- if (m_advancedSettings) {
- TRAPD(err, factor = m_advancedSettings->digitalZoomFactorL());
- if (err)
- return 1.0;
- }
-#else // No advanced settigns
- if (m_cameraEngine && m_cameraInfo) {
- if (m_cameraEngine->Camera()) {
- if (m_cameraInfo->iMaxDigitalZoom != 0)
- factor = (m_cameraEngine->Camera()->DigitalZoomFactor()* maxDigitalZoom()) / m_cameraInfo->iMaxDigitalZoom;
- else
- factor = 1.0;
- }
- }
-#endif // USE_S60_32_ECAM_ADVANCED_SETTINGS_HEADER | USE_S60_50_ECAM_ADVANCED_SETTINGS_HEADER
-
- if (factor == 0.0)
- factor = 1.0;
-
- return factor;
-}
-
-void S60ImageCaptureSession::setFlashMode(QCameraExposure::FlashModes mode)
-{
- TRAPD(err, doSetFlashModeL(mode));
- setError(err, tr("Failed to set flash mode."));
-}
-
-void S60ImageCaptureSession::doSetFlashModeL(QCameraExposure::FlashModes mode)
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- CCamera *camera = m_cameraEngine->Camera();
- switch(mode) {
- case QCameraExposure::FlashOff:
- camera->SetFlashL(CCamera::EFlashNone);
- break;
- case QCameraExposure::FlashAuto:
- camera->SetFlashL(CCamera::EFlashAuto);
- break;
- case QCameraExposure::FlashOn:
- camera->SetFlashL(CCamera::EFlashForced);
- break;
- case QCameraExposure::FlashRedEyeReduction:
- camera->SetFlashL(CCamera::EFlashRedEyeReduce);
- break;
- case QCameraExposure::FlashFill:
- camera->SetFlashL(CCamera::EFlashFillIn);
- break;
-
- default:
- setError(KErrNotSupported, tr("Requested flash mode is not suported"));
- break;
- }
- } else {
- setError(KErrNotReady, tr("Unexpected camera error."));
- }
-}
-
-QCameraExposure::FlashMode S60ImageCaptureSession::flashMode()
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- CCamera *camera = m_cameraEngine->Camera();
- switch(camera->Flash()) {
- case CCamera::EFlashAuto:
- return QCameraExposure::FlashAuto;
- case CCamera::EFlashForced:
- return QCameraExposure::FlashOn;
- case CCamera::EFlashRedEyeReduce:
- return QCameraExposure::FlashRedEyeReduction;
- case CCamera::EFlashFillIn:
- return QCameraExposure::FlashFill;
- case CCamera::EFlashNone:
- return QCameraExposure::FlashOff;
-
- default:
- return QCameraExposure::FlashAuto; // Most probable default
- }
- } else {
- setError(KErrNotReady, tr("Unexpected camera error."));
- }
-
- return QCameraExposure::FlashOff;
-}
-
-QCameraExposure::FlashModes S60ImageCaptureSession::supportedFlashModes()
-{
- QCameraExposure::FlashModes modes = QCameraExposure::FlashOff;
-
- if (queryCurrentCameraInfo()) {
- TInt supportedModes = m_cameraInfo->iFlashModesSupported;
-
- if (supportedModes == 0)
- return modes;
-
- if (supportedModes & CCamera::EFlashManual)
- modes |= QCameraExposure::FlashOff;
- if (supportedModes & CCamera::EFlashForced)
- modes |= QCameraExposure::FlashOn;
- if (supportedModes & CCamera::EFlashAuto)
- modes |= QCameraExposure::FlashAuto;
- if (supportedModes & CCamera::EFlashFillIn)
- modes |= QCameraExposure::FlashFill;
- if (supportedModes & CCamera::EFlashRedEyeReduce)
- modes |= QCameraExposure::FlashRedEyeReduction;
- }
-
- return modes;
-}
-
-QCameraExposure::ExposureMode S60ImageCaptureSession::exposureMode()
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- CCamera* camera = m_cameraEngine->Camera();
- switch(camera->Exposure()) {
- case CCamera::EExposureManual:
- return QCameraExposure::ExposureManual;
- case CCamera::EExposureAuto:
- return QCameraExposure::ExposureAuto;
- case CCamera::EExposureNight:
- return QCameraExposure::ExposureNight;
- case CCamera::EExposureBacklight:
- return QCameraExposure::ExposureBacklight;
- case CCamera::EExposureSport:
- return QCameraExposure::ExposureSports;
- case CCamera::EExposureSnow:
- return QCameraExposure::ExposureSnow;
- case CCamera::EExposureBeach:
- return QCameraExposure::ExposureBeach;
-
- default:
- return QCameraExposure::ExposureAuto;
- }
- }
-
- return QCameraExposure::ExposureAuto;
-}
-
-bool S60ImageCaptureSession::isExposureModeSupported(QCameraExposure::ExposureMode mode) const
-{
- TInt supportedModes = m_cameraInfo->iExposureModesSupported;
-
- if (supportedModes == 0)
- return false;
-
- switch (mode) {
- case QCameraExposure::ExposureManual:
- if(supportedModes & CCamera::EExposureManual)
- return true;
- else
- return false;
- case QCameraExposure::ExposureAuto:
- return true; // Always supported
- case QCameraExposure::ExposureNight:
- if(supportedModes & CCamera::EExposureNight)
- return true;
- else
- return false;
- case QCameraExposure::ExposureBacklight:
- if(supportedModes & CCamera::EExposureBacklight)
- return true;
- else
- return false;
- case QCameraExposure::ExposureSports:
- if(supportedModes & CCamera::EExposureSport)
- return true;
- else
- return false;
- case QCameraExposure::ExposureSnow:
- if(supportedModes & CCamera::EExposureSnow)
- return true;
- else
- return false;
- case QCameraExposure::ExposureBeach:
- if(supportedModes & CCamera::EExposureBeach)
- return true;
- else
- return false;
-
- default:
- return false;
- }
-}
-
-void S60ImageCaptureSession::setExposureMode(QCameraExposure::ExposureMode mode)
-{
- TRAPD(err, doSetExposureModeL(mode));
- setError(err, tr("Failed to set exposure mode."));
-}
-
-void S60ImageCaptureSession::doSetExposureModeL( QCameraExposure::ExposureMode mode)
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- CCamera *camera = m_cameraEngine->Camera();
- switch(mode) {
- case QCameraExposure::ExposureManual:
- camera->SetExposureL(CCamera::EExposureManual);
- break;
- case QCameraExposure::ExposureAuto:
- camera->SetExposureL(CCamera::EExposureAuto);
- break;
- case QCameraExposure::ExposureNight:
- camera->SetExposureL(CCamera::EExposureNight);
- break;
- case QCameraExposure::ExposureBacklight:
- camera->SetExposureL(CCamera::EExposureBacklight);
- break;
- case QCameraExposure::ExposureSports:
- camera->SetExposureL(CCamera::EExposureSport);
- break;
- case QCameraExposure::ExposureSnow:
- camera->SetExposureL(CCamera::EExposureSnow);
- break;
- case QCameraExposure::ExposureBeach:
- camera->SetExposureL(CCamera::EExposureBeach);
- break;
- case QCameraExposure::ExposureLargeAperture:
- case QCameraExposure::ExposureSmallAperture:
- break;
- case QCameraExposure::ExposurePortrait:
- case QCameraExposure::ExposureSpotlight:
- default:
- setError(KErrNotSupported, tr("Requested exposure mode is not suported"));
- break;
- }
- } else {
- setError(KErrNotReady, tr("Unexpected camera error."));
- }
-}
-
-int S60ImageCaptureSession::contrast() const
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- return m_cameraEngine->Camera()->Contrast();
- } else {
- return 0;
- }
-}
-
-void S60ImageCaptureSession::setContrast(int value)
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- TRAPD(err, m_cameraEngine->Camera()->SetContrastL(value));
- setError(err, tr("Failed to set contrast."));
- } else {
- setError(KErrNotReady, tr("Unexpected camera error."));
- }
-}
-
-int S60ImageCaptureSession::brightness() const
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- return m_cameraEngine->Camera()->Brightness();
- } else {
- return 0;
- }
-}
-
-void S60ImageCaptureSession::setBrightness(int value)
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- TRAPD(err, m_cameraEngine->Camera()->SetBrightnessL(value));
- setError(err, tr("Failed to set brightness."));
- } else {
- setError(KErrNotReady, tr("Unexpected camera error."));
- }
-}
-
- QCameraImageProcessing::WhiteBalanceMode S60ImageCaptureSession::whiteBalanceMode()
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- CCamera::TWhiteBalance mode = m_cameraEngine->Camera()->WhiteBalance();
- switch(mode) {
- case CCamera::EWBAuto:
- return QCameraImageProcessing::WhiteBalanceAuto;
- case CCamera::EWBDaylight:
- return QCameraImageProcessing::WhiteBalanceSunlight;
- case CCamera::EWBCloudy:
- return QCameraImageProcessing::WhiteBalanceCloudy;
- case CCamera::EWBTungsten:
- return QCameraImageProcessing::WhiteBalanceTungsten;
- case CCamera::EWBFluorescent:
- return QCameraImageProcessing::WhiteBalanceFluorescent;
- case CCamera::EWBFlash:
- return QCameraImageProcessing::WhiteBalanceFlash;
- case CCamera::EWBBeach:
- return QCameraImageProcessing::WhiteBalanceSunset;
- case CCamera::EWBManual:
- return QCameraImageProcessing::WhiteBalanceManual;
- case CCamera::EWBShade:
- return QCameraImageProcessing::WhiteBalanceShade;
-
- default:
- return QCameraImageProcessing::WhiteBalanceAuto;
- }
- }
-
- return QCameraImageProcessing::WhiteBalanceAuto;
-}
-
-void S60ImageCaptureSession::setWhiteBalanceMode( QCameraImageProcessing::WhiteBalanceMode mode)
-{
- TRAPD(err, doSetWhiteBalanceModeL(mode));
- setError(err, tr("Failed to set white balance mode."));
-}
-
-void S60ImageCaptureSession::doSetWhiteBalanceModeL( QCameraImageProcessing::WhiteBalanceMode mode)
-{
- if (m_cameraEngine && m_cameraEngine->Camera()) {
- CCamera* camera = m_cameraEngine->Camera();
- switch(mode) {
- case QCameraImageProcessing::WhiteBalanceAuto:
- camera->SetWhiteBalanceL(CCamera::EWBAuto);
- break;
- case QCameraImageProcessing::WhiteBalanceSunlight:
- camera->SetWhiteBalanceL(CCamera::EWBDaylight);
- break;
- case QCameraImageProcessing::WhiteBalanceCloudy:
- camera->SetWhiteBalanceL(CCamera::EWBCloudy);
- break;
- case QCameraImageProcessing::WhiteBalanceTungsten:
- camera->SetWhiteBalanceL(CCamera::EWBTungsten);
- break;
- case QCameraImageProcessing::WhiteBalanceFluorescent:
- camera->SetWhiteBalanceL(CCamera::EWBFluorescent);
- break;
- case QCameraImageProcessing::WhiteBalanceFlash:
- camera->SetWhiteBalanceL(CCamera::EWBFlash);
- break;
- case QCameraImageProcessing::WhiteBalanceSunset:
- camera->SetWhiteBalanceL(CCamera::EWBBeach);
- break;
- case QCameraImageProcessing::WhiteBalanceManual:
- camera->SetWhiteBalanceL(CCamera::EWBManual);
- break;
- case QCameraImageProcessing::WhiteBalanceShade:
- camera->SetWhiteBalanceL(CCamera::EWBShade);
- break;
-
- default:
- setError(KErrNotSupported, tr("Requested white balance mode is not suported"));
- break;
- }
- } else {
- setError(KErrNotReady, tr("Unexpected camera error."));
- }
-}
-
-bool S60ImageCaptureSession::isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceMode mode) const
-{
- if (m_cameraEngine) {
- TInt supportedModes = m_cameraInfo->iWhiteBalanceModesSupported;
- switch (mode) {
- case QCameraImageProcessing::WhiteBalanceManual:
- if (supportedModes & CCamera::EWBManual)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceAuto:
- if (supportedModes & CCamera::EWBAuto)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceSunlight:
- if (supportedModes & CCamera::EWBDaylight)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceCloudy:
- if (supportedModes & CCamera::EWBCloudy)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceShade:
- if (supportedModes & CCamera::EWBShade)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceTungsten:
- if (supportedModes & CCamera::EWBTungsten)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceFluorescent:
- if (supportedModes & CCamera::EWBFluorescent)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceIncandescent: // Not available in Symbian
- return false;
- case QCameraImageProcessing::WhiteBalanceFlash:
- if (supportedModes & CCamera::EWBFlash)
- return true;
- else
- return false;
- case QCameraImageProcessing::WhiteBalanceSunset:
- if (supportedModes & CCamera::EWBBeach)
- return true;
- else
- return false;
-
- default:
- return false;
- }
- }
-
- return false;
-}
-
-/*
- * ====================
- * S60 3.1 AutoFocosing
- * ====================
- */
-bool S60ImageCaptureSession::isFocusSupported() const
-{
- return m_cameraEngine->IsAutoFocusSupported();
-}
-
-void S60ImageCaptureSession::startFocus()
-{
- if (m_cameraEngine) {
- TRAPD(err, m_cameraEngine->StartFocusL());
- setError(err, tr("Failed to start focusing."));
- }
- else
- setError(KErrNotReady, tr("Unexpected camera error."));
-}
-
-void S60ImageCaptureSession::cancelFocus()
-{
- if (m_cameraEngine) {
- TRAPD(err, m_cameraEngine->FocusCancel());
- setError(err, tr("Failed to cancel focusing."));
- }
- else
- setError(KErrNotReady, tr("Unexpected camera error."));
-}
-
-void S60ImageCaptureSession::handleImageDecoded(int error)
-{
- // Delete unneeded objects
- if (m_imageDecoder) {
- delete m_imageDecoder;
- m_imageDecoder = 0;
- }
- if (m_fileSystemAccess) {
- m_fileSystemAccess->Close();
- delete m_fileSystemAccess;
- m_fileSystemAccess = 0;
- }
-
- // Check status of decoding
- if (error != KErrNone) {
- if (m_previewBitmap) {
- m_previewBitmap->Reset();
- delete m_previewBitmap;
- m_previewBitmap = 0;
- }
- releaseImageBuffer();
- if (m_previewInWaitLoop) {
- CActiveScheduler::Stop(); // Notify to continue execution of next Preview Image generation
- m_previewInWaitLoop = false; // Reset
- }
- setError(error, tr("Preview creation failed."));
- return;
- }
-
- m_previewDecodingOngoing = false;
-
- QPixmap prevPixmap = QPixmap::fromSymbianCFbsBitmap(m_previewBitmap);
- QImage preview = prevPixmap.toImage();
-
- if (m_previewBitmap) {
- m_previewBitmap->Reset();
- delete m_previewBitmap;
- m_previewBitmap = 0;
- }
-
- QT_TRYCATCH_LEAVING( emit imageCaptured(m_currentImageId, preview) );
-
- // Release image resources (if not already done)
- releaseImageBuffer();
-
- if (m_previewInWaitLoop) {
- CActiveScheduler::Stop(); // Notify to continue execution of next Preview Image generation
- m_previewInWaitLoop = false; // Reset
- }
-}
-
-void S60ImageCaptureSession::handleImageEncoded(int error)
-{
- // Check status of encoding
- if (error != KErrNone) {
- releaseImageBuffer();
- if (m_previewInWaitLoop) {
- CActiveScheduler::Stop(); // Notify to continue execution of next Preview Image generation
- m_previewInWaitLoop = false; // Reset
- }
- setError(error, tr("Saving captured image to file failed."));
- return;
- } else {
- QT_TRYCATCH_LEAVING( emit imageSaved(m_currentImageId, m_stillCaptureFileName) );
- }
-
- if (m_imageEncoder) {
- delete m_imageEncoder;
- m_imageEncoder = 0;
- }
-
-#ifndef ECAM_PREVIEW_API
- // Start preview generation
- TInt previewError = KErrNone;
- TFileName fileName = convertImagePath();
- TRAP(previewError, m_imageDecoder = S60ImageCaptureDecoder::FileNewL(this, m_fileSystemAccess, &fileName));
- if (previewError) {
- setError(previewError, tr("Failed to create preview image."));
- return;
- }
-
- // Set proper Preview Size
- TSize scaledSize((m_captureSize.width() / KSnapshotDownScaleFactor), (m_captureSize.height() / KSnapshotDownScaleFactor));
- if (scaledSize.iWidth < KSnapshotMinWidth || scaledSize.iHeight < KSnapshotMinHeight)
- scaledSize.SetSize((m_captureSize.width() / (KSnapshotDownScaleFactor/2)), (m_captureSize.height() / (KSnapshotDownScaleFactor/2)));
- if (scaledSize.iWidth < KSnapshotMinWidth || scaledSize.iHeight < KSnapshotMinHeight)
- scaledSize.SetSize((m_captureSize.width() / (KSnapshotDownScaleFactor/4)), (m_captureSize.height() / (KSnapshotDownScaleFactor/4)));
- if (scaledSize.iWidth < KSnapshotMinWidth || scaledSize.iHeight < KSnapshotMinHeight)
- scaledSize.SetSize(m_captureSize.width(), m_captureSize.height());
-
- TFrameInfo *info = m_imageDecoder->frameInfo();
- if (!info) {
- setError(KErrGeneral, tr("Preview image creation failed."));
- return;
- }
-
- m_previewBitmap = new CFbsBitmap;
- if (!m_previewBitmap) {
- setError(KErrNoMemory, tr("Failed to create preview image."));
- return;
- }
- previewError = m_previewBitmap->Create(scaledSize, info->iFrameDisplayMode);
- if (previewError) {
- setError(previewError, tr("Preview creation failed."));
- return;
- }
-
- // Jpeg decoding completes in handleImageDecoded()
- m_imageDecoder->decode(m_previewBitmap);
-#endif // ECAM_PREVIEW_API
-
- // Buffer can be released since Preview is created from file
- releaseImageBuffer();
-
- // Inform that we can continue taking more pictures
- QT_TRYCATCH_LEAVING( emit readyForCaptureChanged(true) );
-}
-
-#ifdef ECAM_PREVIEW_API
-void S60ImageCaptureSession::MceoPreviewReady(CFbsBitmap& aPreview)
-{
- QPixmap previewPixmap = QPixmap::fromSymbianCFbsBitmap(&aPreview);
- QImage preview = previewPixmap.toImage();
-
- // Notify preview availability
- emit imageCaptured(m_currentImageId, preview);
-}
-#endif // ECAM_PREVIEW_API
-
-// End of file
-