summaryrefslogtreecommitdiffstats
path: root/src/plugins/android
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-08-02 10:23:28 +0200
committerLiang Qi <liang.qi@qt.io>2016-08-02 10:23:28 +0200
commitf979916804fdcea14e2a560336f31f4046fbe84a (patch)
treeb5ff5737a4a9dd187c056b010e329ed1d601db0f /src/plugins/android
parent9bdc7c84eea0ff66c937d5f62ffed249321c3c35 (diff)
parent339944b284e9dd11302dd013f9d9a10ad0d9055a (diff)
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts: .qmake.conf tests/auto/integration/qsoundeffect/BLACKLIST Change-Id: Icd2edd4410a4ee914d489634d26b262c0c146bf4
Diffstat (limited to 'src/plugins/android')
-rw-r--r--src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java11
-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
7 files changed, 67 insertions, 28 deletions
diff --git a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java
index 917f02d48..e16d424cf 100644
--- a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java
+++ b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java
@@ -40,7 +40,6 @@
package org.qtproject.qt5.android.multimedia;
import android.content.Context;
-import android.app.Activity;
import android.view.OrientationEventListener;
import android.os.Environment;
import android.media.MediaScannerConnection;
@@ -68,13 +67,13 @@ public class QtMultimediaUtils
}
}
- static private Activity m_activity = null;
+ static private Context m_context = null;
static private OrientationListener m_orientationListener = null;
- static public void setActivity(Activity activity, Object activityDelegate)
+ static public void setContext(Context context)
{
- m_activity = activity;
- m_orientationListener = new OrientationListener(activity);
+ m_context = context;
+ m_orientationListener = new OrientationListener(context);
}
public QtMultimediaUtils()
@@ -129,6 +128,6 @@ public class QtMultimediaUtils
static void registerMediaFile(String file)
{
- MediaScannerConnection.scanFile(m_activity, new String[] { file }, null, null);
+ MediaScannerConnection.scanFile(m_context, new String[] { file }, null, null);
}
}
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;