hornetseye-qt4 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +143 -2
- data/Rakefile +6 -7
- data/ext/init.cc +2 -2
- metadata +12 -12
data/README.md
CHANGED
@@ -1,4 +1,145 @@
|
|
1
1
|
hornetseye-qt4
|
2
|
-
|
3
|
-
This Ruby extension provides graphical output of images for Qt4.
|
2
|
+
==============
|
4
3
|
|
4
|
+
**Author**: Jan Wedekind
|
5
|
+
**Copyright**: 2010
|
6
|
+
**License**: GPL
|
7
|
+
|
8
|
+
Synopsis
|
9
|
+
--------
|
10
|
+
|
11
|
+
This Ruby extension implements a Qt4 widget (compatible with *qtruby4*) for hardware accelerated video output.
|
12
|
+
|
13
|
+
Installation
|
14
|
+
------------
|
15
|
+
|
16
|
+
This Ruby extension requires Qt4, QtRuby4 and the software scaling library. If you are running Debian or (K)ubuntu, you can install them like this:
|
17
|
+
|
18
|
+
$ sudo aptitude install libqt4-ruby1.8 qt4-dev-tools libswscale-dev
|
19
|
+
|
20
|
+
To install this Ruby extension, use the following command:
|
21
|
+
|
22
|
+
$ sudo gem install hornetseye-qt4
|
23
|
+
|
24
|
+
Alternatively you can build and install the Ruby extension from source as follows:
|
25
|
+
|
26
|
+
$ rake
|
27
|
+
$ sudo rake install
|
28
|
+
|
29
|
+
Usage
|
30
|
+
-----
|
31
|
+
|
32
|
+
Simply run Interactive Ruby:
|
33
|
+
|
34
|
+
$ irb
|
35
|
+
|
36
|
+
You can use {Hornetseye::XvWidget} as shown below. This example implements a video player with a minimalistic GUI.
|
37
|
+
|
38
|
+
require 'rubygems'
|
39
|
+
require 'hornetseye_ffmpeg'
|
40
|
+
require 'hornetseye_alsa'
|
41
|
+
require 'hornetseye_qt4'
|
42
|
+
require 'Qt4'
|
43
|
+
VIDEO = ARGV.first
|
44
|
+
class Win < Qt::Widget
|
45
|
+
slots 'seek(int)'
|
46
|
+
def initialize
|
47
|
+
super
|
48
|
+
@screen = Hornetseye::XvWidget.new self
|
49
|
+
@slider = Qt::Slider.new Qt::Horizontal
|
50
|
+
layout = Qt::VBoxLayout.new self
|
51
|
+
layout.addWidget @screen
|
52
|
+
layout.addWidget @slider
|
53
|
+
connect @slider, SIGNAL('valueChanged(int)'), self, SLOT('seek(int)')
|
54
|
+
@seeking = true
|
55
|
+
@video = nil
|
56
|
+
@timer = 0
|
57
|
+
start
|
58
|
+
@slider.tracking = false
|
59
|
+
@slider.minimum = 0
|
60
|
+
@slider.single_step = 60
|
61
|
+
@slider.page_step = 600
|
62
|
+
if @video.duration
|
63
|
+
@slider.maximum = @video.duration.to_i
|
64
|
+
else
|
65
|
+
@slider.maximum = ARGV[1] || 1
|
66
|
+
end
|
67
|
+
setWindowTitle 'XVideo'
|
68
|
+
end
|
69
|
+
def update_audio
|
70
|
+
@audio_frame = @video.read_audio unless @audio_frame
|
71
|
+
while @speaker.avail >= @audio_frame.shape[1]
|
72
|
+
@speaker.write @audio_frame
|
73
|
+
@audio_frame = @video.read_audio
|
74
|
+
end
|
75
|
+
end
|
76
|
+
def update_video
|
77
|
+
@screen.write @video.read_video
|
78
|
+
end
|
79
|
+
def timerEvent( e )
|
80
|
+
begin
|
81
|
+
update_audio
|
82
|
+
update_video
|
83
|
+
unless @slider.sliderDown
|
84
|
+
@seeking = false
|
85
|
+
p = @video.audio_pos.to_i
|
86
|
+
@slider.maximum = p if p > @slider.maximum
|
87
|
+
@slider.value = p
|
88
|
+
@seeking = true
|
89
|
+
end
|
90
|
+
t = @video.audio_pos - @speaker.delay.quo( @speaker.rate )
|
91
|
+
delay = [ 3.quo( 2 ) / @video.frame_rate,
|
92
|
+
[ @video.video_pos - t, 0 ].max ].min
|
93
|
+
killTimer @timer
|
94
|
+
@timer = startTimer( ( delay * 1000 ).to_i )
|
95
|
+
rescue Exception => e
|
96
|
+
p e
|
97
|
+
stop
|
98
|
+
end
|
99
|
+
end
|
100
|
+
def start
|
101
|
+
unless @video
|
102
|
+
stop
|
103
|
+
@video = Hornetseye::AVInput.new VIDEO
|
104
|
+
@audio_frame = nil
|
105
|
+
resize ( @video.width * @video.aspect_ratio ).to_i, @video.height
|
106
|
+
@speaker = Hornetseye::AlsaOutput.new 'default:0',
|
107
|
+
@video.sample_rate, @video.channels
|
108
|
+
@timer = startTimer 0
|
109
|
+
end
|
110
|
+
end
|
111
|
+
def stop
|
112
|
+
@audio_frame = nil
|
113
|
+
if @video
|
114
|
+
@video.close
|
115
|
+
@video = nil
|
116
|
+
end
|
117
|
+
if @speaker
|
118
|
+
@speaker.close
|
119
|
+
@speaker = nil
|
120
|
+
end
|
121
|
+
if @timer != 0
|
122
|
+
killTimer @timer
|
123
|
+
@timer = 0
|
124
|
+
@screen.clear
|
125
|
+
end
|
126
|
+
end
|
127
|
+
def seek( p )
|
128
|
+
if @seeking
|
129
|
+
begin
|
130
|
+
start
|
131
|
+
@audio_frame = nil
|
132
|
+
@video.pos = p
|
133
|
+
@speaker.drop
|
134
|
+
@speaker.prepare
|
135
|
+
rescue Exception => e
|
136
|
+
p e
|
137
|
+
stop
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
app = Qt::Application.new ARGV
|
143
|
+
Win.new.show
|
144
|
+
app.exec
|
145
|
+
|
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@ require 'rake/loaders/makefile'
|
|
7
7
|
require 'rbconfig'
|
8
8
|
|
9
9
|
PKG_NAME = 'hornetseye-qt4'
|
10
|
-
PKG_VERSION = '0.
|
10
|
+
PKG_VERSION = '0.2.0'
|
11
11
|
CFG = RbConfig::CONFIG
|
12
12
|
CXX = ENV[ 'CXX' ] || 'g++'
|
13
13
|
RB_FILES = FileList[ 'lib/**/*.rb' ]
|
@@ -120,8 +120,7 @@ end
|
|
120
120
|
begin
|
121
121
|
require 'yard'
|
122
122
|
YARD::Rake::YardocTask.new :yard do |y|
|
123
|
-
y.
|
124
|
-
y.files << FileList[ 'lib/**/*.rb' ]
|
123
|
+
y.files << RB_FILES
|
125
124
|
end
|
126
125
|
rescue LoadError
|
127
126
|
STDERR.puts 'Please install \'yard\' if you want to generate documentation'
|
@@ -155,8 +154,8 @@ begin
|
|
155
154
|
s.rdoc_options = %w{--no-private}
|
156
155
|
s.add_dependency %<qtruby4>, [ '~> 2.1' ]
|
157
156
|
s.add_dependency %<malloc>, [ '~> 1.1' ]
|
158
|
-
s.add_dependency %<multiarray>, [ '~> 0.
|
159
|
-
s.add_dependency %<hornetseye-frame>, [ '~> 0.
|
157
|
+
s.add_dependency %<multiarray>, [ '~> 0.23' ]
|
158
|
+
s.add_dependency %<hornetseye-frame>, [ '~> 0.11' ]
|
160
159
|
s.add_development_dependency %q{rake}
|
161
160
|
end
|
162
161
|
GEM_SOURCE = "#{PKG_NAME}-#{PKG_VERSION}.gem"
|
@@ -179,8 +178,8 @@ begin
|
|
179
178
|
s.rdoc_options = %w{--no-private}
|
180
179
|
s.add_dependency %<qtruby4>, [ '~> 2.1' ]
|
181
180
|
s.add_dependency %<malloc>, [ '~> 1.1' ]
|
182
|
-
s.add_dependency %<multiarray>, [ '~> 0.
|
183
|
-
s.add_dependency %<hornetseye-frame>, [ '~> 0.
|
181
|
+
s.add_dependency %<multiarray>, [ '~> 0.23' ]
|
182
|
+
s.add_dependency %<hornetseye-frame>, [ '~> 0.11' ]
|
184
183
|
end
|
185
184
|
GEM_BINARY = "#{PKG_NAME}-#{PKG_VERSION}-#{$BINSPEC.platform}.gem"
|
186
185
|
desc "Build the gem file #{GEM_SOURCE}"
|
data/ext/init.cc
CHANGED
@@ -31,8 +31,8 @@ extern "C" {
|
|
31
31
|
void Init_hornetseye_qt4(void)
|
32
32
|
{
|
33
33
|
// XInitThreads();
|
34
|
-
|
35
|
-
|
34
|
+
rb_eval_string("require 'hornetseye_frame'");
|
35
|
+
rb_eval_string("require 'Qt4'");
|
36
36
|
VALUE rbHornetseye = rb_define_module( "Hornetseye" );
|
37
37
|
VALUE rbQt = rb_define_module( "Qt" );
|
38
38
|
VALUE cWidget = rb_const_get( rbQt, rb_intern( "Widget" ) );
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jan Wedekind
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-06-29 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -55,8 +55,8 @@ dependencies:
|
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
segments:
|
57
57
|
- 0
|
58
|
-
-
|
59
|
-
version: "0.
|
58
|
+
- 23
|
59
|
+
version: "0.23"
|
60
60
|
type: :runtime
|
61
61
|
version_requirements: *id003
|
62
62
|
- !ruby/object:Gem::Dependency
|
@@ -69,8 +69,8 @@ dependencies:
|
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
segments:
|
71
71
|
- 0
|
72
|
-
-
|
73
|
-
version: "0.
|
72
|
+
- 11
|
73
|
+
version: "0.11"
|
74
74
|
type: :runtime
|
75
75
|
version_requirements: *id004
|
76
76
|
- !ruby/object:Gem::Dependency
|
@@ -99,16 +99,16 @@ files:
|
|
99
99
|
- README.md
|
100
100
|
- COPYING
|
101
101
|
- .document
|
102
|
-
- lib/hornetseye-qt4/xvwidget.rb
|
103
102
|
- lib/hornetseye_qt4_ext.rb
|
103
|
+
- lib/hornetseye-qt4/xvwidget.rb
|
104
104
|
- ext/init.cc
|
105
|
-
- ext/xvwidget.cc
|
106
105
|
- ext/frame.cc
|
106
|
+
- ext/xvwidget.cc
|
107
107
|
- ext/frame.hh
|
108
108
|
- ext/rubytools.hh
|
109
|
-
- ext/xvwidget.hh
|
110
|
-
- ext/rubyinc.hh
|
111
109
|
- ext/error.hh
|
110
|
+
- ext/rubyinc.hh
|
111
|
+
- ext/xvwidget.hh
|
112
112
|
- ext/rubytools.tcc
|
113
113
|
has_rdoc: yard
|
114
114
|
homepage: http://wedesoft.github.com/hornetseye-qt4/
|