diff options
| author | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2011-11-09 20:42:00 +0100 |
|---|---|---|
| committer | Michael Goddard <michael.goddard@nokia.com> | 2011-11-10 04:15:38 +0100 |
| commit | 1d76e399c5d9277895786c6edc2cec76f99d0531 (patch) | |
| tree | f56640988d767202cc8f449ff78ad26ff739d314 /src/multimedia/qmediarecorder.cpp | |
| parent | 1e542df82fbcc4e3a8f75537af204f83827a4587 (diff) | |
Change-Id: Id6de29b7c1e96aed16be8251195c744f68a2d46b
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
Diffstat (limited to 'src/multimedia/qmediarecorder.cpp')
| -rw-r--r-- | src/multimedia/qmediarecorder.cpp | 904 |
1 files changed, 0 insertions, 904 deletions
diff --git a/src/multimedia/qmediarecorder.cpp b/src/multimedia/qmediarecorder.cpp deleted file mode 100644 index 6be462d..0000000 --- a/src/multimedia/qmediarecorder.cpp +++ /dev/null @@ -1,904 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Toolkit. -** -** $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 "qmediarecorder.h" - -#include <qmediarecordercontrol.h> -#include "qmediaobject_p.h" -#include <qmediaservice.h> -#include <qmediaserviceprovider.h> -#include <qmetadatawritercontrol.h> -#include <qaudioencodercontrol.h> -#include <qvideoencodercontrol.h> -#include <qmediacontainercontrol.h> -#include <qcamera.h> -#include <qcameracontrol.h> - -#include <QtCore/qdebug.h> -#include <QtCore/qurl.h> -#include <QtCore/qstringlist.h> -#include <QtCore/qmetaobject.h> - -#include <qaudioformat.h> - -QT_BEGIN_NAMESPACE - -/*! - \class QMediaRecorder - \inmodule QtMultimedia - \ingroup multimedia - \since 1.0 - - - \brief The QMediaRecorder class is used for the recording of media content. - - The QMediaRecorder class is a high level media recording class. It's not - intended to be used alone but for accessing the media recording functions - of other media objects, like QRadioTuner, or QAudioCaptureSource. - - \snippet doc/src/snippets/multimedia-snippets/media.cpp Media recorder - - \sa QAudioCaptureSource -*/ - -namespace -{ -class MediaRecorderRegisterMetaTypes -{ -public: - MediaRecorderRegisterMetaTypes() - { - qRegisterMetaType<QMediaRecorder::State>("QMediaRecorder::State"); - qRegisterMetaType<QMediaRecorder::Error>("QMediaRecorder::Error"); - } -} _registerRecorderMetaTypes; -} - - -class QMediaRecorderPrivate -{ - Q_DECLARE_NON_CONST_PUBLIC(QMediaRecorder) - -public: - QMediaRecorderPrivate(); - - QMediaObject *mediaObject; - - QMediaRecorderControl *control; - QMediaContainerControl *formatControl; - QAudioEncoderControl *audioControl; - QVideoEncoderControl *videoControl; - QMetaDataWriterControl *metaDataControl; - - QTimer* notifyTimer; - - QMediaRecorder::State state; - QMediaRecorder::Error error; - QString errorString; - - void _q_stateChanged(QMediaRecorder::State state); - void _q_error(int error, const QString &errorString); - void _q_serviceDestroyed(); - void _q_notify(); - void _q_updateNotifyInterval(int ms); - - QMediaRecorder *q_ptr; -}; - -QMediaRecorderPrivate::QMediaRecorderPrivate(): - mediaObject(0), - control(0), - formatControl(0), - audioControl(0), - videoControl(0), - metaDataControl(0), - notifyTimer(0), - state(QMediaRecorder::StoppedState), - error(QMediaRecorder::NoError) -{ -} - -#define ENUM_NAME(c,e,v) (c::staticMetaObject.enumerator(c::staticMetaObject.indexOfEnumerator(e)).valueToKey((v))) - -void QMediaRecorderPrivate::_q_stateChanged(QMediaRecorder::State ps) -{ - Q_Q(QMediaRecorder); - - if (ps == QMediaRecorder::RecordingState) - notifyTimer->start(); - else - notifyTimer->stop(); - -// qDebug() << "Recorder state changed:" << ENUM_NAME(QMediaRecorder,"State",ps); - if (state != ps) { - emit q->stateChanged(ps); - } - - state = ps; -} - - -void QMediaRecorderPrivate::_q_error(int error, const QString &errorString) -{ - Q_Q(QMediaRecorder); - - this->error = QMediaRecorder::Error(error); - this->errorString = errorString; - - emit q->error(this->error); -} - -void QMediaRecorderPrivate::_q_serviceDestroyed() -{ - mediaObject = 0; - control = 0; - formatControl = 0; - audioControl = 0; - videoControl = 0; - metaDataControl = 0; -} - -void QMediaRecorderPrivate::_q_notify() -{ - emit q_func()->durationChanged(q_func()->duration()); -} - -void QMediaRecorderPrivate::_q_updateNotifyInterval(int ms) -{ - notifyTimer->setInterval(ms); -} - - -/*! - Constructs a media recorder which records the media produced by \a mediaObject. - - The \a parent is passed to QMediaObject. - \since 1.0 -*/ - -QMediaRecorder::QMediaRecorder(QMediaObject *mediaObject, QObject *parent): - QObject(parent), - d_ptr(new QMediaRecorderPrivate) -{ - Q_D(QMediaRecorder); - d->q_ptr = this; - setMediaObject(mediaObject); - - d->notifyTimer = new QTimer(this); - d->notifyTimer->setInterval(mediaObject->notifyInterval()); - connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify())); - connect(mediaObject, SIGNAL(notifyIntervalChanged(int)), SLOT(_q_updateNotifyInterval(int))); -} - -/*! - Destroys a media recorder object. -*/ - -QMediaRecorder::~QMediaRecorder() -{ -} - -/*! - Returns the QMediaObject instance that this QMediaRecorder is bound too, - or 0 otherwise. - \since 1.0 -*/ -QMediaObject *QMediaRecorder::mediaObject() const -{ - return d_func()->mediaObject; -} - -/*! - \internal - \since 1.0 -*/ -bool QMediaRecorder::setMediaObject(QMediaObject *object) -{ - Q_D(QMediaRecorder); - - if (object == d->mediaObject) - return true; - - if (d->mediaObject) { - if (d->control) { - disconnect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)), - this, SLOT(_q_stateChanged(QMediaRecorder::State))); - - disconnect(d->control, SIGNAL(mutedChanged(bool)), - this, SIGNAL(mutedChanged(bool))); - - disconnect(d->control, SIGNAL(durationChanged(qint64)), - this, SIGNAL(durationChanged(qint64))); - - disconnect(d->control, SIGNAL(error(int,QString)), - this, SLOT(_q_error(int,QString))); - } - - QMediaService *service = d->mediaObject->service(); - - if (service) { - disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); - - if (d->control) - service->releaseControl(d->control); - if (d->formatControl) - service->releaseControl(d->formatControl); - if (d->audioControl) - service->releaseControl(d->audioControl); - if (d->videoControl) - service->releaseControl(d->videoControl); - if (d->metaDataControl) { - disconnect(d->metaDataControl, SIGNAL(metaDataChanged()), - this, SIGNAL(metaDataChanged())); - disconnect(d->metaDataControl, SIGNAL(metaDataAvailableChanged(bool)), - this, SIGNAL(metaDataAvailableChanged(bool))); - disconnect(d->metaDataControl, SIGNAL(writableChanged(bool)), - this, SIGNAL(metaDataWritableChanged(bool))); - - service->releaseControl(d->metaDataControl); - } - } - } - - d->control = 0; - d->formatControl = 0; - d->audioControl = 0; - d->videoControl = 0; - d->metaDataControl = 0; - - d->mediaObject = object; - - if (d->mediaObject) { - QMediaService *service = d->mediaObject->service(); - - if (service) { - d->control = qobject_cast<QMediaRecorderControl*>(service->requestControl(QMediaRecorderControl_iid)); - - if (d->control) { - d->formatControl = qobject_cast<QMediaContainerControl *>(service->requestControl(QMediaContainerControl_iid)); - d->audioControl = qobject_cast<QAudioEncoderControl *>(service->requestControl(QAudioEncoderControl_iid)); - d->videoControl = qobject_cast<QVideoEncoderControl *>(service->requestControl(QVideoEncoderControl_iid)); - - QMediaControl *control = service->requestControl(QMetaDataWriterControl_iid); - if (control) { - d->metaDataControl = qobject_cast<QMetaDataWriterControl *>(control); - if (!d->metaDataControl) { - service->releaseControl(control); - } else { - connect(d->metaDataControl, - SIGNAL(metaDataChanged()), - SIGNAL(metaDataChanged())); - connect(d->metaDataControl, - SIGNAL(metaDataAvailableChanged(bool)), - SIGNAL(metaDataAvailableChanged(bool))); - connect(d->metaDataControl, - SIGNAL(writableChanged(bool)), - SIGNAL(metaDataWritableChanged(bool))); - } - } - - connect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)), - this, SLOT(_q_stateChanged(QMediaRecorder::State))); - - connect(d->control, SIGNAL(mutedChanged(bool)), - this, SIGNAL(mutedChanged(bool))); - - connect(d->control, SIGNAL(durationChanged(qint64)), - this, SIGNAL(durationChanged(qint64))); - - connect(d->control, SIGNAL(error(int,QString)), - this, SLOT(_q_error(int,QString))); - - connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); - - - return true; - } - } - - d->mediaObject = 0; - return false; - } - - return true; -} - -/*! - \property QMediaRecorder::outputLocation - \brief the destination location of media content. - - Setting the location can fail, for example when the service supports only - local file system locations but a network URL was passed. If the service - does not support media recording this setting the output location will - always fail. - - The \a location can be relative or empty; - in this case the recorder uses the system specific place and file naming scheme. - After recording has stated, QMediaRecorder::outputLocation() returns the actual output location. - \since 1.0 -*/ - -/*! - Returns true if media recorder service ready to use. - \since 1.0 -*/ -bool QMediaRecorder::isAvailable() const -{ - if (d_func()->control != NULL) - return true; - else - return false; -} - -/*! - Returns the availability error code. - \since 1.0 -*/ -QtMultimedia::AvailabilityError QMediaRecorder::availabilityError() const -{ - if (d_func()->control != NULL) - return QtMultimedia::NoError; - else - return QtMultimedia::ServiceMissingError; -} - -QUrl QMediaRecorder::outputLocation() const -{ - return d_func()->control ? d_func()->control->outputLocation() : QUrl(); -} - -bool QMediaRecorder::setOutputLocation(const QUrl &location) -{ - Q_D(QMediaRecorder); - return d->control ? d->control->setOutputLocation(location) : false; -} - -/*! - Returns the current media recorder state. - - \since 1.0 - \sa QMediaRecorder::State -*/ - -QMediaRecorder::State QMediaRecorder::state() const -{ - return d_func()->control ? QMediaRecorder::State(d_func()->control->state()) : StoppedState; -} - -/*! - Returns the current error state. - - \since 1.0 - \sa errorString() -*/ - -QMediaRecorder::Error QMediaRecorder::error() const -{ - return d_func()->error; -} - -/*! - Returns a string describing the current error state. - - \since 1.0 - \sa error() -*/ - -QString QMediaRecorder::errorString() const -{ - return d_func()->errorString; -} - -/*! - \property QMediaRecorder::duration - - \brief the recorded media duration in milliseconds. - \since 1.0 -*/ - -qint64 QMediaRecorder::duration() const -{ - return d_func()->control ? d_func()->control->duration() : 0; -} - -/*! - \property QMediaRecorder::muted - - \brief whether a recording audio stream is muted. - \since 1.0 -*/ - -bool QMediaRecorder::isMuted() const -{ - return d_func()->control ? d_func()->control->isMuted() : 0; -} - -void QMediaRecorder::setMuted(bool muted) -{ - Q_D(QMediaRecorder); - - if (d->control) - d->control->setMuted(muted); -} - -/*! - Returns a list of MIME types of supported container formats. - \since 1.0 -*/ -QStringList QMediaRecorder::supportedContainers() const -{ - return d_func()->formatControl ? - d_func()->formatControl->supportedContainers() : QStringList(); -} - -/*! - Returns a description of a container format \a mimeType. - \since 1.0 -*/ -QString QMediaRecorder::containerDescription(const QString &mimeType) const -{ - return d_func()->formatControl ? - d_func()->formatControl->containerDescription(mimeType) : QString(); -} - -/*! - Returns the MIME type of the selected container format. - \since 1.0 -*/ - -QString QMediaRecorder::containerMimeType() const -{ - return d_func()->formatControl ? - d_func()->formatControl->containerMimeType() : QString(); -} - -/*! - Returns a list of supported audio codecs. - \since 1.0 -*/ -QStringList QMediaRecorder::supportedAudioCodecs() const -{ - return d_func()->audioControl ? - d_func()->audioControl->supportedAudioCodecs() : QStringList(); -} - -/*! - Returns a description of an audio \a codec. - \since 1.0 -*/ -QString QMediaRecorder::audioCodecDescription(const QString &codec) const -{ - return d_func()->audioControl ? - d_func()->audioControl->codecDescription(codec) : QString(); -} - -/*! - Returns a list of supported audio sample rates. - - If non null audio \a settings parameter is passed, the returned list is - reduced to sample rates supported with partial settings applied. - - This can be used to query the list of sample rates, supported by specific - audio codec. - - If the encoder supports arbitrary sample rates within the supported rates - range, *\a continuous is set to true, otherwise *\a continuous is set to - false. - \since 1.0 -*/ - -QList<int> QMediaRecorder::supportedAudioSampleRates(const QAudioEncoderSettings &settings, bool *continuous) const -{ - if (continuous) - *continuous = false; - - return d_func()->audioControl ? - d_func()->audioControl->supportedSampleRates(settings, continuous) : QList<int>(); -} - -/*! - Returns a list of resolutions video can be encoded at. - - If non null video \a settings parameter is passed, the returned list is - reduced to resolution supported with partial settings like video codec or - framerate applied. - - If the encoder supports arbitrary resolutions within the supported range, - *\a continuous is set to true, otherwise *\a continuous is set to false. - - \since 1.0 - \sa QVideoEncoderSettings::resolution() -*/ -QList<QSize> QMediaRecorder::supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous) const -{ - if (continuous) - *continuous = false; - - return d_func()->videoControl ? - d_func()->videoControl->supportedResolutions(settings, continuous) : QList<QSize>(); -} - -/*! - Returns a list of frame rates video can be encoded at. - - If non null video \a settings parameter is passed, the returned list is - reduced to frame rates supported with partial settings like video codec or - resolution applied. - - If the encoder supports arbitrary frame rates within the supported range, - *\a continuous is set to true, otherwise *\a continuous is set to false. - - \since 1.0 - \sa QVideoEncoderSettings::frameRate() -*/ -QList<qreal> QMediaRecorder::supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous) const -{ - if (continuous) - *continuous = false; - - return d_func()->videoControl ? - d_func()->videoControl->supportedFrameRates(settings, continuous) : QList<qreal>(); -} - -/*! - Returns a list of supported video codecs. - \since 1.0 -*/ -QStringList QMediaRecorder::supportedVideoCodecs() const -{ - return d_func()->videoControl ? - d_func()->videoControl->supportedVideoCodecs() : QStringList(); -} - -/*! - Returns a description of a video \a codec. - - \since 1.0 - \sa setEncodingSettings() -*/ -QString QMediaRecorder::videoCodecDescription(const QString &codec) const -{ - return d_func()->videoControl ? - d_func()->videoControl->videoCodecDescription(codec) : QString(); -} - -/*! - Returns the audio encoder settings being used. - - \since 1.0 - \sa setEncodingSettings() -*/ - -QAudioEncoderSettings QMediaRecorder::audioSettings() const -{ - return d_func()->audioControl ? - d_func()->audioControl->audioSettings() : QAudioEncoderSettings(); -} - -/*! - Returns the video encoder settings being used. - - \since 1.0 - \sa setEncodingSettings() -*/ - -QVideoEncoderSettings QMediaRecorder::videoSettings() const -{ - return d_func()->videoControl ? - d_func()->videoControl->videoSettings() : QVideoEncoderSettings(); -} - -/*! - Sets the \a audio and \a video encoder settings and \a container format MIME type. - - If some parameters are not specified, or null settings are passed, the - encoder will choose default encoding parameters, depending on media - source properties. - While setEncodingSettings is optional, the backend can preload - encoding pipeline to improve recording startup time. - - It's only possible to change settings when the encoder is in the - QMediaEncoder::StoppedState state. - - \since 1.0 - \sa audioSettings(), videoSettings(), containerMimeType() -*/ - -void QMediaRecorder::setEncodingSettings(const QAudioEncoderSettings &audio, - const QVideoEncoderSettings &video, - const QString &container) -{ - Q_D(QMediaRecorder); - - QCamera *camera = qobject_cast<QCamera*>(d->mediaObject); - if (camera && camera->captureMode() == QCamera::CaptureVideo) { - QMetaObject::invokeMethod(camera, - "_q_preparePropertyChange", - Qt::DirectConnection, - Q_ARG(int, QCameraControl::VideoEncodingSettings)); - } - - if (d->audioControl) - d->audioControl->setAudioSettings(audio); - - if (d->videoControl) - d->videoControl->setVideoSettings(video); - - if (d->formatControl) - d->formatControl->setContainerMimeType(container); - - if (d->control) - d->control->applySettings(); -} - - -/*! - Start recording. - - This is an asynchronous call, with signal - stateCahnged(QMediaRecorder::RecordingState) being emitted when recording - started, otherwise the error() signal is emitted. - \since 1.0 -*/ - -void QMediaRecorder::record() -{ - Q_D(QMediaRecorder); - - // reset error - d->error = NoError; - d->errorString = QString(); - - if (d->control) - d->control->record(); -} - -/*! - Pause recording. - \since 1.0 -*/ - -void QMediaRecorder::pause() -{ - Q_D(QMediaRecorder); - if (d->control) - d->control->pause(); -} - -/*! - Stop recording. - \since 1.0 -*/ - -void QMediaRecorder::stop() -{ - Q_D(QMediaRecorder); - if (d->control) - d->control->stop(); -} - -/*! - \enum QMediaRecorder::State - - \value StoppedState The recorder is not active. - \value RecordingState The recorder is currently active and producing data. - \value PausedState The recorder is paused. -*/ - -/*! - \enum QMediaRecorder::Error - - \value NoError No Errors. - \value ResourceError Device is not ready or not available. - \value FormatError Current format is not supported. -*/ - -/*! - \fn QMediaRecorder::stateChanged(State state) - - Signals that a media recorder's \a state has changed. - \since 1.0 -*/ - -/*! - \fn QMediaRecorder::durationChanged(qint64 duration) - - Signals that the \a duration of the recorded media has changed. - \since 1.0 -*/ - -/*! - \fn QMediaRecorder::error(QMediaRecorder::Error error) - - Signals that an \a error has occurred. - \since 1.0 -*/ - -/*! - \fn QMediaRecorder::mutedChanged(bool muted) - - Signals that the \a muted state has changed. If true the recording is being muted. - \since 1.0 -*/ - -/*! - \property QMediaRecorder::metaDataAvailable - \brief whether access to a media object's meta-data is available. - - If this is true there is meta-data available, otherwise there is no meta-data available. - \since 1.0 -*/ - -bool QMediaRecorder::isMetaDataAvailable() const -{ - Q_D(const QMediaRecorder); - - return d->metaDataControl - ? d->metaDataControl->isMetaDataAvailable() - : false; -} - -/*! - \fn QMediaRecorder::metaDataAvailableChanged(bool available) - - Signals that the \a available state of a media object's meta-data has changed. - \since 1.0 -*/ - -/*! - \property QMediaRecorder::metaDataWritable - \brief whether a media object's meta-data is writable. - - If this is true the meta-data is writable, otherwise the meta-data is read-only. - \since 1.0 -*/ - -bool QMediaRecorder::isMetaDataWritable() const -{ - Q_D(const QMediaRecorder); - - return d->metaDataControl - ? d->metaDataControl->isWritable() - : false; -} - -/*! - \fn QMediaRecorder::metaDataWritableChanged(bool writable) - - Signals that the \a writable state of a media object's meta-data has changed. - \since 1.0 -*/ - -/*! - Returns the value associated with a meta-data \a key. - \since 1.0 -*/ -QVariant QMediaRecorder::metaData(QtMultimedia::MetaData key) const -{ - Q_D(const QMediaRecorder); - - return d->metaDataControl - ? d->metaDataControl->metaData(key) - : QVariant(); -} - -/*! - Sets a \a value for a meta-data \a key. - - \note To ensure that meta data is set corretly, it should be set before starting the recording. - Once the recording is stopped, any meta data set will be attached to the next recording. - \since 1.0 -*/ -void QMediaRecorder::setMetaData(QtMultimedia::MetaData key, const QVariant &value) -{ - Q_D(QMediaRecorder); - - if (d->metaDataControl) - d->metaDataControl->setMetaData(key, value); -} - -/*! - Returns a list of keys there is meta-data available for. - \since 1.0 -*/ -QList<QtMultimedia::MetaData> QMediaRecorder::availableMetaData() const -{ - Q_D(const QMediaRecorder); - - return d->metaDataControl - ? d->metaDataControl->availableMetaData() - : QList<QtMultimedia::MetaData>(); -} - -/*! - \fn QMediaRecorder::metaDataChanged() - - Signals that a media object's meta-data has changed. - \since 1.0 -*/ - -/*! - Returns the value associated with a meta-data \a key. - - The naming and type of extended meta-data is not standardized, so the values and meaning - of keys may vary between backends. - \since 1.0 -*/ -QVariant QMediaRecorder::extendedMetaData(const QString &key) const -{ - Q_D(const QMediaRecorder); - - return d->metaDataControl - ? d->metaDataControl->extendedMetaData(key) - : QVariant(); -} - -/*! - Sets a \a value for a meta-data \a key. - - The naming and type of extended meta-data is not standardized, so the values and meaning - of keys may vary between backends. - \since 1.0 -*/ -void QMediaRecorder::setExtendedMetaData(const QString &key, const QVariant &value) -{ - Q_D(QMediaRecorder); - - if (d->metaDataControl) - d->metaDataControl->setExtendedMetaData(key, value); -} - -/*! - Returns a list of keys there is extended meta-data available for. - \since 1.0 -*/ -QStringList QMediaRecorder::availableExtendedMetaData() const -{ - Q_D(const QMediaRecorder); - - return d->metaDataControl - ? d->metaDataControl->availableExtendedMetaData() - : QStringList(); -} - -#include "moc_qmediarecorder.cpp" -QT_END_NAMESPACE - |
