gstreamer 1.2.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/Rakefile +78 -39
  2. data/ext/gstreamer/extconf.rb +8 -22
  3. data/ext/gstreamer/rbgst.c +82 -194
  4. data/lib/gst/base_loader.rb +20 -0
  5. data/lib/gst/bin.rb +32 -0
  6. data/lib/gst/bus.rb +24 -0
  7. data/lib/gst/element.rb +48 -0
  8. data/lib/gst.rb +87 -22
  9. data/sample/helloworld.rb +75 -0
  10. data/sample/mp3parselaunch.rb +74 -0
  11. data/sample/queue.rb +92 -0
  12. data/sample/typefind.rb +101 -0
  13. metadata +29 -84
  14. data/README +0 -33
  15. data/ext/gstreamer/misc.c +0 -63
  16. data/ext/gstreamer/rbgst-bin.c +0 -456
  17. data/ext/gstreamer/rbgst-buffer.c +0 -363
  18. data/ext/gstreamer/rbgst-bus.c +0 -92
  19. data/ext/gstreamer/rbgst-caps.c +0 -446
  20. data/ext/gstreamer/rbgst-child-proxy.c +0 -34
  21. data/ext/gstreamer/rbgst-clock.c +0 -108
  22. data/ext/gstreamer/rbgst-element-factory.c +0 -249
  23. data/ext/gstreamer/rbgst-element.c +0 -1106
  24. data/ext/gstreamer/rbgst-event.c +0 -352
  25. data/ext/gstreamer/rbgst-ghost-pad.c +0 -45
  26. data/ext/gstreamer/rbgst-index-factory.c +0 -69
  27. data/ext/gstreamer/rbgst-install-plugins-context.c +0 -87
  28. data/ext/gstreamer/rbgst-install-plugins-return.c +0 -45
  29. data/ext/gstreamer/rbgst-install-plugins.c +0 -125
  30. data/ext/gstreamer/rbgst-message.c +0 -785
  31. data/ext/gstreamer/rbgst-mini-object.c +0 -221
  32. data/ext/gstreamer/rbgst-object.c +0 -81
  33. data/ext/gstreamer/rbgst-pad-template.c +0 -125
  34. data/ext/gstreamer/rbgst-pad.c +0 -336
  35. data/ext/gstreamer/rbgst-pipeline.c +0 -91
  36. data/ext/gstreamer/rbgst-plugin-feature.c +0 -131
  37. data/ext/gstreamer/rbgst-plugin.c +0 -162
  38. data/ext/gstreamer/rbgst-private.c +0 -88
  39. data/ext/gstreamer/rbgst-private.h +0 -97
  40. data/ext/gstreamer/rbgst-query.c +0 -291
  41. data/ext/gstreamer/rbgst-seek.c +0 -39
  42. data/ext/gstreamer/rbgst-static-caps.c +0 -49
  43. data/ext/gstreamer/rbgst-static-pad-template.c +0 -65
  44. data/ext/gstreamer/rbgst-structure.c +0 -300
  45. data/ext/gstreamer/rbgst-system-clock.c +0 -48
  46. data/ext/gstreamer/rbgst-type-find-factory.c +0 -125
  47. data/ext/gstreamer/rbgst-value.c +0 -527
  48. data/ext/gstreamer/rbgst-x-overlay.c +0 -131
  49. data/ext/gstreamer/rbgst.h +0 -197
  50. data/ext/gstreamer/rbgstclockentry.c +0 -271
  51. data/ext/gstreamer/rbgstformat.c +0 -162
  52. data/ext/gstreamer/rbgstindex.c +0 -315
  53. data/ext/gstreamer/rbgstindexentry.c +0 -99
  54. data/ext/gstreamer/rbgstparse.c +0 -69
  55. data/ext/gstreamer/rbgstquerytype.c +0 -162
  56. data/ext/gstreamer/rbgstregistry.c +0 -288
  57. data/ext/gstreamer/rbgsttag.c +0 -113
  58. data/ext/gstreamer/rbgsttagsetter.c +0 -53
  59. data/ext/gstreamer/rbgstxml.c +0 -192
  60. data/sample/audio-player.rb +0 -54
  61. data/sample/gst-gi.rb +0 -55
  62. data/sample/gst-inspect.rb +0 -417
  63. data/sample/install-plugins.rb +0 -40
  64. data/sample/media-type.rb +0 -55
  65. data/sample/media-type2.rb +0 -268
  66. data/sample/ogg-audio-player.rb +0 -54
  67. data/sample/type-find.rb +0 -46
  68. data/sample/video-player.rb +0 -57
  69. data/sample/xml-player.rb +0 -60
  70. data/test/gst-test-utils.rb +0 -18
  71. data/test/run-test.rb +0 -25
  72. data/test/test_bin.rb +0 -167
  73. data/test/test_buffer.rb +0 -185
  74. data/test/test_caps.rb +0 -24
  75. data/test/test_element.rb +0 -85
  76. data/test/test_element_factory.rb +0 -28
  77. data/test/test_event.rb +0 -10
  78. data/test/test_index_factory.rb +0 -7
  79. data/test/test_install-plugins.rb +0 -18
  80. data/test/test_message.rb +0 -191
  81. data/test/test_mini_object.rb +0 -38
  82. data/test/test_object.rb +0 -10
  83. data/test/test_pad.rb +0 -68
  84. data/test/test_plugin.rb +0 -6
  85. data/test/test_plugin_feature.rb +0 -20
  86. data/test/test_seek.rb +0 -17
  87. data/test/test_static_caps.rb +0 -18
  88. data/test/test_static_pad_template.rb +0 -16
  89. data/test/test_structure.rb +0 -159
  90. data/test/test_thread_handling.rb +0 -58
  91. data/test/test_type_find_factory.rb +0 -8
  92. data/test/test_value.rb +0 -69
