From 817c548df4b3693495323b163c584945077bbdaa Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 7 Jan 2014 16:54:44 +0100 Subject: 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 581848a7f..8262372c4 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 -- cgit v1.2.3 From 4d3f740795ece7fb46760d384f21913e02b296d7 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Dec 2013 13:11:07 +1000 Subject: 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 --- src/gsttools/qgstreamervideoinputdevicecontrol.cpp | 27 +++++-- .../qgstreamervideoinputdevicecontrol_p.h | 5 ++ .../gstreamer/camerabin/camerabinservice.cpp | 3 +- .../gstreamer/camerabin/camerabinsession.cpp | 92 ++++++++++++---------- src/plugins/gstreamer/camerabin/camerabinsession.h | 3 +- 5 files changed, 80 insertions(+), 50 deletions(-) diff --git a/src/gsttools/qgstreamervideoinputdevicecontrol.cpp b/src/gsttools/qgstreamervideoinputdevicecontrol.cpp index 960853bba..ad61aefad 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 401f50245..eeb576ef5 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 54c49f41c..58d44332f 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 2e5c53a4d..6e857d589 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(); - - 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; - } + GstElement * const source = buildCameraSource(); - 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; + // 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 gstreamer has set a default source use it. + if (!m_videoSrc) + m_videoSrc = videoSrc; - foreach (sourceElementName, candidates) { - videoSrc = gst_element_factory_make(sourceElementName.constData(), "camera_source"); - if (videoSrc) - break; + // 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 (videoSrc && !m_inputDevice.isEmpty()) { + 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 305c1168b..bdc27f33f 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; -- cgit v1.2.3 From 2ec3645b729d4a9ccc3b4bfbf4d64c6def69b68f Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Thu, 5 Dec 2013 16:17:19 +1000 Subject: 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 +- src/plugins/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 27c368e86..e18da8e6e 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 2f69cad37..ed5b483c2 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 a714b2892..fb980204e 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(); -- cgit v1.2.3 From 61001f8dd5a1b2d128259b518f74d46cf9f69173 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Dec 2013 17:50:01 +1000 Subject: 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 b93ab456e..d5f363431 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 9e11731c4..0f4004677 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); -- cgit v1.2.3 From b27913b76d5a1820470b411d2193e4388b047c9d Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Dec 2013 17:59:52 +1000 Subject: 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 --- src/plugins/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 04d612b06..d61e6a010 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); -- cgit v1.2.3 From 15025088eac53d97705191d06b13868d62977155 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Wed, 11 Dec 2013 14:29:57 +1000 Subject: 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 ++- src/plugins/gstreamer/camerabin/camerabincontrol.h | 2 + .../gstreamer/camerabin/camerabinimagecapture.cpp | 6 +- .../gstreamer/camerabin/camerabinrecorder.cpp | 19 ++++-- .../gstreamer/camerabin/camerabinrecorder.h | 1 - .../camerabin/camerabinresourcepolicy.cpp | 72 ++++++++++++++++++---- .../gstreamer/camerabin/camerabinresourcepolicy.h | 9 +++ .../gstreamer/camerabin/camerabinservice.cpp | 4 +- src/plugins/gstreamer/camerabin/camerabinservice.h | 1 - .../gstreamer/camerabin/camerabinsession.cpp | 4 ++ src/plugins/gstreamer/camerabin/camerabinsession.h | 3 + src/plugins/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 620060648..8c63959cf 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 821bee3eb..8958974ab 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 79cfca3bf..122a10eed 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 e45f187c8..c8967dfb7 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 2f8fe5d11..691fc12ff 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 11b04a974..d6df4208e 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 31700958d..f4cbb7c93 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 58d44332f..a916ee88e 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 2d965ff43..7d3b3df09 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 6e857d589..18f6d54d9 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 bdc27f33f..dab8d84cc 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 26f713560..aed9ccb09 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)), -- cgit v1.2.3 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: 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 ++++++------ .../src/mediacapture/qandroidmediastoragelocation.cpp | 2 +- .../src/mediaplayer/qandroidmetadatareadercontrol.cpp | 2 +- src/plugins/audiocapture/audiocapturesession.cpp | 2 +- src/plugins/avfoundation/camera/avfstoragelocation.mm | 2 +- src/plugins/gstreamer/camerabin/camerabinsession.cpp | 2 +- .../mediacapture/qgstreamerimagecapturecontrol.cpp | 2 +- .../gstreamer/mediacapture/qgstreamerrecordercontrol.cpp | 2 +- src/plugins/qnx/camera/bbmediastoragelocation.cpp | 2 +- .../qnx/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 03d84444e..1dc93aa7a 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 ee6734158..2bd3da195 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 e52c46387..b6ef6c4bc 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 e34c0ee7d..a22852715 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 d94e4b2fc..c63abbc30 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 18f6d54d9..e61615bc1 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 a1904eff8..fadc66338 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 257442156..a2602daae 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 3d939ce4f..ea9df5dfe 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 e80001793..ba3cbfdff 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 07f5ddd62..c9babeca0 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(); } -- cgit v1.2.3 From 4b2c80c53b27b3c3cc9b0f6fc36a77a955b26dc8 Mon Sep 17 00:00:00 2001 From: Wolfgang Bremer Date: Thu, 16 Jan 2014 12:45:01 +0100 Subject: 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 c9babeca0..e14e0087e 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(); -- cgit v1.2.3 From c54018f8e2955f22f6e58c34fafeec0277e63958 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 16 Jan 2014 15:20:59 +0100 Subject: 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 1daa1ee50..88960ec03 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 309d41255..f9bf0f35f 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 000000000..cadd956ec --- /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 96dbf0137..37f85209e 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 -- cgit v1.2.3 From 88ef2bf83de18542428151553cbfa87de2469c90 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Wed, 15 Jan 2014 22:58:16 +0100 Subject: 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 457f68b56..104f7dbab 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 -- cgit v1.2.3