summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>2016-05-12 11:18:04 +0200
committerOswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>2016-05-12 11:18:04 +0200
commit690064468c647c9ae3f99c7d90e470db6ef7e6c2 (patch)
treebb786eaa1ebec2a63e5160abeced7ffa28a22132
parentc84bdf63e4de16586eda3c45d5c3c3b2dc4fe089 (diff)
parent15951e672eaf38537c82043b0b9b14088facbd19 (diff)
Merge 5.6 into 5.6.1
-rw-r--r--src/plugins/android/src/common/qandroidvideooutput.cpp55
-rw-r--r--src/plugins/android/src/common/qandroidvideooutput.h2
-rw-r--r--src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp16
-rw-r--r--src/plugins/android/src/wrappers/jni/androidsurfacetexture.h3
-rw-r--r--src/plugins/v4l/radio/v4lradiocontrol.h4
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp2
-rw-r--r--tests/auto/unit/qaudiobuffer/qaudiobuffer.pro6
7 files changed, 68 insertions, 20 deletions
diff --git a/src/plugins/android/src/common/qandroidvideooutput.cpp b/src/plugins/android/src/common/qandroidvideooutput.cpp
index 82c27035d..c0bd88d85 100644
--- a/src/plugins/android/src/common/qandroidvideooutput.cpp
+++ b/src/plugins/android/src/common/qandroidvideooutput.cpp
@@ -42,6 +42,7 @@
#include <qopenglfunctions.h>
#include <qopenglshaderprogram.h>
#include <qopenglframebufferobject.h>
+#include <QtCore/private/qjnihelpers_p.h>
QT_BEGIN_NAMESPACE
@@ -159,6 +160,7 @@ QAndroidTextureVideoOutput::QAndroidTextureVideoOutput(QObject *parent)
, m_fbo(0)
, m_program(0)
, m_glDeleter(0)
+ , m_surfaceTextureCanAttachToContext(QtAndroidPrivate::androidSdkVersion() >= 16)
{
}
@@ -184,12 +186,14 @@ void QAndroidTextureVideoOutput::setSurface(QAbstractVideoSurface *surface)
if (m_surface) {
if (m_surface->isActive())
m_surface->stop();
- m_surface->setProperty("_q_GLThreadCallback", QVariant());
+
+ if (!m_surfaceTextureCanAttachToContext)
+ m_surface->setProperty("_q_GLThreadCallback", QVariant());
}
m_surface = surface;
- if (m_surface) {
+ if (m_surface && !m_surfaceTextureCanAttachToContext) {
m_surface->setProperty("_q_GLThreadCallback",
QVariant::fromValue<QObject*>(this));
}
@@ -197,7 +201,7 @@ void QAndroidTextureVideoOutput::setSurface(QAbstractVideoSurface *surface)
bool QAndroidTextureVideoOutput::isReady()
{
- return QOpenGLContext::currentContext() || m_externalTex;
+ return m_surfaceTextureCanAttachToContext || QOpenGLContext::currentContext() || m_externalTex;
}
bool QAndroidTextureVideoOutput::initSurfaceTexture()
@@ -208,16 +212,20 @@ bool QAndroidTextureVideoOutput::initSurfaceTexture()
if (!m_surface)
return false;
- // if we have an OpenGL context in the current thread, create a texture. Otherwise, wait
- // for the GL render thread to call us back to do it.
- if (QOpenGLContext::currentContext()) {
- glGenTextures(1, &m_externalTex);
- m_glDeleter = new OpenGLResourcesDeleter;
- m_glDeleter->setTexture(m_externalTex);
- } else if (!m_externalTex) {
- return false;
+ if (!m_surfaceTextureCanAttachToContext) {
+ // if we have an OpenGL context in the current thread, create a texture. Otherwise, wait
+ // for the GL render thread to call us back to do it.
+ if (QOpenGLContext::currentContext()) {
+ glGenTextures(1, &m_externalTex);
+ m_glDeleter = new OpenGLResourcesDeleter;
+ m_glDeleter->setTexture(m_externalTex);
+ } else if (!m_externalTex) {
+ return false;
+ }
}
+ QMutexLocker locker(&m_mutex);
+
m_surfaceTexture = new AndroidSurfaceTexture(m_externalTex);
if (m_surfaceTexture->surfaceTexture() != 0) {
@@ -225,7 +233,8 @@ bool QAndroidTextureVideoOutput::initSurfaceTexture()
} else {
delete m_surfaceTexture;
m_surfaceTexture = 0;
- m_glDeleter->deleteLater();
+ if (m_glDeleter)
+ m_glDeleter->deleteLater();
m_externalTex = 0;
m_glDeleter = 0;
}
@@ -235,10 +244,15 @@ bool QAndroidTextureVideoOutput::initSurfaceTexture()
void QAndroidTextureVideoOutput::clearSurfaceTexture()
{
+ QMutexLocker locker(&m_mutex);
if (m_surfaceTexture) {
delete m_surfaceTexture;
m_surfaceTexture = 0;
}
+
+ // Also reset the attached OpenGL texture
+ if (m_surfaceTextureCanAttachToContext)
+ m_externalTex = 0;
}
AndroidSurfaceTexture *QAndroidTextureVideoOutput::surfaceTexture()
@@ -301,6 +315,9 @@ void QAndroidTextureVideoOutput::renderFrameToFbo()
{
QMutexLocker locker(&m_mutex);
+ if (!m_nativeSize.isValid() || !m_surfaceTexture)
+ return;
+
createGLResources();
m_surfaceTexture->updateTexImage();
@@ -358,6 +375,18 @@ void QAndroidTextureVideoOutput::renderFrameToFbo()
void QAndroidTextureVideoOutput::createGLResources()
{
+ Q_ASSERT(QOpenGLContext::currentContext() != NULL);
+
+ if (!m_glDeleter)
+ m_glDeleter = new OpenGLResourcesDeleter;
+
+ if (m_surfaceTextureCanAttachToContext && !m_externalTex) {
+ m_surfaceTexture->detachFromGLContext();
+ glGenTextures(1, &m_externalTex);
+ m_surfaceTexture->attachToGLContext(m_externalTex);
+ m_glDeleter->setTexture(m_externalTex);
+ }
+
if (!m_fbo || m_fbo->size() != m_nativeSize) {
delete m_fbo;
m_fbo = new QOpenGLFramebufferObject(m_nativeSize);
@@ -401,7 +430,7 @@ void QAndroidTextureVideoOutput::customEvent(QEvent *e)
{
if (e->type() == QEvent::User) {
// This is running in the render thread (OpenGL enabled)
- if (!m_externalTex) {
+ if (!m_surfaceTextureCanAttachToContext && !m_externalTex) {
glGenTextures(1, &m_externalTex);
m_glDeleter = new OpenGLResourcesDeleter; // will cleanup GL resources in the correct thread
m_glDeleter->setTexture(m_externalTex);
diff --git a/src/plugins/android/src/common/qandroidvideooutput.h b/src/plugins/android/src/common/qandroidvideooutput.h
index f4401fa1d..0068a5809 100644
--- a/src/plugins/android/src/common/qandroidvideooutput.h
+++ b/src/plugins/android/src/common/qandroidvideooutput.h
@@ -110,6 +110,8 @@ private:
QOpenGLShaderProgram *m_program;
OpenGLResourcesDeleter *m_glDeleter;
+ bool m_surfaceTextureCanAttachToContext;
+
friend class AndroidTextureVideoBuffer;
};
diff --git a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp
index 9a25b7e28..2cea896e1 100644
--- a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp
+++ b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp
@@ -146,6 +146,22 @@ jobject AndroidSurfaceTexture::surfaceHolder()
return m_surfaceHolder.object();
}
+void AndroidSurfaceTexture::attachToGLContext(int texName)
+{
+ if (QtAndroidPrivate::androidSdkVersion() < 16 || !m_surfaceTexture.isValid())
+ return;
+
+ m_surfaceTexture.callMethod<void>("attachToGLContext", "(I)V", texName);
+}
+
+void AndroidSurfaceTexture::detachFromGLContext()
+{
+ if (QtAndroidPrivate::androidSdkVersion() < 16 || !m_surfaceTexture.isValid())
+ return;
+
+ m_surfaceTexture.callMethod<void>("detachFromGLContext");
+}
+
bool AndroidSurfaceTexture::initJNI(JNIEnv *env)
{
// SurfaceTexture is available since API 11.
diff --git a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h
index ac2af694e..a08483e5e 100644
--- a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h
+++ b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h
@@ -58,6 +58,9 @@ public:
void release(); // API level 14
void updateTexImage();
+ void attachToGLContext(int texName); // API level 16
+ void detachFromGLContext(); // API level 16
+
static bool initJNI(JNIEnv *env);
Q_SIGNALS:
diff --git a/src/plugins/v4l/radio/v4lradiocontrol.h b/src/plugins/v4l/radio/v4lradiocontrol.h
index 3d2f21f5d..c084ec960 100644
--- a/src/plugins/v4l/radio/v4lradiocontrol.h
+++ b/src/plugins/v4l/radio/v4lradiocontrol.h
@@ -40,7 +40,11 @@
#include <qradiotunercontrol.h>
+#if defined(Q_OS_FREEBSD)
+#include <sys/types.h>
+#else
#include <linux/types.h>
+#endif
#include <sys/time.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index e2d5fa67d..5c41987a0 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -632,7 +632,7 @@ void QWinRTCameraControl::setState(QCamera::State state)
}
QCameraFocus::FocusModes focusMode = d->cameraFocusControl->focusMode();
- if (setFocus(focusMode) && focusMode == QCameraFocus::ContinuousFocus)
+ if (focusMode != 0 && setFocus(focusMode) && focusMode == QCameraFocus::ContinuousFocus)
focus();
d->state = QCamera::ActiveState;
diff --git a/tests/auto/unit/qaudiobuffer/qaudiobuffer.pro b/tests/auto/unit/qaudiobuffer/qaudiobuffer.pro
index cd3b42f50..535465889 100644
--- a/tests/auto/unit/qaudiobuffer/qaudiobuffer.pro
+++ b/tests/auto/unit/qaudiobuffer/qaudiobuffer.pro
@@ -1,9 +1,3 @@
-#-------------------------------------------------
-#
-# Project created by QtCreator 2012-02-02T23:40:38
-#
-#-------------------------------------------------
-
QT += multimedia testlib
QT -= gui