diff options
author | Yoann Lopes <yoann.lopes@qt.io> | 2016-08-01 11:52:05 +0200 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@qt.io> | 2016-08-01 11:52:05 +0200 |
commit | 339944b284e9dd11302dd013f9d9a10ad0d9055a (patch) | |
tree | c2952d186b1dbc6f2380448fa2cfd9ec55043da6 /src/plugins/android | |
parent | 53d0a1e5454f4e5beecdea19acb9df11c87cc375 (diff) | |
parent | d7d31d63db5f0029a4a5e24d998601baee8bade0 (diff) |
Merge remote-tracking branch 'origin/5.6' into 5.7
Change-Id: Ic29cb09048003f18ff86d4546cd547be715eaec8
Diffstat (limited to 'src/plugins/android')
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; |