clutter-gstreamer 2.2.4-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +70 -0
- data/lib/clutter-gst.rb +79 -0
- data/lib/clutter-gstreamer.rb +17 -0
- data/sample/media-actions-pause.png +0 -0
- data/sample/media-actions-start.png +0 -0
- data/sample/vid-panel.png +0 -0
- data/sample/video-player.rb +376 -0
- data/sample/video-sink-navigation.rb +98 -0
- data/sample/video-sink.rb +87 -0
- data/test/clutter-gstreamer-test-utils.rb +41 -0
- data/test/run-test.rb +63 -0
- data/test/test-clutter-gst.rb +26 -0
- data/vendor/local/bin/libclutter-gst-3.0-0.dll +0 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-aspectratio.h +105 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-camera-device.h +119 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-camera-manager.h +100 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-camera.h +206 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-content.h +107 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-crop.h +104 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-enum-types.h +23 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-playback.h +169 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-player.h +157 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-types.h +167 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-util.h +53 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-version.h +98 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst-video-sink.h +124 -0
- data/vendor/local/include/clutter-gst-3.0/clutter-gst/clutter-gst.h +47 -0
- data/vendor/local/lib/girepository-1.0/ClutterGst-3.0.typelib +0 -0
- data/vendor/local/lib/gstreamer-1.0/libgstclutter-3.0.dll +0 -0
- data/vendor/local/lib/gstreamer-1.0/libgstclutter-3.0.dll.a +0 -0
- data/vendor/local/lib/gstreamer-1.0/libgstclutter-3.0.la +41 -0
- data/vendor/local/lib/libclutter-gst-3.0.dll.a +0 -0
- data/vendor/local/lib/libclutter-gst-3.0.la +41 -0
- data/vendor/local/lib/pkgconfig/clutter-gst-3.0.pc +12 -0
- data/vendor/local/share/gir-1.0/ClutterGst-3.0.gir +3308 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ClutterGstAspectratio.html +171 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ClutterGstCamera.html +1528 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ClutterGstCameraDevice.html +418 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ClutterGstContent.html +551 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ClutterGstCrop.html +198 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ClutterGstPlayback.html +1559 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ClutterGstPlayer.html +805 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ch01.html +33 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ch02.html +42 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ch03.html +45 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ch04.html +35 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/ch05.html +39 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/clutter-gst-3.0.devhelp2 +197 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/clutter-gst-Utilities.html +316 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/clutter-gst-Versioning-Macros.html +176 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/clutter-gst-Video-Sink.html +560 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/home.png +0 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/index.html +98 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/index.sgml +273 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/left-insensitive.png +0 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/left.png +0 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/license.html +59 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/right-insensitive.png +0 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/right.png +0 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/style.css +476 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/up-insensitive.png +0 -0
- data/vendor/local/share/gtk-doc/html/clutter-gst-3.0/up.png +0 -0
- data/vendor/local/share/license/clutter-gst/AUTHORS +7 -0
- data/vendor/local/share/license/clutter-gst/COPYING +502 -0
- metadata +163 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: af35acf4d3bdf7e616a8dc976fdea51fa9d7294f
|
4
|
+
data.tar.gz: 0145ccee1811519fb0e2c8d68124c9f9f8ad58d8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0280c072735ad4c200d55f9a08041f635c2d0bf7f83706d70c869f72fa53f4ed50a5f03c1b5a1c7af3fd1821c971268c3cf47361430eb5901d408e2d59b5e1bf
|
7
|
+
data.tar.gz: fe245f4b4c32a7814289b682e5e7f3689e5207d51480fef1296830fb074667732dbb6d37c0110455ecd34344da172f728a8763b3324478c9e1cc6fa7e4b56a91
|
data/Rakefile
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013-2014 Ruby-GNOME2 Project Team
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
$LOAD_PATH.unshift("./../glib2/lib")
|
20
|
+
require "gnome2/rake/package-task"
|
21
|
+
|
22
|
+
package_task = GNOME2::Rake::PackageTask.new do |package|
|
23
|
+
package.summary = "Ruby/ClutterGStreamer is a Ruby binding of Clutter-GStreamer."
|
24
|
+
package.description = "Ruby/ClutterGStreamer is a Ruby binding of Clutter-GStreamer."
|
25
|
+
package.dependency.gem.runtime = ["gdk_pixbuf2", "clutter", "gstreamer"]
|
26
|
+
package.dependency.gem.development = ["test-unit-notify"]
|
27
|
+
package.windows.packages = []
|
28
|
+
package.windows.dependencies = []
|
29
|
+
package.windows.build_dependencies = [
|
30
|
+
"glib2",
|
31
|
+
"gdk_pixbuf2",
|
32
|
+
"atk",
|
33
|
+
"pango",
|
34
|
+
"gobject-introspection",
|
35
|
+
"clutter",
|
36
|
+
"gstreamer",
|
37
|
+
]
|
38
|
+
package.windows.gobject_introspection_dependencies = [
|
39
|
+
"atk",
|
40
|
+
"pango",
|
41
|
+
"gdk_pixbuf2",
|
42
|
+
"clutter",
|
43
|
+
"gstreamer",
|
44
|
+
]
|
45
|
+
package.external_packages = [
|
46
|
+
{
|
47
|
+
:name => "clutter-gst",
|
48
|
+
:download_site => :gnome,
|
49
|
+
:label => "Clutter-GStreamer",
|
50
|
+
:version => "3.0.0",
|
51
|
+
:compression_method => "xz",
|
52
|
+
:windows => {
|
53
|
+
:configure_args => [
|
54
|
+
"--enable-introspection",
|
55
|
+
],
|
56
|
+
:built_file => "bin/libclutter-gst-3.0-0.dll",
|
57
|
+
},
|
58
|
+
}
|
59
|
+
]
|
60
|
+
end
|
61
|
+
package_task.define
|
62
|
+
|
63
|
+
namespace :dependency do
|
64
|
+
desc "Install depenencies"
|
65
|
+
task :install do
|
66
|
+
# TODO: Install gir1.2-clutter-gst-1.0 on Debian.
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
task :build => "dependency:install"
|
data/lib/clutter-gst.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Copyright (C) 2013-2014 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
|
+
require "gdk_pixbuf2"
|
18
|
+
require "clutter"
|
19
|
+
require "gst"
|
20
|
+
|
21
|
+
base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
|
22
|
+
vendor_dir = base_dir + "vendor" + "local"
|
23
|
+
vendor_bin_dir = vendor_dir + "bin"
|
24
|
+
GLib.prepend_dll_path(vendor_bin_dir)
|
25
|
+
vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
|
26
|
+
GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
|
27
|
+
|
28
|
+
module ClutterGst
|
29
|
+
LOG_DOMAIN = "Clutter-GStreamer"
|
30
|
+
GLib::Log.set_log_domain(LOG_DOMAIN)
|
31
|
+
|
32
|
+
class << self
|
33
|
+
def const_missing(name)
|
34
|
+
init
|
35
|
+
if const_defined?(name)
|
36
|
+
const_get(name)
|
37
|
+
else
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def init(argv=[])
|
43
|
+
class << self
|
44
|
+
remove_method(:init)
|
45
|
+
remove_method(:const_missing)
|
46
|
+
end
|
47
|
+
Gst.init if Gst.respond_to?(:init)
|
48
|
+
Clutter.init if Clutter.respond_to?(:init)
|
49
|
+
loader = Loader.new(self, argv)
|
50
|
+
loader.load("ClutterGst")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Loader < GObjectIntrospection::Loader
|
55
|
+
class InitError < StandardError
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize(base_module, init_arguments)
|
59
|
+
super(base_module)
|
60
|
+
@init_arguments = init_arguments
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def pre_load(repository, namespace)
|
65
|
+
init = repository.find(namespace, "init")
|
66
|
+
arguments = [
|
67
|
+
[$0] + @init_arguments,
|
68
|
+
]
|
69
|
+
error, returned_arguments = init.invoke(:arguments => arguments)
|
70
|
+
@init_arguments.replace(returned_arguments[1..-1])
|
71
|
+
if error.to_i <= 0
|
72
|
+
raise InitError, "failed to initialize Clutter-GStreamer: #{error.name}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def post_load(repository, namespace)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Copyright (C) 2014 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
|
+
require "clutter-gst"
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,376 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This sample code is a port of clutter-gst/examples/video-player.c. The
|
4
|
+
# image files used in this sample code are copied from clutter-gst/examples.
|
5
|
+
# They are licensed under the terms of the GNU Lesser General Public
|
6
|
+
# License, version 2.1 or (at your option) later.
|
7
|
+
#
|
8
|
+
# The original header:
|
9
|
+
# video-player.c - A simple video player with an OSD.
|
10
|
+
#
|
11
|
+
# Copyright (C) 2007,2008 OpenedHand
|
12
|
+
# Copyright (C) 2013 Collabora
|
13
|
+
#
|
14
|
+
# Copyright (C) 2013-2014 Ruby-GNOME2 Project Team
|
15
|
+
#
|
16
|
+
# This library is free software; you can redistribute it and/or
|
17
|
+
# modify it under the terms of the GNU Lesser General Public
|
18
|
+
# License as published by the Free Software Foundation; either
|
19
|
+
# version 2.1 of the License, or (at your option) any later version.
|
20
|
+
#
|
21
|
+
# This library is distributed in the hope that it will be useful,
|
22
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
23
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
24
|
+
# Lesser General Public License for more details.
|
25
|
+
#
|
26
|
+
# You should have received a copy of the GNU Lesser General Public
|
27
|
+
# License along with this library; if not, write to the Free Software
|
28
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
29
|
+
|
30
|
+
require "optparse"
|
31
|
+
|
32
|
+
require "clutter-gst"
|
33
|
+
|
34
|
+
SEEK_H = 14
|
35
|
+
SEEK_W = 440
|
36
|
+
|
37
|
+
GST_PLAY_FLAG_VIS = (1 << 3)
|
38
|
+
|
39
|
+
class VideoApp
|
40
|
+
attr_accessor :stage
|
41
|
+
attr_accessor :vtexture
|
42
|
+
attr_accessor :control, :control_bg, :control_label
|
43
|
+
attr_accessor :control_play, :control_pause
|
44
|
+
attr_accessor :control_seek1, :control_seek2, :control_seekbar
|
45
|
+
attr_accessor :controls_showing, :paused, :mouse_in_window
|
46
|
+
attr_accessor :controls_timeout
|
47
|
+
def initialize
|
48
|
+
@controls_showing = false
|
49
|
+
@paused = false
|
50
|
+
@mouse_in_window = false
|
51
|
+
@controls_timeout = 0
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
opt_fullscreen = false
|
56
|
+
opt_loop = false
|
57
|
+
|
58
|
+
parser = OptionParser.new
|
59
|
+
parser.on("-f", "--[no-]fullscreen",
|
60
|
+
"Start the player in fullscreen",
|
61
|
+
"(#{opt_fullscreen})") do |boolean|
|
62
|
+
opt_fullscreen = boolean
|
63
|
+
end
|
64
|
+
parser.on("-l", "--[no-]loop",
|
65
|
+
"Start the video again once reached EOS",
|
66
|
+
"(#{opt_loop})") do |boolean|
|
67
|
+
opt_loop = boolean
|
68
|
+
end
|
69
|
+
parser.parse!
|
70
|
+
|
71
|
+
def controls_timeout_cb(app)
|
72
|
+
app.controls_timeout = 0
|
73
|
+
show_controls(app, false)
|
74
|
+
false
|
75
|
+
end
|
76
|
+
|
77
|
+
def actor_animate(actor, mode, duration, first_property, *args)
|
78
|
+
actor.save_easing_state
|
79
|
+
actor.easing_mode = mode
|
80
|
+
actor.easing_duration = duration
|
81
|
+
|
82
|
+
actor.set_property(first_property, args.first)
|
83
|
+
end
|
84
|
+
|
85
|
+
def show_controls(app, vis)
|
86
|
+
return if app.control.nil?
|
87
|
+
|
88
|
+
if vis == true && app.controls_showing == true
|
89
|
+
if app.controls_timeout == 0
|
90
|
+
app.controls_timeout = GLib::Timeout.add_seconds(5) do
|
91
|
+
controls_timeout_cb(app)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
return
|
95
|
+
end
|
96
|
+
|
97
|
+
if vis == true && app.controls_showing == false
|
98
|
+
app.controls_showing = true
|
99
|
+
app.stage.show_cursor
|
100
|
+
actor_animate(app.control, :ease_out_quint, 250, "opacity", 224)
|
101
|
+
return
|
102
|
+
end
|
103
|
+
|
104
|
+
if vis == false && app.controls_showing == true
|
105
|
+
app.controls_showing = false
|
106
|
+
if app.mouse_in_window
|
107
|
+
app.stage.hide_cursor
|
108
|
+
end
|
109
|
+
actor_animate(app.control, :ease_out_quint, 250, "opacity", 0)
|
110
|
+
return
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def toggle_pause_state(app)
|
115
|
+
return if app.vtexture.nil?
|
116
|
+
|
117
|
+
if app.paused
|
118
|
+
app.vtexture.playing = true
|
119
|
+
app.paused = false
|
120
|
+
app.control_play.hide
|
121
|
+
app.control_pause.show
|
122
|
+
else
|
123
|
+
app.vtexture.playing = false
|
124
|
+
app.paused = true
|
125
|
+
app.control_pause.hide
|
126
|
+
app.control_play.show
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def position_controls(app, controls)
|
131
|
+
stage_width, stage_height = app.stage.size
|
132
|
+
bg_width, bg_height = app.control.size
|
133
|
+
|
134
|
+
x = ((stage_width - bg_width) / 2).floor
|
135
|
+
y = stage_height - bg_height - 28
|
136
|
+
|
137
|
+
controls.set_position(x, y)
|
138
|
+
end
|
139
|
+
|
140
|
+
def new_rectangle_with_color(color)
|
141
|
+
actor = Clutter::Actor.new
|
142
|
+
actor.background_color = color
|
143
|
+
actor
|
144
|
+
end
|
145
|
+
|
146
|
+
stage_color = Clutter::Color.new(0, 0, 0, 0)
|
147
|
+
control_color1 = Clutter::Color.new(73, 74, 77, 0xee)
|
148
|
+
control_color2 = Clutter::Color.new(0xcc, 0xcc, 0xcc, 0xff)
|
149
|
+
|
150
|
+
if ARGV.length < 1
|
151
|
+
puts "Usage: #{$0} [OPTIONS] <video file> - A simple video player"
|
152
|
+
exit(false)
|
153
|
+
end
|
154
|
+
|
155
|
+
stage = Clutter::Stage.new
|
156
|
+
stage.background_color = Clutter::Color.new(0, 0, 0, 0)
|
157
|
+
stage.set_size(768, 576)
|
158
|
+
stage.set_minimum_size(640, 480)
|
159
|
+
stage.fullscreen = true if opt_fullscreen
|
160
|
+
|
161
|
+
app = VideoApp.new
|
162
|
+
app.stage = stage
|
163
|
+
app.vtexture = ClutterGst::VideoTexture.new
|
164
|
+
|
165
|
+
raise "failed to create vtexture" if app.vtexture.nil?
|
166
|
+
|
167
|
+
# By default ClutterGst seeks to the nearest key frame (faster). However
|
168
|
+
# it has the weird effect that when you click on the progress bar, the fill
|
169
|
+
# goes to the key frame position that can be quite far from where you
|
170
|
+
# clicked. Using the ACCURATE flag tells playbin2 to seek to the actual
|
171
|
+
# frame
|
172
|
+
app.vtexture.seek_flags = :accurate
|
173
|
+
|
174
|
+
app.vtexture.signal_connect("eos") do |media, app|
|
175
|
+
if opt_loop
|
176
|
+
media.progress = 0.0
|
177
|
+
media.playing = true
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
stage.signal_connect("allocation-changed") do |stage, box, flags|
|
182
|
+
position_controls(app, app.control)
|
183
|
+
show_controls(app, true)
|
184
|
+
end
|
185
|
+
|
186
|
+
stage.signal_connect("destroy") do
|
187
|
+
Clutter.main_quit
|
188
|
+
end
|
189
|
+
|
190
|
+
# Handle it ourselves so can scale up for fullscreen better
|
191
|
+
app.vtexture.signal_connect_after("size-change") do |texture, base_width, base_height|
|
192
|
+
stage_width, stage_height = stage.size
|
193
|
+
|
194
|
+
# base_width and base_height are the actual dimensions of the buffers before
|
195
|
+
# taking the pixel aspect ratio into account. We need to get the actual
|
196
|
+
# size of the texture to display
|
197
|
+
frame_width, frame_height = texture.size
|
198
|
+
|
199
|
+
new_height = (frame_height * stage_width) / frame_width
|
200
|
+
if new_height <= stage_height
|
201
|
+
new_width = stage_width
|
202
|
+
new_x = 0
|
203
|
+
new_y = (stage_height - new_height) / 2
|
204
|
+
else
|
205
|
+
new_width = (frame_width * stage_height) / frame_height
|
206
|
+
new_height = stage_height
|
207
|
+
new_x = (stage_width - new_width) / 2
|
208
|
+
new_y = 0
|
209
|
+
end
|
210
|
+
texture.set_position(new_x, new_y)
|
211
|
+
texture.set_size(new_width, new_height)
|
212
|
+
end
|
213
|
+
|
214
|
+
# Load up out video texture
|
215
|
+
app.vtexture.filename = ARGV[0]
|
216
|
+
|
217
|
+
# Set up things so that a visualisation is played if there's no video
|
218
|
+
pipe = app.vtexture.pipeline
|
219
|
+
raise "Unable to get gstreamer pipeline!" unless pipe
|
220
|
+
|
221
|
+
iter = pipe.iterate_sinks
|
222
|
+
raise "Unable to iterate over sinks!" unless iter
|
223
|
+
|
224
|
+
playsink = nil
|
225
|
+
while (value = iter.next)[0] == :ok
|
226
|
+
playsink = value[1].value
|
227
|
+
sink_name = playsink.name # unused
|
228
|
+
end
|
229
|
+
|
230
|
+
goomsource = Gst::ElementFactory.make("goom", "source")
|
231
|
+
raise "Unable to create goom visualiser!" unless goomsource
|
232
|
+
|
233
|
+
# TODO: warnings occurred
|
234
|
+
#playsink_flags = playsink.flags.value
|
235
|
+
#playsink_flags |= GST_PLAY_FLAG_VIS
|
236
|
+
playsink.vis_plugin = goomsource
|
237
|
+
#playsink.flags = playsink_flags
|
238
|
+
|
239
|
+
# Create the control UI
|
240
|
+
app.control = Clutter::Actor.new
|
241
|
+
|
242
|
+
app.control_bg = Clutter::Texture.new
|
243
|
+
app.control_bg.from_file = File.expand_path("vid-panel.png", File.dirname(__FILE__))
|
244
|
+
app.control_play = Clutter::Texture.new
|
245
|
+
app.control_play.from_file = File.expand_path("media-actions-start.png", File.dirname(__FILE__))
|
246
|
+
app.control_pause = Clutter::Texture.new
|
247
|
+
app.control_pause.from_file = File.expand_path("media-actions-pause.png", File.dirname(__FILE__))
|
248
|
+
|
249
|
+
app.control_seek1 = new_rectangle_with_color(control_color1)
|
250
|
+
app.control_seek2 = new_rectangle_with_color(control_color2)
|
251
|
+
app.control_seekbar = new_rectangle_with_color(control_color1)
|
252
|
+
app.control_seekbar.opacity = 0x99
|
253
|
+
|
254
|
+
app.control_label = Clutter::Text.new
|
255
|
+
app.control_label.font_name = "Sans Bold 14"
|
256
|
+
app.control_label.text = File.basename(ARGV[0])
|
257
|
+
stage.title = File.basename(ARGV[0]) # substitutes for label text
|
258
|
+
app.control_label.color = control_color1
|
259
|
+
|
260
|
+
app.control_play.hide
|
261
|
+
|
262
|
+
app.control.add_child(app.control_bg)
|
263
|
+
app.control.add_child(app.control_play)
|
264
|
+
app.control.add_child(app.control_pause)
|
265
|
+
app.control.add_child(app.control_seek1)
|
266
|
+
app.control.add_child(app.control_seek2)
|
267
|
+
app.control.add_child(app.control_seekbar)
|
268
|
+
app.control.add_child(app.control_label)
|
269
|
+
|
270
|
+
app.control.opacity = 0xee
|
271
|
+
|
272
|
+
app.control_play.set_position(22, 31)
|
273
|
+
app.control_pause.set_position(18, 31)
|
274
|
+
|
275
|
+
app.control_seek1.set_size(SEEK_W + 4, SEEK_H + 4)
|
276
|
+
app.control_seek1.set_position(80, 57)
|
277
|
+
app.control_seek2.set_size(SEEK_W, SEEK_H)
|
278
|
+
app.control_seek2.set_position(82, 59)
|
279
|
+
app.control_seekbar.set_size(0, SEEK_H)
|
280
|
+
app.control_seekbar.set_position(82, 59)
|
281
|
+
|
282
|
+
app.control_label.set_position(82, 29)
|
283
|
+
|
284
|
+
# Add control UI to stage
|
285
|
+
stage.add_child(app.vtexture)
|
286
|
+
stage.add_child(app.control)
|
287
|
+
|
288
|
+
position_controls(app, app.control)
|
289
|
+
|
290
|
+
stage.hide_cursor
|
291
|
+
actor_animate(app.control, :ease_out_quint, 1000, "opacity", 0)
|
292
|
+
|
293
|
+
# Hook up other events
|
294
|
+
stage.signal_connect("event") do |stage, event|
|
295
|
+
handled = false
|
296
|
+
|
297
|
+
case event.type
|
298
|
+
when Clutter::EventType::MOTION
|
299
|
+
show_controls(app, true)
|
300
|
+
handled = true
|
301
|
+
when Clutter::EventType::BUTTON_PRESS
|
302
|
+
if app.controls_showing
|
303
|
+
actor = stage.get_actor_at_pos(:all, event.x, event.y)
|
304
|
+
if actor == app.control_pause || actor == app.control_play
|
305
|
+
toggle_pause_state(app)
|
306
|
+
elsif actor == app.control_seek1 ||
|
307
|
+
actor == app.control_seek2 ||
|
308
|
+
actor == app.control_seekbar
|
309
|
+
x, y = app.control_seekbar.transformed_position
|
310
|
+
dist = event.x - x
|
311
|
+
def clamp(x, low, high)
|
312
|
+
if x > high
|
313
|
+
high
|
314
|
+
elsif x < low
|
315
|
+
low
|
316
|
+
else
|
317
|
+
x
|
318
|
+
end
|
319
|
+
end
|
320
|
+
dist = clamp(dist, 0, SEEK_W)
|
321
|
+
progress = 1.0 * dist / SEEK_W
|
322
|
+
app.vtexture.progress == progress
|
323
|
+
end
|
324
|
+
end
|
325
|
+
handled = true
|
326
|
+
when Clutter::EventType::KEY_PRESS
|
327
|
+
animation = nil
|
328
|
+
case event.key_symbol
|
329
|
+
when Clutter::Keys::KEY_d
|
330
|
+
if app.vtexture
|
331
|
+
app.stage.remove_child(app.vtexture)
|
332
|
+
app.vtexture = nil
|
333
|
+
end
|
334
|
+
if app.control
|
335
|
+
app.stage.remove_child(app.control)
|
336
|
+
app.control = nil
|
337
|
+
end
|
338
|
+
when Clutter::Keys::KEY_q, Clutter::Keys::KEY_Escape
|
339
|
+
app.stage.destroy
|
340
|
+
when Clutter::Keys::KEY_e
|
341
|
+
if app.vtexture
|
342
|
+
app.vtexture .set_pivot_point(0.5, 0)
|
343
|
+
animation = actor_animate(app.vtexture,
|
344
|
+
:linear, 500,
|
345
|
+
"rotation-angle-y", 360.0)
|
346
|
+
animation.signal_connect_after("transitions-completed") do
|
347
|
+
if app.vtexture
|
348
|
+
app.vtexture.set_rotation_angle(:y_axis, 0.0)
|
349
|
+
end
|
350
|
+
end
|
351
|
+
handled = true
|
352
|
+
end
|
353
|
+
else
|
354
|
+
toggle_pause_state(app)
|
355
|
+
handled = true
|
356
|
+
end
|
357
|
+
when Clutter::EventType::ENTER
|
358
|
+
app.mouse_in_window = true
|
359
|
+
app.stage.cursor_visible = app.controls_showing
|
360
|
+
when Clutter::EventType::LEAVE
|
361
|
+
app.mouse_in_window = false
|
362
|
+
app.stage.show_cursor
|
363
|
+
end
|
364
|
+
handled
|
365
|
+
end
|
366
|
+
|
367
|
+
app.vtexture.signal_connect("notify::progress") do |video_texture, pspec|
|
368
|
+
progress = video_texture.progress
|
369
|
+
app.control_seekbar.set_size(progress * SEEK_W, SEEK_H)
|
370
|
+
end
|
371
|
+
|
372
|
+
app.vtexture.playing = true
|
373
|
+
|
374
|
+
stage.show
|
375
|
+
|
376
|
+
Clutter.main
|