/**************************************************************************** ** ** 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$ ** ****************************************************************************/ #ifndef S60VIDEOCAPTURESESSION_H #define S60VIDEOCAPTURESESSION_H #include #include #include #include #include #include "s60cameraengine.h" #include #include // CVideoRecorderUtility #ifdef S60_DEVVIDEO_RECORDING_SUPPORTED #include #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 supportedVideoResolutions(bool *continuous); QList supportedVideoResolutions(const QVideoEncoderSettings &settings, bool *continuous); // Framerate void setFrameRate(const qreal rate); QList supportedVideoFrameRates(bool *continuous); QList 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 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 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 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 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 > 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 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