summaryrefslogtreecommitdiffstats
path: root/src/plugins/android
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@qt.io>2016-08-01 11:52:05 +0200
committerYoann Lopes <yoann.lopes@qt.io>2016-08-01 11:52:05 +0200
commit339944b284e9dd11302dd013f9d9a10ad0d9055a (patch)
treec2952d186b1dbc6f2380448fa2cfd9ec55043da6 /src/plugins/android
parent53d0a1e5454f4e5beecdea19acb9df11c87cc375 (diff)
parentd7d31d63db5f0029a4a5e24d998601baee8bade0 (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Diffstat (limited to 'src/plugins/android')
-rw-r--r--src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java10
-rw-r--r--src/plugins/android/src/common/qandroidvideooutput.cpp8
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp15
-rw-r--r--src/plugins/android/src/qandroidmediaserviceplugin.cpp5
-rw-r--r--src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp42
-rw-r--r--src/plugins/android/src/wrappers/jni/androidsurfacetexture.h4
6 files changed, 62 insertions, 22 deletions
diff --git a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java
index 0404e2d75..a997dde90 100644
--- a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java
+++ b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java
@@ -43,18 +43,18 @@ import android.graphics.SurfaceTexture;
public class QtSurfaceTextureListener implements SurfaceTexture.OnFrameAvailableListener
{
- private final int texID;
+ private final long m_id;
- public QtSurfaceTextureListener(int texName)
+ public QtSurfaceTextureListener(long id)
{
- texID = texName;
+ m_id = id;
}
@Override
public void onFrameAvailable(SurfaceTexture surfaceTexture)
{
- notifyFrameAvailable(texID);
+ notifyFrameAvailable(m_id);
}
- private static native void notifyFrameAvailable(int id);
+ private static native void notifyFrameAvailable(long id);
}
diff --git a/src/plugins/android/src/common/qandroidvideooutput.cpp b/src/plugins/android/src/common/qandroidvideooutput.cpp
index 5c804ccc4..a5cd3580b 100644
--- a/src/plugins/android/src/common/qandroidvideooutput.cpp
+++ b/src/plugins/android/src/common/qandroidvideooutput.cpp
@@ -147,7 +147,13 @@ public:
delete m_program;
}
- void setTexture(quint32 id) { m_textureID = id; }
+ void setTexture(quint32 id) {
+ if (m_textureID)
+ glDeleteTextures(1, &m_textureID);
+
+ m_textureID = id;
+ }
+
void setFbo(QOpenGLFramebufferObject *fbo) { m_fbo = fbo; }
void setShaderProgram(QOpenGLShaderProgram *prog) { m_program = prog; }
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index 9137fbc05..0b082b02b 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -295,16 +295,27 @@ void QAndroidCameraSession::applyViewfinderSettings(const QSize &captureSize, bo
adjustedViewfinderResolution = vfRes;
} else if (validCaptureSize) {
// search for viewfinder resolution with the same aspect ratio
+ qreal minAspectDiff = 1;
+ QSize closestResolution;
for (int i = previewSizes.count() - 1; i >= 0; --i) {
const QSize &size = previewSizes.at(i);
- if (qAbs(captureAspectRatio - (qreal(size.width()) / size.height())) < 0.01) {
+ const qreal sizeAspect = qreal(size.width()) / size.height();
+ if (qFuzzyCompare(captureAspectRatio, sizeAspect)) {
adjustedViewfinderResolution = size;
break;
+ } else if (minAspectDiff > qAbs(sizeAspect - captureAspectRatio)) {
+ closestResolution = size;
+ minAspectDiff = qAbs(sizeAspect - captureAspectRatio);
}
}
if (!adjustedViewfinderResolution.isValid()) {
qWarning("Cannot find a viewfinder resolution matching the capture aspect ratio.");
- return;
+ if (closestResolution.isValid()) {
+ adjustedViewfinderResolution = closestResolution;
+ qWarning("Using closest viewfinder resolution.");
+ } else {
+ return;
+ }
}
} else {
adjustedViewfinderResolution = previewSizes.last();
diff --git a/src/plugins/android/src/qandroidmediaserviceplugin.cpp b/src/plugins/android/src/qandroidmediaserviceplugin.cpp
index 87de7d561..0de231c9d 100644
--- a/src/plugins/android/src/qandroidmediaserviceplugin.cpp
+++ b/src/plugins/android/src/qandroidmediaserviceplugin.cpp
@@ -150,6 +150,11 @@ QT_END_NAMESPACE
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
{
+ static bool initialized = false;
+ if (initialized)
+ return JNI_VERSION_1_6;
+ initialized = true;
+
QT_USE_NAMESPACE
typedef union {
JNIEnv *nativeEnvironment;
diff --git a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp
index 82a8bffe3..df09d0819 100644
--- a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp
+++ b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp
@@ -40,24 +40,32 @@
#include "androidsurfacetexture.h"
#include <QtCore/private/qjni_p.h>
#include <QtCore/private/qjnihelpers_p.h>
+#include <QtCore/qmutex.h>
QT_BEGIN_NAMESPACE
static const char QtSurfaceTextureListenerClassName[] = "org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener";
-static QMap<int, AndroidSurfaceTexture*> g_objectMap;
+typedef QVector<jlong> SurfaceTextures;
+Q_GLOBAL_STATIC(SurfaceTextures, g_surfaceTextures);
+Q_GLOBAL_STATIC(QMutex, g_textureMutex);
// native method for QtSurfaceTexture.java
-static void notifyFrameAvailable(JNIEnv* , jobject, int id)
+static void notifyFrameAvailable(JNIEnv* , jobject, jlong id)
{
- AndroidSurfaceTexture *obj = g_objectMap.value(id, 0);
+ const QMutexLocker lock(g_textureMutex);
+ const int idx = g_surfaceTextures->indexOf(id);
+ if (idx == -1)
+ return;
+
+ AndroidSurfaceTexture *obj = reinterpret_cast<AndroidSurfaceTexture *>(g_surfaceTextures->at(idx));
if (obj)
Q_EMIT obj->frameAvailable();
}
AndroidSurfaceTexture::AndroidSurfaceTexture(unsigned int texName)
: QObject()
- , m_texID(int(texName))
{
+ Q_STATIC_ASSERT(sizeof (jlong) >= sizeof (void *));
// API level 11 or higher is required
if (QtAndroidPrivate::androidSdkVersion() < 11) {
qWarning("Camera preview and video playback require Android 3.0 (API level 11) or later.");
@@ -73,13 +81,13 @@ AndroidSurfaceTexture::AndroidSurfaceTexture(unsigned int texName)
env->ExceptionClear();
}
- if (m_surfaceTexture.isValid())
- g_objectMap.insert(int(texName), this);
+ if (!m_surfaceTexture.isValid())
+ return;
- QJNIObjectPrivate listener(QtSurfaceTextureListenerClassName, "(I)V", jint(texName));
- m_surfaceTexture.callMethod<void>("setOnFrameAvailableListener",
- "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V",
- listener.object());
+ const QMutexLocker lock(g_textureMutex);
+ g_surfaceTextures->append(jlong(this));
+ QJNIObjectPrivate listener(QtSurfaceTextureListenerClassName, "(J)V", jlong(this));
+ setOnFrameAvailableListener(listener);
}
AndroidSurfaceTexture::~AndroidSurfaceTexture()
@@ -89,7 +97,10 @@ AndroidSurfaceTexture::~AndroidSurfaceTexture()
if (m_surfaceTexture.isValid()) {
release();
- g_objectMap.remove(m_texID);
+ const QMutexLocker lock(g_textureMutex);
+ const int idx = g_surfaceTextures->indexOf(jlong(this));
+ if (idx != -1)
+ g_surfaceTextures->remove(idx);
}
}
@@ -178,7 +189,7 @@ bool AndroidSurfaceTexture::initJNI(JNIEnv *env)
env);
static const JNINativeMethod methods[] = {
- {"notifyFrameAvailable", "(I)V", (void *)notifyFrameAvailable}
+ {"notifyFrameAvailable", "(J)V", (void *)notifyFrameAvailable}
};
if (clazz && env->RegisterNatives(clazz,
@@ -190,4 +201,11 @@ bool AndroidSurfaceTexture::initJNI(JNIEnv *env)
return true;
}
+void AndroidSurfaceTexture::setOnFrameAvailableListener(const QJNIObjectPrivate &listener)
+{
+ m_surfaceTexture.callMethod<void>("setOnFrameAvailableListener",
+ "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V",
+ listener.object());
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h
index b45ee384c..0a271287a 100644
--- a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h
+++ b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.h
@@ -54,7 +54,6 @@ public:
explicit AndroidSurfaceTexture(unsigned int texName);
~AndroidSurfaceTexture();
- int textureID() const { return m_texID; }
jobject surfaceTexture();
jobject surface();
jobject surfaceHolder();
@@ -73,7 +72,8 @@ Q_SIGNALS:
void frameAvailable();
private:
- int m_texID;
+ void setOnFrameAvailableListener(const QJNIObjectPrivate &listener);
+
QJNIObjectPrivate m_surfaceTexture;
QJNIObjectPrivate m_surface;
QJNIObjectPrivate m_surfaceHolder;