1 /* GStreamer
2 *
3 * unit test for state changes on all elements
4 *
5 * Copyright (C) <2017> Julien Isorce <julien.isorce@gmail.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
21 */
22
23 #ifdef HAVE_CONFIG_H
24 # include "config.h"
25 #endif
26
27 #include <gst/check/gstcheck.h>
28
29 #include <gst/gl/gl.h>
30 #include <gst/gl/gstglfuncs.h>
31
32 static GstGLDisplay *display;
33 static GstGLContext *context;
34
35 static void
setup(void)36 setup (void)
37 {
38 display = gst_gl_display_new ();
39 context = gst_gl_context_new (display);
40 gst_gl_context_create (context, 0, NULL);
41 }
42
43 static void
teardown(void)44 teardown (void)
45 {
46 gst_object_unref (context);
47 gst_object_unref (display);
48 }
49
50 /* keep in sync with the list in gstglformat.h */
51 static const struct
52 {
53 GstGLFormat format;
54 guint gl_type;
55 guint n_bytes;
56 } formats[] = {
57 /* *INDENT-OFF* */
58 {GST_GL_LUMINANCE, GL_UNSIGNED_BYTE, 1},
59 {GST_GL_ALPHA, GL_UNSIGNED_BYTE, 1},
60 {GST_GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2},
61 {GST_GL_RED, GL_UNSIGNED_BYTE, 1},
62 {GST_GL_R8, GL_UNSIGNED_BYTE, 1},
63 {GST_GL_RG, GL_UNSIGNED_BYTE, 2},
64 {GST_GL_RG8, GL_UNSIGNED_BYTE, 2},
65 {GST_GL_RGB, GL_UNSIGNED_BYTE, 3},
66 {GST_GL_RGB8, GL_UNSIGNED_BYTE, 3},
67 {GST_GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, 2},
68 {GST_GL_RGB16, GL_UNSIGNED_SHORT, 6},
69 {GST_GL_RGBA, GL_UNSIGNED_BYTE, 4},
70 {GST_GL_RGBA8, GL_UNSIGNED_BYTE, 4},
71 {GST_GL_RGBA16, GL_UNSIGNED_SHORT, 8},
72 /* {GST_GL_DEPTH_COMPONENT16, GL_UNSIGNED_BYTE, 2},
73 {GST_GL_DEPTH24_STENCIL8, GL_UNSIGNED_BYTE, 4},*/
74 /* *INDENT-ON* */
75 };
76
GST_START_TEST(test_format_n_bytes)77 GST_START_TEST (test_format_n_bytes)
78 {
79 int i;
80
81 for (i = 0; i < G_N_ELEMENTS (formats); i++) {
82 GST_DEBUG ("idx %i: expected %u, args format 0x%x, gl type 0x%x", i,
83 formats[i].n_bytes, formats[i].format, formats[i].gl_type);
84 fail_unless_equals_int (formats[i].n_bytes,
85 gst_gl_format_type_n_bytes (formats[i].format, formats[i].gl_type));
86 }
87 }
88
89 GST_END_TEST;
90
91 /* keep in sync with the list in gstglformat.h */
92 static const struct
93 {
94 GstGLFormat format;
95 GstGLFormat unsized_format;
96 guint gl_type;
97 } sized_formats[] = {
98 /* *INDENT-OFF* */
99 {GST_GL_LUMINANCE, GST_GL_LUMINANCE, GL_UNSIGNED_BYTE},
100 {GST_GL_ALPHA, GST_GL_ALPHA, GL_UNSIGNED_BYTE},
101 {GST_GL_LUMINANCE_ALPHA, GST_GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE},
102 /* {GST_GL_R8, GST_GL_RED, GL_UNSIGNED_BYTE}, can be either R8 or RED depending on extensions and GL version */
103 /* {GST_GL_R8, GST_GL_R8, GL_UNSIGNED_BYTE}, can be either R8 or RED depending on extensions and GL version */
104 /* {GST_GL_RG8, GST_GL_RG, GL_UNSIGNED_BYTE}, can be either RG8 or RG depending on extensions and GL version */
105 /* {GST_GL_RG8, GST_GL_RG8, GL_UNSIGNED_BYTE}, can be either RG8 or RG depending on extensions and GL version */
106 {GST_GL_RGB8, GST_GL_RGB, GL_UNSIGNED_BYTE},
107 {GST_GL_RGB8, GST_GL_RGB8, GL_UNSIGNED_BYTE},
108 {GST_GL_RGB565, GST_GL_RGB, GL_UNSIGNED_SHORT_5_6_5},
109 {GST_GL_RGB565, GST_GL_RGB565, GL_UNSIGNED_SHORT_5_6_5},
110 {GST_GL_RGB16, GST_GL_RGB, GL_UNSIGNED_SHORT},
111 {GST_GL_RGB16, GST_GL_RGB16, GL_UNSIGNED_SHORT},
112 {GST_GL_RGBA8, GST_GL_RGBA, GL_UNSIGNED_BYTE},
113 {GST_GL_RGBA8, GST_GL_RGBA8, GL_UNSIGNED_BYTE},
114 {GST_GL_RGBA16, GST_GL_RGBA, GL_UNSIGNED_SHORT},
115 {GST_GL_RGBA16, GST_GL_RGBA16, GL_UNSIGNED_SHORT},
116 /* {GST_GL_DEPTH_COMPONENT16, GST_GL_DEPTH_COMPONENT16, GL_UNSIGNED_BYTE},
117 {GST_GL_DEPTH24_STENCIL8, GST_GL_DEPTH24_STENCIL8, GL_UNSIGNED_BYTE},*/
118 /* *INDENT-ON* */
119 };
120
GST_START_TEST(test_sized_from_unsized)121 GST_START_TEST (test_sized_from_unsized)
122 {
123 int i;
124
125 for (i = 0; i < G_N_ELEMENTS (sized_formats); i++) {
126 GST_DEBUG ("idx %i: expected 0x%x, args format 0x%x, gl type 0x%x", i,
127 sized_formats[i].format, sized_formats[i].unsized_format,
128 sized_formats[i].gl_type);
129 fail_unless_equals_int (sized_formats[i].format,
130 gst_gl_sized_gl_format_from_gl_format_type (context,
131 sized_formats[i].unsized_format, sized_formats[i].gl_type));
132 }
133 }
134
135 GST_END_TEST;
136
137 /* keep in sync with the list in gstglformat.h */
138 static const struct
139 {
140 GstGLFormat unsized_format;
141 guint gl_type;
142 GstGLFormat format;
143 } unsized_formats[] = {
144 /* *INDENT-OFF* */
145 {GST_GL_LUMINANCE, GL_UNSIGNED_BYTE, GST_GL_LUMINANCE},
146 {GST_GL_ALPHA, GL_UNSIGNED_BYTE, GST_GL_ALPHA},
147 {GST_GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GST_GL_LUMINANCE_ALPHA},
148 {GST_GL_RED, GL_UNSIGNED_BYTE, GST_GL_RED},
149 {GST_GL_RED, GL_UNSIGNED_BYTE, GST_GL_R8},
150 {GST_GL_RG, GL_UNSIGNED_BYTE, GST_GL_RG},
151 {GST_GL_RG, GL_UNSIGNED_BYTE, GST_GL_RG8},
152 {GST_GL_RGB, GL_UNSIGNED_BYTE, GST_GL_RGB},
153 {GST_GL_RGB, GL_UNSIGNED_BYTE, GST_GL_RGB8},
154 {GST_GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GST_GL_RGB565},
155 {GST_GL_RGB, GL_UNSIGNED_SHORT, GST_GL_RGB16},
156 {GST_GL_RGBA, GL_UNSIGNED_BYTE, GST_GL_RGBA},
157 {GST_GL_RGBA, GL_UNSIGNED_BYTE, GST_GL_RGBA8},
158 {GST_GL_RGBA, GL_UNSIGNED_SHORT, GST_GL_RGBA16},
159 /* {GST_GL_DEPTH_COMPONENT16, GL_UNSIGNED_BYTE, GST_GL_DEPTH_COMPONENT16},
160 {GST_GL_DEPTH24_STENCIL8, GL_UNSIGNED_BYTE, GST_GL_DEPTH24_STENCIL8},*/
161 /* *INDENT-ON* */
162 };
163
GST_START_TEST(test_unsized_from_sized)164 GST_START_TEST (test_unsized_from_sized)
165 {
166 int i;
167
168 for (i = 0; i < G_N_ELEMENTS (unsized_formats); i++) {
169 GstGLFormat unsized_format;
170 guint gl_type;
171
172 GST_DEBUG ("idx %i: expected 0x%x 0x%x, args format 0x%x", i,
173 unsized_formats[i].unsized_format, unsized_formats[i].gl_type,
174 unsized_formats[i].format);
175 gst_gl_format_type_from_sized_gl_format (unsized_formats[i].format,
176 &unsized_format, &gl_type);
177
178 fail_unless_equals_int (unsized_formats[i].unsized_format, unsized_format);
179 fail_unless_equals_int (unsized_formats[i].gl_type, gl_type);
180 }
181 }
182
183 GST_END_TEST;
184
185 static GstGLTextureTarget texture_targets[] = {
186 GST_GL_TEXTURE_TARGET_2D,
187 GST_GL_TEXTURE_TARGET_RECTANGLE,
188 GST_GL_TEXTURE_TARGET_EXTERNAL_OES,
189 };
190
GST_START_TEST(test_texture_target_strings)191 GST_START_TEST (test_texture_target_strings)
192 {
193 int i;
194
195 for (i = 0; i < G_N_ELEMENTS (texture_targets); i++) {
196 GstGLTextureTarget res;
197 const gchar *str;
198
199 str = gst_gl_texture_target_to_string (texture_targets[i]);
200 res = gst_gl_texture_target_from_string (str);
201
202 GST_DEBUG ("from %u to \'%s\' to %u", texture_targets[i], str, res);
203
204 fail_unless_equals_int (texture_targets[i], res);
205 }
206 }
207
208 GST_END_TEST;
209
GST_START_TEST(test_texture_target_gl)210 GST_START_TEST (test_texture_target_gl)
211 {
212 int i;
213
214 for (i = 0; i < G_N_ELEMENTS (texture_targets); i++) {
215 GstGLTextureTarget res;
216 guint gl;
217
218 gl = gst_gl_texture_target_to_gl (texture_targets[i]);
219 res = gst_gl_texture_target_from_gl (gl);
220
221 GST_DEBUG ("from %u to 0x%x to %u", texture_targets[i], gl, res);
222
223 fail_unless_equals_int (texture_targets[i], res);
224 }
225 }
226
227 GST_END_TEST;
228
229 static Suite *
gst_gl_format_suite(void)230 gst_gl_format_suite (void)
231 {
232 Suite *s = suite_create ("Gst GL Formats");
233 TCase *tc_chain = tcase_create ("general");
234
235 suite_add_tcase (s, tc_chain);
236 tcase_add_checked_fixture (tc_chain, setup, teardown);
237 tcase_add_test (tc_chain, test_format_n_bytes);
238 tcase_add_test (tc_chain, test_sized_from_unsized);
239 tcase_add_test (tc_chain, test_unsized_from_sized);
240 tcase_add_test (tc_chain, test_texture_target_strings);
241 tcase_add_test (tc_chain, test_texture_target_gl);
242
243 return s;
244 }
245
246 GST_CHECK_MAIN (gst_gl_format);
247