summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2014-01-17 17:20:59 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2014-01-17 17:20:59 +0100
commit422099e8ddeddc0631db3a369e3c52f0ffe2f455 (patch)
treea38d0a77e8082c52072e9054b4399090405fcf31
parent16aadf964dcdb71733414afdc7a548ca1ac58f97 (diff)
parent88ef2bf83de18542428151553cbfa87de2469c90 (diff)
Merge remote-tracking branch 'origin/stable' into dev
Conflicts: .qmake.conf Change-Id: Id367a610a3aefd288bfe287a3bf64606e582deb9
-rw-r--r--examples/multimedia/spectrum/app/app.pro2
-rw-r--r--src/gsttools/qgstreamervideoinputdevicecontrol.cpp27
-rw-r--r--src/imports/multimedia/qdeclarativecameracapture.cpp1
-rw-r--r--src/imports/multimedia/qdeclarativecamerarecorder.cpp10
-rw-r--r--src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h5
-rw-r--r--src/multimedia/playback/playlistfileparser.cpp12
-rw-r--r--src/plugins/android/src/mediacapture/qandroidmediastoragelocation.cpp2
-rw-r--r--src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp2
-rw-r--r--src/plugins/audiocapture/audiocapturesession.cpp2
-rw-r--r--src/plugins/avfoundation/camera/avfstoragelocation.mm2
-rw-r--r--src/plugins/gstreamer/camerabin/camerabin.pro2
-rw-r--r--src/plugins/gstreamer/camerabin/camerabincontrol.cpp8
-rw-r--r--src/plugins/gstreamer/camerabin/camerabincontrol.h2
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinfocus.cpp43
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp6
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp4
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinrecorder.cpp19
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinrecorder.h1
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinresourcepolicy.cpp72
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinresourcepolicy.h9
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinservice.cpp7
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinservice.h1
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.cpp98
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.h6
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp2
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp2
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp8
-rw-r--r--src/plugins/qnx/camera/bbmediastoragelocation.cpp2
-rw-r--r--src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp4
-rw-r--r--src/plugins/qnx/mediaplayer/mmrenderermetadata.cpp14
-rw-r--r--src/plugins/resourcepolicy/resourcepolicyimpl.cpp3
-rw-r--r--tests/auto/integration/multimedia.pro8
-rw-r--r--tests/auto/unit/multimedia.pro6
-rw-r--r--tests/auto/unit/multimediaqml.pro10
-rw-r--r--tests/auto/unit/unit.pro1
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