Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
androidsurfacetexture.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QtCore/qmutex.h>
6#include <QtCore/qcoreapplication.h>
7
9
10static const char QtSurfaceTextureListenerClassName[] = "org/qtproject/qt/android/multimedia/QtSurfaceTextureListener";
11typedef QList<jlong> SurfaceTextures;
12Q_GLOBAL_STATIC(SurfaceTextures, g_surfaceTextures);
13Q_GLOBAL_STATIC(QMutex, g_textureMutex);
14
15static QAtomicInteger<quint64> indexCounter = 0u;
16
17// native method for QtSurfaceTexture.java
18static void notifyFrameAvailable(JNIEnv* , jobject, jlong id)
19{
20 const QMutexLocker lock(g_textureMutex());
21 const int idx = g_surfaceTextures->indexOf(id);
22 if (idx == -1)
23 return;
24
25 AndroidSurfaceTexture *obj = reinterpret_cast<AndroidSurfaceTexture *>(g_surfaceTextures->at(idx));
26 if (obj)
27 Q_EMIT obj->frameAvailable();
28}
29
31 : QObject()
32 , m_index(indexCounter.fetchAndAddRelaxed(1))
33{
34 Q_STATIC_ASSERT(sizeof (jlong) >= sizeof (void *));
35 m_surfaceTexture = QJniObject("android/graphics/SurfaceTexture", "(I)V", jint(texName));
36
37 if (!m_surfaceTexture.isValid())
38 return;
39
40 const QMutexLocker lock(g_textureMutex());
41 g_surfaceTextures->append(jlong(this));
42 QJniObject listener(QtSurfaceTextureListenerClassName, "(J)V", jlong(this));
43 setOnFrameAvailableListener(listener);
44}
45
47{
48 if (m_surface.isValid())
49 m_surface.callMethod<void>("release");
50
51 if (m_surfaceTexture.isValid()) {
52 release();
53 const QMutexLocker lock(g_textureMutex());
54 const int idx = g_surfaceTextures->indexOf(jlong(this));
55 if (idx != -1)
56 g_surfaceTextures->remove(idx);
57 }
58}
59
61{
63 if (!m_surfaceTexture.isValid())
64 return matrix;
65
67 jfloatArray array = env->NewFloatArray(16);
68 m_surfaceTexture.callMethod<void>("getTransformMatrix", "([F)V", array);
69 env->GetFloatArrayRegion(array, 0, 16, matrix.data());
70 env->DeleteLocalRef(array);
71
72 return matrix;
73}
74
76{
77 m_surfaceTexture.callMethod<void>("release");
78}
79
81{
82 if (!m_surfaceTexture.isValid())
83 return;
84
85 m_surfaceTexture.callMethod<void>("updateTexImage");
86}
87
89{
90 return m_surfaceTexture.object();
91}
92
94{
95 if (!m_surface.isValid()) {
96 m_surface = QJniObject("android/view/Surface",
97 "(Landroid/graphics/SurfaceTexture;)V",
98 m_surfaceTexture.object());
99 }
100
101 return m_surface.object();
102}
103
105{
106 if (!m_surfaceHolder.isValid()) {
107 m_surfaceHolder = QJniObject("org/qtproject/qt/android/multimedia/QtSurfaceTextureHolder",
108 "(Landroid/view/Surface;)V",
109 surface());
110 }
111
112 return m_surfaceHolder.object();
113}
114
116{
117 if (!m_surfaceTexture.isValid())
118 return;
119
120 m_surfaceTexture.callMethod<void>("attachToGLContext", "(I)V", texName);
121}
122
124{
125 if (!m_surfaceTexture.isValid())
126 return;
127
128 m_surfaceTexture.callMethod<void>("detachFromGLContext");
129}
130
132{
133 static const JNINativeMethod methods[] = {
134 {"notifyFrameAvailable", "(J)V", (void *)notifyFrameAvailable}
135 };
136 const int size = std::size(methods);
138 return false;
139
140 return true;
141}
142
143void AndroidSurfaceTexture::setOnFrameAvailableListener(const QJniObject &listener)
144{
145 m_surfaceTexture.callMethod<void>("setOnFrameAvailableListener",
146 "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V",
147 listener.object());
148}
149
151
152#include "moc_androidsurfacetexture_p.cpp"
static void notifyFrameAvailable(JNIEnv *, jobject, int id)
static JNINativeMethod methods[]
static QT_BEGIN_NAMESPACE const char QtSurfaceTextureListenerClassName[]
static void notifyFrameAvailable(JNIEnv *, jobject, jlong id)
static QAtomicInteger< quint64 > indexCounter
QList< jlong > SurfaceTextures
AndroidSurfaceTexture(quint32 texName)
void attachToGLContext(quint32 texName)
\inmodule QtCore
\inmodule QtCore
Definition qlist.h:75
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Definition qmatrix4x4.h:25
\inmodule QtCore
Definition qmutex.h:313
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtCore
Definition qobject.h:103
Combined button and popup list for selecting options.
#define Q_STATIC_ASSERT(Condition)
Definition qassert.h:108
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLhandleARB obj
[2]
GLenum array
GLuint GLenum matrix
#define Q_EMIT
unsigned int quint32
Definition qtypes.h:50
QReadWriteLock lock
[0]