@@ -1,1106 +0,0 @@
1
- /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
- /*
3
- * Copyright (C) 2011-2013 Ruby-GNOME2 Project Team
4
- * Copyright (C) 2007, 2008 Ruby-GNOME2 Project Team
5
- * Copyright (C) 2006, 2008 Sjoerd Simons <sjoerd@luon.net>
6
- * Copyright (C) 2003, 2004 Laurent Sansonetti <lrz@gnome.org>
7
- *
8
- * This library is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU Lesser General Public
10
- * License as published by the Free Software Foundation; either
11
- * version 2.1 of the License, or (at your option) any later version.
12
- *
13
- * This library is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
- * Lesser General Public License for more details.
17
- *
18
- * You should have received a copy of the GNU Lesser General Public
19
- * License along with this library; if not, write to the Free Software
20
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21
- * MA 02110-1301 USA
22
- */
23
-
24
- #include "rbgst-private.h"
25
-
26
- #ifdef G_OS_WIN32
27
- # ifdef HAVE_IO_H
28
- # include <io.h>
29
- # define pipe(phandles) _pipe(phandles, 128, _O_BINARY)
30
- # endif
31
- #else
32
- # ifdef HAVE_UNISTD_H
33
- # include <unistd.h>
34
- # endif
35
- #endif
36
- #include <fcntl.h>
37
- #include <errno.h>
38
-
39
- #define RG_TARGET_NAMESPACE cElement
40
- #define SELF(self) RVAL2GST_ELEMENT(self)
41
-
42
- #define GST_STATE_CHANGE_RETURN2RVAL(object) \
43
- (GENUM2RVAL(object, GST_TYPE_STATE_CHANGE_RETURN))
44
-
45
- #define NOTIFY_MESSAGE "R"
46
- #define NOTIFY_MESSAGE_SIZE 1
47
-
48
- typedef struct _SetStateData {
49
- GstStateChangeReturn result;
50
- GstState state;
51
- } SetStateData;
52
-
53
- typedef struct _GetStateData {
54
- GstStateChangeReturn result;
55
- GstState state;
56
- GstState pending;
57
- GstClockTime timeout;
58
- } GetStateData;
59
-
60
- typedef struct _QueryData {
61
- gboolean result;
62
- GstQuery *query;
63
- } QueryData;
64
-
65
- typedef struct _SendEventData {
66
- gboolean result;
67
- GstEvent *event;
68
- } SendEventData;
69
-
70
- typedef struct _ThreadData {
71
- GstElement *element;
72
- gint notify_write_fd;
73
- gint notify_read_fd;
74
- gint errno_on_write;
75
- const gchar *context;
76
- union {
77
- SetStateData set_state_data;
78
- GetStateData get_state_data;
79
- QueryData query_data;
80
- SendEventData send_event_data;
81
- } data;
82
- } ThreadData;
83
-
84
- static VALUE RG_TARGET_NAMESPACE;
85
- static ID id_gtype;
86
- static GThreadPool *set_state_thread_pool;
87
- static GThreadPool *get_state_thread_pool;
88
- static GThreadPool *query_thread_pool;
89
- static GThreadPool *send_event_thread_pool;
90
-
91
- static void
92
- define_class_if_need(VALUE klass, GType type)
93
- {
94
- _rbgst_define_class_if_need(klass, type, "Element");
95
- }
96
-
97
- static VALUE
98
- instance2robj(gpointer instance, gpointer user_data)
99
- {
100
- VALUE klass;
101
- GType type;
102
-
103
- type = G_TYPE_FROM_INSTANCE(instance);
104
- klass = GTYPE2CLASS(type);
105
- define_class_if_need(klass, type);
106
- return rbgst_object_instance2robj(instance, user_data);
107
- }
108
-
109
- /* Class: Gst::Element
110
- * Base class for all pipeline elements.
111
- */
112
-
113
- static void
114
- do_in_thread(GThreadPool *pool, ThreadData *data)
115
- {
116
- int notify_fds[2];
117
- GError *error = NULL;
118
-
119
- if (pipe(notify_fds) != 0)
120
- rb_sys_fail("failed to create a pipe to synchronize threaded operation");
121
-
122
- data->errno_on_write = 0;
123
- data->notify_read_fd = notify_fds[0];
124
- data->notify_write_fd = notify_fds[1];
125
- g_thread_pool_push(pool, data, &error);
126
- if (error) {
127
- close(notify_fds[0]);
128
- close(notify_fds[1]);
129
- RAISE_GERROR(error);
130
- }
131
-
132
- rb_thread_wait_fd(notify_fds[0]);
133
-
134
- #define BUFFER_SIZE 512
135
- if (data->errno_on_write == 0) {
136
- char buf[NOTIFY_MESSAGE_SIZE];
137
- ssize_t read_size;
138
- int saved_errno = 0;
139
- read_size = read(notify_fds[0], buf, NOTIFY_MESSAGE_SIZE);
140
- if (read_size != NOTIFY_MESSAGE_SIZE) {
141
- saved_errno = errno;
142
- }
143
-
144
- close(notify_fds[0]);
145
- close(notify_fds[1]);
146
-
147
- if (saved_errno != 0) {
148
- char buffer[BUFFER_SIZE];
149
- snprintf(buffer, BUFFER_SIZE - 1,
150
- "failed to read notify pipe on %s", data->context);
151
- errno = saved_errno;
152
- rb_sys_fail(buffer);
153
- }
154
- } else {
155
- char buffer[BUFFER_SIZE];
156
- snprintf(buffer, BUFFER_SIZE - 1,
157
- "failed to write notify pipe on %s", data->context);
158
- errno = data->errno_on_write;
159
- rb_sys_fail(buffer);
160
- }
161
- #undef BUFFER_SIZE
162
- }
163
-
164
- static void
165
- notify(ThreadData *thread_data)
166
- {
167
- ssize_t written_size;
168
-
169
- written_size = write(thread_data->notify_write_fd,
170
- NOTIFY_MESSAGE, NOTIFY_MESSAGE_SIZE);
171
- if (written_size != NOTIFY_MESSAGE_SIZE) {
172
- int read_fd = thread_data->notify_read_fd;
173
- int write_fd = thread_data->notify_write_fd;
174
- thread_data->errno_on_write = errno;
175
- thread_data->notify_read_fd = -1;
176
- thread_data->notify_write_fd = -1;
177
- close(write_fd);
178
- close(read_fd);
179
- }
180
- }
181
-
182
- static void
183
- set_state_in_thread(gpointer data, G_GNUC_UNUSED gpointer user_data)
184
- {
185
- ThreadData *thread_data = (ThreadData *)data;
186
- SetStateData *set_state_data;
187
-
188
- set_state_data = &(thread_data->data.set_state_data);
189
- set_state_data->result = gst_element_set_state(thread_data->element,
190
- set_state_data->state);
191
- notify(thread_data);
192
- }
193
-
194
- static VALUE
195
- rb_gst_element_set_state_internal(VALUE self, GstState state)
196
- {
197
- VALUE result;
198
- ThreadData thread_data;
199
- SetStateData *set_state_data;
200
-
201
- thread_data.element = SELF(self);
202
- thread_data.context = "set_state";
203
- set_state_data = &(thread_data.data.set_state_data);
204
- set_state_data->state = state;
205
-
206
- do_in_thread(set_state_thread_pool, &thread_data);
207
-
208
- result = GST_STATE_CHANGE_RETURN2RVAL(set_state_data->result);
209
-
210
- return result;
211
- }
212
-
213
- /*
214
- * Method: set_state(state)
215
- * state: the state you want to set (see Gst::Element::State).
216
- *
217
- * Sets the state of the element.
218
- *
219
- * This method will try to set the requested state by going through all
220
- * the intermediary states and calling the class's state change function
221
- * for each.
222
- *
223
- * Returns: a code (see Gst::Element::StateChangeReturn).
224
- */
225
- static VALUE
226
- rg_set_state(VALUE self, VALUE state)
227
- {
228
- return rb_gst_element_set_state_internal(self,
229
- RVAL2GENUM(state, GST_TYPE_STATE));
230
- }
231
-
232
- static void
233
- get_state_in_thread(gpointer data, G_GNUC_UNUSED gpointer user_data)
234
- {
235
- ThreadData *thread_data = (ThreadData *)data;
236
- GetStateData *get_state_data;
237
-
238
- get_state_data = &(thread_data->data.get_state_data);
239
- get_state_data->result = gst_element_get_state(thread_data->element,
240
- &(get_state_data->state),
241
- &(get_state_data->pending),
242
- get_state_data->timeout);
243
- notify(thread_data);
244
- }
245
-
246
- /* Method: get_state(timeout=nil)
247
- */
248
- static VALUE
249
- rg_get_state(int argc, VALUE *argv, VALUE self)
250
- {
251
- VALUE result, timeout;
252
- ThreadData thread_data;
253
- GetStateData *get_state_data;
254
-
255
- rb_scan_args(argc, argv, "01", &timeout);
256
-
257
- thread_data.element = SELF(self);
258
- thread_data.context = "get_state";
259
- get_state_data = &(thread_data.data.get_state_data);
260
- if (NIL_P(timeout))
261
- get_state_data->timeout = GST_CLOCK_TIME_NONE;
262
- else
263
- get_state_data->timeout = NUM2ULL(timeout);
264
-
265
- do_in_thread(get_state_thread_pool, &thread_data);
266
-
267
- result = rb_ary_new3(3,
268
- GST_STATE_CHANGE_RETURN2RVAL(get_state_data->result),
269
- GST_STATE2RVAL(get_state_data->state),
270
- GST_STATE2RVAL(get_state_data->pending));
271
-
272
- return result;
273
- }
274
-
275
- /*
276
- * Method: stop
277
- *
278
- * This method calls Gst::Element#set_state with Gst::Element::STATE_NULL.
279
- *
280
- * Returns: a code (see Gst::Element::StateChangeReturn).
281
- */
282
- static VALUE
283
- rg_stop(VALUE self)
284
- {
285
- return rb_gst_element_set_state_internal(self, GST_STATE_NULL);
286
- }
287
-
288
- /*
289
- * Method: ready
290
- *
291
- * This method calls Gst::Element#set_state with Gst::Element::STATE_READY.
292
- *
293
- * Returns: a code (see Gst::Element::StateChangeReturn).
294
- */
295
- static VALUE
296
- rg_ready(VALUE self)
297
- {
298
- return rb_gst_element_set_state_internal(self, GST_STATE_READY);
299
- }
300
-
301
- /*
302
- * Method: pause
303
- *
304
- * This method calls Gst::Element#set_state with Gst::Element::STATE_PAUSED.
305
- *
306
- * Returns: a code (see Gst::Element::StateChangedReturn).
307
- */
308
- static VALUE
309
- rg_pause(VALUE self)
310
- {
311
- return rb_gst_element_set_state_internal(self, GST_STATE_PAUSED);
312
- }
313
-
314
- /*
315
- * Method: play
316
- *
317
- * This method calls Gst::Element#set_state with Gst::Element::STATE_PLAYING.
318
- *
319
- * Returns: a code (see Gst::Element::StateChangedReturn).
320
- */
321
- static VALUE
322
- rg_play(VALUE self)
323
- {
324
- return rb_gst_element_set_state_internal(self, GST_STATE_PLAYING);
325
- }
326
-
327
- /*
328
- * Method: link(element)
329
- * element: a Gst::Element object.
330
- *
331
- * Links this element (source) to the provided element (destination).
332
- *
333
- * The method looks for existing pads and request pads that
334
- * aren't linked yet. If multiple links are possible, only one
335
- * is established.
336
- *
337
- * Returns: the destination element, or nil if the link failed.
338
- */
339
- static VALUE
340
- rg_link(VALUE self, VALUE other_element)
341
- {
342
- GstElement *element1, *element2;
343
-
344
- element1 = SELF(self);
345
- element2 = SELF(other_element);
346
- return gst_element_link(element1, element2) == TRUE ? other_element : Qnil;
347
- }
348
-
349
- /*
350
- * Method: unlink(element)
351
- * element: a Gst::Element object.
352
- *
353
- * Unlinks this element (source) to the provided element (destination).
354
- *
355
- * The method looks for all source pads of the source elemnt that are
356
- * linked to the destination element and unlinkes them.
357
- *
358
- */
359
- static VALUE
360
- rg_unlink(VALUE self, VALUE other_element)
361
- {
362
- GstElement *element1, *element2;
363
-
364
- element1 = SELF(self);
365
- element2 = SELF(other_element);
366
- gst_element_unlink(element1, element2);
367
- return self;
368
- }
369
-
370
- /*
371
- * Method: link_filtered(element, caps)
372
- * element: a Gst::Element object.
373
- * caps: a Gst::Caps object.
374
- *
375
- * Links this element (source) to the provided element (destination),
376
- * filtered by the given caps.
377
- *
378
- * The method looks for existing pads and request pads that
379
- * aren't linked yet. If multiple links are possible, only one
380
- * is established.
381
- *
382
- * Returns: the destination element, or nil if the link failed.
383
- */
384
- static VALUE
385
- rg_link_filtered(VALUE self, VALUE other_element, VALUE rcaps)
386
- {
387
- GstElement *element1, *element2;
388
- GstCaps *caps;
389
-
390
- element1 = SELF(self);
391
- element2 = SELF(other_element);
392
- caps = RGST_CAPS(rcaps);
393
- return gst_element_link_filtered(element1, element2, caps)
394
- ? other_element
395
- : Qnil;
396
- }
397
-
398
- /* Method: requires_clock?
399
- * Returns: true if the element requires a clock, false otherwise.
400
- */
401
- static VALUE
402
- rg_requires_clock_p(VALUE self)
403
- {
404
- return CBOOL2RVAL(gst_element_requires_clock(SELF(self)));
405
- }
406
-
407
- /* Method: provides_clock?
408
- * Returns: true if the element provides a clock, false otherwise.
409
- */
410
- static VALUE
411
- rg_provides_clock_p(VALUE self)
412
- {
413
- return CBOOL2RVAL(gst_element_provides_clock(SELF(self)));
414
- }
415
-
416
- /* Method: clock
417
- * Returns: the clock of the element (as a Gst::Clock object), or nil
418
- * if this element does not provide a clock.
419
- */
420
- static VALUE
421
- rg_clock(VALUE self)
422
- {
423
- GstClock *clock;
424
-
425
- clock = gst_element_get_clock(SELF(self));
426
- return clock != NULL ? RGST_CLOCK_NEW(clock)
427
- : Qnil;
428
- }
429
-
430
- /*
431
- * Method: set_clock(clock)
432
- * clock: the Gst::Clock to set for the element.
433
- *
434
- * Sets the clock for the element.
435
- *
436
- * Returns: self.
437
- */
438
- static VALUE
439
- rg_set_clock(VALUE self, VALUE clock)
440
- {
441
- gst_element_set_clock(SELF(self), RVAL2GST_CLOCK(clock));
442
- return self;
443
- }
444
-
445
- typedef void (*EachPadCallback)(VALUE pad, VALUE user_data);
446
- typedef struct _EachPadData {
447
- VALUE self;
448
- EachPadCallback callback;
449
- VALUE user_data;
450
- GstIterator *iterator;
451
- } EachPadData;
452
-
453
- static VALUE
454
- rb_gst_element_each_pad_body(VALUE user_data)
455
- {
456
- GstPad *pad;
457
- gboolean done = FALSE;
458
- EachPadData *data;
459
-
460
- data = (EachPadData *)user_data;
461
-
462
- while (!done) {
463
- switch (gst_iterator_next(data->iterator, (gpointer)&pad)) {
464
- case GST_ITERATOR_OK:
465
- data->callback(GST_PAD2RVAL(pad), data->user_data);
466
- gst_object_unref(pad);
467
- break;
468
- case GST_ITERATOR_RESYNC:
469
- gst_iterator_resync(data->iterator);
470
- break;
471
- case GST_ITERATOR_ERROR:
472
- rb_raise(rb_eIndexError, "Pad iteration failed");
473
- break;
474
- case GST_ITERATOR_DONE:
475
- done = TRUE;
476
- break;
477
- }
478
- }
479
-
480
- return Qnil;
481
- }
482
-
483
- static VALUE
484
- rb_gst_element_each_pad_ensure(VALUE user_data)
485
- {
486
- EachPadData *data = (EachPadData *)user_data;
487
-
488
- gst_iterator_free(data->iterator);
489
- return Qnil;
490
- }
491
-
492
- static VALUE
493
- rb_gst_element_each_pad_with_callback(VALUE self,
494
- EachPadCallback callback,
495
- VALUE user_data)
496
- {
497
- EachPadData data;
498
-
499
- data.self = self;
500
- data.callback = callback;
501
- data.user_data = user_data;
502
- data.iterator = gst_element_iterate_pads(SELF(self));
503
- return rb_ensure(rb_gst_element_each_pad_body, (VALUE)(&data),
504
- rb_gst_element_each_pad_ensure, (VALUE)(&data));
505
- }
506
-
507
- /*
508
- * Method: each_pad { |pad| ... }
509
- *
510
- * Calls the block for each pad associated with the element, passing a
511
- * reference to the Gst::Pad as parameter. Throws an IndexError on errors.
512
- * Note that the elements might be yielded multiple times if the iterator had
513
- * to resync.
514
- *
515
- * Returns: always nil.
516
- */
517
- static VALUE
518
- rg_each_pad(VALUE self)
519
- {
520
- rb_gst_element_each_pad_with_callback(self, (EachPadCallback)rb_yield, Qnil);
521
- return Qnil;
522
- }
523
-
524
- static void
525
- collect_pad(VALUE pad, VALUE pads)
526
- {
527
- rb_ary_push(pads, pad);
528
- }
529
-
530
- static VALUE
531
- rg_pads(VALUE self)
532
- {
533
- VALUE pads;
534
-
535
- pads = rb_ary_new();
536
- rb_gst_element_each_pad_with_callback(self, collect_pad, pads);
537
- return pads;
538
- }
539
-
540
- /*
541
- * Method: get_pad(name)
542
- * name: the name of a pad.
543
- *
544
- * Retrieves a Gst::Pad object from the element by name.
545
- *
546
- * Returns: a Gst::Pad object, or nil if the pad cannot be found.
547
- */
548
- static VALUE
549
- rg_get_pad(VALUE self, VALUE pad_name)
550
- {
551
- GstPad *pad = gst_element_get_pad(SELF(self),
552
- RVAL2CSTR(pad_name));
553
-
554
- return pad != NULL ? RGST_PAD_NEW(pad)
555
- : Qnil;
556
- }
557
-
558
- /*
559
- * Method: link_pads(source_pad_name, element, destination_pad_name)
560
- * element: a Gst::Element.
561
- *
562
- * Links the source_pad_name pad of the current element to the
563
- * destination_pad_name pad of the destination element, returning
564
- * true on success.
565
- *
566
- * Returns: true on success, false on failure.
567
- */
568
- static VALUE
569
- rg_link_pads(VALUE self, VALUE source_pad_name,
570
- VALUE other_element, VALUE destination_pad_name)
571
- {
572
- return CBOOL2RVAL(gst_element_link_pads(SELF(self),
573
- RVAL2CSTR(source_pad_name),
574
- SELF(other_element),
575
- RVAL2CSTR(destination_pad_name)));
576
- }
577
-
578
- /*
579
- * Method: unlink_pads(source_pad_name, element, destination_pad_name)
580
- * element: a Gst::Element.
581
- *
582
- * Unlinks the source_pad_name named pad of the current element from the
583
- * destination_pad_name named pad of the destination element.
584
- *
585
- * Returns: self.
586
- */
587
- static VALUE
588
- rg_unlink_pads(VALUE self, VALUE source_pad_name,
589
- VALUE other_element, VALUE destination_pad_name)
590
- {
591
- gst_element_unlink_pads(SELF(self),
592
- RVAL2CSTR(source_pad_name),
593
- SELF(other_element),
594
- RVAL2CSTR(destination_pad_name));
595
- return self;
596
- }
597
-
598
- /* Method: indexable?
599
- * Returns: true if the element can be indexed, false otherwise.
600
- */
601
- static VALUE
602
- rg_indexable_p(VALUE self)
603
- {
604
- return CBOOL2RVAL(gst_element_is_indexable(SELF(self)));
605
- }
606
-
607
- static void
608
- query_in_thread(gpointer data, G_GNUC_UNUSED gpointer user_data)
609
- {
610
- ThreadData *thread_data = (ThreadData *)data;
611
- QueryData *query_data;
612
-
613
- query_data = &(thread_data->data.query_data);
614
- query_data->result = gst_element_query(thread_data->element,
615
- query_data->query);
616
- notify(thread_data);
617
- }
618
-
619
- /*
620
- * Method: query(query)
621
- * query: a query type (see Gst::Query).
622
- *
623
- * Performs a query on the element.
624
- *
625
- * Returns: true if the query is performed, false otherwise.
626
- */
627
- static VALUE
628
- rg_query(VALUE self, VALUE query)
629
- {
630
- VALUE result;
631
- ThreadData thread_data;
632
- QueryData *query_data;
633
-
634
- thread_data.element = SELF(self);
635
- thread_data.context = "query";
636
- query_data = &(thread_data.data.query_data);
637
- query_data->query = RVAL2GST_QUERY(query);
638
-
639
- do_in_thread(query_thread_pool, &thread_data);
640
-
641
- result = CBOOL2RVAL(query_data->result);
642
-
643
- return result;
644
- }
645
-
646
- static void
647
- send_event_in_thread(gpointer data, G_GNUC_UNUSED gpointer user_data)
648
- {
649
- ThreadData *thread_data = (ThreadData *)data;
650
- SendEventData *send_event_data;
651
-
652
- send_event_data = &(thread_data->data.send_event_data);
653
- send_event_data->result = gst_element_send_event(thread_data->element,
654
- send_event_data->event);
655
- notify(thread_data);
656
- }
657
- /*
658
- * Method: send_event(event)
659
- * event: a Gst::Event object.
660
- *
661
- * Sends an event to an element, through a Gst::Event object.
662
- * If the element doesn't implement an event handler, the event will be
663
- * forwarded to a random sink pad.
664
- *
665
- * Returns: true if the request event was successfully handled, false
666
- * otherwise.
667
- */
668
- static VALUE
669
- rg_send_event(VALUE self, VALUE event)
670
- {
671
- VALUE result;
672
- ThreadData thread_data;
673
- SendEventData *send_event_data;
674
-
675
- thread_data.element = SELF(self);
676
- thread_data.context = "send_event";
677
- send_event_data = &(thread_data.data.send_event_data);
678
- send_event_data->event = RVAL2GST_EVENT(event);
679
-
680
- gst_event_ref(send_event_data->event);
681
- do_in_thread(send_event_thread_pool, &thread_data);
682
-
683
- result = CBOOL2RVAL(send_event_data->result);
684
-
685
- return result;
686
- }
687
-
688
- /*
689
- * Method: base_time
690
- *
691
- * Queries the element's time.
692
- *
693
- * Returns: the current stream time (in nanoseconds) in Gst::Element::STATE_PLAYING, the
694
- * element base time in Gst::Element::STATE_PAUSED, or -1 otherwise.
695
- */
696
- static VALUE
697
- rg_base_time(VALUE self)
698
- {
699
- return ULL2NUM(gst_element_get_base_time(SELF(self)));
700
- }
701
-
702
- /*
703
- * Method: set_base_time(time)
704
- * time: time to set (in nanoseconds).
705
- *
706
- * Sets the current time of the element. This method can be used when handling discont events.
707
- * You can only call this method on an element with a clock in Gst::Element::STATE_PAUSED or
708
- * Gst::Element::STATE_PLAYING. You might want to have a look at Gst::Element#adjust_time, if
709
- * you want to adjust by a difference as that is more accurate.
710
- *
711
- * Returns: self.
712
- */
713
- static VALUE
714
- rg_set_base_time(VALUE self, VALUE time)
715
- {
716
- gst_element_set_base_time(SELF(self), NUM2ULL(time));
717
- return Qnil;
718
- }
719
-
720
- /*
721
- * Method: index
722
- *
723
- * Gets the index from the element.
724
- *
725
- * Returns: a Gst::Index or nil when no index was set on the element.
726
- */
727
- static VALUE
728
- rg_index(VALUE self)
729
- {
730
- GstIndex *index = gst_element_get_index(SELF(self));
731
-
732
- return index != NULL ? RGST_INDEX_NEW(index)
733
- : Qnil;
734
- }
735
-
736
- /*
737
- * Method: set_index(index)
738
- * index: the index to set, as a Gst::Index.
739
- *
740
- * Sets the specified index on the element.
741
- *
742
- * Returns: self.
743
- */
744
- static VALUE
745
- rg_set_index(VALUE self, VALUE index)
746
- {
747
- gst_element_set_index(SELF(self), RGST_INDEX(index));
748
- return self;
749
- }
750
-
751
- /*
752
- * Method: get_static_pad(name)
753
- * name: the name of the static Gst::Pad to retrieve.
754
- *
755
- * Retrieves a pad from the element by name. This version only retrieves
756
- * already existing (i.e. 'static') pads.
757
- *
758
- * Returns: the requested Gst::Pad if found, otherwise nil.
759
- */
760
- static VALUE
761
- rg_get_static_pad(VALUE self, VALUE name)
762
- {
763
- GstPad *pad =
764
- gst_element_get_static_pad(SELF(self), RVAL2CSTR(name));
765
- return pad != NULL ? RGST_PAD_NEW(pad) : Qnil;
766
- }
767
-
768
- /*
769
- * Method: get_request_pad(name)
770
- * name: the name of the request Gst::Pad to retrieve.
771
- *
772
- * Retrieves a pad from the element by name. This version only retrieves
773
- * request pads.
774
- *
775
- * Returns: the requested Gst::Pad if found, otherwise nil.
776
- */
777
- static VALUE
778
- rg_get_request_pad(VALUE self, VALUE name)
779
- {
780
- GstPad *pad =
781
- gst_element_get_request_pad(SELF(self), RVAL2CSTR(name));
782
- return pad != NULL ? GST_PAD2RVAL_UNREF(pad) : Qnil;
783
- }
784
-
785
- /*
786
- * Method: release_request_pad(pad)
787
- * pad: the Gst::Pad to release.
788
- *
789
- * Makes the element free the previously requested pad ass obtained with
790
- * Gst::Element#get_requested_pad.
791
- *
792
- * Returns: self.
793
- */
794
- static VALUE
795
- rg_release_request_pad(VALUE self, VALUE pad)
796
- {
797
- gst_element_release_request_pad(SELF(self), RGST_PAD(pad));
798
- return self;
799
- }
800
-
801
- /*
802
- * Method: add_pad(pad)
803
- * pad: the Gst::Pad to add to the element.
804
- *
805
- * Adds a pad (link point) to the element. Pads are automatically activated
806
- * when the element is in state Gst::Element::PLAYING.
807
- *
808
- * Returns: self.
809
- */
810
- static VALUE
811
- rg_add_pad(VALUE self, VALUE pad)
812
- {
813
- gst_element_add_pad(SELF(self), RGST_PAD(pad));
814
- G_CHILD_ADD(self, pad);
815
- return self;
816
- }
817
-
818
- /*
819
- * Method: remove_pad(pad)
820
- * pad: the Gst::Pad to remove from the element.
821
- *
822
- * Removes the given pad from the element.
823
- *
824
- * Returns: self.
825
- */
826
- static VALUE
827
- rg_remove_pad(VALUE self, VALUE pad)
828
- {
829
- gst_element_remove_pad(SELF(self), RGST_PAD(pad));
830
- return self;
831
- }
832
-
833
- /*
834
- * Class Method: get_pad_template(name)
835
- * name: the name of the Gst::PadTemplate to get.
836
- *
837
- * Retrieves a Gst::PadTemplate from this element with the given name.
838
- *
839
- * Returns: the Gst::PadTemplate with the given name, or nil if none was found.
840
- */
841
- static VALUE
842
- rg_s_get_pad_template(VALUE self, VALUE name)
843
- {
844
- GstElementClass *element_class;
845
- GstPadTemplate *template;
846
-
847
- element_class = g_type_class_peek(CLASS2GTYPE(self));
848
- template = gst_element_class_get_pad_template(element_class,
849
- RVAL2CSTR(name));
850
- return template == NULL ? Qnil : RGST_PAD_TEMPLATE_NEW(template);
851
- }
852
-
853
- /*
854
- * Class Method: pad_templates
855
- *
856
- * Retrieves a list of pad templates associated with the element.
857
- *
858
- * Returns: an Array of Gst::PadTemplate objects.
859
- */
860
- static VALUE
861
- rg_s_pad_templates(VALUE self)
862
- {
863
- GstElementClass *element_class;
864
- GList *list, *node;
865
- VALUE ary;
866
-
867
- ary = rb_ary_new();
868
-
869
- element_class = g_type_class_peek(CLASS2GTYPE(self));
870
- list = gst_element_class_get_pad_template_list(element_class);
871
- for (node = list; node != NULL; node = g_list_next(node)) {
872
- rb_ary_push(ary, RGST_PAD_TEMPLATE_NEW(node->data));
873
- }
874
- g_list_free(list);
875
- return ary;
876
- }
877
-
878
- /*
879
- * Class Method: each_pad_template { |pad_template| ... }
880
- *
881
- * Calls the block for each pad template associated with the element,
882
- * passing a reference to a Gst::PadTemplate object as parameter.
883
- *
884
- * Returns: always nil.
885
- */
886
- static VALUE
887
- rg_s_each_pad_template(VALUE self)
888
- {
889
- return rb_ary_yield(rg_s_pad_templates(self));
890
- }
891
-
892
- /*
893
- * Method: seek_simple(format, flags, position)
894
- * format: the format to use for seeking (see Gst::Format::Type).
895
- * flags: seek options (see Gst::Seek::FlAG_*)
896
- * position: the position to seek to.
897
- *
898
- * Sends a seek event (Gst::EventSseek) to the element.
899
- *
900
- * Returns: true if the event was handled.
901
- */
902
- static VALUE
903
- rg_seek_simple(VALUE self, VALUE format, VALUE flags, VALUE position)
904
- {
905
- return CBOOL2RVAL(gst_element_seek_simple(SELF(self),
906
- RVAL2GENUM(format, GST_TYPE_FORMAT),
907
- RVAL2GFLAGS(flags, GST_TYPE_SEEK_FLAGS),
908
- NUM2LL(position)));
909
- }
910
-
911
- /*
912
- * Method: seek(seek_type, offset)
913
- * seek_type: the method to use for seeking (see Gst::EventSeek::Type).
914
- * offset: the offset to seek to.
915
- *
916
- * Sends a seek event (Gst::EventSseek) to the element.
917
- *
918
- * Returns: true if the event was handled.
919
- */
920
- static VALUE
921
- rg_seek(VALUE self, VALUE rate, VALUE format, VALUE flags,
922
- VALUE cur_type, VALUE cur, VALUE stop_type, VALUE stop)
923
- {
924
- return CBOOL2RVAL(gst_element_seek(SELF(self),
925
- NUM2DBL(rate),
926
- RVAL2GENUM(format, GST_TYPE_FORMAT),
927
- RVAL2GFLAGS(flags, GST_TYPE_SEEK_FLAGS),
928
- RVAL2GENUM(cur_type, GST_TYPE_SEEK_TYPE),
929
- NUM2LL(cur),
930
- RVAL2GENUM(stop_type, GST_TYPE_SEEK_TYPE),
931
- NUM2LL(stop)));
932
- }
933
-
934
- /*
935
- * Method: locked_state?
936
- *
937
- * Checks if the state of an element is locked. If the state of an element is
938
- * locked, state changes of the parent don't affect the element. This way you
939
- * can leave currently unused elements inside bins. Just lock their state
940
- * before changing the state from Gst::Element::STATE_NULL.
941
- *
942
- * Returns: true if the element's state is locked.
943
- */
944
- static VALUE
945
- rg_locked_state_p(VALUE self)
946
- {
947
- return CBOOL2RVAL(gst_element_is_locked_state(SELF(self)));
948
- }
949
-
950
- /*
951
- * Method: set_locked_state(state)
952
- * state: whether to lock the element's state.
953
- *
954
- * Locks the state of an element, so state changes of the parent don't affect
955
- * this element anymore.
956
- *
957
- * Returns: self.
958
- */
959
- static VALUE
960
- rg_set_locked_state(VALUE self, VALUE state)
961
- {
962
- gst_element_set_locked_state(SELF(self), RVAL2CBOOL(state));
963
- return self;
964
- }
965
-
966
- /*
967
- * Method: sync_state_with_parent
968
- *
969
- * Tries to change the state of the element to the same as its parent. If this
970
- * method returns false, the state of element is undefined.
971
- *
972
- * Returns: true if the element's state could be synced to the parent's state.
973
- */
974
- static VALUE
975
- rg_sync_state_with_parent(VALUE self)
976
- {
977
- return
978
- CBOOL2RVAL(gst_element_sync_state_with_parent(SELF(self)));
979
- }
980
-
981
- /*
982
- * Method: no_more_pads
983
- *
984
- * Uses this method to signal that the element does not expect any more pads
985
- * to show up in the current pipeline. This method should be called whenever
986
- * pads have been added by the element itself.
987
- * Elements with Gst::Pad::SOMETIMES pad templates use this in combination
988
- * with autopluggers to figure out that the element is done initializing its
989
- * pads.
990
- *
991
- * Returns: self.
992
- */
993
- static VALUE
994
- rg_no_more_pads(VALUE self)
995
- {
996
- gst_element_no_more_pads(SELF(self));
997
- return self;
998
- }
999
-
1000
- static VALUE
1001
- rb_gst_element_found_tag_sig(G_GNUC_UNUSED guint n, const GValue *values)
1002
- {
1003
- GstElement *element, *source;
1004
- GstTagList *tag_list;
1005
-
1006
- element = g_value_get_object(&values[0]);
1007
- source = g_value_get_object(&values[1]);
1008
- tag_list = g_value_get_boxed(&values[2]);
1009
-
1010
- return rb_ary_new3(3,
1011
- GST_ELEMENT2RVAL(element),
1012
- GST_ELEMENT2RVAL(source),
1013
- GST_STRUCT2RVAL(tag_list));
1014
- }
1015
-
1016
- static void
1017
- initialize_thread_pool(GThreadPool **pool, GFunc function)
1018
- {
1019
- GError *error = NULL;
1020
-
1021
- *pool = g_thread_pool_new(function, NULL, -1, FALSE, &error);
1022
- if (error)
1023
- RAISE_GERROR(error);
1024
- }
1025
-
1026
- void
1027
- Init_gst_element(VALUE mGst)
1028
- {
1029
- RGConvertTable table;
1030
- memset(&table, 0, sizeof(table));
1031
- table.type = GST_TYPE_ELEMENT;
1032
- table.klass = Qnil;
1033
- table.instance2robj = instance2robj;
1034
- RG_DEF_CONVERSION(&table);
1035
-
1036
- id_gtype = rb_intern("gtype");
1037
-
1038
- initialize_thread_pool(&set_state_thread_pool, set_state_in_thread);
1039
- initialize_thread_pool(&get_state_thread_pool, get_state_in_thread);
1040
- initialize_thread_pool(&query_thread_pool, query_in_thread);
1041
- initialize_thread_pool(&send_event_thread_pool, send_event_in_thread);
1042
-
1043
- RG_TARGET_NAMESPACE = G_DEF_CLASS(GST_TYPE_ELEMENT, "Element", mGst);
1044
-
1045
- RG_DEF_SMETHOD(get_pad_template, 1);
1046
- RG_DEF_SMETHOD(pad_templates, 0);
1047
- RG_DEF_SMETHOD(each_pad_template, 0);
1048
-
1049
- RG_DEF_METHOD(set_state, 1);
1050
- RG_DEF_METHOD(get_state, -1);
1051
- RG_DEF_METHOD(stop, 0);
1052
- RG_DEF_METHOD(ready, 0);
1053
- RG_DEF_METHOD(pause, 0);
1054
- RG_DEF_METHOD(play, 0);
1055
- RG_DEF_METHOD(link, 1);
1056
- RG_DEF_ALIAS(">>", "link");
1057
- RG_DEF_METHOD(unlink, 1);
1058
- RG_DEF_METHOD(link_filtered, 2);
1059
- RG_DEF_METHOD_P(provides_clock, 0);
1060
- RG_DEF_ALIAS("provide_clock?", "provides_clock?");
1061
- RG_DEF_METHOD_P(requires_clock, 0);
1062
- RG_DEF_ALIAS("require_clock?", "requires_clock?");
1063
- RG_DEF_METHOD(clock, 0);
1064
- RG_DEF_METHOD(set_clock, 1);
1065
- RG_DEF_METHOD(base_time, 0);
1066
- RG_DEF_METHOD(set_base_time, 1);
1067
- RG_DEF_METHOD(each_pad, 0);
1068
- RG_DEF_METHOD(pads, 0);
1069
- RG_DEF_METHOD(get_pad, 1);
1070
- RG_DEF_ALIAS("[]", "get_pad");
1071
- RG_DEF_METHOD(get_static_pad, 1);
1072
- RG_DEF_METHOD(get_request_pad, 1);
1073
- RG_DEF_METHOD(release_request_pad, 1);
1074
- RG_DEF_METHOD(link_pads, 3);
1075
- RG_DEF_METHOD(unlink_pads, 3);
1076
- RG_DEF_METHOD(add_pad, 1);
1077
- RG_DEF_METHOD(remove_pad, 1);
1078
- RG_DEF_METHOD_P(indexable, 0);
1079
- RG_DEF_METHOD(query, 1);
1080
- RG_DEF_METHOD(send_event, 1);
1081
- RG_DEF_METHOD(seek_simple, 3);
1082
- RG_DEF_METHOD(seek, 7);
1083
- RG_DEF_METHOD(index, 0);
1084
- RG_DEF_METHOD(set_index, 1);
1085
- RG_DEF_METHOD_P(locked_state, 0);
1086
- RG_DEF_METHOD(set_locked_state, 1);
1087
- RG_DEF_METHOD(sync_state_with_parent, 0);
1088
- RG_DEF_METHOD(no_more_pads, 0);
1089
-
1090
- G_DEF_CLASS(GST_TYPE_STATE, "State", mGst);
1091
- G_DEF_CONSTANTS(mGst, GST_TYPE_STATE, "GST_");
1092
- G_DEF_CLASS(GST_TYPE_STATE_CHANGE_RETURN, "StateChangeReturn", mGst);
1093
- G_DEF_CONSTANTS(mGst, GST_TYPE_STATE_CHANGE_RETURN, "GST_");
1094
- G_DEF_CLASS(GST_TYPE_STATE_CHANGE, "StateChange", mGst);
1095
- G_DEF_CONSTANTS(mGst, GST_TYPE_STATE_CHANGE, "GST_");
1096
- G_DEF_CLASS(GST_TYPE_ELEMENT_FLAGS, "Flags", RG_TARGET_NAMESPACE);
1097
- G_DEF_CONSTANTS(RG_TARGET_NAMESPACE, GST_TYPE_ELEMENT_FLAGS, "GST_ELEMENT_");
1098
-
1099
- /*
1100
- * TODO:
1101
- * gst_element_clock_wait()
1102
- */
1103
-
1104
- G_DEF_SIGNAL_FUNC(RG_TARGET_NAMESPACE, "found-tag",
1105
- (GValToRValSignalFunc)rb_gst_element_found_tag_sig);
1106
- }