From 817c548df4b3693495323b163c584945077bbdaa Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 7 Jan 2014 16:54:44 +0100 Subject: [PATCH 01/10] don't error out on static builds commit daa8e22 made it actually work, but apparently forgot to re-enable it. Task-number: QTBUG-35843 Change-Id: Ib782634a4b1916e25e22f0b4c4f7bf42bf92b52f Reviewed-by: David Faure Reviewed-by: Yoann Lopes --- examples/multimedia/spectrum/app/app.pro | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/multimedia/spectrum/app/app.pro b/examples/multimedia/spectrum/app/app.pro index 581848a7..8262372c 100644 --- a/examples/multimedia/spectrum/app/app.pro +++ b/examples/multimedia/spectrum/app/app.pro @@ -1,7 +1,5 @@ include(../spectrum.pri) -static: error(This application cannot be statically linked to the fftreal library) - TEMPLATE = app TARGET = spectrum From 4d3f740795ece7fb46760d384f21913e02b296d7 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Dec 2013 13:11:07 +1000 Subject: [PATCH 02/10] Allow the camerabin source selection to be overridden. Prefer the default camera-source element if there is one or an element identified by an environment variable to a static list of possible elements which may not be appropriate for the target environment. Change-Id: I53816c949307953780f9046eb11e09effe059be0 Reviewed-by: John Brooks Reviewed-by: Andy Nichols Reviewed-by: Yoann Lopes --- .../qgstreamervideoinputdevicecontrol.cpp | 27 ++++-- .../qgstreamervideoinputdevicecontrol_p.h | 5 + .../gstreamer/camerabin/camerabinservice.cpp | 3 +- .../gstreamer/camerabin/camerabinsession.cpp | 94 ++++++++++--------- .../gstreamer/camerabin/camerabinsession.h | 3 +- 5 files changed, 81 insertions(+), 51 deletions(-) diff --git a/src/gsttools/qgstreamervideoinputdevicecontrol.cpp b/src/gsttools/qgstreamervideoinputdevicecontrol.cpp index 960853bb..ad61aefa 100644 --- a/src/gsttools/qgstreamervideoinputdevicecontrol.cpp +++ b/src/gsttools/qgstreamervideoinputdevicecontrol.cpp @@ -57,13 +57,24 @@ #include QGstreamerVideoInputDeviceControl::QGstreamerVideoInputDeviceControl(QObject *parent) - :QVideoDeviceSelectorControl(parent), m_selectedDevice(0) + :QVideoDeviceSelectorControl(parent), m_source(0), m_selectedDevice(0) { update(); } +QGstreamerVideoInputDeviceControl::QGstreamerVideoInputDeviceControl(GstElement *source, QObject *parent) + :QVideoDeviceSelectorControl(parent), m_source(source), m_selectedDevice(0) +{ + if (m_source) + gst_object_ref(GST_OBJECT(m_source)); + + update(); +} + QGstreamerVideoInputDeviceControl::~QGstreamerVideoInputDeviceControl() { + if (m_source) + gst_object_unref(GST_OBJECT(m_source)); } int QGstreamerVideoInputDeviceControl::deviceCount() const @@ -107,10 +118,15 @@ void QGstreamerVideoInputDeviceControl::update() m_names.clear(); m_descriptions.clear(); -#ifdef Q_WS_MAEMO_6 - m_names << QLatin1String("primary") << QLatin1String("secondary"); - m_descriptions << tr("Main camera") << tr("Front camera"); -#else + // subdevsrc and the like have a camera-device property that takes an enumeration + // identifying a primary or secondary camera, so return identifiers that map to those + // instead of a list of actual devices. + if (m_source && g_object_class_find_property(G_OBJECT_GET_CLASS(m_source), "camera-device")) { + m_names << QLatin1String("primary") << QLatin1String("secondary"); + m_descriptions << tr("Main camera") << tr("Front camera"); + return; + } + QDir devDir("/dev"); devDir.setFilter(QDir::System); @@ -151,5 +167,4 @@ void QGstreamerVideoInputDeviceControl::update() } ::close(fd); } -#endif } diff --git a/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h b/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h index 401f5024..eeb576ef 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h @@ -45,6 +45,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE class QGstreamerVideoInputDeviceControl : public QVideoDeviceSelectorControl @@ -52,6 +54,7 @@ class QGstreamerVideoInputDeviceControl : public QVideoDeviceSelectorControl Q_OBJECT public: QGstreamerVideoInputDeviceControl(QObject *parent); + QGstreamerVideoInputDeviceControl(GstElement *source, QObject *parent); ~QGstreamerVideoInputDeviceControl(); int deviceCount() const; @@ -68,6 +71,8 @@ public Q_SLOTS: private: void update(); + GstElement *m_source; + int m_selectedDevice; QStringList m_names; QStringList m_descriptions; diff --git a/src/plugins/gstreamer/camerabin/camerabinservice.cpp b/src/plugins/gstreamer/camerabin/camerabinservice.cpp index 54c49f41..58d44332 100644 --- a/src/plugins/gstreamer/camerabin/camerabinservice.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinservice.cpp @@ -109,7 +109,8 @@ CameraBinService::CameraBinService(const QString &service, QObject *parent): if (service == Q_MEDIASERVICE_CAMERA) { m_captureSession = new CameraBinSession(this); m_cameraControl = new CameraBinControl(m_captureSession); - m_videoInputDevice = new QGstreamerVideoInputDeviceControl(m_captureSession); + m_videoInputDevice = new QGstreamerVideoInputDeviceControl( + m_captureSession->buildCameraSource(), m_captureSession); m_imageCaptureControl = new CameraBinImageCapture(m_captureSession); connect(m_videoInputDevice, SIGNAL(selectedDeviceChanged(QString)), diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 2e5c53a4..6e857d58 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -169,6 +169,10 @@ CameraBinSession::CameraBinSession(QObject *parent) m_captureDestinationControl = new CameraBinCaptureDestination(this); m_captureBufferFormatControl = new CameraBinCaptureBufferFormat(this); + QByteArray envFlags = qgetenv("QT_GSTREAMER_CAMERABIN_FLAGS"); + if (!envFlags.isEmpty()) + g_object_set(G_OBJECT(m_camerabin), "flags", envFlags.toInt(), NULL); + //post image preview in RGB format g_object_set(G_OBJECT(m_camerabin), POST_PREVIEWS_PROPERTY, TRUE, NULL); @@ -197,19 +201,10 @@ GstPhotography *CameraBinSession::photography() return GST_PHOTOGRAPHY(m_camerabin); } - if (!m_videoSrc) { - m_videoSrc = buildCameraSource(); + GstElement * const source = buildCameraSource(); - if (m_videoSrc) - g_object_set(m_camerabin, CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL); - else - g_object_get(m_camerabin, CAMERA_SOURCE_PROPERTY, &m_videoSrc, NULL); - - m_videoInputHasChanged = false; - } - - if (m_videoSrc && GST_IS_PHOTOGRAPHY(m_videoSrc)) - return GST_PHOTOGRAPHY(m_videoSrc); + if (source && GST_IS_PHOTOGRAPHY(source)) + return GST_PHOTOGRAPHY(source); return 0; } @@ -225,17 +220,8 @@ CameraBinSession::CameraRole CameraBinSession::cameraRole() const */ bool CameraBinSession::setupCameraBin() { - if (m_videoInputHasChanged) { - m_videoSrc = buildCameraSource(); - - if (m_videoSrc) - g_object_set(m_camerabin, CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL); - else - g_object_get(m_camerabin, CAMERA_SOURCE_PROPERTY, &m_videoSrc, NULL); - - m_videoInputHasChanged = false; - } - + if (!buildCameraSource()) + return false; if (m_viewfinderHasChanged) { if (m_viewfinderElement) @@ -370,28 +356,43 @@ GstElement *CameraBinSession::buildCameraSource() #if CAMERABIN_DEBUG qDebug() << Q_FUNC_INFO; #endif + if (!m_videoInputHasChanged) + return m_videoSrc; + m_videoInputHasChanged = false; + GstElement *videoSrc = 0; + g_object_get(G_OBJECT(m_camerabin), CAMERA_SOURCE_PROPERTY, &videoSrc, NULL); - QList candidates; - candidates << "subdevsrc" << "wrappercamerabinsrc"; - QByteArray sourceElementName; - - foreach (sourceElementName, candidates) { - videoSrc = gst_element_factory_make(sourceElementName.constData(), "camera_source"); - if (videoSrc) - break; + // If the QT_GSTREAMER_CAMERABIN_SRC environment variable has been set use the source + // it recommends. + const QByteArray envCandidate = qgetenv("QT_GSTREAMER_CAMERABIN_SRC"); + if (!m_videoSrc && !envCandidate.isEmpty()) { + m_videoSrc = gst_element_factory_make(envCandidate.constData(), "camera_source"); } - if (videoSrc && !m_inputDevice.isEmpty()) { + // If gstreamer has set a default source use it. + if (!m_videoSrc) + m_videoSrc = videoSrc; + + // If there's no better guidance try the names of some known camera source elements. + if (!m_videoSrc) { + const QList candidates = QList() + << "subdevsrc" + << "wrappercamerabinsrc"; + + foreach (const QByteArray &sourceElementName, candidates) { + m_videoSrc = gst_element_factory_make(sourceElementName.constData(), "camera_source"); + if (m_videoSrc) + break; + } + } + + if (m_videoSrc && !m_inputDevice.isEmpty()) { #if CAMERABIN_DEBUG qDebug() << "set camera device" << m_inputDevice; #endif - if (sourceElementName == "subdevsrc") { - if (m_inputDevice == QLatin1String("secondary")) - g_object_set(G_OBJECT(videoSrc), "camera-device", 1, NULL); - else - g_object_set(G_OBJECT(videoSrc), "camera-device", 0, NULL); - } else if (sourceElementName == "wrappercamerabinsrc") { + + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "video-source")) { GstElement *src = 0; if (m_videoInputFactory) @@ -401,12 +402,21 @@ GstElement *CameraBinSession::buildCameraSource() if (src) { g_object_set(G_OBJECT(src), "device", m_inputDevice.toUtf8().constData(), NULL); - g_object_set(G_OBJECT(videoSrc), "video-source", src, NULL); + g_object_set(G_OBJECT(m_videoSrc), "video-source", src, NULL); + } + } else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "camera-device")) { + if (m_inputDevice == QLatin1String("secondary")) { + g_object_set(G_OBJECT(m_videoSrc), "camera-device", 1, NULL); + } else { + g_object_set(G_OBJECT(m_videoSrc), "camera-device", 0, NULL); } } } - return videoSrc; + if (m_videoSrc != videoSrc) + g_object_set(G_OBJECT(m_camerabin), CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL); + + return m_videoSrc; } void CameraBinSession::captureImage(int requestId, const QString &fileName) @@ -626,9 +636,7 @@ void CameraBinSession::setState(QCamera::State newState) m_viewfinderInterface->stopRenderer(); gst_element_set_state(m_camerabin, GST_STATE_NULL); - m_videoSrc = buildCameraSource(); - g_object_set(m_camerabin, CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL); - m_videoInputHasChanged = false; + buildCameraSource(); } #ifdef USE_READY_STATE_ON_LOADED gst_element_set_state(m_camerabin, GST_STATE_READY); diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.h b/src/plugins/gstreamer/camerabin/camerabinsession.h index 305c1168..bdc27f33 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.h +++ b/src/plugins/gstreamer/camerabin/camerabinsession.h @@ -117,6 +117,8 @@ public: QDir defaultDir(QCamera::CaptureModes mode) const; QString generateFileName(const QString &prefix, const QDir &dir, const QString &ext) const; + GstElement *buildCameraSource(); + CameraBinAudioEncoder *audioEncodeControl() const { return m_audioEncodeControl; } CameraBinVideoEncoder *videoEncodeControl() const { return m_videoEncodeControl; } CameraBinImageEncoder *imageEncodeControl() const { return m_imageEncodeControl; } @@ -188,7 +190,6 @@ private slots: private: bool setupCameraBin(); void setupCaptureResolution(); - GstElement *buildCameraSource(); static void updateBusyStatus(GObject *o, GParamSpec *p, gpointer d); QUrl m_sink; From 2ec3645b729d4a9ccc3b4bfbf4d64c6def69b68f Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Thu, 5 Dec 2013 16:17:19 +1000 Subject: [PATCH 03/10] Fix configuration of camera settings in camerabin backend. Enable gstphotography interfaces if the compile check passes, and implement missing pieces of whitebalance and focus configuration. Change-Id: Icd24dfd148204f8d8218176593c3120427a13e1e Reviewed-by: John Brooks Reviewed-by: Yoann Lopes --- src/plugins/gstreamer/camerabin/camerabin.pro | 2 +- .../gstreamer/camerabin/camerabinfocus.cpp | 43 +++++++++++++++++-- .../camerabin/camerabinimageprocessing.cpp | 4 +- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/plugins/gstreamer/camerabin/camerabin.pro b/src/plugins/gstreamer/camerabin/camerabin.pro index 27c368e8..e18da8e6 100644 --- a/src/plugins/gstreamer/camerabin/camerabin.pro +++ b/src/plugins/gstreamer/camerabin/camerabin.pro @@ -58,7 +58,7 @@ maemo6 { CONFIG += have_gst_photography } -have_gst_photography { +config_gstreamer_photography { DEFINES += HAVE_GST_PHOTOGRAPHY HEADERS += \ diff --git a/src/plugins/gstreamer/camerabin/camerabinfocus.cpp b/src/plugins/gstreamer/camerabin/camerabinfocus.cpp index 2f69cad3..ed5b483c 100644 --- a/src/plugins/gstreamer/camerabin/camerabinfocus.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinfocus.cpp @@ -58,6 +58,8 @@ CameraBinFocus::CameraBinFocus(CameraBinSession *session) m_focusStatus(QCamera::Unlocked), m_focusZoneStatus(QCameraFocusZone::Selected) { + gst_photography_set_focus_mode(m_session->photography(), GST_PHOTOGRAPHY_FOCUS_MODE_AUTO); + connect(m_session, SIGNAL(stateChanged(QCamera::State)), this, SLOT(_q_handleCameraStateChange(QCamera::State))); } @@ -73,14 +75,49 @@ QCameraFocus::FocusModes CameraBinFocus::focusMode() const void CameraBinFocus::setFocusMode(QCameraFocus::FocusModes mode) { - if (isFocusModeSupported(mode)) { - m_focusMode = mode; + GstFocusMode photographyMode; + + switch (mode) { + case QCameraFocus::AutoFocus: + photographyMode = GST_PHOTOGRAPHY_FOCUS_MODE_AUTO; + break; + case QCameraFocus::HyperfocalFocus: + photographyMode = GST_PHOTOGRAPHY_FOCUS_MODE_HYPERFOCAL; + break; + case QCameraFocus::InfinityFocus: + photographyMode = GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY; + break; + case QCameraFocus::ContinuousFocus: + photographyMode = GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL; + break; + case QCameraFocus::MacroFocus: + photographyMode = GST_PHOTOGRAPHY_FOCUS_MODE_MACRO; + break; + default: + if (mode & QCameraFocus::AutoFocus) { + photographyMode = GST_PHOTOGRAPHY_FOCUS_MODE_AUTO; + break; + } else { + return; + } } + + if (gst_photography_set_focus_mode(m_session->photography(), photographyMode)) + m_focusMode = mode; } bool CameraBinFocus::isFocusModeSupported(QCameraFocus::FocusModes mode) const { - return mode & QCameraFocus::AutoFocus; + switch (mode) { + case QCameraFocus::AutoFocus: + case QCameraFocus::HyperfocalFocus: + case QCameraFocus::InfinityFocus: + case QCameraFocus::ContinuousFocus: + case QCameraFocus::MacroFocus: + return true; + default: + return mode & QCameraFocus::AutoFocus; + } } QCameraFocus::FocusPointMode CameraBinFocus::focusPointMode() const diff --git a/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp b/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp index a714b289..fb980204 100644 --- a/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp @@ -188,7 +188,9 @@ bool CameraBinImageProcessing::isParameterValueSupported(QCameraImageProcessingC QVariant CameraBinImageProcessing::parameter( QCameraImageProcessingControl::ProcessingParameter parameter) const { - if (m_values.contains(parameter)) + if (parameter == QCameraImageProcessingControl::WhiteBalancePreset) + return QVariant::fromValue(whiteBalanceMode()); + else if (m_values.contains(parameter)) return m_values.value(parameter); else return QVariant(); From 61001f8dd5a1b2d128259b518f74d46cf9f69173 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Dec 2013 17:50:01 +1000 Subject: [PATCH 04/10] Fix recording settings being discarded by the Camera QML type. Query existing settings from the recorder instead of locally cached settings as some other agent may have applied some settings separately and those would otherwise be discarded. Change-Id: I0ebeaf06c6f7306c5987aa269032842b538a6a8b Reviewed-by: John Brooks Reviewed-by: Yoann Lopes --- src/imports/multimedia/qdeclarativecameracapture.cpp | 1 + src/imports/multimedia/qdeclarativecamerarecorder.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/imports/multimedia/qdeclarativecameracapture.cpp b/src/imports/multimedia/qdeclarativecameracapture.cpp index b93ab456..d5f36343 100644 --- a/src/imports/multimedia/qdeclarativecameracapture.cpp +++ b/src/imports/multimedia/qdeclarativecameracapture.cpp @@ -267,6 +267,7 @@ QSize QDeclarativeCameraCapture::resolution() void QDeclarativeCameraCapture::setResolution(const QSize &captureResolution) { + m_imageSettings = m_capture->encodingSettings(); if (captureResolution != resolution()) { m_imageSettings.setResolution(captureResolution); m_capture->setEncodingSettings(m_imageSettings); diff --git a/src/imports/multimedia/qdeclarativecamerarecorder.cpp b/src/imports/multimedia/qdeclarativecamerarecorder.cpp index 9e11731c..0f400467 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder.cpp +++ b/src/imports/multimedia/qdeclarativecamerarecorder.cpp @@ -145,6 +145,7 @@ QString QDeclarativeCameraRecorder::mediaContainer() const void QDeclarativeCameraRecorder::setCaptureResolution(const QSize &resolution) { + m_videoSettings = m_recorder->videoSettings(); if (resolution != captureResolution()) { m_videoSettings.setResolution(resolution); m_recorder->setVideoSettings(m_videoSettings); @@ -154,6 +155,7 @@ void QDeclarativeCameraRecorder::setCaptureResolution(const QSize &resolution) void QDeclarativeCameraRecorder::setAudioCodec(const QString &codec) { + m_audioSettings = m_recorder->audioSettings(); if (codec != audioCodec()) { m_audioSettings.setCodec(codec); m_recorder->setAudioSettings(m_audioSettings); @@ -163,6 +165,7 @@ void QDeclarativeCameraRecorder::setAudioCodec(const QString &codec) void QDeclarativeCameraRecorder::setVideoCodec(const QString &codec) { + m_videoSettings = m_recorder->videoSettings(); if (codec != videoCodec()) { m_videoSettings.setCodec(codec); m_recorder->setVideoSettings(m_videoSettings); @@ -281,6 +284,7 @@ QDeclarativeCameraRecorder::EncodingMode QDeclarativeCameraRecorder::audioEncodi void QDeclarativeCameraRecorder::setFrameRate(qreal frameRate) { + m_videoSettings = m_recorder->videoSettings(); if (!qFuzzyCompare(m_videoSettings.frameRate(),frameRate)) { m_videoSettings.setFrameRate(frameRate); m_recorder->setVideoSettings(m_videoSettings); @@ -290,6 +294,7 @@ void QDeclarativeCameraRecorder::setFrameRate(qreal frameRate) void QDeclarativeCameraRecorder::setVideoBitRate(int rate) { + m_videoSettings = m_recorder->videoSettings(); if (m_videoSettings.bitRate() != rate) { m_videoSettings.setBitRate(rate); m_recorder->setVideoSettings(m_videoSettings); @@ -299,6 +304,7 @@ void QDeclarativeCameraRecorder::setVideoBitRate(int rate) void QDeclarativeCameraRecorder::setAudioBitRate(int rate) { + m_audioSettings = m_recorder->audioSettings(); if (m_audioSettings.bitRate() != rate) { m_audioSettings.setBitRate(rate); m_recorder->setAudioSettings(m_audioSettings); @@ -308,6 +314,7 @@ void QDeclarativeCameraRecorder::setAudioBitRate(int rate) void QDeclarativeCameraRecorder::setAudioChannels(int channels) { + m_audioSettings = m_recorder->audioSettings(); if (m_audioSettings.channelCount() != channels) { m_audioSettings.setChannelCount(channels); m_recorder->setAudioSettings(m_audioSettings); @@ -317,6 +324,7 @@ void QDeclarativeCameraRecorder::setAudioChannels(int channels) void QDeclarativeCameraRecorder::setAudioSampleRate(int rate) { + m_audioSettings = m_recorder->audioSettings(); if (m_audioSettings.sampleRate() != rate) { m_audioSettings.setSampleRate(rate); m_recorder->setAudioSettings(m_audioSettings); @@ -326,6 +334,7 @@ void QDeclarativeCameraRecorder::setAudioSampleRate(int rate) void QDeclarativeCameraRecorder::setAudioEncodingMode(QDeclarativeCameraRecorder::EncodingMode encodingMode) { + m_audioSettings = m_recorder->audioSettings(); if (m_audioSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { m_audioSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); m_recorder->setAudioSettings(m_audioSettings); @@ -335,6 +344,7 @@ void QDeclarativeCameraRecorder::setAudioEncodingMode(QDeclarativeCameraRecorder void QDeclarativeCameraRecorder::setVideoEncodingMode(QDeclarativeCameraRecorder::EncodingMode encodingMode) { + m_videoSettings = m_recorder->videoSettings(); if (m_videoSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { m_videoSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); m_recorder->setVideoSettings(m_videoSettings); From b27913b76d5a1820470b411d2193e4388b047c9d Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Dec 2013 17:59:52 +1000 Subject: [PATCH 05/10] Fix playback with exotic gstreamer pipelines. Extend the list of raw video formats, and allow the playbin flags to be overridden by an environment variable when the default isn't suitable for whatever reason. Change-Id: I4c7d821b0ce29f5ad2dc0341e378ffd17c489e98 Reviewed-by: John Brooks Reviewed-by: Yoann Lopes --- .../gstreamer/mediaplayer/qgstreamerplayersession.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp index 04d612b0..d61e6a01 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp @@ -83,6 +83,7 @@ typedef enum { "video/x-raw-rgb; " \ "video/x-raw-gray; " \ "video/x-surface; " \ + "video/x-android-buffer; " \ "audio/x-raw-int; " \ "audio/x-raw-float; " \ "text/plain; " \ @@ -140,7 +141,12 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent) #else int flags = 0; g_object_get(G_OBJECT(m_playbin), "flags", &flags, NULL); - flags |= GST_PLAY_FLAG_NATIVE_VIDEO; + QByteArray envFlags = qgetenv("QT_GSTREAMER_PLAYBIN_FLAGS"); + if (!envFlags.isEmpty()) { + flags |= envFlags.toInt(); + } else { + flags |= GST_PLAY_FLAG_NATIVE_VIDEO; + } #endif g_object_set(G_OBJECT(m_playbin), "flags", flags, NULL); From 15025088eac53d97705191d06b13868d62977155 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Wed, 11 Dec 2013 14:29:57 +1000 Subject: [PATCH 06/10] Only acquire resources as required in gstreamer backend. Make resources required for capture optional and disable just the capture features if they are not available, so the camera viewfinder can be displayed and images captured without blocking the music playback and the other way around. Change-Id: Ic9692195156d994ccd4a911ae41d2242a00d575b Reviewed-by: John Brooks Reviewed-by: Yoann Lopes --- .../gstreamer/camerabin/camerabincontrol.cpp | 8 ++- .../gstreamer/camerabin/camerabincontrol.h | 2 + .../camerabin/camerabinimagecapture.cpp | 6 +- .../gstreamer/camerabin/camerabinrecorder.cpp | 19 +++-- .../gstreamer/camerabin/camerabinrecorder.h | 1 - .../camerabin/camerabinresourcepolicy.cpp | 72 +++++++++++++++---- .../camerabin/camerabinresourcepolicy.h | 9 +++ .../gstreamer/camerabin/camerabinservice.cpp | 4 +- .../gstreamer/camerabin/camerabinservice.h | 1 - .../gstreamer/camerabin/camerabinsession.cpp | 4 ++ .../gstreamer/camerabin/camerabinsession.h | 3 + .../resourcepolicy/resourcepolicyimpl.cpp | 3 +- 12 files changed, 107 insertions(+), 25 deletions(-) diff --git a/src/plugins/gstreamer/camerabin/camerabincontrol.cpp b/src/plugins/gstreamer/camerabin/camerabincontrol.cpp index 62006064..8c63959c 100644 --- a/src/plugins/gstreamer/camerabin/camerabincontrol.cpp +++ b/src/plugins/gstreamer/camerabin/camerabincontrol.cpp @@ -201,7 +201,9 @@ void CameraBinControl::updateStatus() case QCamera::LoadedState: switch (sessionState) { case QCamera::UnloadedState: - m_status = QCamera::LoadingStatus; + m_status = m_resourcePolicy->isResourcesGranted() + ? QCamera::LoadingStatus + : QCamera::UnavailableStatus; break; case QCamera::LoadedState: m_status = QCamera::LoadedStatus; @@ -214,7 +216,9 @@ void CameraBinControl::updateStatus() case QCamera::ActiveState: switch (sessionState) { case QCamera::UnloadedState: - m_status = QCamera::LoadingStatus; + m_status = m_resourcePolicy->isResourcesGranted() + ? QCamera::LoadingStatus + : QCamera::UnavailableStatus; break; case QCamera::LoadedState: m_status = QCamera::StartingStatus; diff --git a/src/plugins/gstreamer/camerabin/camerabincontrol.h b/src/plugins/gstreamer/camerabin/camerabincontrol.h index 821bee3e..8958974a 100644 --- a/src/plugins/gstreamer/camerabin/camerabincontrol.h +++ b/src/plugins/gstreamer/camerabin/camerabincontrol.h @@ -73,6 +73,8 @@ public: bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const; bool viewfinderColorSpaceConversion() const; + CamerabinResourcePolicy *resourcePolicy() { return m_resourcePolicy; } + public slots: void reloadLater(); void setViewfinderColorSpaceConversion(bool enabled); diff --git a/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp b/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp index 79cfca3b..122a10ee 100644 --- a/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp @@ -40,9 +40,11 @@ ****************************************************************************/ #include "camerabinimagecapture.h" +#include "camerabincontrol.h" #include "camerabincapturedestination.h" #include "camerabincapturebufferformat.h" #include "camerabinsession.h" +#include "camerabinresourcepolicy.h" #include #include #include @@ -68,6 +70,7 @@ CameraBinImageCapture::CameraBinImageCapture(CameraBinSession *session) connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(updateState())); connect(m_session, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); connect(m_session, SIGNAL(imageCaptured(int,QImage)), this, SIGNAL(imageCaptured(int,QImage))); + connect(m_session->cameraControl()->resourcePolicy(), SIGNAL(canCaptureChanged()), this, SLOT(updateState())); m_session->bus()->installMessageFilter(this); } @@ -103,7 +106,8 @@ void CameraBinImageCapture::cancelCapture() void CameraBinImageCapture::updateState() { - bool ready = m_session->state() == QCamera::ActiveState; + bool ready = m_session->state() == QCamera::ActiveState + && m_session->cameraControl()->resourcePolicy()->canCapture(); if (m_ready != ready) { #ifdef DEBUG_CAPTURE qDebug() << "readyForCaptureChanged" << ready; diff --git a/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp b/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp index e45f187c..c8967dfb 100644 --- a/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp @@ -40,6 +40,8 @@ ****************************************************************************/ #include "camerabinrecorder.h" +#include "camerabincontrol.h" +#include "camerabinresourcepolicy.h" #include "camerabinaudioencoder.h" #include "camerabinvideoencoder.h" #include "camerabincontainer.h" @@ -61,6 +63,8 @@ CameraBinRecorder::CameraBinRecorder(CameraBinSession *session) connect(m_session, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64))); connect(m_session, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool))); + connect(m_session->cameraControl()->resourcePolicy(), SIGNAL(canCaptureChanged()), + this, SLOT(updateStatus())); } CameraBinRecorder::~CameraBinRecorder() @@ -98,7 +102,11 @@ void CameraBinRecorder::updateStatus() if (sessionState == QCamera::ActiveState && m_session->captureMode().testFlag(QCamera::CaptureVideo)) { - if (m_state == QMediaRecorder::RecordingState) { + if (!m_session->cameraControl()->resourcePolicy()->canCapture()) { + m_status = QMediaRecorder::UnavailableStatus; + m_state = QMediaRecorder::StoppedState; + m_session->stopVideoRecording(); + } else if (m_state == QMediaRecorder::RecordingState) { m_status = QMediaRecorder::RecordingStatus; } else { m_status = m_session->isBusy() ? @@ -208,13 +216,16 @@ void CameraBinRecorder::setState(QMediaRecorder::State state) emit error(QMediaRecorder::ResourceError, tr("QMediaRecorder::pause() is not supported by camerabin2.")); break; case QMediaRecorder::RecordingState: - if (m_session->state() == QCamera::ActiveState) { + + if (m_session->state() != QCamera::ActiveState) { + emit error(QMediaRecorder::ResourceError, tr("Service has not been started")); + } else if (!m_session->cameraControl()->resourcePolicy()->canCapture()) { + emit error(QMediaRecorder::ResourceError, tr("Recording permissions are not available")); + } else { m_session->recordVideo(); m_state = state; m_status = QMediaRecorder::RecordingStatus; emit actualLocationChanged(m_session->outputLocation()); - } else { - emit error(QMediaRecorder::ResourceError, tr("Service has not been started")); } } diff --git a/src/plugins/gstreamer/camerabin/camerabinrecorder.h b/src/plugins/gstreamer/camerabin/camerabinrecorder.h index 2f8fe5d1..691fc12f 100644 --- a/src/plugins/gstreamer/camerabin/camerabinrecorder.h +++ b/src/plugins/gstreamer/camerabin/camerabinrecorder.h @@ -76,7 +76,6 @@ public slots: void setMuted(bool); void setVolume(qreal volume); -private slots: void updateStatus(); private: diff --git a/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.cpp b/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.cpp index 11b04a97..d6df4208 100644 --- a/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.cpp @@ -56,7 +56,8 @@ QT_BEGIN_NAMESPACE CamerabinResourcePolicy::CamerabinResourcePolicy(QObject *parent) : QObject(parent), m_resourceSet(NoResources), - m_releasingResources(false) + m_releasingResources(false), + m_canCapture(false) { #ifdef HAVE_RESOURCE_POLICY //loaded resource set is also kept requested for image and video capture sets @@ -65,10 +66,13 @@ CamerabinResourcePolicy::CamerabinResourcePolicy(QObject *parent) : m_resource->initAndConnect(); connect(m_resource, SIGNAL(resourcesGranted(const QList)), - SIGNAL(resourcesGranted())); + SLOT(handleResourcesGranted())); connect(m_resource, SIGNAL(resourcesDenied()), SIGNAL(resourcesDenied())); - connect(m_resource, SIGNAL(lostResources()), SIGNAL(resourcesLost())); + connect(m_resource, SIGNAL(lostResources()), SLOT(handleResourcesLost())); connect(m_resource, SIGNAL(resourcesReleased()), SLOT(handleResourcesReleased())); + connect(m_resource, SIGNAL(resourcesBecameAvailable(QList)), + this, SLOT(resourcesAvailable())); + connect(m_resource, SIGNAL(updateOK()), this, SLOT(updateCanCapture())); #endif } @@ -112,17 +116,13 @@ void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSe break; case LoadedResources: requestedTypes << ResourcePolicy::LensCoverType //to detect lens cover is opened/closed - << ResourcePolicy::VideoRecorderType //to open camera device - << ResourcePolicy::SnapButtonType; //to detect capture button events + << ResourcePolicy::VideoRecorderType; //to open camera device break; case ImageCaptureResources: requestedTypes << ResourcePolicy::LensCoverType << ResourcePolicy::VideoPlaybackType << ResourcePolicy::VideoRecorderType - << ResourcePolicy::AudioPlaybackType - << ResourcePolicy::ScaleButtonType - << ResourcePolicy::LedsType - << ResourcePolicy::SnapButtonType; + << ResourcePolicy::LedsType; break; case VideoCaptureResources: requestedTypes << ResourcePolicy::LensCoverType @@ -130,9 +130,7 @@ void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSe << ResourcePolicy::VideoRecorderType << ResourcePolicy::AudioPlaybackType << ResourcePolicy::AudioRecorderType - << ResourcePolicy::ScaleButtonType - << ResourcePolicy::LedsType - << ResourcePolicy::SnapButtonType; + << ResourcePolicy::LedsType; break; } @@ -148,6 +146,14 @@ void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSe ResourcePolicy::LensCoverResource *lensCoverResource = new ResourcePolicy::LensCoverResource; lensCoverResource->setOptional(true); m_resource->addResourceObject(lensCoverResource); + } else if (resourceType == ResourcePolicy::AudioPlaybackType) { + ResourcePolicy::Resource *resource = new ResourcePolicy::AudioResource; + resource->setOptional(true); + m_resource->addResourceObject(resource); + } else if (resourceType == ResourcePolicy::AudioRecorderType) { + ResourcePolicy::Resource *resource = new ResourcePolicy::AudioRecorderResource; + resource->setOptional(true); + m_resource->addResourceObject(resource); } else { m_resource->addResource(resourceType); } @@ -164,6 +170,7 @@ void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSe } #else Q_UNUSED(oldSet); + updateCanCapture(); #endif } @@ -177,6 +184,18 @@ bool CamerabinResourcePolicy::isResourcesGranted() const return true; } +void CamerabinResourcePolicy::handleResourcesLost() +{ + updateCanCapture(); + emit resourcesLost(); +} + +void CamerabinResourcePolicy::handleResourcesGranted() +{ + updateCanCapture(); + emit resourcesGranted(); +} + void CamerabinResourcePolicy::handleResourcesReleased() { #ifdef HAVE_RESOURCE_POLICY @@ -185,6 +204,35 @@ void CamerabinResourcePolicy::handleResourcesReleased() #endif m_releasingResources = false; #endif + updateCanCapture(); +} + +void CamerabinResourcePolicy::resourcesAvailable() +{ +#ifdef HAVE_RESOURCE_POLICY + if (m_resourceSet != NoResources) { + m_resource->acquire(); + } +#endif +} + +bool CamerabinResourcePolicy::canCapture() const +{ + return m_canCapture; +} + +void CamerabinResourcePolicy::updateCanCapture() +{ + const bool wasAbleToRecord = m_canCapture; + m_canCapture = (m_resourceSet == VideoCaptureResources) || (m_resourceSet == ImageCaptureResources); +#ifdef HAVE_RESOURCE_POLICY + foreach (ResourcePolicy::Resource *resource, m_resource->resources()) { + if (resource->type() != ResourcePolicy::LensCoverType) + m_canCapture = m_canCapture && resource->isGranted(); + } +#endif + if (wasAbleToRecord != m_canCapture) + emit canCaptureChanged(); } QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.h b/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.h index 31700958..f4cbb7c9 100644 --- a/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.h +++ b/src/plugins/gstreamer/camerabin/camerabinresourcepolicy.h @@ -69,18 +69,27 @@ public: bool isResourcesGranted() const; + bool canCapture() const; + Q_SIGNALS: void resourcesDenied(); void resourcesGranted(); void resourcesLost(); + void canCaptureChanged(); private Q_SLOTS: + void handleResourcesLost(); + void handleResourcesGranted(); void handleResourcesReleased(); + void resourcesAvailable(); + void updateCanCapture(); + private: ResourceSet m_resourceSet; ResourcePolicy::ResourceSet *m_resource; bool m_releasingResources; + bool m_canCapture; }; QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/camerabin/camerabinservice.cpp b/src/plugins/gstreamer/camerabin/camerabinservice.cpp index 58d44332..a916ee88 100644 --- a/src/plugins/gstreamer/camerabin/camerabinservice.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinservice.cpp @@ -92,7 +92,6 @@ CameraBinService::CameraBinService(const QString &service, QObject *parent): QMediaService(parent) { m_captureSession = 0; - m_cameraControl = 0; m_metaDataControl = 0; m_audioInputSelector = 0; @@ -108,7 +107,6 @@ CameraBinService::CameraBinService(const QString &service, QObject *parent): if (service == Q_MEDIASERVICE_CAMERA) { m_captureSession = new CameraBinSession(this); - m_cameraControl = new CameraBinControl(m_captureSession); m_videoInputDevice = new QGstreamerVideoInputDeviceControl( m_captureSession->buildCameraSource(), m_captureSession); m_imageCaptureControl = new CameraBinImageCapture(m_captureSession); @@ -208,7 +206,7 @@ QMediaControl *CameraBinService::requestControl(const char *name) return m_captureSession->mediaContainerControl(); if (qstrcmp(name,QCameraControl_iid) == 0) - return m_cameraControl; + return m_captureSession->cameraControl(); if (qstrcmp(name,QMetaDataWriterControl_iid) == 0) return m_metaDataControl; diff --git a/src/plugins/gstreamer/camerabin/camerabinservice.h b/src/plugins/gstreamer/camerabin/camerabinservice.h index 2d965ff4..7d3b3df0 100644 --- a/src/plugins/gstreamer/camerabin/camerabinservice.h +++ b/src/plugins/gstreamer/camerabin/camerabinservice.h @@ -79,7 +79,6 @@ private: void setAudioPreview(GstElement*); CameraBinSession *m_captureSession; - CameraBinControl *m_cameraControl; CameraBinMetaData *m_metaDataControl; QAudioInputSelectorControl *m_audioInputSelector; diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 6e857d58..18f6d54d 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -39,6 +39,7 @@ ** ****************************************************************************/ #include "camerabinsession.h" +#include "camerabincontrol.h" #include "camerabinrecorder.h" #include "camerabincontainer.h" #include "camerabinaudioencoder.h" @@ -152,6 +153,7 @@ CameraBinSession::CameraBinSession(QObject *parent) m_busHelper = new QGstreamerBusHelper(m_bus, this); m_busHelper->installMessageFilter(this); + m_cameraControl = new CameraBinControl(this); m_audioEncodeControl = new CameraBinAudioEncoder(this); m_videoEncodeControl = new CameraBinVideoEncoder(this); m_imageEncodeControl = new CameraBinImageEncoder(this); @@ -450,6 +452,8 @@ void CameraBinSession::setCaptureMode(QCamera::CaptureModes mode) g_object_set(m_camerabin, MODE_PROPERTY, CAMERABIN_VIDEO_MODE, NULL); break; } + + m_recorderControl->updateStatus(); } QUrl CameraBinSession::outputLocation() const diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.h b/src/plugins/gstreamer/camerabin/camerabinsession.h index bdc27f33..dab8d84c 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.h +++ b/src/plugins/gstreamer/camerabin/camerabinsession.h @@ -59,6 +59,7 @@ QT_BEGIN_NAMESPACE class QGstreamerMessage; class QGstreamerBusHelper; +class CameraBinControl; class CameraBinAudioEncoder; class CameraBinVideoEncoder; class CameraBinImageEncoder; @@ -119,6 +120,7 @@ public: GstElement *buildCameraSource(); + CameraBinControl *cameraControl() const { return m_cameraControl; } CameraBinAudioEncoder *audioEncodeControl() const { return m_audioEncodeControl; } CameraBinVideoEncoder *videoEncodeControl() const { return m_videoEncodeControl; } CameraBinImageEncoder *imageEncodeControl() const { return m_imageEncodeControl; } @@ -210,6 +212,7 @@ private: QObject *m_viewfinder; QGstreamerVideoRendererInterface *m_viewfinderInterface; + CameraBinControl *m_cameraControl; CameraBinAudioEncoder *m_audioEncodeControl; CameraBinVideoEncoder *m_videoEncodeControl; CameraBinImageEncoder *m_imageEncodeControl; diff --git a/src/plugins/resourcepolicy/resourcepolicyimpl.cpp b/src/plugins/resourcepolicy/resourcepolicyimpl.cpp index 26f71356..aed9ccb0 100644 --- a/src/plugins/resourcepolicy/resourcepolicyimpl.cpp +++ b/src/plugins/resourcepolicy/resourcepolicyimpl.cpp @@ -48,6 +48,8 @@ ResourcePolicyImpl::ResourcePolicyImpl(QObject *parent) : QMediaPlayerResourceSetInterface(parent) + , m_status(Initial) + , m_videoEnabled(false) { m_resourceSet = new ResourcePolicy::ResourceSet("player", this); m_resourceSet->setAlwaysReply(); @@ -57,7 +59,6 @@ ResourcePolicyImpl::ResourcePolicyImpl(QObject *parent) audioResource->setStreamTag("media.name", "*"); m_resourceSet->addResourceObject(audioResource); - m_resourceSet->addResource(ResourcePolicy::VideoPlaybackType); m_resourceSet->update(); connect(m_resourceSet, SIGNAL(resourcesGranted(const QList)), From e485e066acde8799c3b592aa1dcb62a6dfcb6604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Wed, 15 Jan 2014 16:56:12 +0100 Subject: [PATCH 07/10] Use QStringRef instead of QString whenever possible. That way we reduce count of temporary QString instances. Change-Id: Id806c68ea616828c2355c07b8576616fa6a8da17 Reviewed-by: Yoann Lopes --- src/multimedia/playback/playlistfileparser.cpp | 12 ++++++------ .../mediacapture/qandroidmediastoragelocation.cpp | 2 +- .../mediaplayer/qandroidmetadatareadercontrol.cpp | 2 +- src/plugins/audiocapture/audiocapturesession.cpp | 2 +- .../avfoundation/camera/avfstoragelocation.mm | 2 +- .../gstreamer/camerabin/camerabinsession.cpp | 2 +- .../mediacapture/qgstreamerimagecapturecontrol.cpp | 2 +- .../mediacapture/qgstreamerrecordercontrol.cpp | 2 +- src/plugins/qnx/camera/bbmediastoragelocation.cpp | 2 +- .../mediaplayer/mmrenderermediaplayercontrol.cpp | 4 ++-- src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp | 14 +++++++------- 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/multimedia/playback/playlistfileparser.cpp b/src/multimedia/playback/playlistfileparser.cpp index 03d84444..1dc93aa7 100644 --- a/src/multimedia/playback/playlistfileparser.cpp +++ b/src/multimedia/playback/playlistfileparser.cpp @@ -100,7 +100,7 @@ public: m_extraInfo.clear(); int artistStart = line.indexOf(QLatin1String(","), 8); bool ok = false; - int length = line.mid(8, artistStart < 8 ? -1 : artistStart - 8).trimmed().toInt(&ok); + int length = line.midRef(8, artistStart < 8 ? -1 : artistStart - 8).trimmed().toInt(&ok); if (ok && length > 0) { //convert from second to milisecond m_extraInfo[QMediaMetaData::Duration] = QVariant(length * 1000); @@ -108,13 +108,13 @@ public: if (artistStart > 0) { int titleStart = getSplitIndex(line, artistStart); if (titleStart > artistStart) { - m_extraInfo[QMediaMetaData::Author] = line.mid(artistStart + 1, - titleStart - artistStart - 1).trimmed(). + m_extraInfo[QMediaMetaData::Author] = line.midRef(artistStart + 1, + titleStart - artistStart - 1).trimmed().toString(). replace(QLatin1String("--"), QLatin1String("-")); - m_extraInfo[QMediaMetaData::Title] = line.mid(titleStart + 1).trimmed(). + m_extraInfo[QMediaMetaData::Title] = line.midRef(titleStart + 1).trimmed().toString(). replace(QLatin1String("--"), QLatin1String("-")); } else { - m_extraInfo[QMediaMetaData::Title] = line.mid(artistStart + 1).trimmed(). + m_extraInfo[QMediaMetaData::Title] = line.midRef(artistStart + 1).trimmed().toString(). replace(QLatin1String("--"), QLatin1String("-")); } } @@ -302,7 +302,7 @@ Version=2 emit error(QPlaylistFileParser::FormatError, QString(tr("Error parsing playlist at line[%1]:%2")).arg(QString::number(lineIndex), line)); return QString(); } - return line.mid(start + 1).trimmed(); + return line.midRef(start + 1).trimmed().toString(); } void setCount(int count) { diff --git a/src/plugins/android/src/mediacapture/qandroidmediastoragelocation.cpp b/src/plugins/android/src/mediacapture/qandroidmediastoragelocation.cpp index ee673415..2bd3da19 100644 --- a/src/plugins/android/src/mediacapture/qandroidmediastoragelocation.cpp +++ b/src/plugins/android/src/mediacapture/qandroidmediastoragelocation.cpp @@ -103,7 +103,7 @@ QString QAndroidMediaStorageLocation::generateFileName(const QString &prefix, if (lastMediaIndex == 0) { // first run, find the maximum media number during the fist capture Q_FOREACH (const QString &fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(extension))) { - const qint64 mediaIndex = fileName.mid(prefix.length(), fileName.size() - prefix.length() - extension.length() - 1).toInt(); + const qint64 mediaIndex = fileName.midRef(prefix.length(), fileName.size() - prefix.length() - extension.length() - 1).toInt(); lastMediaIndex = qMax(lastMediaIndex, mediaIndex); } } diff --git a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp index e52c4638..b6ef6c4b 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp @@ -183,7 +183,7 @@ void QAndroidMetaDataReaderControl::updateData() // The genre can be returned as an ID3v2 id, get the name for it in that case if (string.startsWith('(') && string.endsWith(')')) { bool ok = false; - int genreId = string.mid(1, string.length() - 2).toInt(&ok); + int genreId = string.midRef(1, string.length() - 2).toInt(&ok); if (ok && genreId >= 0 && genreId <= 125) string = QLatin1String(qt_ID3GenreNames[genreId]); } diff --git a/src/plugins/audiocapture/audiocapturesession.cpp b/src/plugins/audiocapture/audiocapturesession.cpp index e34c0ee7..a2285271 100644 --- a/src/plugins/audiocapture/audiocapturesession.cpp +++ b/src/plugins/audiocapture/audiocapturesession.cpp @@ -250,7 +250,7 @@ QString AudioCaptureSession::generateFileName(const QDir &dir, { int lastClip = 0; foreach(QString fileName, dir.entryList(QStringList() << QString("clip_*.%1").arg(ext))) { - int imgNumber = fileName.mid(5, fileName.size()-6-ext.length()).toInt(); + int imgNumber = fileName.midRef(5, fileName.size()-6-ext.length()).toInt(); lastClip = qMax(lastClip, imgNumber); } diff --git a/src/plugins/avfoundation/camera/avfstoragelocation.mm b/src/plugins/avfoundation/camera/avfstoragelocation.mm index d94e4b2f..c63abbc3 100644 --- a/src/plugins/avfoundation/camera/avfstoragelocation.mm +++ b/src/plugins/avfoundation/camera/avfstoragelocation.mm @@ -105,7 +105,7 @@ QString AVFStorageLocation::generateFileName(const QString &prefix, const QDir & if (lastClip == 0) { //first run, find the maximum clip number during the fist capture Q_FOREACH (const QString &fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(ext))) { - int imgNumber = fileName.mid(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt(); + int imgNumber = fileName.midRef(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt(); lastClip = qMax(lastClip, imgNumber); } } diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 18f6d54d..e61615bc 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -508,7 +508,7 @@ QString CameraBinSession::generateFileName(const QString &prefix, const QDir &di { int lastClip = 0; foreach(QString fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(ext))) { - int imgNumber = fileName.mid(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt(); + int imgNumber = fileName.midRef(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt(); lastClip = qMax(lastClip, imgNumber); } diff --git a/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp index a1904eff..fadc6633 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp @@ -83,7 +83,7 @@ int QGstreamerImageCaptureControl::capture(const QString &fileName) int lastImage = 0; QDir outputDir = QDir::currentPath(); foreach(QString fileName, outputDir.entryList(QStringList() << "img_*.jpg")) { - int imgNumber = fileName.mid(4, fileName.size()-8).toInt(); + int imgNumber = fileName.midRef(4, fileName.size()-8).toInt(); lastImage = qMax(lastImage, imgNumber); } diff --git a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp index 25744215..a2602daa 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp @@ -361,7 +361,7 @@ QString QGstreamerRecorderControl::generateFileName(const QDir &dir, const QStri int lastClip = 0; foreach(QString fileName, dir.entryList(QStringList() << QString("clip_*.%1").arg(ext))) { - int imgNumber = fileName.mid(5, fileName.size()-6-ext.length()).toInt(); + int imgNumber = fileName.midRef(5, fileName.size()-6-ext.length()).toInt(); lastClip = qMax(lastClip, imgNumber); } diff --git a/src/plugins/qnx/camera/bbmediastoragelocation.cpp b/src/plugins/qnx/camera/bbmediastoragelocation.cpp index 3d939ce4..ea9df5df 100644 --- a/src/plugins/qnx/camera/bbmediastoragelocation.cpp +++ b/src/plugins/qnx/camera/bbmediastoragelocation.cpp @@ -92,7 +92,7 @@ QString BbMediaStorageLocation::generateFileName(const QString &prefix, const QD if (lastMediaIndex == 0) { // first run, find the maximum media number during the fist capture Q_FOREACH (const QString &fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(extension))) { - const qint64 mediaIndex = fileName.mid(prefix.length(), fileName.size() - prefix.length() - extension.length() - 1).toInt(); + const qint64 mediaIndex = fileName.midRef(prefix.length(), fileName.size() - prefix.length() - extension.length() - 1).toInt(); lastMediaIndex = qMax(lastMediaIndex, mediaIndex); } } diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp index e8000179..ba3cbfdf 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp @@ -587,8 +587,8 @@ void MmRendererMediaPlayerControl::setMmBufferStatus(const QString &bufferStatus { const int slashPos = bufferStatus.indexOf('/'); if (slashPos != -1) { - const int fill = bufferStatus.left(slashPos).toInt(); - const int capacity = bufferStatus.mid(slashPos + 1).toInt(); + const int fill = bufferStatus.leftRef(slashPos).toInt(); + const int capacity = bufferStatus.midRef(slashPos + 1).toInt(); if (capacity != 0) { m_bufferStatus = fill / static_cast(capacity) * 100.0f; emit bufferStatusChanged(m_bufferStatus); diff --git a/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp b/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp index 07f5ddd6..c9babeca 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp @@ -97,8 +97,8 @@ bool MmRendererMetaData::parse(const QString &contextName) const int separatorPos = line.indexOf(separator); if (separatorPos != -1) { - const QString key = line.left(separatorPos); - const QString value = line.mid(separatorPos + separator.length()); + const QStringRef key = line.left(separatorPos); + const QStringRef value = line.mid(separatorPos + separator.length()); if (key == durationKey) m_duration = value.toLongLong(); @@ -113,15 +113,15 @@ bool MmRendererMetaData::parse(const QString &contextName) else if (key == pixelHeightKey) m_pixelHeight = value.toFloat(); else if (key == titleKey) - m_title = value; + m_title = value.toString(); else if (key == seekableKey) m_seekable = !(value == QLatin1String("0")); else if (key == artistKey) - m_artist = value; + m_artist = value.toString(); else if (key == commentKey) - m_comment = value; + m_comment = value.toString(); else if (key == genreKey) - m_genre = value; + m_genre = value.toString(); else if (key == yearKey) m_year = value.toInt(); else if (key == bitRateKey) @@ -129,7 +129,7 @@ bool MmRendererMetaData::parse(const QString &contextName) else if (key == sampleKey) m_sampleRate = value.toInt(); else if (key == albumKey) - m_album = value; + m_album = value.toString(); else if (key == trackKey) m_track = value.toInt(); } From 4b2c80c53b27b3c3cc9b0f6fc36a77a955b26dc8 Mon Sep 17 00:00:00 2001 From: Wolfgang Bremer Date: Thu, 16 Jan 2014 12:45:01 +0100 Subject: [PATCH 08/10] Fix build error on BlackBerry10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The variable type was changed to QStringRef but the the conversion to QStringRef was left out. Change-Id: I973b0eb5795fa7bcf89ceac809fb3ff607a85913 Reviewed-by: Peter Hartmann Reviewed-by: Jędrzej Nowacki --- src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp b/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp index c9babeca..e14e0087 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp @@ -97,8 +97,8 @@ bool MmRendererMetaData::parse(const QString &contextName) const int separatorPos = line.indexOf(separator); if (separatorPos != -1) { - const QStringRef key = line.left(separatorPos); - const QStringRef value = line.mid(separatorPos + separator.length()); + const QStringRef key = line.leftRef(separatorPos); + const QStringRef value = line.midRef(separatorPos + separator.length()); if (key == durationKey) m_duration = value.toLongLong(); From c54018f8e2955f22f6e58c34fafeec0277e63958 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 16 Jan 2014 15:20:59 +0100 Subject: [PATCH 09/10] Fix build without Qml and Quick modules. Conditionally enable auto-tests that depend on the Quick and Qml modules. Task-number: QTBUG-35911 Change-Id: I8b9d304ea630093d423b48a4ebc53ef6f4280244 Reviewed-by: Mitch Curtis --- tests/auto/integration/multimedia.pro | 8 ++++++-- tests/auto/unit/multimedia.pro | 6 ------ tests/auto/unit/multimediaqml.pro | 10 ++++++++++ tests/auto/unit/unit.pro | 1 + 4 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 tests/auto/unit/multimediaqml.pro diff --git a/tests/auto/integration/multimedia.pro b/tests/auto/integration/multimedia.pro index 1daa1ee5..88960ec0 100644 --- a/tests/auto/integration/multimedia.pro +++ b/tests/auto/integration/multimedia.pro @@ -5,11 +5,15 @@ SUBDIRS += \ qaudiodeviceinfo \ qaudioinput \ qaudiooutput \ - qdeclarativevideooutput \ - qdeclarativevideooutput_window \ qmediaplayerbackend \ qcamerabackend \ qsoundeffect \ qsound +qtHaveModule(quick) { + SUBDIRS += \ + qdeclarativevideooutput \ + qdeclarativevideooutput_window +} + !qtHaveModule(widgets): SUBDIRS -= qcamerabackend diff --git a/tests/auto/unit/multimedia.pro b/tests/auto/unit/multimedia.pro index 309d4125..f9bf0f35 100644 --- a/tests/auto/unit/multimedia.pro +++ b/tests/auto/unit/multimedia.pro @@ -30,13 +30,7 @@ SUBDIRS += \ qvideosurfaceformat \ qwavedecoder \ qaudiobuffer \ - qdeclarativeaudio \ qaudiodecoder \ qaudioprobe \ qvideoprobe \ qsamplecache - -disabled { - SUBDIRS += \ - qdeclarativevideo -} diff --git a/tests/auto/unit/multimediaqml.pro b/tests/auto/unit/multimediaqml.pro new file mode 100644 index 00000000..cadd956e --- /dev/null +++ b/tests/auto/unit/multimediaqml.pro @@ -0,0 +1,10 @@ + +TEMPLATE = subdirs +SUBDIRS += \ + qdeclarativeaudio \ + +disabled { + SUBDIRS += \ + qdeclarativevideo +} + diff --git a/tests/auto/unit/unit.pro b/tests/auto/unit/unit.pro index 96dbf013..37f85209 100644 --- a/tests/auto/unit/unit.pro +++ b/tests/auto/unit/unit.pro @@ -2,3 +2,4 @@ TEMPLATE = subdirs SUBDIRS += multimedia.pro qtHaveModule(widgets): SUBDIRS += multimediawidgets.pro +qtHaveModule(qml): SUBDIRS += multimediaqml.pro From 88ef2bf83de18542428151553cbfa87de2469c90 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Wed, 15 Jan 2014 22:58:16 +0100 Subject: [PATCH 10/10] Bump MODULE_VERSION to 5.2.2 Change-Id: I662277a4ed9341f188e5e3f1abab50c6f5f85577 Reviewed-by: Thiago Macieira --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 457f68b5..104f7dba 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += qt_example_installs -MODULE_VERSION = 5.2.1 +MODULE_VERSION = 5.2.2