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 --- .../gstreamer/camerabin/camerabinservice.cpp | 3 +- .../gstreamer/camerabin/camerabinsession.cpp | 92 ++++++++++++---------- src/plugins/gstreamer/camerabin/camerabinsession.h | 3 +- 3 files changed, 54 insertions(+), 44 deletions(-) (limited to 'src/plugins') 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(-) (limited to 'src/plugins') 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 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(-) (limited to 'src/plugins') 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(-) (limited to 'src/plugins') 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/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 +++++++------- 10 files changed, 17 insertions(+), 17 deletions(-) (limited to 'src/plugins') 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(-) (limited to 'src/plugins') 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