29 #define GL_GLEXT_PROTOTYPES
31 #include <GLES3/gl31.h>
32 #include <GLES2/gl2ext.h>
37 #include "UniquePointer.h"
45 namespace ArgusSamples
49 : m_initialized(false)
54 , m_windowAspectRatio(1.0f)
61 REPORT_ERROR(
"Failed to shutdown composer");
66 static InitOnce initOnce;
78 REPORT_ERROR(
"Initalization failed");
92 PROPAGATE_ERROR(
m_display.initialize(window.getEGLNativeDisplay()));
97 PROPAGATE_ERROR(
onResize(window.getWidth(), window.getHeight()));
100 PROPAGATE_ERROR(window.registerObserver(
this));
102 PROPAGATE_ERROR(Thread::initialize());
103 PROPAGATE_ERROR(Thread::waitRunning());
115 PROPAGATE_ERROR_CONTINUE(Window::getInstance().unregisterObserver(
this));
118 PROPAGATE_ERROR_CONTINUE(Thread::requestShutdown());
120 PROPAGATE_ERROR_CONTINUE(Thread::shutdown());
122 PROPAGATE_ERROR_CONTINUE(
m_display.cleanup());
131 if (eglStream == EGL_NO_STREAM_KHR)
132 ORIGINATE_ERROR(
"Invalid stream");
136 UniquePointer<StreamConsumer> streamConsumer(
new StreamConsumer(eglStream));
138 ORIGINATE_ERROR(
"Out of memory");
149 while (streamConsumer->getStreamState() != EGL_STREAM_STATE_CONNECTING_KHR)
151 streamConsumer.release();
163 if (it->m_consumer->isEGLStream(eglStream))
166 it->m_shutdown =
true;
171 ORIGINATE_ERROR(
"Stream was not bound");
183 if (it->m_consumer->isEGLStream(eglStream))
185 it->m_active = active;
190 ORIGINATE_ERROR(
"Stream was not bound");
202 if (it->m_consumer->isEGLStream(eglStream))
204 PROPAGATE_ERROR(it->m_consumer->setStreamAspectRatio(aspectRatio));
209 ORIGINATE_ERROR(
"Stream was not bound");
225 PROPAGATE_ERROR(
m_context.initialize(&Window::getInstance()));
226 PROPAGATE_ERROR(
m_context.makeCurrent());
229 static const char vtxSrc[] =
231 "#extension GL_ARB_explicit_uniform_location : require\n"
232 "in layout(location = 0) vec2 vertex;\n"
233 "out vec2 vTexCoord;\n"
234 "layout(location = 0) uniform vec2 offset;\n"
235 "layout(location = 1) uniform vec2 scale;\n"
237 " gl_Position = vec4((offset + vertex * scale) * 2.0 - 1.0, 0.0, 1.0);\n"
238 " vTexCoord = vec2(vertex.x, 1.0 - vertex.y);\n"
240 static const char frgSrc[] =
242 "#extension GL_OES_EGL_image_external : require\n"
243 "precision highp float;\n"
244 "uniform samplerExternalOES texSampler;\n"
245 "in vec2 vTexCoord;\n"
246 "out vec4 fragColor;\n"
248 " fragColor = texture2D(texSampler, vTexCoord);\n"
255 static const GLfloat vertices[] = {
261 glGenBuffers(1, &
m_vbo);
262 glBindBuffer(GL_ARRAY_BUFFER,
m_vbo);
264 ORIGINATE_ERROR(
"Failed to create VBO");
265 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertices), vertices, GL_STATIC_DRAW);
266 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
267 glBindBuffer(GL_ARRAY_BUFFER, 0);
268 glEnableVertexAttribArray(0);
271 if (eglSwapInterval(
m_display.get(), 1) != EGL_TRUE)
272 ORIGINATE_ERROR(
"Failed to set the swap interval");
281 glClear(GL_COLOR_BUFFER_BIT);
283 const uint32_t cells =
static_cast<uint32_t
>(ceil(sqrt(activeStreams)));
284 const float scaleX = 1.0f / cells;
285 const float scaleY = 1.0f / cells;
286 uint32_t offsetX = 0, offsetY = cells - 1;
297 const EGLint streamState = it->m_consumer->getStreamState();
298 if ((streamState == EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR) ||
299 (streamState == EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR))
301 glBindTexture(GL_TEXTURE_EXTERNAL_OES, it->m_consumer->getStreamTextureID());
319 (offsetX - (sizeX - 1.0f) * 0.5f) * scaleX,
320 (offsetY - (sizeY - 1.0f) * 0.5f) * scaleY);
321 glUniform2f(1, scaleX * sizeX, scaleY * sizeY);
323 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
327 if (offsetX == cells)
335 PROPAGATE_ERROR(
m_context.swapBuffers());
345 uint32_t activeStreams = 0;
361 PROPAGATE_ERROR_CONTINUE(it->m_consumer->shutdown());
362 delete it->m_consumer;
369 bool acquiredNewFrame =
false;
370 PROPAGATE_ERROR(it->m_consumer->acquire(&acquiredNewFrame));
377 if (acquiredNewFrame)
400 PROPAGATE_ERROR_CONTINUE(it->m_consumer->shutdown());
401 delete it->m_consumer;
412 glDeleteBuffers(1, &
m_vbo);