summaryrefslogtreecommitdiff
path: root/src/plugins/symbian/ecam/s60videocapturesession.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/symbian/ecam/s60videocapturesession.h')
-rw-r--r--src/plugins/symbian/ecam/s60videocapturesession.h414
1 files changed, 414 insertions, 0 deletions
diff --git a/src/plugins/symbian/ecam/s60videocapturesession.h b/src/plugins/symbian/ecam/s60videocapturesession.h
new file mode 100644
index 000000000..cfa101f57
--- /dev/null
+++ b/src/plugins/symbian/ecam/s60videocapturesession.h
@@ -0,0 +1,414 @@
+/****************************************************************************
+**
+** 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$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, 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.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef S60VIDEOCAPTURESESSION_H
+#define S60VIDEOCAPTURESESSION_H
+
+#include <QtCore/qurl.h>
+#include <QtCore/qhash.h>
+
+#include <qmediaencodersettings.h>
+#include <qcamera.h>
+#include <qmediarecorder.h>
+
+#include "s60cameraengine.h"
+
+#include <e32base.h>
+#include <videorecorder.h> // CVideoRecorderUtility
+#ifdef S60_DEVVIDEO_RECORDING_SUPPORTED
+#include <mmf/devvideo/devvideorecord.h>
+#endif // S60_DEVVIDEO_RECORDING_SUPPORTED
+
+QT_USE_NAMESPACE
+
+class QTimer;
+
+/*
+ * VideoSession is the main class handling all video recording related
+ * operations. It uses mainly CVideoRecorderUtility to do it's tasks, but if
+ * DevVideoRecord is available it is used to provide more detailed
+ * information of the supported video settings.
+ */
+class S60VideoCaptureSession : public QObject,
+ public MVideoRecorderUtilityObserver
+#ifdef S60_DEVVIDEO_RECORDING_SUPPORTED
+ ,public MMMFDevVideoRecordObserver
+#endif // S60_DEVVIDEO_RECORDING_SUPPORTED
+{
+ Q_OBJECT
+ Q_ENUMS(Error)
+ Q_ENUMS(EcamErrors)
+ Q_ENUMS(TVideoCaptureState)
+
+public: // Enums
+
+ enum TVideoCaptureState
+ {
+ ENotInitialized = 0, // 0 - VideoRecording is not initialized, instance may or may not be created
+ EInitializing, // 1 - Initialization is ongoing
+ EInitialized, // 2 - VideoRecording is initialized, OpenFile is called with dummy file
+ EOpening, // 3 - OpenFile called with actual output location, waiting completion
+ EOpenComplete, // 4 - OpenFile completed with the actual output location
+ EPreparing, // 5 - Preparing VideoRecording to use set video settings
+ EPrepared, // 6 - VideoRecording is prepared with the set settings, ready to record
+ ERecording, // 7 - Video recording is ongoing
+ EPaused // 8 - Video recording has been started and paused
+ };
+
+ enum AudioQualityDefinition
+ {
+ ENoAudioQuality = 0, // 0 - Both BitRate and SampleRate settings available
+ EOnlyAudioQuality, // 1 - No BitRate or SampleRate settings available, use Quality to set them
+ EAudioQualityAndBitRate, // 2 - BitRate setting available, use Quality to set SampleRate
+ EAudioQualityAndSampleRate, // 3 - SampleRate setting available, use Quality to set BitRate
+ };
+
+ enum VideoQualityDefinition
+ {
+ ENoVideoQuality = 0, // 0 - All, Resolution, FrameRate and BitRate available
+ EOnlyVideoQuality, // 1 - None available, use Quality to set Resolution, FrameRate and BitRate
+ EVideoQualityAndResolution, // 2 - Only Resolution available, use Quality to set FrameRate and BitRate
+ EVideoQualityAndFrameRate, // 3 - Only FrameRate available, use Quality to set Resolution and BitRate
+ EVideoQualityAndBitRate, // 4 - Only BitRate available, use Quality to set Resolution and FrameRate
+ EVideoQualityAndResolutionAndBitRate, // 5 - No FrameRate available, use Quality to set it
+ EVideoQualityAndResolutionAndFrameRate, // 6 - No BitRate available, use Quality to set it
+ EVideoQualityAndFrameRateAndBitRate // 7 - No Resolution available, use Quality to set it
+ };
+
+public: // Constructor & Destructor
+
+ S60VideoCaptureSession(QObject *parent = 0);
+ ~S60VideoCaptureSession();
+
+public: // MVideoRecorderUtilityObserver
+
+ void MvruoOpenComplete(TInt aError);
+ void MvruoPrepareComplete(TInt aError);
+ void MvruoRecordComplete(TInt aError);
+ void MvruoEvent(const TMMFEvent& aEvent);
+
+#ifdef S60_DEVVIDEO_RECORDING_SUPPORTED
+public: // MMMFDevVideoRecordObserver
+ void MdvroReturnPicture(TVideoPicture *aPicture);
+ void MdvroSupplementalInfoSent();
+ void MdvroNewBuffers();
+ void MdvroFatalError(TInt aError);
+ void MdvroInitializeComplete(TInt aError);
+ void MdvroStreamEnd();
+#endif // S60_DEVVIDEO_RECORDING_SUPPORTED
+
+public: // Methods
+
+ void setError(const TInt error, const QString &description);
+ void setCameraHandle(CCameraEngine* cameraHandle);
+ void notifySettingsSet();
+
+ qint64 position();
+ TVideoCaptureState state() const;
+ bool isMuted() const;
+
+ // Controls
+ int initializeVideoRecording();
+ void releaseVideoRecording();
+ void applyAllSettings();
+
+ void startRecording();
+ void pauseRecording();
+ void stopRecording(const bool reInitialize = true);
+ void setMuted(const bool muted);
+
+ // Output Location
+ bool setOutputLocation(const QUrl &sink);
+ QUrl outputLocation() const;
+
+ // Resolution
+ void setVideoResolution(const QSize &resolution);
+ QList<QSize> supportedVideoResolutions(bool *continuous);
+ QList<QSize> supportedVideoResolutions(const QVideoEncoderSettings &settings, bool *continuous);
+
+ // Framerate
+ void setFrameRate(const qreal rate);
+ QList<qreal> supportedVideoFrameRates(bool *continuous);
+ QList<qreal> supportedVideoFrameRates(const QVideoEncoderSettings &settings, bool *continuous);
+
+ // Other Video Settings
+ void setBitrate(const int bitrate);
+ void setVideoEncodingMode(const QtMultimediaKit::EncodingMode mode);
+
+ // Video Codecs
+ void setVideoCaptureCodec(const QString &codecName);
+ QStringList supportedVideoCaptureCodecs();
+ QString videoCaptureCodecDescription(const QString &codecName);
+
+ // Audio Codecs
+ void setAudioCaptureCodec(const QString &codecName);
+ QStringList supportedAudioCaptureCodecs();
+
+ // Encoder Settings
+ void videoEncoderSettings(QVideoEncoderSettings &videoSettings);
+ void audioEncoderSettings(QAudioEncoderSettings &audioSettings);
+
+ // Quality
+ void setVideoCaptureQuality(const QtMultimediaKit::EncodingQuality quality,
+ const VideoQualityDefinition mode);
+ void setAudioCaptureQuality(const QtMultimediaKit::EncodingQuality quality,
+ const AudioQualityDefinition mode);
+
+ // Video Containers
+ QString videoContainer() const;
+ void setVideoContainer(const QString &containerName);
+ QStringList supportedVideoContainers();
+ bool isSupportedVideoContainer(const QString &containerName);
+ QString videoContainerDescription(const QString &containerName);
+
+ // Audio Settings
+ QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous);
+ void setAudioSampleRate(const int sampleRate);
+ void setAudioBitRate(const int bitRate);
+ void setAudioChannelCount(const int channelCount);
+ void setAudioEncodingMode(const QtMultimediaKit::EncodingMode mode);
+
+ // Video Options
+ QSize pixelAspectRatio();
+ void setPixelAspectRatio(const QSize par);
+ int gain();
+ void setGain(const int gain);
+ int maxClipSizeInBytes() const;
+ void setMaxClipSizeInBytes(const int size);
+
+private: // Internal
+
+ QMediaRecorder::Error fromSymbianErrorToQtMultimediaError(int aError);
+
+ void initializeVideoCaptureSettings();
+ void doInitializeVideoRecorderL();
+ void commitVideoEncoderSettings();
+ void queryAudioEncoderSettings();
+ void queryVideoEncoderSettings();
+ void validateRequestedCodecs();
+ void resetSession(bool errorHandling = false);
+
+ void doSetCodecsL();
+ QString determineProfileAndLevel();
+ void doSetVideoResolution(const QSize &resolution);
+ void doSetFrameRate(qreal rate);
+ void doSetBitrate(const int &bitrate);
+
+ void updateVideoCaptureContainers();
+ void doUpdateVideoCaptureContainersL();
+ void selectController(const QString &format,
+ TUid &controllerUid,
+ TUid &formatUid);
+
+ void doPopulateVideoCodecsDataL();
+ void doPopulateVideoCodecsL();
+#ifndef S60_DEVVIDEO_RECORDING_SUPPORTED
+ void doPopulateMaxVideoParameters();
+#endif // S60_DEVVIDEO_RECORDING_SUPPORTED
+ void doPopulateAudioCodecsL();
+
+ QList<int> doGetSupportedSampleRatesL(const QAudioEncoderSettings &settings,
+ bool *continuous);
+ QSize maximumResolutionForMimeType(const QString &mimeType) const;
+ qreal maximumFrameRateForMimeType(const QString &mimeType) const;
+ int maximumBitRateForMimeType(const QString &mimeType) const;
+
+signals: // Notification Signals
+
+ void stateChanged(S60VideoCaptureSession::TVideoCaptureState);
+ void positionChanged(qint64);
+ void mutedChanged(bool);
+ void captureSizeChanged(const QSize&);
+ void error(int, const QString&);
+
+private slots: // Internal Slots
+
+ void cameraStatusChanged(QCamera::Status);
+ void durationTimerTriggered();
+
+private: // Structs
+
+ /*
+ * This structure holds the information of supported video mime types for
+ * the format and also description for it.
+ */
+ struct VideoFormatData {
+ QString description;
+ QStringList supportedMimeTypes;
+ };
+
+ /*
+ * This structure is used to define supported resolutions and framerate
+ * (depending on each other) for each supported encoder mime type (defining
+ * encoder, profile and level)
+ */
+ struct SupportedFrameRatePictureSize {
+ SupportedFrameRatePictureSize() {}
+ SupportedFrameRatePictureSize(qreal rate, QSize size):
+ frameRate(rate),
+ frameSize(size) {}
+ qreal frameRate;
+ QSize frameSize;
+ };
+
+ /*
+ * This structure defines supported resolution/framerate pairs and maximum
+ * bitrate for a single encodec device. It also the supported mime types
+ * (codec, profile and level) of the encoder device.
+ *
+ * Structure defines 2 contructors:
+ * - First with no attributes
+ * - Second, which will construct the sructure appending one
+ * resolution/framerate pair to the list of
+ * SupportedFrameRatePictureSizes and setting the given bitrate as
+ * maximum. This second constructor is for convenience.
+ *
+ * This struct is used in m_videoParametersForEncoder (QList).
+ *
+ * Here's a visualization of an example strcuture:
+ * STRUCT:
+ * |-- Resolution/FrameRate Pairs:
+ * | |- VGA / 30fps
+ * | |- 720p / 25fps
+ * | |- Etc.
+ * |
+ * |-- MimeTypes:
+ * | |- video/mp4v-es; profile-level-id=1
+ * | |- video/mp4v-es; profile-level-id=2
+ * | |- Etc.
+ * |
+ * |-- Max BitRate: 1Mbps
+ */
+ struct MaxResolutionRatesAndTypes {
+ MaxResolutionRatesAndTypes() {}
+ MaxResolutionRatesAndTypes(QSize size, qreal fRate, int bRate):
+ bitRate(bRate)
+ {
+ frameRatePictureSizePair.append(SupportedFrameRatePictureSize(fRate,size));
+ }
+ QList<SupportedFrameRatePictureSize> frameRatePictureSizePair;
+ QStringList mimeTypes;
+ int bitRate;
+ };
+
+private: // Data
+
+ CCameraEngine *m_cameraEngine;
+ CVideoRecorderUtility *m_videoRecorder;
+ QTimer *m_durationTimer;
+ qint64 m_position;
+ // Symbian ErrorCode
+ mutable int m_error;
+ // This defines whether Camera is in ActiveStatus or not
+ bool m_cameraStarted;
+ // Internal state of the video recorder
+ TVideoCaptureState m_captureState;
+ // Actual output file name/path
+ QUrl m_sink;
+ // Requested output file name/path, this may be different from m_sink if
+ // asynchronous operation was ongoing in the CVideoRecorderUtility when new
+ // outputLocation was set.
+ QUrl m_requestedSink;
+ // Requested videoSettings. The may not be active settings before those are
+ // committed (with commitVideoEncoderSettings())
+ QVideoEncoderSettings m_videoSettings;
+ // Requested audioSettings. The may not be active settings before those are
+ // committed (with commitVideoEncoderSettings())
+ QAudioEncoderSettings m_audioSettings;
+ // Tells whether settings should be initialized when changing the camera
+ bool m_captureSettingsSet;
+ // Active container
+ QString m_container;
+ // Requested container, this may be different from m_container if
+ // asynchronous operation was ongoing in the CVideoRecorderUtility when new
+ // container was set.
+ QString m_requestedContainer;
+ // Requested muted value. This may not be active value before settings are
+ // committed (with commitVideoEncoderSettings())
+ bool m_muted;
+ // Maximum ClipSize in Bytes
+ int m_maxClipSize;
+ // List of supported video codec mime types
+ QStringList m_videoCodecList;
+ // Hash of supported video codec mime types and corresponding FourCC codes
+ QHash<QString, TFourCC> m_audioCodecList;
+ // Map of video capture controllers information. It is populated during
+ // doUpdateVideoCaptureContainersL().
+ //
+ // Here's a visualization of an example strcuture:
+ // m_videoControllerMap(HASH):
+ // |
+ // |-- Controller 1 : HASH
+ // | |- Container 1 (UID) : FormatData
+ // | | |- Description
+ // | | |- List of supported MimeTypes
+ // | |- Container 2 (UID) : FormatData
+ // | | |- Description
+ // | | |- List of supported MimeTypes
+ // | |- Etc.
+ // |
+ // |-- Controller 2: HASH
+ // | |- Container 1 (UID) : FormatData
+ // | | |- Description
+ // | | |- List of supported MimeTypes
+ // | |- Etc.
+ //
+ QHash<TInt, QHash<TInt,VideoFormatData> > m_videoControllerMap;
+ // List of Encoder information. If DevVideoRecord is available info is
+ // gathered during doPopulateVideoCodecsDataL() for each encoder (hw
+ // accelerated and supporting camera input) found. If DevVideoRecord is not
+ // available, the info is set in doPopulateMaxVideoParameters() based on
+ // supported codec list received from CVideoRecorderUtility.
+ QList<MaxResolutionRatesAndTypes> m_videoParametersForEncoder;
+ // Set if OpenFileL should be executed when currently ongoing operation
+ // is completed.
+ bool m_openWhenReady;
+ // Set if video capture should be prepared after OpenFileL has completed
+ bool m_prepareAfterOpenComplete;
+ // Set if video capture should be started when Prepare has completed
+ bool m_startAfterPrepareComplete;
+ // Tells if settings have been set after last Prepare()
+ bool m_uncommittedSettings;
+ // Tells if settings need to be applied after ongoing operation has finished
+ bool m_commitSettingsWhenReady;
+};
+
+#endif // S60VIDEOCAPTURESESSION_H