gstreamer 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -83,7 +83,7 @@ package = GNOME2Package.new do |_package|
83
83
  :name => "gstreamer",
84
84
  :download_base_url => "#{freedesktop_download_url_base}/gstreamer",
85
85
  :label => "GStreamer",
86
- :version => "1.0.6",
86
+ :version => "1.0.7",
87
87
  :compression_method => "xz",
88
88
  :windows => {
89
89
  :configure_args => [
@@ -97,7 +97,7 @@ package = GNOME2Package.new do |_package|
97
97
  :name => "gst-plugins-base",
98
98
  :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-base",
99
99
  :label => "GStreamer plugins (base)",
100
- :version => "1.0.6",
100
+ :version => "1.0.7",
101
101
  :compression_method => "xz",
102
102
  :windows => {
103
103
  :configure_args => [
@@ -110,7 +110,7 @@ package = GNOME2Package.new do |_package|
110
110
  :name => "gst-plugins-good",
111
111
  :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-good",
112
112
  :label => "GStreamer plugins (good)",
113
- :version => "1.0.6",
113
+ :version => "1.0.7",
114
114
  :compression_method => "xz",
115
115
  :windows => {
116
116
  :configure_args => [
@@ -122,7 +122,7 @@ package = GNOME2Package.new do |_package|
122
122
  :name => "gst-plugins-bad",
123
123
  :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-bad",
124
124
  :label => "GStreamer plugins (bad)",
125
- :version => "1.0.6",
125
+ :version => "1.0.7",
126
126
  :compression_method => "xz",
127
127
  :windows => {
128
128
  :configure_args => ["--disable-librfb"],
@@ -132,7 +132,7 @@ package = GNOME2Package.new do |_package|
132
132
  # :name => "gst-plugins-ugly",
133
133
  # :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-ugly",
134
134
  # :label => "GStreamer plugins (ugly)",
135
- # :version => "1.0.6",
135
+ # :version => "1.0.7",
136
136
  # :compression_method => "xz",
137
137
  # :windows => {
138
138
  # :configure_args => [],
@@ -142,7 +142,7 @@ package = GNOME2Package.new do |_package|
142
142
  :name => "gst-libav",
143
143
  :download_base_url => "#{freedesktop_download_url_base}/gst-libav",
144
144
  :label => "GStreamer libav",
145
- :version => "1.0.6",
145
+ :version => "1.0.7",
146
146
  :compression_method => "xz",
147
147
  :windows => {
148
148
  :configure_args => ["--with-libav-extra-configure=" +
@@ -25,24 +25,24 @@
25
25
  extern void Init_gstreamer (void);
26
26
 
27
27
  static gboolean
28
- rg_gst_bus_func_p(GIArgInfo *info)
28
+ name_equal(GIArgInfo *info, const gchar *target_name)
29
29
  {
30
30
  GITypeInfo type_info;
31
31
  GIBaseInfo *interface_info;
32
32
  const gchar *namespace;
33
33
  const gchar *name;
34
- gboolean gst_bus_func_p = FALSE;
34
+ gboolean equal_name_p = FALSE;
35
35
 
36
36
  g_arg_info_load_type(info, &type_info);
37
37
  interface_info = g_type_info_get_interface(&type_info);
38
38
  namespace = g_base_info_get_namespace(interface_info);
39
39
  name = g_base_info_get_name(interface_info);
40
- if (strcmp(namespace, "Gst") == 0 && strcmp(name, "BusFunc") == 0) {
41
- gst_bus_func_p = TRUE;
40
+ if (strcmp(namespace, "Gst") == 0 && strcmp(name, target_name) == 0) {
41
+ equal_name_p = TRUE;
42
42
  }
43
43
  g_base_info_unref(interface_info);
44
44
 
45
- return gst_bus_func_p;
45
+ return equal_name_p;
46
46
  }
47
47
 
48
48
  static gboolean
@@ -65,31 +65,38 @@ rg_gst_bus_func_callback(GstBus *bus, GstMessage *message, gpointer user_data)
65
65
  static gpointer
66
66
  rg_gst_bus_func_callback_finder(GIArgInfo *info)
67
67
  {
68
- if (!rg_gst_bus_func_p(info)) {
68
+ if (!name_equal(info, "BusFunc")) {
69
69
  return NULL;
70
70
  }
71
71
  return rg_gst_bus_func_callback;
72
72
  }
73
73
 
74
74
  static gboolean
75
- rg_gst_tag_foreach_func_p(GIArgInfo *info)
75
+ rg_gst_bus_sync_handler_callback(GstBus *bus, GstMessage *message,
76
+ gpointer user_data)
76
77
  {
77
- GITypeInfo type_info;
78
- GIBaseInfo *interface_info;
79
- const gchar *namespace;
80
- const gchar *name;
81
- gboolean gst_tag_foreach_func_p = FALSE;
78
+ RBGICallbackData *callback_data = user_data;
79
+ VALUE rb_bus_sync_reply;
80
+ ID id_call;
82
81
 
83
- g_arg_info_load_type(info, &type_info);
84
- interface_info = g_type_info_get_interface(&type_info);
85
- namespace = g_base_info_get_namespace(interface_info);
86
- name = g_base_info_get_name(interface_info);
87
- if (strcmp(namespace, "Gst") == 0 && strcmp(name, "TagForeachFunc") == 0) {
88
- gst_tag_foreach_func_p = TRUE;
82
+ CONST_ID(id_call, "call");
83
+ rb_bus_sync_reply =
84
+ rb_funcall(callback_data->rb_callback, id_call, 2,
85
+ GOBJ2RVAL(bus),
86
+ BOXED2RVAL(message, GST_MINI_OBJECT_TYPE(message)));
87
+ if (callback_data->metadata->scope_type == GI_SCOPE_TYPE_ASYNC) {
88
+ rb_gi_callback_data_free(callback_data);
89
89
  }
90
- g_base_info_unref(interface_info);
90
+ return RVAL2GENUM(rb_bus_sync_reply, GST_TYPE_BUS_SYNC_REPLY);
91
+ }
91
92
 
92
- return gst_tag_foreach_func_p;
93
+ static gpointer
94
+ rg_gst_bus_sync_handler_callback_finder(GIArgInfo *info)
95
+ {
96
+ if (!name_equal(info, "BusSyncHandler")) {
97
+ return NULL;
98
+ }
99
+ return rg_gst_bus_sync_handler_callback;
93
100
  }
94
101
 
95
102
  static void
@@ -101,7 +108,13 @@ rg_gst_tag_foreach_func_callback(const GstTagList *list, const gchar *tag,
101
108
 
102
109
  CONST_ID(id_call, "call");
103
110
  rb_funcall(callback_data->rb_callback, id_call, 2,
104
- BOXED2RVAL(list, GST_MINI_OBJECT_TYPE(list)),
111
+ /*
112
+ * XXX: Use gst_tag_list_copy() instead if we don't trust
113
+ * users. Users should not use destructive methods such as
114
+ * #insert. If many users use these methods, we shuold use
115
+ * gst_tag_list_copy().
116
+ */
117
+ BOXED2RVAL((GstTagList *)list, GST_MINI_OBJECT_TYPE(list)),
105
118
  CSTR2RVAL(tag));
106
119
  if (callback_data->metadata->scope_type == GI_SCOPE_TYPE_ASYNC) {
107
120
  rb_gi_callback_data_free(callback_data);
@@ -111,7 +124,7 @@ rg_gst_tag_foreach_func_callback(const GstTagList *list, const gchar *tag,
111
124
  static gpointer
112
125
  rg_gst_tag_foreach_func_callback_finder(GIArgInfo *info)
113
126
  {
114
- if (!rg_gst_tag_foreach_func_p(info)) {
127
+ if (!name_equal(info, "TagForeachFunc")) {
115
128
  return NULL;
116
129
  }
117
130
  return rg_gst_tag_foreach_func_callback;
@@ -121,5 +134,6 @@ void
121
134
  Init_gstreamer (void)
122
135
  {
123
136
  rb_gi_callback_register_finder(rg_gst_bus_func_callback_finder);
137
+ rb_gi_callback_register_finder(rg_gst_bus_sync_handler_callback_finder);
124
138
  rb_gi_callback_register_finder(rg_gst_tag_foreach_func_callback_finder);
125
139
  }
data/lib/gst.rb CHANGED
@@ -33,17 +33,28 @@ module Gst
33
33
  LOG_DOMAIN = "GStreamer"
34
34
  GLib::Log.set_log_domain(LOG_DOMAIN)
35
35
 
36
- @initialized = false
37
36
  class << self
37
+ def const_missing(name)
38
+ init()
39
+ if const_defined?(name)
40
+ const_get(name)
41
+ else
42
+ super
43
+ end
44
+ end
45
+
38
46
  def init(*argv)
39
- return if @initialized
40
- @initialized = true
41
47
  loader = Loader.new(self, argv)
42
48
  loader.load("Gst")
43
49
  require "gst/bin"
44
50
  require "gst/bus"
45
51
  require "gst/element"
46
52
  init_base
53
+ init_controller
54
+ class << self
55
+ remove_method(:init)
56
+ remove_method(:const_missing)
57
+ end
47
58
  end
48
59
 
49
60
  private
@@ -52,6 +63,12 @@ module Gst
52
63
  base_loader = BaseLoader.new(self)
53
64
  base_loader.load("GstBase")
54
65
  end
66
+
67
+ def init_controller
68
+ require "gst/controller_loader"
69
+ controller_loader = ControllerLoader.new(self)
70
+ controller_loader.load("GstController")
71
+ end
55
72
  end
56
73
 
57
74
  class Loader < GObjectIntrospection::Loader
@@ -63,8 +80,11 @@ module Gst
63
80
  private
64
81
  def pre_load(repository, namespace)
65
82
  init_check = repository.find(namespace, "init_check")
66
- succeeded, argc, argv, error = init_check.invoke(1 + @init_arguments.size,
67
- [$0] + @init_arguments)
83
+ arguments = [
84
+ 1 + @init_arguments.size,
85
+ [$0] + @init_arguments,
86
+ ]
87
+ succeeded, argc, argv, error = init_check.invoke(arguments)
68
88
  @init_arguments.replace(argv[1..-1])
69
89
  raise error unless succeeded
70
90
  end
@@ -97,5 +117,15 @@ module Gst
97
117
  def rubyish_method_name(function_info)
98
118
  RENAME_MAP[function_info.name] || super
99
119
  end
120
+
121
+ UNLOCK_GVL_METHODS = {
122
+ "Gst::Element#set_state" => true,
123
+ "Gst::Element#get_state" => true,
124
+ "Gst::Element#query_state" => true,
125
+ "Gst::Element#send_event" => true,
126
+ }
127
+ def should_unlock_gvl?(function_info, klass)
128
+ UNLOCK_GVL_METHODS["#{klass}\##{function_info.name}"] || super
129
+ end
100
130
  end
101
131
  end
@@ -20,5 +20,21 @@ module Gst
20
20
  def add_watch(priority=GLib::PRIORITY_DEFAULT, &block)
21
21
  add_watch_full(priority, &block)
22
22
  end
23
+
24
+ def sync_handler(&block)
25
+ @sync_handler = lambda do |bus, message|
26
+ begin
27
+ block.call(bus, message)
28
+ rescue Exception
29
+ $stderr.puts("An exception is raised in " +
30
+ "#{self.class}\##{__method__} callback: #{block}")
31
+ $stderr.puts("#{$!.class}: #{$!.message}")
32
+ $stderr.puts($@)
33
+ BusSyncReply::DROP
34
+ end
35
+ end
36
+ set_sync_handler(&@sync_handler)
37
+ end
38
+ private :set_sync_handler
23
39
  end
24
40
  end
@@ -0,0 +1,20 @@
1
+ # Copyright (C) 2013 Ruby-GNOME2 Project Team
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ module Gst
18
+ class ControllerLoader < GObjectIntrospection::Loader
19
+ end
20
+ end
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # audio-example.rb
5
+ #
6
+ # Builds a pipeline with [ audiotestsource ! autoaudiosink ] and sweeps
7
+ # frequency and volume.
8
+ #
9
+ # Needs gst-plugin-base + gst-plugins-good installed.
10
+ #
11
+ # This sample code is a port of
12
+ # gstreamer/tests/examples/controller/audio-example.c. It is licensed
13
+ # under the terms of the GNU Library General Public License, version
14
+ # 2 or (at your option) later.
15
+ #
16
+ # Copyright (C) 2013 Ruby-GNOME2 Project Team
17
+ #
18
+ # This library is free software; you can redistribute it and/or
19
+ # modify it under the terms of the GNU Lesser General Public
20
+ # License as published by the Free Software Foundation; either
21
+ # version 2.1 of the License, or (at your option) any later version.
22
+ #
23
+ # This library is distributed in the hope that it will be useful,
24
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26
+ # Lesser General Public License for more details.
27
+ #
28
+ # You should have received a copy of the GNU Lesser General Public
29
+ # License along with this library; if not, write to the Free Software
30
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31
+
32
+ require "gst"
33
+
34
+ bin = Gst::Pipeline.new("pipeline")
35
+ clock = bin.clock
36
+ src = Gst::ElementFactory.make("audiotestsrc", nil)
37
+ raise "need audiotestsrc from gst-plugins-base" if src.nil?
38
+ sink = Gst::ElementFactory.make("autoaudiosink", nil)
39
+ raise "need autoaudiosink from gst-plugins-good" if sink.nil?
40
+
41
+ bin << src << sink
42
+ src >> sink
43
+
44
+ # setup control sources
45
+ cs1 = Gst::InterpolationControlSource.new
46
+ cs2 = Gst::InterpolationControlSource.new
47
+
48
+ src.add_control_binding(Gst::DirectControlBinding.new(src, "volume", cs1))
49
+ src.add_control_binding(Gst::DirectControlBinding.new(src, "freq", cs2))
50
+
51
+ # set interpolation mode
52
+ cs1.mode = Gst::InterpolationMode::LINEAR
53
+ cs2.mode = Gst::InterpolationMode::LINEAR
54
+
55
+ # set control values
56
+ cs1.set(0 * Gst::SECOND, 0.0)
57
+ cs1.set(5 * Gst::SECOND, 1.0)
58
+
59
+ cs2.set(0 * Gst::SECOND, 220.0 / 20000.0)
60
+ cs2.set(3 * Gst::SECOND, 3520.0 / 20000.0)
61
+ cs2.set(6 * Gst::SECOND, 440.0 / 20000.0)
62
+
63
+ # run for 7 seconds
64
+ clock_id = clock.new_single_shot_id(clock.time + (7 * Gst::SECOND))
65
+ bin.play
66
+ wait_ret, jitter = Gst::Clock.id_wait(clock_id)
67
+ $stderr.puts "Clock::id_wait returned: #{wait_ret}" if wait_ret != Gst::ClockReturn::OK
68
+ bin.stop
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # This sample code is a port of
5
+ # gstreamer/tests/examples/stepping/framestep1.c. It is licensed
6
+ # under the terms of the GNU Library General Public License, version
7
+ # 2 or (at your option) later.
8
+ #
9
+ # Copyright (C) 2013 Ruby-GNOME2 Project Team
10
+ #
11
+ # This library is free software; you can redistribute it and/or
12
+ # modify it under the terms of the GNU Lesser General Public
13
+ # License as published by the Free Software Foundation; either
14
+ # version 2.1 of the License, or (at your option) any later version.
15
+ #
16
+ # This library is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19
+ # Lesser General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU Lesser General Public
22
+ # License along with this library; if not, write to the Free Software
23
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
+
25
+ require "gst"
26
+
27
+ def event_loop(pipe)
28
+ running = true
29
+
30
+ bus = pipe.bus
31
+
32
+ while running
33
+ message = bus.timed_pop_filtered(Gst::CLOCK_TIME_NONE, Gst::MessageType::ANY)
34
+ raise "message nil" if message.nil?
35
+
36
+ case message.type
37
+ when Gst::MessageType::EOS
38
+ puts "got EOS"
39
+ running = false
40
+ when Gst::MessageType::WARNING
41
+ warning, debug = message.parse_warning
42
+ puts "Debugging info: #{debug || 'none'}"
43
+ puts "Warning: #{warning.message}"
44
+ when Gst::MessageType::ERROR
45
+ error, debug = message.parse_error
46
+ puts "Debugging info: #{debug || 'none'}"
47
+ puts "Error: #{error.message}"
48
+ running = false
49
+ when Gst::MessageType::STEP_DONE
50
+ format, amount, rate, flush, intermediate, duration, eos =
51
+ message.parse_step_done
52
+ if format == Gst::Format::DEFAULT
53
+ puts "step done: #{gst_time(duration)} skipped in #{gst_time(amount)} frames"
54
+ else
55
+ puts "step done: #{gst_time(duration)} skipped"
56
+ end
57
+ running = false
58
+ end
59
+ end
60
+ end
61
+
62
+ def gst_time(time)
63
+ Time.at(time / 1000000000.0).utc.strftime("%H:%M:%S.%N")
64
+ end
65
+
66
+ # create a new bin to hold the elements
67
+ bin = Gst::Pipeline.new("pipeline")
68
+ raise "'pipeline' gstreamer plugin missing" if bin.nil?
69
+
70
+ # create a fake source
71
+ videotestsrc = Gst::ElementFactory.make("videotestsrc", "videotestsrc")
72
+ raise "'videotestsrc' gstreamer plugin missing" if videotestsrc.nil?
73
+ videotestsrc.num_buffers = 10
74
+
75
+ # and a fake sink
76
+ appsink = Gst::ElementFactory.make("appsink", "appsink")
77
+ raise "'appsink' gstreamer plugin missing" if appsink.nil?
78
+ appsink.emit_signals = true
79
+ appsink.sync = true
80
+ appsink.signal_connect("new-preroll") do |appsink|
81
+ # signalled when a new preroll buffer is available
82
+ sample = appsink.pull_preroll
83
+ puts "have new-preroll sample #{sample}, timestamp #{gst_time(sample.buffer.pts)}"
84
+ Gst::FlowReturn::OK
85
+ end
86
+
87
+ # add objects to the main pipeline
88
+ bin << videotestsrc << appsink
89
+
90
+ # link the elements
91
+ videotestsrc >> appsink
92
+
93
+ # go to the PAUSED state and wait for preroll
94
+ puts "prerolling first frame"
95
+ bin.pause
96
+ bin.get_state(Gst::CLOCK_TIME_NONE)
97
+
98
+ # step two frames, flush so that new preroll is queued
99
+ puts "stepping three frames"
100
+ unless bin.send_event(Gst::Event.new(Gst::Format::BUFFERS, 2, 1.0, true, false))
101
+ raise "Failed to send STEP event!"
102
+ end
103
+
104
+ # blocks and returns when we received the step done message
105
+ event_loop(bin)
106
+
107
+ # wait for step to really complete
108
+ bin.get_state(Gst::CLOCK_TIME_NONE)
109
+
110
+ result, pos = bin.query_position(Gst::Format::TIME)
111
+ puts "stepped two frames, now at #{gst_time(pos)}"
112
+
113
+ # step 3 frames, flush so that new preroll is queued
114
+ puts "stepping 120 milliseconds"
115
+ unless bin.send_event(Gst::Event.new(Gst::Format::TIME, 120 * Gst::MSECOND, 1.0,
116
+ true, false))
117
+ raise "Failed to send STEP event!"
118
+ end
119
+
120
+ # blocks and returns when we received the step done message
121
+ event_loop(bin)
122
+
123
+ # wait for step to really complete
124
+ bin.get_state(Gst::CLOCK_TIME_NONE)
125
+
126
+ result, pos = bin.query_position(Gst::Format::TIME)
127
+ puts "stepped 120ms frames, now at #{gst_time(pos)}"
128
+
129
+ puts "playing until EOS"
130
+ bin.play
131
+
132
+ # Run event loop listening for bus messages until EOS or ERROR
133
+ event_loop(bin)
134
+ puts "finished"
135
+
136
+ # stop the bin
137
+ bin.stop
@@ -28,8 +28,6 @@ if ARGV.length < 1
28
28
  exit(false)
29
29
  end
30
30
 
31
- Gst.init
32
-
33
31
  playbin = Gst::ElementFactory.make("playbin")
34
32
  if playbin.nil?
35
33
  puts "'playbin' gstreamer plugin missing"
@@ -48,8 +48,6 @@ def event_loop(pipe)
48
48
  end
49
49
  end
50
50
 
51
- Gst.init
52
-
53
51
  if ARGV.length < 1
54
52
  puts "usage: #{$0} <mp3 file>"
55
53
  exit(false)
@@ -34,7 +34,7 @@ def event_loop(pipe)
34
34
  running = true
35
35
  bus = pipe.bus
36
36
 
37
- while running do
37
+ while running
38
38
  message = bus.poll(Gst::MessageType::ANY, -1)
39
39
 
40
40
  case message.type
@@ -53,8 +53,6 @@ def event_loop(pipe)
53
53
  end
54
54
  end
55
55
 
56
- Gst.init
57
-
58
56
  if ARGV.length < 1
59
57
  puts "usage: #{$0} <filename>"
60
58
  exit(false)
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # This sample code is a port of
5
+ # gstreamer/tests/examples/streams/stream-status.c. It is licensed
6
+ # under the terms of the GNU Library General Public License, version
7
+ # 2 or (at your option) later.
8
+ #
9
+ # Copyright (C) 2013 Ruby-GNOME2 Project Team
10
+ #
11
+ # This library is free software; you can redistribute it and/or
12
+ # modify it under the terms of the GNU Lesser General Public
13
+ # License as published by the Free Software Foundation; either
14
+ # version 2.1 of the License, or (at your option) any later version.
15
+ #
16
+ # This library is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19
+ # Lesser General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU Lesser General Public
22
+ # License along with this library; if not, write to the Free Software
23
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
+
25
+ require "gst"
26
+
27
+ def event_loop(bus, pipe)
28
+
29
+ loop do
30
+ message = bus.poll(Gst::MessageType::ANY, Gst::CLOCK_TIME_NONE)
31
+ raise "message nil" if message.nil?
32
+
33
+ case message.type
34
+ when Gst::MessageType::EOS
35
+ puts "received EOS"
36
+ return
37
+ when Gst::MessageType::WARNING
38
+ warning, debug = message.parse_warning
39
+ puts "#{message} #{warning.message}"
40
+ when Gst::MessageType::ERROR
41
+ error, debug = message.parse_error
42
+ puts "#{message} #{error.message}"
43
+ return
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ # create a new bin to hold the elements
50
+ bin = Gst::Pipeline.new("pipeline")
51
+ raise "'pipeline' gstreamer plugin missing" if bin.nil?
52
+
53
+ # create a source
54
+ fakesrc = Gst::ElementFactory.make("fakesrc", "fakesrc")
55
+ raise "'fakesrc' gstreamer plugin missing" if fakesrc.nil?
56
+
57
+ # and a sink
58
+ fakesink = Gst::ElementFactory.make("fakesink", "fakesink")
59
+ raise "'fakesink' gstreamer plugin missing" if fakesink.nil?
60
+
61
+ # add objects to the main pipeline
62
+ bin << fakesrc << fakesink
63
+
64
+ # link the elements
65
+ fakesrc >> fakesink
66
+
67
+ # get the bus, we need to install a sync handler
68
+ bin.bus.sync_handler do |bus, message|
69
+
70
+ case message.type
71
+ when Gst::MessageType::STREAM_STATUS
72
+ type, owner = message.parse_stream_status
73
+
74
+ val = message.stream_status_object
75
+
76
+ puts "type: #{type}"
77
+ puts "source: #{message.src.path_string}"
78
+ puts "owner: #{owner.path_string}"
79
+ puts "object: type #{val.type.name}, value #{val.value}"
80
+
81
+ # see if we know how to deal with this object
82
+ if val.type == Gst::Task
83
+ task = val.value
84
+ end
85
+
86
+ case type
87
+ when Gst::StreamStatusType::CREATE
88
+ puts "created task #{task}"
89
+ when Gst::StreamStatusType::ENTER
90
+ # puts "raising task priority"
91
+ # setpriority(PRIO_PROCESS, 0, -10)
92
+ when Gst::StreamStatusType::LEAVE
93
+ end
94
+ end
95
+
96
+ Gst::BusSyncReply::PASS
97
+ end
98
+
99
+ # start playing
100
+ bin.play
101
+
102
+ # run event loop listening for bus messages until EOS or ERROR
103
+ event_loop(bus, bin)
104
+
105
+ # stop the bin
106
+ bin.stop
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # text-color-example.rb
5
+ #
6
+ # Builds a pipeline with [videotestsrc ! textoverlay ! ximagesink] and
7
+ # modulates color, text and text pos.
8
+ #
9
+ # Needs gst-plugin-base installed.
10
+ #
11
+ # This sample code is a port of
12
+ # gstreamer/tests/examples/controller/text-color-example.c. It is
13
+ # licensed under the terms of the GNU Library General Public License,
14
+ # version 2 or (at your option) later.
15
+ #
16
+ # Copyright (C) 2013 Ruby-GNOME2 Project Team
17
+ #
18
+ # This library is free software; you can redistribute it and/or
19
+ # modify it under the terms of the GNU Lesser General Public
20
+ # License as published by the Free Software Foundation; either
21
+ # version 2.1 of the License, or (at your option) any later version.
22
+ #
23
+ # This library is distributed in the hope that it will be useful,
24
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26
+ # Lesser General Public License for more details.
27
+ #
28
+ # You should have received a copy of the GNU Lesser General Public
29
+ # License along with this library; if not, write to the Free Software
30
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31
+
32
+ require "gst"
33
+
34
+ bin = Gst::Pipeline.new("pipeline")
35
+ clock = bin.clock
36
+ src = Gst::ElementFactory.make("videotestsrc", nil)
37
+ raise "need videotestsrc from gst-plugins-base" if src.nil?
38
+ src.pattern = 10 # checkers-8
39
+ text = Gst::ElementFactory.make("textoverlay", nil)
40
+ raise "need textoverlay from gst-plugins-base" if text.nil?
41
+ text.text = "GStreamer rocks!"
42
+ text.font_desc = "Sans, 30"
43
+ text.halignment = 4 # position
44
+ text.valignment = 3 # position
45
+ sink = Gst::ElementFactory.make("ximagesink", nil)
46
+ raise "need ximagesink from gst-plugins-base" if sink.nil?
47
+
48
+ bin << src << text << sink
49
+ src >> text >> sink
50
+
51
+ # setup control sources
52
+ cs = Gst::LFOControlSource.new
53
+ cs.frequency = 0.11
54
+ cs.amplitude = 0.2
55
+ cs.offset = 0.5
56
+ text.add_control_binding(Gst::DirectControlBinding.new(text, "xpos", cs))
57
+
58
+ cs = Gst::LFOControlSource.new
59
+ cs.frequency = 0.04
60
+ cs.amplitude = 0.4
61
+ cs.offset = 0.5
62
+ text.add_control_binding(Gst::DirectControlBinding.new(text, "ypos", cs))
63
+
64
+ cs_r = Gst::LFOControlSource.new
65
+ cs_r.frequency = 0.19
66
+ cs_r.amplitude = 0.5
67
+ cs_r.offset = 0.5
68
+ cs_g = Gst::LFOControlSource.new
69
+ cs_g.frequency = 0.27
70
+ cs_g.amplitude = 0.5
71
+ cs_g.offset = 0.5
72
+ cs_b = Gst::LFOControlSource.new
73
+ cs_b.frequency = 0.13
74
+ cs_b.amplitude = 0.5
75
+ cs_b.offset = 0.5
76
+ text.add_control_binding(Gst::ARGBControlBinding.new(text, "color", nil,
77
+ cs_r, cs_g, cs_b))
78
+
79
+ # run for 10 seconds
80
+ clock_id = clock.new_single_shot_id(clock.time + (30 * Gst::SECOND))
81
+ bin.play
82
+ wait_ret, jitter = Gst::Clock.id_wait(clock_id)
83
+ $stderr.puts "Clock.id_wait returned: #{wait_ret}" if wait_ret != Gst::ClockReturn::OK
84
+ bin.stop
@@ -53,8 +53,6 @@ def event_loop(pipe)
53
53
  end
54
54
  end
55
55
 
56
- Gst.init
57
-
58
56
  if ARGV.length < 1
59
57
  puts "usage: #{$0} <filename>"
60
58
  exit(false)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gstreamer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,40 +9,40 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-29 00:00:00.000000000 Z
12
+ date: 2013-05-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: glib2
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 2.0.0
21
+ version: 2.0.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 2.0.0
29
+ version: 2.0.1
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: gobject-introspection
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
- - - ! '>='
35
+ - - '='
36
36
  - !ruby/object:Gem::Version
37
- version: 2.0.0
37
+ version: 2.0.1
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ! '>='
43
+ - - '='
44
44
  - !ruby/object:Gem::Version
45
- version: 2.0.0
45
+ version: 2.0.1
46
46
  description: Ruby/GStreamer is a Ruby binding for GStreamer.
47
47
  email: ruby-gnome2-devel-en@lists.sourceforge.net
48
48
  executables: []
@@ -56,13 +56,18 @@ files:
56
56
  - lib/gst/base_loader.rb
57
57
  - lib/gst/bin.rb
58
58
  - lib/gst/bus.rb
59
+ - lib/gst/controller_loader.rb
59
60
  - lib/gst/element.rb
60
61
  - ext/gstreamer/depend
61
62
  - ext/gstreamer/extconf.rb
62
63
  - ext/gstreamer/rbgst.c
64
+ - sample/audio-example.rb
65
+ - sample/framestep1.rb
63
66
  - sample/helloworld.rb
64
67
  - sample/mp3parselaunch.rb
65
68
  - sample/queue.rb
69
+ - sample/stream-status.rb
70
+ - sample/text-color-example.rb
66
71
  - sample/typefind.rb
67
72
  homepage: http://ruby-gnome2.sourceforge.jp/
68
73
  licenses: []