diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-01-17 17:20:59 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-01-17 17:20:59 +0100 |
commit | 422099e8ddeddc0631db3a369e3c52f0ffe2f455 (patch) | |
tree | a38d0a77e8082c52072e9054b4399090405fcf31 | |
parent | 16aadf964dcdb71733414afdc7a548ca1ac58f97 (diff) | |
parent | 88ef2bf83de18542428151553cbfa87de2469c90 (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Conflicts:
.qmake.conf
Change-Id: Id367a610a3aefd288bfe287a3bf64606e582deb9
35 files changed, 289 insertions, 114 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 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 <linux/videodev2.h> 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/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); 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 <qvideodeviceselectorcontrol.h> #include <QtCore/qstringlist.h> +#include <gst/gst.h> + 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/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/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/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/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/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 <private/qgstvideobuffer_p.h> #include <private/qvideosurfacegstsink_p.h> #include <private/qgstutils_p.h> @@ -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/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<QCameraImageProcessing::WhiteBalanceMode>(whiteBalanceMode()); + else if (m_values.contains(parameter)) return m_values.value(parameter); else return QVariant(); 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<ResourcePolicy::ResourceType>)), - 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<ResourcePolicy::ResourceType>)), + 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 54c49f41c..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,8 +107,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)), @@ -207,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 2e5c53a4d..e61615bc1 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); @@ -169,6 +171,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 +203,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); + GstElement * const source = buildCameraSource(); - m_videoInputHasChanged = false; - } - - if (m_videoSrc && GST_IS_PHOTOGRAPHY(m_videoSrc)) - return GST_PHOTOGRAPHY(m_videoSrc); + if (source && GST_IS_PHOTOGRAPHY(source)) + return GST_PHOTOGRAPHY(source); return 0; } @@ -225,17 +222,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 +358,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<QByteArray> 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"); + } - foreach (sourceElementName, candidates) { - videoSrc = gst_element_factory_make(sourceElementName.constData(), "camera_source"); - if (videoSrc) - break; + // If gstreamer has set a default source use it. + if (!m_videoSrc) + m_videoSrc = videoSrc; + + // If there's no better guidance try the names of some known camera source elements. + if (!m_videoSrc) { + const QList<QByteArray> candidates = QList<QByteArray>() + << "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 +404,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) @@ -440,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 @@ -494,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); } @@ -626,9 +640,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..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; @@ -117,6 +118,9 @@ public: QDir defaultDir(QCamera::CaptureModes mode) const; QString generateFileName(const QString &prefix, const QDir &dir, const QString &ext) const; + 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; } @@ -188,7 +192,6 @@ private slots: private: bool setupCameraBin(); void setupCaptureResolution(); - GstElement *buildCameraSource(); static void updateBusyStatus(GObject *o, GParamSpec *p, gpointer d); QUrl m_sink; @@ -209,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/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/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); 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<float>(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..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 QString key = line.left(separatorPos); - const QString 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(); @@ -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(); } 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<ResourcePolicy::ResourceType>)), 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 |