/* GStreamer * * unit test for state changes on all elements * * Copyright (C) <2017> Julien Isorce * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include static GstGLDisplay *display; static GstGLContext *context; static void setup (void) { display = gst_gl_display_new (); context = gst_gl_context_new (display); gst_gl_context_create (context, 0, NULL); } static void teardown (void) { gst_object_unref (context); gst_object_unref (display); } /* keep in sync with the list in gstglformat.h */ static const struct { GstGLFormat format; guint gl_type; guint n_bytes; } formats[] = { /* *INDENT-OFF* */ {GST_GL_LUMINANCE, GL_UNSIGNED_BYTE, 1}, {GST_GL_ALPHA, GL_UNSIGNED_BYTE, 1}, {GST_GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2}, {GST_GL_RED, GL_UNSIGNED_BYTE, 1}, {GST_GL_R8, GL_UNSIGNED_BYTE, 1}, {GST_GL_RG, GL_UNSIGNED_BYTE, 2}, {GST_GL_RG8, GL_UNSIGNED_BYTE, 2}, {GST_GL_RGB, GL_UNSIGNED_BYTE, 3}, {GST_GL_RGB8, GL_UNSIGNED_BYTE, 3}, {GST_GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, 2}, {GST_GL_RGB16, GL_UNSIGNED_SHORT, 6}, {GST_GL_RGBA, GL_UNSIGNED_BYTE, 4}, {GST_GL_RGBA8, GL_UNSIGNED_BYTE, 4}, {GST_GL_RGBA16, GL_UNSIGNED_SHORT, 8}, /* {GST_GL_DEPTH_COMPONENT16, GL_UNSIGNED_BYTE, 2}, {GST_GL_DEPTH24_STENCIL8, GL_UNSIGNED_BYTE, 4},*/ /* *INDENT-ON* */ }; GST_START_TEST (test_format_n_bytes) { int i; for (i = 0; i < G_N_ELEMENTS (formats); i++) { GST_DEBUG ("idx %i: expected %u, args format 0x%x, gl type 0x%x", i, formats[i].n_bytes, formats[i].format, formats[i].gl_type); fail_unless_equals_int (formats[i].n_bytes, gst_gl_format_type_n_bytes (formats[i].format, formats[i].gl_type)); } } GST_END_TEST; /* keep in sync with the list in gstglformat.h */ static const struct { GstGLFormat format; GstGLFormat unsized_format; guint gl_type; } sized_formats[] = { /* *INDENT-OFF* */ {GST_GL_LUMINANCE, GST_GL_LUMINANCE, GL_UNSIGNED_BYTE}, {GST_GL_ALPHA, GST_GL_ALPHA, GL_UNSIGNED_BYTE}, {GST_GL_LUMINANCE_ALPHA, GST_GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE}, /* {GST_GL_R8, GST_GL_RED, GL_UNSIGNED_BYTE}, can be either R8 or RED depending on extensions and GL version */ /* {GST_GL_R8, GST_GL_R8, GL_UNSIGNED_BYTE}, can be either R8 or RED depending on extensions and GL version */ /* {GST_GL_RG8, GST_GL_RG, GL_UNSIGNED_BYTE}, can be either RG8 or RG depending on extensions and GL version */ /* {GST_GL_RG8, GST_GL_RG8, GL_UNSIGNED_BYTE}, can be either RG8 or RG depending on extensions and GL version */ {GST_GL_RGB8, GST_GL_RGB, GL_UNSIGNED_BYTE}, {GST_GL_RGB8, GST_GL_RGB8, GL_UNSIGNED_BYTE}, {GST_GL_RGB565, GST_GL_RGB, GL_UNSIGNED_SHORT_5_6_5}, {GST_GL_RGB565, GST_GL_RGB565, GL_UNSIGNED_SHORT_5_6_5}, {GST_GL_RGB16, GST_GL_RGB, GL_UNSIGNED_SHORT}, {GST_GL_RGB16, GST_GL_RGB16, GL_UNSIGNED_SHORT}, {GST_GL_RGBA8, GST_GL_RGBA, GL_UNSIGNED_BYTE}, {GST_GL_RGBA8, GST_GL_RGBA8, GL_UNSIGNED_BYTE}, {GST_GL_RGBA16, GST_GL_RGBA, GL_UNSIGNED_SHORT}, {GST_GL_RGBA16, GST_GL_RGBA16, GL_UNSIGNED_SHORT}, /* {GST_GL_DEPTH_COMPONENT16, GST_GL_DEPTH_COMPONENT16, GL_UNSIGNED_BYTE}, {GST_GL_DEPTH24_STENCIL8, GST_GL_DEPTH24_STENCIL8, GL_UNSIGNED_BYTE},*/ /* *INDENT-ON* */ }; GST_START_TEST (test_sized_from_unsized) { int i; for (i = 0; i < G_N_ELEMENTS (sized_formats); i++) { GST_DEBUG ("idx %i: expected 0x%x, args format 0x%x, gl type 0x%x", i, sized_formats[i].format, sized_formats[i].unsized_format, sized_formats[i].gl_type); fail_unless_equals_int (sized_formats[i].format, gst_gl_sized_gl_format_from_gl_format_type (context, sized_formats[i].unsized_format, sized_formats[i].gl_type)); } } GST_END_TEST; /* keep in sync with the list in gstglformat.h */ static const struct { GstGLFormat unsized_format; guint gl_type; GstGLFormat format; } unsized_formats[] = { /* *INDENT-OFF* */ {GST_GL_LUMINANCE, GL_UNSIGNED_BYTE, GST_GL_LUMINANCE}, {GST_GL_ALPHA, GL_UNSIGNED_BYTE, GST_GL_ALPHA}, {GST_GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GST_GL_LUMINANCE_ALPHA}, {GST_GL_RED, GL_UNSIGNED_BYTE, GST_GL_RED}, {GST_GL_RED, GL_UNSIGNED_BYTE, GST_GL_R8}, {GST_GL_RG, GL_UNSIGNED_BYTE, GST_GL_RG}, {GST_GL_RG, GL_UNSIGNED_BYTE, GST_GL_RG8}, {GST_GL_RGB, GL_UNSIGNED_BYTE, GST_GL_RGB}, {GST_GL_RGB, GL_UNSIGNED_BYTE, GST_GL_RGB8}, {GST_GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GST_GL_RGB565}, {GST_GL_RGB, GL_UNSIGNED_SHORT, GST_GL_RGB16}, {GST_GL_RGBA, GL_UNSIGNED_BYTE, GST_GL_RGBA}, {GST_GL_RGBA, GL_UNSIGNED_BYTE, GST_GL_RGBA8}, {GST_GL_RGBA, GL_UNSIGNED_SHORT, GST_GL_RGBA16}, /* {GST_GL_DEPTH_COMPONENT16, GL_UNSIGNED_BYTE, GST_GL_DEPTH_COMPONENT16}, {GST_GL_DEPTH24_STENCIL8, GL_UNSIGNED_BYTE, GST_GL_DEPTH24_STENCIL8},*/ /* *INDENT-ON* */ }; GST_START_TEST (test_unsized_from_sized) { int i; for (i = 0; i < G_N_ELEMENTS (unsized_formats); i++) { GstGLFormat unsized_format; guint gl_type; GST_DEBUG ("idx %i: expected 0x%x 0x%x, args format 0x%x", i, unsized_formats[i].unsized_format, unsized_formats[i].gl_type, unsized_formats[i].format); gst_gl_format_type_from_sized_gl_format (unsized_formats[i].format, &unsized_format, &gl_type); fail_unless_equals_int (unsized_formats[i].unsized_format, unsized_format); fail_unless_equals_int (unsized_formats[i].gl_type, gl_type); } } GST_END_TEST; static GstGLTextureTarget texture_targets[] = { GST_GL_TEXTURE_TARGET_2D, GST_GL_TEXTURE_TARGET_RECTANGLE, GST_GL_TEXTURE_TARGET_EXTERNAL_OES, }; GST_START_TEST (test_texture_target_strings) { int i; for (i = 0; i < G_N_ELEMENTS (texture_targets); i++) { GstGLTextureTarget res; const gchar *str; str = gst_gl_texture_target_to_string (texture_targets[i]); res = gst_gl_texture_target_from_string (str); GST_DEBUG ("from %u to \'%s\' to %u", texture_targets[i], str, res); fail_unless_equals_int (texture_targets[i], res); } } GST_END_TEST; GST_START_TEST (test_texture_target_gl) { int i; for (i = 0; i < G_N_ELEMENTS (texture_targets); i++) { GstGLTextureTarget res; guint gl; gl = gst_gl_texture_target_to_gl (texture_targets[i]); res = gst_gl_texture_target_from_gl (gl); GST_DEBUG ("from %u to 0x%x to %u", texture_targets[i], gl, res); fail_unless_equals_int (texture_targets[i], res); } } GST_END_TEST; static Suite * gst_gl_format_suite (void) { Suite *s = suite_create ("Gst GL Formats"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_checked_fixture (tc_chain, setup, teardown); tcase_add_test (tc_chain, test_format_n_bytes); tcase_add_test (tc_chain, test_sized_from_unsized); tcase_add_test (tc_chain, test_unsized_from_sized); tcase_add_test (tc_chain, test_texture_target_strings); tcase_add_test (tc_chain, test_texture_target_gl); return s; } GST_CHECK_MAIN (gst_gl_format);