From deb13f102a0773ef87310346f1755b16215e62f4 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 17 Oct 2014 16:51:23 +0200 Subject: [PATCH 1/6] Add QT_GSTREAMER_CAMERABIN_VIDEOSRC environment variable. It can be used to set which video source element should be used by the camerabin. Change-Id: I8d1cd8c4ba6fe5a89817699f645b0997e713aaca Reviewed-by: Samuli Piippo Reviewed-by: Christian Stromme --- src/gsttools/qgstutils.cpp | 25 ++++++++++--- src/multimedia/gsttools_headers/qgstutils_p.h | 2 ++ .../gstreamer/camerabin/camerabinsession.cpp | 36 +++++++++++++++++-- 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp index 8d484aa6..556fc03c 100644 --- a/src/gsttools/qgstutils.cpp +++ b/src/gsttools/qgstutils.cpp @@ -430,13 +430,15 @@ QVector QGstUtils::enumerateCameras(GstElementFactory *fa QStringLiteral("primary"), QGstreamerVideoInputDeviceControl::primaryCamera(), 0, - QCamera::BackFace + QCamera::BackFace, + QByteArray() }; const CameraInfo secondary = { QStringLiteral("secondary"), QGstreamerVideoInputDeviceControl::secondaryCamera(), 0, - QCamera::FrontFace + QCamera::FrontFace, + QByteArray() }; devices.append(primary); @@ -498,14 +500,17 @@ QVector QGstUtils::enumerateCameras(GstElementFactory *fa if (isCamera) { // find out its driver "name" + QByteArray driver; QString name; struct v4l2_capability vcap; memset(&vcap, 0, sizeof(struct v4l2_capability)); - if (ioctl(fd, VIDIOC_QUERYCAP, &vcap) != 0) + if (ioctl(fd, VIDIOC_QUERYCAP, &vcap) != 0) { name = entryInfo.fileName(); - else + } else { + driver = QByteArray((const char*)vcap.driver); name = QString::fromUtf8((const char*)vcap.card); + } //qDebug() << "found camera: " << name; @@ -513,7 +518,8 @@ QVector QGstUtils::enumerateCameras(GstElementFactory *fa entryInfo.absoluteFilePath(), name, 0, - QCamera::UnspecifiedPosition + QCamera::UnspecifiedPosition, + driver }; devices.append(device); } @@ -561,6 +567,15 @@ int QGstUtils::cameraOrientation(const QString &device, GstElementFactory * fact return 0; } +QByteArray QGstUtils::cameraDriver(const QString &device, GstElementFactory *factory) +{ + foreach (const CameraInfo &camera, enumerateCameras(factory)) { + if (camera.name == device) + return camera.driver; + } + return QByteArray(); +} + void qt_gst_object_ref_sink(gpointer object) { diff --git a/src/multimedia/gsttools_headers/qgstutils_p.h b/src/multimedia/gsttools_headers/qgstutils_p.h index 48434b2f..65ff759a 100644 --- a/src/multimedia/gsttools_headers/qgstutils_p.h +++ b/src/multimedia/gsttools_headers/qgstutils_p.h @@ -65,6 +65,7 @@ namespace QGstUtils { QString description; int orientation; QCamera::Position position; + QByteArray driver; }; QMap gstTagListToMap(const GstTagList *list); @@ -84,6 +85,7 @@ namespace QGstUtils { QString cameraDescription(const QString &device, GstElementFactory * factory = 0); QCamera::Position cameraPosition(const QString &device, GstElementFactory * factory = 0); int cameraOrientation(const QString &device, GstElementFactory * factory = 0); + QByteArray cameraDriver(const QString &device, GstElementFactory * factory = 0); } void qt_gst_object_ref_sink(gpointer object); diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 01978397..a4038c58 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -412,9 +412,41 @@ GstElement *CameraBinSession::buildCameraSource() if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "video-source")) { GstElement *src = 0; - if (m_videoInputFactory) + /* QT_GSTREAMER_CAMERABIN_VIDEOSRC can be used to set the video source element. + + --- Usage + + QT_GSTREAMER_CAMERABIN_VIDEOSRC=[drivername=elementname[,drivername2=elementname2 ...],][elementname] + + --- Examples + + Always use 'somevideosrc': + QT_GSTREAMER_CAMERABIN_VIDEOSRC="somevideosrc" + + Use 'somevideosrc' when the device driver is 'somedriver', otherwise use default: + QT_GSTREAMER_CAMERABIN_VIDEOSRC="somedriver=somevideosrc" + + Use 'somevideosrc' when the device driver is 'somedriver', otherwise use 'somevideosrc2' + QT_GSTREAMER_CAMERABIN_VIDEOSRC="somedriver=somevideosrc,somevideosrc2" + */ + const QByteArray envVideoSource = qgetenv("QT_GSTREAMER_CAMERABIN_VIDEOSRC"); + if (!envVideoSource.isEmpty()) { + QList sources = envVideoSource.split(','); + foreach (const QByteArray &source, sources) { + QList keyValue = source.split('='); + if (keyValue.count() == 1) { + src = gst_element_factory_make(keyValue.at(0), "camera_source"); + break; + } else if (keyValue.at(0) == QGstUtils::cameraDriver(m_inputDevice, m_sourceFactory)) { + src = gst_element_factory_make(keyValue.at(1), "camera_source"); + break; + } + } + } else if (m_videoInputFactory) { src = m_videoInputFactory->buildElement(); - else + } + + if (!src) src = gst_element_factory_make("v4l2src", "camera_source"); if (src) { From f1b775ab4fd5ae09b5ef25fee2a2c3748e0192ee Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 29 Oct 2014 10:00:56 +0100 Subject: [PATCH 2/6] WMF plugin: Initialize member variable m_stateDirty. Fix purify warning: [W] UMR: Uninitialized memory read in MFPlayerControl::refreshState(void) {1 occurrence} Task-number: QTBUG-41966 Change-Id: I1416f906dcc8c31a528ab7f09a258873fcfe9d1e Reviewed-by: Yoann Lopes --- src/plugins/wmf/player/mfplayercontrol.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/wmf/player/mfplayercontrol.cpp b/src/plugins/wmf/player/mfplayercontrol.cpp index 33754831..02bd902e 100644 --- a/src/plugins/wmf/player/mfplayercontrol.cpp +++ b/src/plugins/wmf/player/mfplayercontrol.cpp @@ -39,6 +39,7 @@ MFPlayerControl::MFPlayerControl(MFPlayerSession *session) : QMediaPlayerControl(session) , m_state(QMediaPlayer::StoppedState) +, m_stateDirty(false) , m_videoAvailable(false) , m_audioAvailable(false) , m_duration(-1) From d0ed4f3b085414dc8288363e527e49ebfd2eb339 Mon Sep 17 00:00:00 2001 From: Venugopal Shivashankar Date: Thu, 30 Oct 2014 19:57:30 +0100 Subject: [PATCH 3/6] Doc: Added the missing screenshot image Change-Id: Ifcef698bd735b7fe7e5f4a92984be07a01f283fb Reviewed-by: Leena Miettinen --- .../player/doc/images/mediaplayerex.jpg | Bin 0 -> 28825 bytes .../player/doc/src/player.qdoc | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 examples/multimediawidgets/player/doc/images/mediaplayerex.jpg diff --git a/examples/multimediawidgets/player/doc/images/mediaplayerex.jpg b/examples/multimediawidgets/player/doc/images/mediaplayerex.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e875bd1340a90638dc86ea14abfaf0ef314aab09 GIT binary patch literal 28825 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 Date: Fri, 31 Oct 2014 13:47:19 +0100 Subject: [PATCH 4/6] OpenSL ES: Don't store or return the adjusted volume level. According to our own docs we should always return 1.0 (MAX) volume level if the device doesn't support setting the volume, which is the case for OpenSL ES on Android. Task-number: QTBUG-42159 Change-Id: I9144e9e2cd84cc80633c68c5d6fa32b8dbd0fcd5 Reviewed-by: Yoann Lopes --- src/plugins/opensles/qopenslesaudioinput.cpp | 5 ++--- src/plugins/opensles/qopenslesaudioinput.h | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/plugins/opensles/qopenslesaudioinput.cpp b/src/plugins/opensles/qopenslesaudioinput.cpp index cd592a7d..181649ae 100644 --- a/src/plugins/opensles/qopenslesaudioinput.cpp +++ b/src/plugins/opensles/qopenslesaudioinput.cpp @@ -70,7 +70,6 @@ QOpenSLESAudioInput::QOpenSLESAudioInput(const QByteArray &device) , m_errorState(QAudio::NoError) , m_deviceState(QAudio::StoppedState) , m_lastNotifyTime(0) - , m_volume(1) , m_bufferSize(0) , m_periodSize(0) , m_intervalTime(1000) @@ -480,12 +479,12 @@ qint64 QOpenSLESAudioInput::elapsedUSecs() const void QOpenSLESAudioInput::setVolume(qreal vol) { // Volume interface is not available for the recorder on Android - m_volume = vol; + Q_UNUSED(vol); } qreal QOpenSLESAudioInput::volume() const { - return m_volume; + return qreal(1.0); } void QOpenSLESAudioInput::reset() diff --git a/src/plugins/opensles/qopenslesaudioinput.h b/src/plugins/opensles/qopenslesaudioinput.h index 7ffff047..481ff371 100644 --- a/src/plugins/opensles/qopenslesaudioinput.h +++ b/src/plugins/opensles/qopenslesaudioinput.h @@ -113,7 +113,6 @@ private: QAudio::State m_deviceState; QTime m_clockStamp; qint64 m_lastNotifyTime; - qreal m_volume; int m_bufferSize; int m_periodSize; int m_intervalTime; From e92bcbfa4dc8ea5e78e4c1712fffc9be0104a73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Thu, 30 Oct 2014 18:29:38 +0100 Subject: [PATCH 5/6] OpenSL ES: improve buffer logic Don't use relaxed load and stores, we need to be stricter to avoid problems with high frequency re-fills of the buffer. If we don't enforce ordering we might end-up spending more time trying to acquire an open slot in the buffer. Updating processes bytes is also moved off the "OpenSL" thread. Added some comments for improved readability. Change-Id: Ie27965fc6bf4b8394081ae6419f4933522ada98e Reviewed-by: Yoann Lopes --- src/plugins/opensles/qopenslesaudiooutput.cpp | 34 ++++++++++++++----- src/plugins/opensles/qopenslesaudiooutput.h | 1 + 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/plugins/opensles/qopenslesaudiooutput.cpp b/src/plugins/opensles/qopenslesaudiooutput.cpp index c45fbd3c..b89d8b93 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.cpp +++ b/src/plugins/opensles/qopenslesaudiooutput.cpp @@ -157,7 +157,7 @@ int QOpenSLESAudioOutput::bytesFree() const if (m_state != QAudio::ActiveState && m_state != QAudio::IdleState) return 0; - return m_availableBuffers.load() ? m_bufferSize : 0; + return m_availableBuffers.loadAcquire() ? m_bufferSize : 0; } int QOpenSLESAudioOutput::periodSize() const @@ -343,6 +343,11 @@ void QOpenSLESAudioOutput::onEOSEvent() setError(QAudio::UnderrunError); } +void QOpenSLESAudioOutput::onBytesProcessed(qint64 bytes) +{ + m_processedBytes += bytes; +} + void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex) { Q_UNUSED(count); @@ -351,11 +356,13 @@ void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex) if (m_state == QAudio::StoppedState) return; - if (!m_pullMode) { - m_availableBuffers.fetchAndAddRelaxed(1); + if (!m_pullMode) { // We're in push mode. + // Signal that there is a new open slot in the buffer and return + m_availableBuffers.fetchAndAddRelease(1); return; } + // We're in pull mode. const int index = m_nextBuffer * m_bufferSize; const qint64 readSize = m_audioSource->read(m_buffers + index, m_bufferSize); @@ -370,8 +377,8 @@ void QOpenSLESAudioOutput::bufferAvailable(quint32 count, quint32 playIndex) return; } - m_processedBytes += readSize; m_nextBuffer = (m_nextBuffer + 1) % BUFFER_COUNT; + QMetaObject::invokeMethod(this, "onBytesProcessed", Qt::QueuedConnection, Q_ARG(qint64, readSize)); } void QOpenSLESAudioOutput::playCallback(SLPlayItf player, void *ctx, SLuint32 event) @@ -570,7 +577,7 @@ void QOpenSLESAudioOutput::destroyPlayer() m_buffers = Q_NULLPTR; m_processedBytes = 0; m_nextBuffer = 0; - m_availableBuffers = BUFFER_COUNT; + m_availableBuffers.storeRelease(BUFFER_COUNT); m_playItf = Q_NULLPTR; m_volumeItf = Q_NULLPTR; m_bufferQueueItf = Q_NULLPTR; @@ -599,20 +606,32 @@ void QOpenSLESAudioOutput::startPlayer() qint64 QOpenSLESAudioOutput::writeData(const char *data, qint64 len) { - if (!len || !m_availableBuffers.load()) + if (!len) return 0; if (len > m_bufferSize) len = m_bufferSize; + // Acquire one slot in the buffer + const int before = m_availableBuffers.fetchAndAddAcquire(-1); + + // If there where no vacant slots, then we just overdrew the buffer account... + if (before < 1) { + m_availableBuffers.fetchAndAddRelease(1); + return 0; + } + const int index = m_nextBuffer * m_bufferSize; ::memcpy(m_buffers + index, data, len); const SLuint32 res = (*m_bufferQueueItf)->Enqueue(m_bufferQueueItf, m_buffers + index, len); - if (res == SL_RESULT_BUFFER_INSUFFICIENT) + // If we where unable to enqueue a new buffer, give back the acquired slot. + if (res == SL_RESULT_BUFFER_INSUFFICIENT) { + m_availableBuffers.fetchAndAddRelease(1); return 0; + } if (res != SL_RESULT_SUCCESS) { setError(QAudio::FatalError); @@ -621,7 +640,6 @@ qint64 QOpenSLESAudioOutput::writeData(const char *data, qint64 len) } m_processedBytes += len; - m_availableBuffers.fetchAndAddRelaxed(-1); setState(QAudio::ActiveState); setError(QAudio::NoError); m_nextBuffer = (m_nextBuffer + 1) % BUFFER_COUNT; diff --git a/src/plugins/opensles/qopenslesaudiooutput.h b/src/plugins/opensles/qopenslesaudiooutput.h index 200b4a3c..f36a5bf0 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.h +++ b/src/plugins/opensles/qopenslesaudiooutput.h @@ -79,6 +79,7 @@ private: friend class SLIODevicePrivate; Q_INVOKABLE void onEOSEvent(); + Q_INVOKABLE void onBytesProcessed(qint64 bytes); void bufferAvailable(quint32 count, quint32 playIndex); static void playCallback(SLPlayItf playItf, void *ctx, SLuint32 event); From 2020b032e83d1b61736a80a6815635aa7451deed Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 6 Nov 2014 16:24:57 +0100 Subject: [PATCH 6/6] Check whether current context can be obtained when deleting textures. Add a warning in that case. Task-number: QTBUG-41966 Change-Id: I491ee9e13c9504040ab789951656983a736d9203 Reviewed-by: Yoann Lopes --- src/plugins/wmf/evrd3dpresentengine.cpp | 8 ++++++-- src/qtmultimediaquicktools/qsgvideonode_i420.cpp | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/plugins/wmf/evrd3dpresentengine.cpp b/src/plugins/wmf/evrd3dpresentengine.cpp index 42d0dea4..9a508520 100644 --- a/src/plugins/wmf/evrd3dpresentengine.cpp +++ b/src/plugins/wmf/evrd3dpresentengine.cpp @@ -184,8 +184,12 @@ D3DPresentEngine::~D3DPresentEngine() m_egl->destroySurface(m_eglDisplay, m_eglSurface); m_eglSurface = NULL; } - if (m_glTexture) - QOpenGLContext::currentContext()->functions()->glDeleteTextures(1, &m_glTexture); + if (m_glTexture) { + if (QOpenGLContext *current = QOpenGLContext::currentContext()) + current->functions()->glDeleteTextures(1, &m_glTexture); + else + qWarning() << "D3DPresentEngine: Cannot obtain GL context, unable to delete textures"; + } delete m_glContext; delete m_offscreenSurface; diff --git a/src/qtmultimediaquicktools/qsgvideonode_i420.cpp b/src/qtmultimediaquicktools/qsgvideonode_i420.cpp index 5b8b7ce8..17b4924d 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_i420.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_i420.cpp @@ -227,8 +227,12 @@ QSGVideoMaterial_YUV420::QSGVideoMaterial_YUV420(const QVideoSurfaceFormat &form QSGVideoMaterial_YUV420::~QSGVideoMaterial_YUV420() { - if (!m_textureSize.isEmpty()) - QOpenGLContext::currentContext()->functions()->glDeleteTextures(Num_Texture_IDs, m_textureIds); + if (!m_textureSize.isEmpty()) { + if (QOpenGLContext *current = QOpenGLContext::currentContext()) + current->functions()->glDeleteTextures(Num_Texture_IDs, m_textureIds); + else + qWarning() << "QSGVideoMaterial_YUV420: Cannot obtain GL context, unable to delete textures"; + } } void QSGVideoMaterial_YUV420::bind()