41 #define GL_GLEXT_PROTOTYPES
43 #include <GLES3/gl31.h>
44 #include <GLES2/gl2ext.h>
47 #include <sys/types.h>
61 #include "UniquePointer.h"
63 #include "GLContext.h"
70 namespace ArgusSamples
182 PROPAGATE_ERROR_CONTINUE(
shutdown());
222 struct jpeg_decompress_struct info;
223 struct jpeg_error_mgr err;
224 std::vector<JSAMPLE*> rowPointers;
226 bool success =
false;
231 ORIGINATE_ERROR(
"Could not open file '%s'.",
m_fileName.c_str());
234 memset(&info, 0,
sizeof(info));
235 info.err = jpeg_std_error(&err);
236 jpeg_create_decompress(&info);
237 #ifdef TEGRA_ACCELERATE
240 jpeg_set_hardware_acceleration_parameters_dec(&info,
false, 0, 0, 0, 0,
false);
242 jpeg_stdio_src(&info, file);
243 if (jpeg_read_header(&info, TRUE) != JPEG_HEADER_OK)
244 ORIGINATE_ERROR_FAIL(
"Invalid JPEG image file '%s'.",
m_fileName.c_str());
245 if (jpeg_start_decompress(&info) != TRUE)
246 ORIGINATE_ERROR_FAIL(
"Invalid JPEG image file '%s'.",
m_fileName.c_str());
249 if (info.output_components != 3)
250 ORIGINATE_ERROR_FAIL(
"Only RGB JPEGs supported.");
260 rowPointers.resize(m_height);
261 for (
size_t row = 0; row <
m_height; ++row)
262 rowPointers[row] =
m_data.data() + row *
m_width * info.output_components;
266 while (read < m_height)
267 read += jpeg_read_scanlines(&info, &rowPointers[read], m_height - read);
273 if (jpeg_finish_decompress(&info) != TRUE)
274 REPORT_ERROR(
"jpeg_finish_decompress() failed.");
275 jpeg_destroy_decompress(&info);
276 if (fclose(file) != 0)
277 REPORT_ERROR(
"fclose() failed.");
305 PROPAGATE_ERROR_CONTINUE(
shutdown());
339 ORIGINATE_ERROR(
"Failed to allocate video pipeline");
348 float aspectRatio = 1.0f;
369 ORIGINATE_ERROR(
"Not initialized");
379 ORIGINATE_ERROR(
"Not initialized");
388 ORIGINATE_ERROR(
"Not initialized");
397 ORIGINATE_ERROR(
"Not initialized");
473 switch ((*m_curItem)->getType())
485 return EGL_NO_STREAM_KHR;
490 : m_eglOutputSurface(EGL_NO_SURFACE)
494 , m_curItem(m_itemList.end())
508 PROPAGATE_ERROR(Thread::initialize());
514 PROPAGATE_ERROR_CONTINUE(Thread::shutdown());
545 const extTypePair extensions[] =
561 DIR *directory = opendir(path.c_str());
562 if (directory != NULL)
565 struct dirent *entry;
566 while ((entry = readdir(directory)))
569 if (entry->d_type != DT_REG)
574 const size_t fileNameLen = strlen(entry->d_name);
575 for (
size_t index = 0; index <
sizeof(extensions) /
sizeof(extensions[0]); ++index)
577 const extTypePair *ext = &extensions[index];
580 const size_t extLen = strlen(ext->ext);
581 if (fileNameLen >= extLen + 1)
583 if ((entry->d_name[fileNameLen - extLen - 1] ==
'.') &&
584 (strcasecmp(&entry->d_name[fileNameLen - extLen], ext->ext) == 0))
594 std::string fullName;
598 fullName += entry->d_name;
601 struct stat fileStat;
602 if (stat(fullName.c_str(), &fileStat) != 0)
603 ORIGINATE_ERROR_FAIL(
"Failed to query file status on '%s'", fullName.c_str());
605 UniquePointer<GalleryItem> item;
616 ORIGINATE_ERROR(
"Failed to create gallery item");
629 if (directory != NULL)
640 const uint32_t streamWidth = 1920;
641 const uint32_t streamHeight = 1080;
650 (float)streamWidth / (
float)streamHeight));
666 ORIGINATE_ERROR(
"Failed to create GL texture");
669 static const char vtxSrc[] =
671 "#extension GL_ARB_explicit_uniform_location : require\n"
672 "in layout(location = 0) vec2 vertex;\n"
673 "out vec2 vTexCoord;\n"
674 "layout(location = 0) uniform vec2 offset;\n"
675 "layout(location = 1) uniform vec2 scale;\n"
677 " gl_Position = vec4((offset + vertex * scale) * 2.0 - 1.0, 0.0, 1.0);\n"
678 " vTexCoord = vec2(vertex.x, vertex.y);\n"
681 static const char copyFrgSrc[] =
683 "precision highp float;\n"
684 "uniform sampler2D texSampler;\n"
685 "in vec2 vTexCoord;\n"
686 "out vec4 fragColor;\n"
688 " fragColor = texture(texSampler, vTexCoord);\n"
693 static const GLfloat vertices[] =
700 glGenBuffers(1, &
m_vbo);
701 glBindBuffer(GL_ARRAY_BUFFER,
m_vbo);
702 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertices), vertices, GL_STATIC_DRAW);
703 glBindBuffer(GL_ARRAY_BUFFER, 0);
704 glEnableVertexAttribArray(0);
715 ORIGINATE_ERROR(
"Item list should be empty");
747 std::ostringstream message;
749 message <<
"Displaying '" << (*m_curItem)->getFileName() <<
"'" << std::endl;
752 PROPAGATE_ERROR((*m_curItem)->initialize());
754 switch ((*m_curItem)->getType())
761 glClear(GL_COLOR_BUFFER_BIT);
764 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
765 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
768 GL_RGB, GL_UNSIGNED_BYTE,
reinterpret_cast<const void*
>(image->
getData()));
772 glUniform2f(0, 0.0f, 0.0f);
773 glUniform2f(1, 1.0f, 1.0f);
774 glBindBuffer(GL_ARRAY_BUFFER,
m_vbo);
775 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
776 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
783 PROPAGATE_ERROR(static_cast<GalleryItemVideo*>(*m_curItem)->startDisplay());
786 ORIGINATE_ERROR(
"Unhandled gallery item type");
800 PROPAGATE_ERROR((*m_curItem)->pauseDisplay());
810 PROPAGATE_ERROR((*m_curItem)->togglePlayBack());
820 PROPAGATE_ERROR((*m_curItem)->rewind());
847 PROPAGATE_ERROR(requestShutdown());
850 PROPAGATE_ERROR(
start());
857 PROPAGATE_ERROR(
rewind());
860 PROPAGATE_ERROR(
stop());
879 ORIGINATE_ERROR(
"Invalid command %d", cmd);
889 PROPAGATE_ERROR_CONTINUE(
stop());
908 glDeleteBuffers(1, &
m_vbo);
911 PROPAGATE_ERROR_CONTINUE(
m_context.cleanup());
917 : m_initialized(false)
944 PROPAGATE_ERROR_CONTINUE(
stop());
954 ORIGINATE_ERROR(
"Not initialized");
959 UniquePointer<GalleryThread> galleryThread(
new GalleryThread());
961 ORIGINATE_ERROR(
"Out of memory");
963 PROPAGATE_ERROR(galleryThread->initialize());
966 PROPAGATE_ERROR(m_thread->waitRunning());
978 ORIGINATE_ERROR(
"Not initialized");
1000 ORIGINATE_ERROR(
"Not running");
1009 ORIGINATE_ERROR(
"Not running");
1018 ORIGINATE_ERROR(
"Not running");
1027 ORIGINATE_ERROR(
"Not running");