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