summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDmytro Poplavskiy <dmytro.poplavskiy@nokia.com>2012-01-31 10:08:49 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-01 08:10:20 +0100
commita22a0195f146e83174ee4eacffe33c161ab39e50 (patch)
treeecc72efc2790bce4238c8c1c9df223f54c0b3651 /src
parent9d3102efe29e294971b30aa2ce00be5cb7db5e05 (diff)
Split QMediaRecorder::setEncodingSettings to separate setters.
It's easier to change only the necessary part of encoding settings. The settings are applied during the next event loop or before recording starts. Change-Id: Ia2b5c93826a302212aa7f79a0c75e4cbaaf1dd7a Reviewed-by: Ling Hu <ling.hu@nokia.com> Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/imports/multimedia/qdeclarativecamerarecorder.cpp15
-rw-r--r--src/imports/multimedia/qdeclarativecamerarecorder_p.h2
-rw-r--r--src/multimedia/controls/qmediacontainercontrol.cpp12
-rw-r--r--src/multimedia/controls/qmediacontainercontrol.h4
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp143
-rw-r--r--src/multimedia/recording/qmediarecorder.h10
-rw-r--r--src/multimedia/recording/qmediarecorder_p.h6
-rw-r--r--src/plugins/audiocapture/audiocapturesession.cpp4
-rw-r--r--src/plugins/audiocapture/audiocapturesession.h4
-rw-r--r--src/plugins/audiocapture/audiocontainercontrol.cpp8
-rw-r--r--src/plugins/audiocapture/audiocontainercontrol.h4
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.cpp2
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.h6
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp6
14 files changed, 163 insertions, 63 deletions
diff --git a/src/imports/multimedia/qdeclarativecamerarecorder.cpp b/src/imports/multimedia/qdeclarativecamerarecorder.cpp
index 7aad15037..e7568aa34 100644
--- a/src/imports/multimedia/qdeclarativecamerarecorder.cpp
+++ b/src/imports/multimedia/qdeclarativecamerarecorder.cpp
@@ -94,7 +94,7 @@ void QDeclarativeCameraRecorder::setCaptureResolution(const QSize &resolution)
{
if (resolution != captureResolution()) {
m_videoSettings.setResolution(resolution);
- applySettings();
+ m_recorder->setVideoSettings(m_videoSettings);
emit captureResolutionChanged(resolution);
}
}
@@ -103,7 +103,7 @@ void QDeclarativeCameraRecorder::setAudioCodec(const QString &codec)
{
if (codec != audioCodec()) {
m_audioSettings.setCodec(codec);
- applySettings();
+ m_recorder->setAudioSettings(m_audioSettings);
emit audioCodecChanged(codec);
}
}
@@ -112,7 +112,7 @@ void QDeclarativeCameraRecorder::setVideoCodec(const QString &codec)
{
if (codec != videoCodec()) {
m_videoSettings.setCodec(codec);
- applySettings();
+ m_recorder->setVideoSettings(m_videoSettings);
emit videoCodecChanged(codec);
}
}
@@ -121,18 +121,11 @@ void QDeclarativeCameraRecorder::setMediaContainer(const QString &container)
{
if (container != m_mediaContainer) {
m_mediaContainer = container;
- applySettings();
+ m_recorder->setContainerFormat(container);
emit mediaContainerChanged(container);
}
}
-void QDeclarativeCameraRecorder::applySettings()
-{
- m_recorder->setEncodingSettings(m_audioSettings,
- m_videoSettings,
- m_mediaContainer);
-}
-
QMediaRecorder::Error QDeclarativeCameraRecorder::error() const
{
return m_recorder->error();
diff --git a/src/imports/multimedia/qdeclarativecamerarecorder_p.h b/src/imports/multimedia/qdeclarativecamerarecorder_p.h
index 6706e41d0..9ff116fc5 100644
--- a/src/imports/multimedia/qdeclarativecamerarecorder_p.h
+++ b/src/imports/multimedia/qdeclarativecamerarecorder_p.h
@@ -144,8 +144,6 @@ private:
friend class QDeclarativeCamera;
QDeclarativeCameraRecorder(QCamera *camera, QObject *parent = 0);
- void applySettings();
-
QMediaRecorder *m_recorder;
QAudioEncoderSettings m_audioSettings;
diff --git a/src/multimedia/controls/qmediacontainercontrol.cpp b/src/multimedia/controls/qmediacontainercontrol.cpp
index a391a3bd1..647ba0ce1 100644
--- a/src/multimedia/controls/qmediacontainercontrol.cpp
+++ b/src/multimedia/controls/qmediacontainercontrol.cpp
@@ -101,21 +101,21 @@ QMediaContainerControl::~QMediaContainerControl()
*/
/*!
- \fn QMediaContainerControl::containerMimeType() const
+ \fn QMediaContainerControl::containerFormat() const
- Returns the MIME type of the selected container format.
+ Returns the selected container format.
*/
/*!
- \fn QMediaContainerControl::setContainerMimeType(const QString &mimeType)
+ \fn QMediaContainerControl::setContainerFormat(const QString &format)
- Sets the current container format to the format identified by the given \a mimeType.
+ Sets the current container \a format.
*/
/*!
- \fn QMediaContainerControl::containerDescription(const QString &mimeType) const
+ \fn QMediaContainerControl::containerDescription(const QString &format) const
- Returns a description of the container format identified by the given \a mimeType.
+ Returns a description of the container \a format.
*/
#include "moc_qmediacontainercontrol.cpp"
diff --git a/src/multimedia/controls/qmediacontainercontrol.h b/src/multimedia/controls/qmediacontainercontrol.h
index e0284660c..85582d521 100644
--- a/src/multimedia/controls/qmediacontainercontrol.h
+++ b/src/multimedia/controls/qmediacontainercontrol.h
@@ -60,8 +60,8 @@ public:
virtual ~QMediaContainerControl();
virtual QStringList supportedContainers() const = 0;
- virtual QString containerMimeType() const = 0;
- virtual void setContainerMimeType(const QString &formatMimeType) = 0;
+ virtual QString containerFormat() const = 0;
+ virtual void setContainerFormat(const QString &format) = 0;
virtual QString containerDescription(const QString &formatMimeType) const = 0;
diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp
index 9e007daa7..879d584c5 100644
--- a/src/multimedia/recording/qmediarecorder.cpp
+++ b/src/multimedia/recording/qmediarecorder.cpp
@@ -155,6 +155,34 @@ void QMediaRecorderPrivate::_q_updateNotifyInterval(int ms)
notifyTimer->setInterval(ms);
}
+void QMediaRecorderPrivate::applySettingsLater()
+{
+ if (control && !settingsChanged) {
+ settingsChanged = true;
+ QMetaObject::invokeMethod(q_func(), "_q_applySettings", Qt::QueuedConnection);
+ }
+}
+
+void QMediaRecorderPrivate::_q_applySettings()
+{
+ if (control && settingsChanged) {
+ settingsChanged = false;
+ control->applySettings();
+ }
+}
+
+void QMediaRecorderPrivate::restartCamera()
+{
+ //restart camera if it can't apply new settings in the Active state
+ QCamera *camera = qobject_cast<QCamera*>(mediaObject);
+ if (camera && camera->captureMode() == QCamera::CaptureVideo) {
+ QMetaObject::invokeMethod(camera,
+ "_q_preparePropertyChange",
+ Qt::DirectConnection,
+ Q_ARG(int, QCameraControl::VideoEncodingSettings));
+ }
+}
+
/*!
Constructs a media recorder which records the media produced by \a mediaObject.
@@ -316,6 +344,8 @@ bool QMediaRecorder::setMediaObject(QMediaObject *object)
connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
+ d->applySettingsLater();
+
return true;
}
}
@@ -438,7 +468,7 @@ void QMediaRecorder::setMuted(bool muted)
}
/*!
- Returns a list of MIME types of supported container formats.
+ Returns a list of supported container formats.
*/
QStringList QMediaRecorder::supportedContainers() const
{
@@ -447,22 +477,22 @@ QStringList QMediaRecorder::supportedContainers() const
}
/*!
- Returns a description of a container format \a mimeType.
+ Returns a description of a container \a format.
*/
-QString QMediaRecorder::containerDescription(const QString &mimeType) const
+QString QMediaRecorder::containerDescription(const QString &format) const
{
return d_func()->formatControl ?
- d_func()->formatControl->containerDescription(mimeType) : QString();
+ d_func()->formatControl->containerDescription(format) : QString();
}
/*!
- Returns the MIME type of the selected container format.
+ Returns the selected container format.
*/
-QString QMediaRecorder::containerMimeType() const
+QString QMediaRecorder::containerFormat() const
{
return d_func()->formatControl ?
- d_func()->formatControl->containerMimeType() : QString();
+ d_func()->formatControl->containerFormat() : QString();
}
/*!
@@ -593,18 +623,92 @@ QVideoEncoderSettings QMediaRecorder::videoSettings() const
}
/*!
- Sets the \a audio and \a video encoder settings and \a container format MIME type.
+ Sets the audio encoder \a settings.
+
+ If some parameters are not specified, or null settings are passed, the
+ encoder will choose default encoding parameters, depending on media
+ source properties.
+
+ It's only possible to change settings when the encoder is in the
+ QMediaEncoder::StoppedState state.
+
+ \sa audioSettings(), videoSettings(), containerFormat()
+*/
+
+void QMediaRecorder::setAudioSettings(const QAudioEncoderSettings &settings)
+{
+ Q_D(QMediaRecorder);
+
+ //restart camera if it can't apply new settings in the Active state
+ d->restartCamera();
+
+ if (d->audioControl) {
+ d->audioControl->setAudioSettings(settings);
+ d->applySettingsLater();
+ }
+}
+
+/*!
+ Sets the video encoder \a settings.
+
+ If some parameters are not specified, or null settings are passed, the
+ encoder will choose default encoding parameters, depending on media
+ source properties.
+
+ It's only possible to change settings when the encoder is in the
+ QMediaEncoder::StoppedState state.
+
+ \sa audioSettings(), videoSettings(), containerFormat()
+*/
+
+void QMediaRecorder::setVideoSettings(const QVideoEncoderSettings &settings)
+{
+ Q_D(QMediaRecorder);
+
+ d->restartCamera();
+
+ if (d->videoControl) {
+ d->videoControl->setVideoSettings(settings);
+ d->applySettingsLater();
+ }
+}
+
+/*!
+ Sets the media \a container format.
+
+ If the container format is not specified, the
+ encoder will choose format, depending on media source properties
+ and encoding settings selected.
+
+ It's only possible to change settings when the encoder is in the
+ QMediaEncoder::StoppedState state.
+
+ \sa audioSettings(), videoSettings(), containerFormat()
+*/
+
+void QMediaRecorder::setContainerFormat(const QString &container)
+{
+ Q_D(QMediaRecorder);
+
+ d->restartCamera();
+
+ if (d->formatControl) {
+ d->formatControl->setContainerFormat(container);
+ d->applySettingsLater();
+ }
+}
+
+/*!
+ Sets the \a audio and \a video encoder settings and \a container format.
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.
- \sa audioSettings(), videoSettings(), containerMimeType()
+ \sa audioSettings(), videoSettings(), containerFormat()
*/
void QMediaRecorder::setEncodingSettings(const QAudioEncoderSettings &audio,
@@ -613,13 +717,7 @@ void QMediaRecorder::setEncodingSettings(const QAudioEncoderSettings &audio,
{
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));
- }
+ d->restartCamera();
if (d->audioControl)
d->audioControl->setAudioSettings(audio);
@@ -628,13 +726,11 @@ void QMediaRecorder::setEncodingSettings(const QAudioEncoderSettings &audio,
d->videoControl->setVideoSettings(video);
if (d->formatControl)
- d->formatControl->setContainerMimeType(container);
+ d->formatControl->setContainerFormat(container);
- if (d->control)
- d->control->applySettings();
+ d->applySettingsLater();
}
-
/*!
Start recording.
@@ -647,6 +743,9 @@ void QMediaRecorder::record()
{
Q_D(QMediaRecorder);
+ if (d->settingsChanged)
+ d->_q_applySettings();
+
// reset error
d->error = NoError;
d->errorString = QString();
diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h
index 1536d160e..2a8d62fac 100644
--- a/src/multimedia/recording/qmediarecorder.h
+++ b/src/multimedia/recording/qmediarecorder.h
@@ -115,7 +115,7 @@ public:
bool isMuted() const;
QStringList supportedContainers() const;
- QString containerDescription(const QString &containerMimeType) const;
+ QString containerDescription(const QString &format) const;
QStringList supportedAudioCodecs() const;
QString audioCodecDescription(const QString &codecName) const;
@@ -134,13 +134,16 @@ public:
QAudioEncoderSettings audioSettings() const;
QVideoEncoderSettings videoSettings() const;
- QString containerMimeType() const;
+ QString containerFormat() const;
+
+ void setAudioSettings(const QAudioEncoderSettings &audioSettings);
+ void setVideoSettings(const QVideoEncoderSettings &videoSettings);
+ void setContainerFormat(const QString &container);
void setEncodingSettings(const QAudioEncoderSettings &audioSettings,
const QVideoEncoderSettings &videoSettings = QVideoEncoderSettings(),
const QString &containerMimeType = QString());
-
bool isMetaDataAvailable() const;
bool isMetaDataWritable() const;
@@ -178,6 +181,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed())
Q_PRIVATE_SLOT(d_func(), void _q_notify())
Q_PRIVATE_SLOT(d_func(), void _q_updateNotifyInterval(int))
+ Q_PRIVATE_SLOT(d_func(), void _q_applySettings())
};
QT_END_NAMESPACE
diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h
index bf18abf77..c868c4705 100644
--- a/src/multimedia/recording/qmediarecorder_p.h
+++ b/src/multimedia/recording/qmediarecorder_p.h
@@ -62,6 +62,9 @@ public:
QMediaRecorderPrivate();
virtual ~QMediaRecorderPrivate() {}
+ void applySettingsLater();
+ void restartCamera();
+
QMediaObject *mediaObject;
QMediaRecorderControl *control;
@@ -70,6 +73,8 @@ public:
QVideoEncoderControl *videoControl;
QMetaDataWriterControl *metaDataControl;
+ bool settingsChanged;
+
QTimer* notifyTimer;
QMediaRecorder::State state;
@@ -81,6 +86,7 @@ public:
void _q_serviceDestroyed();
void _q_notify();
void _q_updateNotifyInterval(int ms);
+ void _q_applySettings();
QMediaRecorder *q_ptr;
};
diff --git a/src/plugins/audiocapture/audiocapturesession.cpp b/src/plugins/audiocapture/audiocapturesession.cpp
index 29dd11dc9..62e475d15 100644
--- a/src/plugins/audiocapture/audiocapturesession.cpp
+++ b/src/plugins/audiocapture/audiocapturesession.cpp
@@ -146,7 +146,7 @@ QString AudioCaptureSession::containerDescription(const QString &formatMimeType)
return QString();
}
-void AudioCaptureSession::setContainerMimeType(const QString &formatMimeType)
+void AudioCaptureSession::setContainerFormat(const QString &formatMimeType)
{
if (!formatMimeType.contains(QLatin1String("audio/x-wav")) &&
!formatMimeType.contains(QLatin1String("audio/pcm")) &&
@@ -167,7 +167,7 @@ void AudioCaptureSession::setContainerMimeType(const QString &formatMimeType)
}
}
-QString AudioCaptureSession::containerMimeType() const
+QString AudioCaptureSession::containerFormat() const
{
if(wavFile)
return QString("audio/x-wav");
diff --git a/src/plugins/audiocapture/audiocapturesession.h b/src/plugins/audiocapture/audiocapturesession.h
index 4151daaa4..bf68f6eef 100644
--- a/src/plugins/audiocapture/audiocapturesession.h
+++ b/src/plugins/audiocapture/audiocapturesession.h
@@ -69,8 +69,8 @@ public:
bool isFormatSupported(const QAudioFormat &format) const;
bool setFormat(const QAudioFormat &format);
QStringList supportedContainers() const;
- QString containerMimeType() const;
- void setContainerMimeType(const QString &formatMimeType);
+ QString containerFormat() const;
+ void setContainerFormat(const QString &formatMimeType);
QString containerDescription(const QString &formatMimeType) const;
QUrl outputLocation() const;
diff --git a/src/plugins/audiocapture/audiocontainercontrol.cpp b/src/plugins/audiocapture/audiocontainercontrol.cpp
index 732df3e1e..462bfa731 100644
--- a/src/plugins/audiocapture/audiocontainercontrol.cpp
+++ b/src/plugins/audiocapture/audiocontainercontrol.cpp
@@ -57,14 +57,14 @@ QStringList AudioContainerControl::supportedContainers() const
return m_session->supportedContainers();
}
-QString AudioContainerControl::containerMimeType() const
+QString AudioContainerControl::containerFormat() const
{
- return m_session->containerMimeType();
+ return m_session->containerFormat();
}
-void AudioContainerControl::setContainerMimeType(const QString &formatMimeType)
+void AudioContainerControl::setContainerFormat(const QString &formatMimeType)
{
- m_session->setContainerMimeType(formatMimeType);
+ m_session->setContainerFormat(formatMimeType);
}
QString AudioContainerControl::containerDescription(const QString &formatMimeType) const
diff --git a/src/plugins/audiocapture/audiocontainercontrol.h b/src/plugins/audiocapture/audiocontainercontrol.h
index baf8a5a34..bc93834c3 100644
--- a/src/plugins/audiocapture/audiocontainercontrol.h
+++ b/src/plugins/audiocapture/audiocontainercontrol.h
@@ -59,8 +59,8 @@ public:
virtual ~AudioContainerControl();
QStringList supportedContainers() const;
- QString containerMimeType() const;
- void setContainerMimeType(const QString &formatMimeType);
+ QString containerFormat() const;
+ void setContainerFormat(const QString &formatMimeType);
QString containerDescription(const QString &formatMimeType) const;
private:
diff --git a/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.cpp
index 3e57cc786..12297bac5 100644
--- a/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.cpp
+++ b/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.cpp
@@ -101,7 +101,7 @@ QGstreamerMediaContainerControl::QGstreamerMediaContainerControl(QObject *parent
}
//if (!m_supportedContainers.isEmpty())
- // setContainerMimeType(m_supportedContainers[0]);
+ // setContainerFormat(m_supportedContainers[0]);
}
QSet<QString> QGstreamerMediaContainerControl::supportedStreamTypes(GstElementFactory *factory, GstPadDirection direction)
diff --git a/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.h b/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.h
index 68a0b0b56..75d7e8eb7 100644
--- a/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.h
+++ b/src/plugins/gstreamer/mediacapture/qgstreamermediacontainercontrol.h
@@ -59,12 +59,12 @@ public:
virtual ~QGstreamerMediaContainerControl() {};
virtual QStringList supportedContainers() const { return m_supportedContainers; }
- virtual QString containerMimeType() const { return m_format; }
- virtual void setContainerMimeType(const QString &formatMimeType) { m_format = formatMimeType; }
+ virtual QString containerFormat() const { return m_format; }
+ virtual void setContainerFormat(const QString &formatMimeType) { m_format = formatMimeType; }
virtual QString containerDescription(const QString &formatMimeType) const { return m_containerDescriptions.value(formatMimeType); }
- QByteArray formatElementName() const { return m_elementNames.value(containerMimeType()); }
+ QByteArray formatElementName() const { return m_elementNames.value(containerFormat()); }
QSet<QString> supportedStreamTypes(const QString &container) const;
diff --git a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
index 958551fb7..c9e8d454c 100644
--- a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
+++ b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
@@ -152,10 +152,10 @@ void QGstreamerRecorderControl::applySettings()
bool needVideo = m_session->captureMode() & QGstreamerCaptureSession::Video;
QStringList containerCandidates;
- if (mediaContainerControl->containerMimeType().isEmpty())
+ if (mediaContainerControl->containerFormat().isEmpty())
containerCandidates = mediaContainerControl->supportedContainers();
else
- containerCandidates << mediaContainerControl->containerMimeType();
+ containerCandidates << mediaContainerControl->containerFormat();
QStringList audioCandidates;
@@ -221,7 +221,7 @@ void QGstreamerRecorderControl::applySettings()
if (container.isEmpty()) {
emit error(QMediaRecorder::FormatError, tr("Not compatible codecs and container format."));
} else {
- mediaContainerControl->setContainerMimeType(container);
+ mediaContainerControl->setContainerFormat(container);
if (needAudio) {
QAudioEncoderSettings audioSettings = audioEncodeControl->audioSettings();