diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraxui/cxengine/src/cxevideocapturecontroldesktop.cpp --- a/camerauis/cameraxui/cxengine/src/cxevideocapturecontroldesktop.cpp Tue Aug 31 15:03:46 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,550 +0,0 @@ -/* -* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ -#include -#include - -#include "cxevideocapturecontroldesktop.h" -#include "cxeviewfindercontrol.h" -#include "cxutils.h" -#include "cxestate.h" -#include "cxenamespace.h" -#include "cxefilenamegeneratordesktop.h" -#include "cxecameradevicedesktop.h" -#include "cxeexception.h" - -namespace -{ - // Unit is milliseconds - static const int CXENGINE_ELAPSED_TIME_TIMEOUT = 1000; // 1 second - - // Unit is seconds - static const int CXENGINE_MAXIMUM_VIDEO_TIME = 90*60; // 90 minutes -} - - -/*! -* Constructor -*/ -CxeVideoCaptureControlDesktop::CxeVideoCaptureControlDesktop(CxeCameraDeviceDesktop &cameraDevice, - CxeViewfinderControl &viewfinderControl, - CxeCameraDeviceControl &cameraDeviceControl, - CxeFilenameGenerator &nameGenerator, - CxeQualityPresets &qualityPresets) : - mCameraDevice(cameraDevice), - mCameraDeviceControl(cameraDeviceControl), - mViewfinderControl(viewfinderControl), - mFilenameGenerator(nameGenerator), - mQualityPresets(qualityPresets), - mSnapshot(), - mNewFileName(""), - mCurrentFilename(""), - mState(Idle), - mElapsedTime(0) -{ - CX_DEBUG_ENTER_FUNCTION(); - - qRegisterMetaType (); - initializeStates(); - setupElapseTimer(); - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Destructor -*/ -CxeVideoCaptureControlDesktop::~CxeVideoCaptureControlDesktop() -{ - CX_DEBUG_ENTER_FUNCTION(); - - releaseResources(); - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Initializes resources for video recording. -*/ -void CxeVideoCaptureControlDesktop::init() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() == Idle) { - // start initializing resources for video capture - initVideoRecorder(); - } else if (state() == Initialized) { - // video recorder already initalized. Continue to prepare video reocording. - open(); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Releases all resources -*/ -void CxeVideoCaptureControlDesktop::deinit() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() == Idle) { - // nothing to do - CX_DEBUG_EXIT_FUNCTION(); - return; - } - // stop video-recording in-case if its ongoing. - stop(); - - setState(Idle); - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Intializes VideoRecorder for recording. -*/ -void CxeVideoCaptureControlDesktop::initVideoRecorder() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() != Idle) { - // not valid state to start "open" operation - CX_DEBUG_EXIT_FUNCTION(); - return; - } - - // update current video quality details from icm - CxeError::Id err = CxeError::None; - - setState(Initialized); - open(); - - if (err) { - // In case of error - emit videoPrepareComplete(err); - deinit(); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* Setup the timer for elapsed time -*/ -void CxeVideoCaptureControlDesktop::setupElapseTimer() -{ - mRecordElapseTimer.setSingleShot(false); - mRecordElapseTimer.setInterval(CXENGINE_ELAPSED_TIME_TIMEOUT); - connect(&mRecordElapseTimer, SIGNAL(timeout()), this, SLOT(handleElapseTimeout())); -} - - -/*! -* Opens file for video recording. -*/ -void CxeVideoCaptureControlDesktop::open() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() != Initialized) { - // not valid state to start "open" operation - CX_DEBUG_EXIT_FUNCTION(); - return; - } - - CxeError::Id err = CxeError::None; - - // generate video file name, if necessary - if (mNewFileName.isEmpty()) { - QString fileExt = ".mp4"; - - // Generate new filename and open the file for writing video data - err = mFilenameGenerator.generateFilename(mNewFileName, fileExt); - if (err == CxeError::None) { - mCurrentFilename = mNewFileName; - } else { - // file name is not valid, re-initialize the value of current string - // back to empty string - mCurrentFilename = QString(""); - } - } - - if (err) { - // error occured. - deinit(); - emit videoPrepareComplete(err); - } else { - setState(Preparing); - prepare(); - } - CX_DEBUG_EXIT_FUNCTION(); -} - - - -/*! -* Prepare Video Recorder with necessary settings for video capture. -*/ -void CxeVideoCaptureControlDesktop::prepare() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() != Preparing) { - // not valid state to continue prepare. - CX_DEBUG_EXIT_FUNCTION(); - return; - } - - int err = CxeError::None; - - if (!err) { - // prepare snapshot - err = prepareVideoSnapshot(); - } - - if (!err) { - // prepare zoom only when there are no errors during prepare. - emit prepareZoomForVideo(); - } - - mViewfinderControl.start(); - setState(Ready); - - // emit video prepare status - emit videoPrepareComplete(CxeError::None); - - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - Prepare snapshot -@Return symbian error code. - */ -int CxeVideoCaptureControlDesktop::prepareVideoSnapshot() -{ - CX_DEBUG_ENTER_FUNCTION(); - - - int err = 0; - // Whether or not we have postcapture on, we need the snapshot for Thumbnail Manager. - - mSnapshot = mCameraDevice.currentSnaphot(); - handleSnapshotEvent(CxeError::None); - - CX_DEBUG_EXIT_FUNCTION(); - - return err; -} - -/*! -* Camera events coming from ecam. -*/ -void CxeVideoCaptureControlDesktop::handleCameraEvent(int eventUid, int error) -{ - CX_DEBUG_ENTER_FUNCTION(); - - Q_UNUSED(eventUid); - Q_UNUSED(error); - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Handle Snapshot event from ecam -*/ -void CxeVideoCaptureControlDesktop::handleSnapshotEvent(CxeError::Id error) -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() == Idle) { - // we ignore this event, when we are not in active state(s) - CX_DEBUG(( "wrong state, ignoring snapshot" )); - CX_DEBUG_EXIT_FUNCTION(); - return; - } - emit snapshotReady(error, QImage(), filename()); - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Resets the video snapshot and current video filename -*/ -void CxeVideoCaptureControlDesktop::reset() -{ - CX_DEBUG_ENTER_FUNCTION(); - - // Snapshot will consume considerably memory. - // Replace it with null pixmap to have it freed. - mSnapshot = QPixmap(); - // reset the current file name. - mCurrentFilename = QString(""); - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -*@Return current video filename -*/ -QString CxeVideoCaptureControlDesktop::filename() const -{ - // Simply return the current contents of mCurrentFilename. - // If video recording was started then it returns proper filename - // otherwise an empty string is returned. - return mCurrentFilename; -} - - -/*! -* @Return current video snapshot -*/ -QPixmap CxeVideoCaptureControlDesktop::snapshot() const -{ - return mSnapshot; -} - -/*! -* @Return QList of all supported video quality details based on the camera index -* (primary/secondary). -*/ -QList CxeVideoCaptureControlDesktop::supportedVideoQualities() -{ - return QList(); -} - -/*! -* Starts video recording if we are in appropriate state. -*/ -void CxeVideoCaptureControlDesktop::record() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() == Ready || state() == Paused) { - //we skip the playing of the sound in the desktop state for now - setState(Recording); - mRecordElapseTimer.start(); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Pauses video recording. -*/ -void CxeVideoCaptureControlDesktop::pause() -{ - CX_DEBUG_ENTER_FUNCTION(); - - mRecordElapseTimer.stop(); - - setState(Paused); - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Stops video recording. -*/ -void CxeVideoCaptureControlDesktop::stop() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (state() == Recording || state() == Paused) { - mFilenameGenerator.raiseCounterValue(); - } - - mViewfinderControl.stop(); - mRecordElapseTimer.stop(); - mElapsedTime = 0; - - setState(Stopping); - setState(Initialized); - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* camera reference changing, release resources -*/ -void CxeVideoCaptureControlDesktop::prepareForCameraDelete() -{ - CX_DEBUG_ENTER_FUNCTION(); - releaseResources(); - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* prepare for camera release. -*/ -void CxeVideoCaptureControlDesktop::prepareForRelease() -{ - CX_DEBUG_ENTER_FUNCTION(); - deinit(); - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* new camera available, -*/ -void CxeVideoCaptureControlDesktop::handleCameraAllocated(CxeError::Id error) -{ - Q_UNUSED(error); - CX_DEBUG_IN_FUNCTION(); -} - - -/*! -* Initializes video recorder. -*/ -void CxeVideoCaptureControlDesktop::createVideoRecorder() -{ - CX_DEBUG_IN_FUNCTION(); -} - - -/*! -* releases resources used by videocapture -*/ -void CxeVideoCaptureControlDesktop::releaseResources() -{ - CX_DEBUG_ENTER_FUNCTION(); - - // first de-init videocapture control - deinit(); - reset(); - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -@Returns current state of videocapture -*/ -CxeVideoCaptureControl::State CxeVideoCaptureControlDesktop::state() const -{ - return mState; -} - -/*! -* Initialize states for videocapturecontrol -*/ -void CxeVideoCaptureControlDesktop::initializeStates() -{ - CX_DEBUG_IN_FUNCTION(); -} - -/*! -* calculates remaining video recording time. -*/ -void CxeVideoCaptureControlDesktop::remainingTime(int &time) -{ - CX_DEBUG_ENTER_FUNCTION(); - - time = CXENGINE_MAXIMUM_VIDEO_TIME - mElapsedTime; - if (time < 0) { - time = 0; - } - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Calculates elapsed recording time during video recording -* @return Did fetching elapsed time succeed. -*/ -bool CxeVideoCaptureControlDesktop::elapsedTime(int &time) -{ - CX_DEBUG_ENTER_FUNCTION(); - - time = mElapsedTime; - - CX_DEBUG_EXIT_FUNCTION(); - - return true; -} - -/*! -* slot called when playing a sound has finished. -*/ -void CxeVideoCaptureControlDesktop::handleSoundPlayed() -{ - // in case of video capture stop sound playing, nothing needs to be done - // meaning the state set elsewhere, and the video capture has been stopped already - - CX_DEBUG_IN_FUNCTION(); -} - - -/*! -* setting has changed, check if we are interested. -*/ -void CxeVideoCaptureControlDesktop::handleSettingValueChanged(const QString& settingId, - QVariant newValue) -{ - CX_DEBUG_ENTER_FUNCTION(); - - Q_UNUSED(newValue); - - if (settingId == CxeSettingIds::VIDEO_QUALITY) { - // re-prepare for video - deinit(); - init(); - } else if (settingId == CxeSettingIds::VIDEO_MUTE_SETTING) { - // mute setting changed, apply the new setting and re-prepare. - prepare(); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - - - -/*! -* Video Scene mode changed, needs updated -*/ -void CxeVideoCaptureControlDesktop::handleSceneChanged(CxeScene &scene) -{ - CX_DEBUG_ENTER_FUNCTION(); - Q_UNUSED(scene); - CX_DEBUG_EXIT_FUNCTION(); -} - -void CxeVideoCaptureControlDesktop::handleElapseTimeout() -{ - mElapsedTime++; - - CX_DEBUG( ("CxeVideoCaptureControlDesktop::handleElapseTimeout() <> mElapsedTime: %d", mElapsedTime ) ); -} - -void CxeVideoCaptureControlDesktop::setState(CxeVideoCaptureControl::State stateId, CxeError::Id error) -{ - mState = stateId; - CX_DEBUG( ("CxeVideoCaptureControlDesktop::setState <> mState: %d", mState ) ); - emit stateChanged(mState, error); -} -// End of file