hornetseye-qt4 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README.md +143 -2
  2. data/Rakefile +6 -7
  3. data/ext/init.cc +2 -2
  4. 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.1.1'
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.options << '--no-private'
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.9' ]
159
- s.add_dependency %<hornetseye-frame>, [ '~> 0.6' ]
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.9' ]
183
- s.add_dependency %<hornetseye-frame>, [ '~> 0.6' ]
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
- rb_require( "hornetseye_frame" );
35
- rb_require( "Qt4" );
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
- - 1
8
- - 1
9
- version: 0.1.1
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: 2010-12-21 00:00:00 +00:00
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
- - 9
59
- version: "0.9"
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
- - 6
73
- version: "0.6"
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/