• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GStreamer
2  *
3  * unit test for state changes on all elements
4  *
5  * Copyright (C) <2012> Matthew Waters <ystreet00@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 
31 #include <stdio.h>
32 
33 static GstGLDisplay *display;
34 static GstGLContext *context;
35 
36 static void
setup(void)37 setup (void)
38 {
39   display = gst_gl_display_new ();
40   context = gst_gl_context_new (display);
41   gst_gl_context_create (context, 0, NULL);
42   gst_gl_memory_init_once ();
43 }
44 
45 static void
teardown(void)46 teardown (void)
47 {
48   gst_object_unref (display);
49   gst_object_unref (context);
50 }
51 
52 /* one red rgba pixel */
53 static guint8 rgba_pixel[] = {
54   0xff, 0x00, 0x00, 0xff,
55 };
56 
57 static const struct
58 {
59   GstVideoFormat format;
60   guint width;
61   guint height;
62   guint plane;
63   guint8 *data;
64   gsize size;
65 } formats[] = {
66   {
67   GST_VIDEO_FORMAT_RGBA, 1, 1, 0, rgba_pixel, 4}, {
68   GST_VIDEO_FORMAT_RGB, 1, 1, 0, rgba_pixel, 3}, {
69   GST_VIDEO_FORMAT_YUY2, 1, 1, 0, rgba_pixel, 1}, {
70 GST_VIDEO_FORMAT_I420, 1, 1, 0, rgba_pixel, 1},};
71 
GST_START_TEST(test_allocator_alloc)72 GST_START_TEST (test_allocator_alloc)
73 {
74   GstAllocator *gl_allocator;
75   GstMemory *mem;
76 
77   gl_allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR_NAME);
78 
79   ASSERT_WARNING (mem = gst_allocator_alloc (gl_allocator, 0, NULL));
80   fail_unless (mem == NULL);
81 
82   gst_object_unref (gl_allocator);
83 }
84 
85 GST_END_TEST;
86 
GST_START_TEST(test_allocator_pbo_alloc)87 GST_START_TEST (test_allocator_pbo_alloc)
88 {
89   GstAllocator *gl_allocator;
90   GstMemory *mem;
91 
92   gl_allocator = gst_allocator_find (GST_GL_MEMORY_PBO_ALLOCATOR_NAME);
93 
94   ASSERT_WARNING (mem = gst_allocator_alloc (gl_allocator, 0, NULL));
95   fail_unless (mem == NULL);
96 
97   gst_object_unref (gl_allocator);
98 }
99 
100 GST_END_TEST;
101 
102 static GstMemory *
create_memory(const gchar * allocator_name,const GstVideoInfo * v_info,guint plane)103 create_memory (const gchar * allocator_name, const GstVideoInfo * v_info,
104     guint plane)
105 {
106   GstAllocator *gl_allocator;
107   GstGLBaseMemoryAllocator *base_mem_alloc;
108   GstGLVideoAllocationParams *params;
109   GstGLMemory *gl_mem;
110   GstMemory *mem;
111 
112   GST_DEBUG ("creating from %s texture for format %s, %ux%u plane %u",
113       allocator_name, GST_VIDEO_INFO_NAME (v_info),
114       GST_VIDEO_INFO_WIDTH (v_info), GST_VIDEO_INFO_HEIGHT (v_info), plane);
115 
116   gl_allocator = gst_allocator_find (allocator_name);
117   fail_if (gl_allocator == NULL);
118   base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (gl_allocator);
119 
120   params = gst_gl_video_allocation_params_new (context, NULL, v_info, plane,
121       NULL, GST_GL_TEXTURE_TARGET_2D, GST_GL_RGBA);
122 
123   /* texture creation */
124   mem = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
125       (GstGLAllocationParams *) params);
126   gl_mem = (GstGLMemory *) mem;
127   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
128           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
129   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
130           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
131 
132   fail_unless_equals_int (TRUE, gst_video_info_is_equal (v_info,
133           &gl_mem->info));
134   fail_unless_equals_int (plane, gl_mem->plane);
135   fail_if (gl_mem->mem.context != context);
136   fail_if (gl_mem->tex_id == 0);
137 
138   gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
139   gst_object_unref (gl_allocator);
140 
141   return mem;
142 }
143 
GST_START_TEST(test_allocator_create)144 GST_START_TEST (test_allocator_create)
145 {
146   int i;
147 
148   for (i = 0; i < G_N_ELEMENTS (formats); i++) {
149     GstVideoInfo v_info;
150     GstMemory *mem;
151 
152     gst_video_info_set_format (&v_info, formats[i].format, formats[i].width,
153         formats[i].height);
154     mem = create_memory (GST_GL_MEMORY_ALLOCATOR_NAME, &v_info,
155         formats[i].plane);
156     gst_memory_unref (mem);
157     mem = create_memory (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info,
158         formats[i].plane);
159     gst_memory_unref (mem);
160   }
161 }
162 
163 GST_END_TEST;
164 
GST_START_TEST(test_memory_copy)165 GST_START_TEST (test_memory_copy)
166 {
167   int i;
168 
169   for (i = 0; i < G_N_ELEMENTS (formats); i++) {
170     GstVideoInfo v_info;
171     GstMemory *mem, *mem2;
172     GstGLMemory *gl_mem, *gl_mem2;
173 
174     gst_video_info_set_format (&v_info, formats[i].format, formats[i].width,
175         formats[i].height);
176     mem = create_memory (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info,
177         formats[i].plane);
178     gl_mem = (GstGLMemory *) mem;
179     mem2 = gst_memory_copy (mem, 0, -1);
180     gl_mem2 = (GstGLMemory *) mem;
181 
182     fail_unless (gl_mem->mem.context == context);
183     fail_unless_equals_int (gl_mem->tex_id, gl_mem2->tex_id);
184     fail_unless_equals_int (gl_mem->tex_target, gl_mem2->tex_target);
185     fail_unless_equals_int (gl_mem->tex_format, gl_mem2->tex_format);
186     fail_unless_equals_int (TRUE, gst_video_info_is_equal (&gl_mem2->info,
187             &gl_mem->info));
188     fail_unless_equals_int (gl_mem->plane, gl_mem2->plane);
189 
190     gst_memory_unref (mem);
191     gst_memory_unref (mem2);
192   }
193 }
194 
195 GST_END_TEST;
196 
197 static GstMemory *
wrap_raw_data(const gchar * allocator_name,const GstVideoInfo * v_info,guint plane,guint8 * data)198 wrap_raw_data (const gchar * allocator_name, const GstVideoInfo * v_info,
199     guint plane, guint8 * data)
200 {
201   GstAllocator *gl_allocator;
202   GstGLBaseMemoryAllocator *base_mem_alloc;
203   GstGLVideoAllocationParams *params;
204   GstMemory *mem;
205   GstGLMemory *gl_mem;
206   GstGLFormat gl_format;
207 
208   GST_DEBUG ("wrapping from %s data pointer %p for format %s, %ux%u plane %u",
209       allocator_name, data, GST_VIDEO_INFO_NAME (v_info),
210       GST_VIDEO_INFO_WIDTH (v_info), GST_VIDEO_INFO_HEIGHT (v_info), plane);
211 
212   gl_allocator = gst_allocator_find (allocator_name);
213   fail_if (gl_allocator == NULL);
214   base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (gl_allocator);
215 
216   gl_format = gst_gl_format_from_video_info (context, v_info, plane);
217   params = gst_gl_video_allocation_params_new_wrapped_data (context, NULL,
218       v_info, plane, NULL, GST_GL_TEXTURE_TARGET_2D,
219       gl_format, data, NULL, NULL);
220   mem =
221       (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
222       (GstGLAllocationParams *) params);
223   gl_mem = (GstGLMemory *) mem;
224   fail_if (mem == NULL);
225 
226   fail_unless (GST_MEMORY_FLAG_IS_SET (mem,
227           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
228   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
229           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
230 
231   fail_unless_equals_int (TRUE, gst_video_info_is_equal (v_info,
232           &gl_mem->info));
233   fail_unless_equals_int (gl_mem->plane, plane);
234 
235   gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
236   gst_object_unref (gl_allocator);
237 
238   return mem;
239 }
240 
GST_START_TEST(test_wrap_raw)241 GST_START_TEST (test_wrap_raw)
242 {
243   int i;
244 
245   for (i = 0; i < G_N_ELEMENTS (formats); i++) {
246     GstVideoInfo v_info;
247     GstMemory *mem;
248     GstGLMemory *gl_mem;
249     GstMapInfo map_info;
250 
251     gst_video_info_set_format (&v_info, formats[i].format, formats[i].width,
252         formats[i].height);
253     mem = wrap_raw_data (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info,
254         formats[i].plane, formats[i].data);
255     gl_mem = (GstGLMemory *) mem;
256 
257     fail_unless (gl_mem->mem.context == context);
258 
259     fail_unless (gst_memory_map (mem, &map_info, GST_MAP_READ));
260     fail_unless (memcmp (map_info.data, formats[i].data, formats[i].size) == 0);
261     gst_memory_unmap (mem, &map_info);
262 
263     gst_memory_unref (mem);
264   }
265 }
266 
267 GST_END_TEST;
268 
269 static GstMemory *
wrap_gl_memory(GstGLMemory * gl_mem)270 wrap_gl_memory (GstGLMemory * gl_mem)
271 {
272   GstGLBaseMemoryAllocator *base_mem_alloc;
273   GstGLVideoAllocationParams *params;
274   GstMemory *mem, *mem2;
275   GstGLMemory *gl_mem2;
276 
277   mem = (GstMemory *) gl_mem;
278   base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (mem->allocator);
279 
280   GST_DEBUG ("wrapping from %s %" GST_PTR_FORMAT " for format %s, %ux%u "
281       "plane %u", mem->allocator->mem_type, gl_mem,
282       GST_VIDEO_INFO_NAME (&gl_mem->info), GST_VIDEO_INFO_WIDTH (&gl_mem->info),
283       GST_VIDEO_INFO_HEIGHT (&gl_mem->info), gl_mem->plane);
284 
285   params = gst_gl_video_allocation_params_new_wrapped_texture (context, NULL,
286       &gl_mem->info, gl_mem->plane, NULL, gl_mem->tex_target,
287       gl_mem->tex_format, gl_mem->tex_id, NULL, NULL);
288   mem2 =
289       (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
290       (GstGLAllocationParams *) params);
291   gl_mem2 = (GstGLMemory *) mem2;
292   fail_if (mem == NULL);
293 
294   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
295           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
296   fail_unless (GST_MEMORY_FLAG_IS_SET (mem2,
297           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
298 
299   fail_unless (gl_mem->mem.context == context);
300   fail_unless_equals_int (gl_mem->tex_id, gl_mem2->tex_id);
301   fail_unless_equals_int (gl_mem->tex_target, gl_mem2->tex_target);
302   fail_unless_equals_int (gl_mem->tex_format, gl_mem2->tex_format);
303   fail_unless_equals_int (TRUE, gst_video_info_is_equal (&gl_mem2->info,
304           &gl_mem->info));
305   fail_unless_equals_int (gl_mem->plane, gl_mem2->plane);
306 
307   gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
308 
309   return mem2;
310 }
311 
GST_START_TEST(test_wrap_gl_memory)312 GST_START_TEST (test_wrap_gl_memory)
313 {
314   int i;
315 
316   for (i = 0; i < G_N_ELEMENTS (formats); i++) {
317     GstVideoInfo v_info;
318     GstMemory *mem, *mem2;
319     GstGLMemory *gl_mem;
320 
321     gst_video_info_set_format (&v_info, formats[i].format, formats[i].width,
322         formats[i].height);
323     mem = create_memory (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info,
324         formats[i].plane);
325     gl_mem = (GstGLMemory *) mem;
326     mem2 = wrap_gl_memory (gl_mem);
327 
328     gst_memory_unref (mem);
329     gst_memory_unref (mem2);
330   }
331 }
332 
333 GST_END_TEST;
334 
GST_START_TEST(test_wrap_data_copy_into)335 GST_START_TEST (test_wrap_data_copy_into)
336 {
337   int i;
338 
339   /* FIXME: in GLES2 only supported with RGBA */
340   for (i = 0; i < 1 /*G_N_ELEMENTS (formats) */ ; i++) {
341     GstVideoInfo v_info;
342     GstMemory *mem, *mem2;
343     GstGLMemory *gl_mem, *gl_mem2;
344     GstMapInfo map_info;
345 
346     gst_video_info_set_format (&v_info, formats[i].format, formats[i].width,
347         formats[i].height);
348     /* wrap some data */
349     mem = wrap_raw_data (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info,
350         formats[i].plane, formats[i].data);
351     gl_mem = (GstGLMemory *) mem;
352     mem2 = create_memory (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info,
353         formats[i].plane);
354     gl_mem2 = (GstGLMemory *) mem2;
355 
356     fail_unless (gst_memory_map (mem, &map_info, GST_MAP_READ | GST_MAP_GL));
357 
358     /* copy wrapped data into another texture */
359     fail_unless (gst_gl_memory_copy_into (gl_mem,
360             gl_mem2->tex_id, GST_GL_TEXTURE_TARGET_2D, gl_mem2->tex_format,
361             formats[i].width, formats[i].height));
362     GST_MINI_OBJECT_FLAG_SET (mem2, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
363 
364     fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
365             GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
366     fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
367             GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
368     fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
369             GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
370     fail_unless (GST_MEMORY_FLAG_IS_SET (mem2,
371             GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
372 
373     gst_memory_unmap (mem, &map_info);
374 
375     /* check copied texture is the same as the wrapped data */
376     fail_unless (gst_memory_map (mem2, &map_info, GST_MAP_READ));
377     fail_unless (memcmp (map_info.data, formats[i].data, formats[i].size) == 0);
378     gst_memory_unmap (mem2, &map_info);
379 
380     gst_memory_unref (mem);
381     gst_memory_unref (mem2);
382   }
383 }
384 
385 GST_END_TEST;
386 
GST_START_TEST(test_transfer_state)387 GST_START_TEST (test_transfer_state)
388 {
389   GstVideoInfo v_info;
390   GstMapInfo map_info;
391   GstMemory *mem;
392 
393   gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA, 1, 1);
394   mem = create_memory (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info, 0);
395 
396   /* initial state is no transfer needed */
397   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
398           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
399   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
400           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
401 
402   GST_DEBUG ("read-only map");
403   gst_memory_map (mem, &map_info, GST_MAP_READ);
404   gst_memory_unmap (mem, &map_info);
405   /* read map does not change transfer state */
406   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
407           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
408   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
409           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
410 
411   GST_DEBUG ("read/GL-only map");
412   gst_memory_map (mem, &map_info, GST_MAP_READ | GST_MAP_GL);
413   gst_memory_unmap (mem, &map_info);
414   /* read | GL map does not change transfer state */
415   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
416           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
417   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
418           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
419 
420   GST_DEBUG ("write-only map");
421   gst_memory_map (mem, &map_info, GST_MAP_WRITE);
422   gst_memory_unmap (mem, &map_info);
423   /* write map causes need-upload */
424   fail_unless (GST_MEMORY_FLAG_IS_SET (mem,
425           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
426   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
427           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
428 
429   GST_DEBUG ("write/GL-only map");
430   gst_memory_map (mem, &map_info, GST_MAP_WRITE | GST_MAP_GL);
431   gst_memory_unmap (mem, &map_info);
432   /* write | GL map from need-upload causes only need-download */
433   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
434           GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
435   fail_unless (GST_MEMORY_FLAG_IS_SET (mem,
436           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
437 
438   gst_memory_unref (mem);
439 }
440 
441 GST_END_TEST;
442 
GST_START_TEST(test_separate_upload_transfer)443 GST_START_TEST (test_separate_upload_transfer)
444 {
445   GstVideoInfo v_info;
446   GstMemory *mem;
447   GstMapInfo info;
448 
449   gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA, 1, 1);
450   mem =
451       wrap_raw_data (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info, 0, rgba_pixel);
452   gst_gl_memory_pbo_upload_transfer ((GstGLMemoryPBO *) mem);
453 
454   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
455           GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
456 
457   /* complete the upload */
458   fail_unless (gst_memory_map (mem, &info, GST_MAP_READ | GST_MAP_GL));
459   gst_memory_unmap (mem, &info);
460 
461   /* force a download */
462   fail_unless (gst_memory_map (mem, &info, GST_MAP_WRITE | GST_MAP_GL));
463   gst_memory_unmap (mem, &info);
464 
465   /* check the downloaded data is the same */
466   fail_unless (gst_memory_map (mem, &info, GST_MAP_READ));
467   fail_unless (memcmp (info.data, rgba_pixel, G_N_ELEMENTS (rgba_pixel)) == 0,
468       "0x%02x%02x%02x%02x != 0x%02x%02x%02x%02x", (guint8) info.data[0],
469       (guint8) info.data[1], (guint8) info.data[2],
470       (guint8) info.data[3], (guint8) rgba_pixel[0], (guint8) rgba_pixel[1],
471       (guint8) rgba_pixel[2], (guint8) rgba_pixel[3]);
472   gst_memory_unmap (mem, &info);
473 
474   gst_memory_unref (mem);
475 }
476 
477 GST_END_TEST;
478 
GST_START_TEST(test_separate_download_transfer)479 GST_START_TEST (test_separate_download_transfer)
480 {
481   GstVideoInfo v_info;
482   GstMemory *mem;
483   GstMapInfo info;
484 
485   gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA, 1, 1);
486   mem =
487       wrap_raw_data (GST_GL_MEMORY_PBO_ALLOCATOR_NAME, &v_info, 0, rgba_pixel);
488 
489   /* complete the upload */
490   fail_unless (gst_memory_map (mem, &info, GST_MAP_READ | GST_MAP_GL));
491   gst_memory_unmap (mem, &info);
492 
493   /* force a download */
494   fail_unless (gst_memory_map (mem, &info, GST_MAP_WRITE | GST_MAP_GL));
495   gst_memory_unmap (mem, &info);
496 
497   gst_gl_memory_pbo_download_transfer ((GstGLMemoryPBO *) mem);
498 
499   /* check the downloaded data is the same */
500   fail_unless (gst_memory_map (mem, &info, GST_MAP_READ));
501   fail_unless (memcmp (info.data, rgba_pixel, G_N_ELEMENTS (rgba_pixel)) == 0,
502       "0x%02x%02x%02x%02x != 0x%02x%02x%02x%02x", (guint8) info.data[0],
503       (guint8) info.data[1], (guint8) info.data[2],
504       (guint8) info.data[3], (guint8) rgba_pixel[0], (guint8) rgba_pixel[1],
505       (guint8) rgba_pixel[2], (guint8) rgba_pixel[3]);
506   gst_memory_unmap (mem, &info);
507 
508   gst_memory_unref (mem);
509 }
510 
511 GST_END_TEST;
512 
513 static Suite *
gst_gl_memory_suite(void)514 gst_gl_memory_suite (void)
515 {
516   Suite *s = suite_create ("GstGLMemory");
517   TCase *tc_chain = tcase_create ("general");
518 
519   suite_add_tcase (s, tc_chain);
520   tcase_add_checked_fixture (tc_chain, setup, teardown);
521   tcase_add_test (tc_chain, test_allocator_alloc);
522   tcase_add_test (tc_chain, test_allocator_pbo_alloc);
523   tcase_add_test (tc_chain, test_allocator_create);
524   tcase_add_test (tc_chain, test_memory_copy);
525   tcase_add_test (tc_chain, test_wrap_raw);
526   tcase_add_test (tc_chain, test_wrap_gl_memory);
527   tcase_add_test (tc_chain, test_wrap_data_copy_into);
528   tcase_add_test (tc_chain, test_transfer_state);
529   tcase_add_test (tc_chain, test_separate_upload_transfer);
530   tcase_add_test (tc_chain, test_separate_download_transfer);
531 
532   return s;
533 }
534 
535 GST_CHECK_MAIN (gst_gl_memory);
536