dclext-anim 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.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in narray_miss.gemspec
4
+ gemspec
@@ -0,0 +1,34 @@
1
+ RubyDCLExt-Anim is copyrighted free software by Seiya Nishizawa and GFD
2
+ Dennou Club (http://www.gfd-dennou.org/).
3
+
4
+ Copyright 2001 (C) Seiya Nishizawa and GFD Dennou Club
5
+ (http://www.gfd-dennou.org/) All rights reserved.
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are
9
+ met:
10
+
11
+ 1. Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+
14
+ 2. Redistributions in binary form must reproduce the above copyright
15
+ notice, this list of conditions and the following disclaimer in
16
+ the documentation and/or other materials provided with the
17
+ distribution.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY GFD DENNOU CLUB AND CONTRIBUTORS ``AS IS''
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GFD DENNOU CLUB OR
23
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ The views and conclusions contained in the software and documentation
32
+ are those of the authors and should not be interpreted as representing
33
+ official policies, either expressed or implied, of Seiya Nishizawa
34
+ and GFD Dennou Club.
@@ -0,0 +1,56 @@
1
+ = What's RubyDCLExt-Anim
2
+
3
+ RubyDCLExt-Anim is an extension for RubyDCL
4
+ to output animation (movie) file.
5
+ Currently, output file is MP4 file formated and h264 encoded .
6
+
7
+
8
+ = RubyDCLExt-Anim home-page
9
+
10
+ The URL of the RubyDCLExt-Anim home-page is:
11
+ http://ruby.gfd-dennou.org/products/ruby-dclext-anim/
12
+
13
+
14
+ = Requires
15
+
16
+ * Ruby (http://www.ruby-lang.org/)
17
+ * RubyDCL (http://ruby.gfd-dennou.org/products/ruby-dcl/)
18
+ * Ruby-Gtk2 and Ruby-GStreamer (http://ruby-gnome2.sourceforge.jp/)
19
+ * gst-plugins-ugly (http://gstreamer.freedesktop.org/modules/gst-plugins-ugly.html)
20
+ * use x264enc element.
21
+
22
+
23
+ = Install
24
+
25
+ # gem install dclext-anim
26
+
27
+
28
+ = Copying
29
+
30
+ See the file LICENSE.txt.
31
+
32
+
33
+ = Usage
34
+
35
+ To output animation file, require "numru/dclext/anim"
36
+ % ruby -r numru/dclext/anim your_dcl_script.rb
37
+
38
+ == Options
39
+
40
+ You can change some parameters with environmental variable or runtime option.
41
+
42
+ * framerate: frame rate for the output movie (frame/sec)
43
+ * environmental variable: DCLEXT_ANIM_FRAMERATE=(int)
44
+ * runtime option: --dclext-anim-framerate=(int)
45
+
46
+ * filename: name of the output file
47
+ * environmental variable: DCLEXT_ANIM_FILENAME=(string)
48
+ * runtime option: --dclext-anim-filename=(string)
49
+
50
+
51
+ = The Author
52
+
53
+ Feel free to send comments and bug reports to the author.
54
+ The author's e-mail addess is
55
+
56
+ seiya@gfd-dennou.org
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.unshift File.expand_path("../lib", __FILE__)
3
+ require "numru/dclext/anim/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "dclext-anim"
7
+ s.version = NumRu::DCLExt::Anim::VERSION
8
+ s.authors = ["Seiya Nishizawa"]
9
+ s.email = ["seiya@gfd-dennou.org"]
10
+ s.homepage = "http://ruby.gfd-dennou.org/products/ruby-dclext-anim/"
11
+ s.summary = %q{Anim extension for RubyDCL}
12
+ s.description = %q{RubyDCLExt-Anim is an extension for RubyDCL to output animation (movie) file.
13
+ Currently, output file is MP4 file formated and h264 encoded .}
14
+
15
+ s.rubyforge_project = "dclext-anim"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ #s.extensions << "ext/extconf.rb"
22
+
23
+ # specify any dependencies here; for example:
24
+ #s.add_development_dependency "rspec"
25
+ #s.add_runtime_dependency "numru/dcl"
26
+ s.add_runtime_dependency "gtk2"
27
+ s.add_runtime_dependency "gst"
28
+ end
@@ -0,0 +1,8 @@
1
+ begin
2
+ require "rubygems"
3
+ rescue LoadError
4
+ end
5
+ require "numru/dcl"
6
+ require "numru/dclext/anim/version.rb"
7
+ require "numru/dclext/anim/anim.rb"
8
+ require "numru/dclext/anim/anim_dcl.rb"
@@ -0,0 +1,13 @@
1
+ module NumRu
2
+ module DCLExt
3
+ module Anim
4
+ PADDING = 4
5
+
6
+ module_function
7
+ def width; @width ||= NumRu::DCL.swiget("iwidth") - PADDING; end
8
+ def height; @height ||= NumRu::DCL.swiget("iheight") - PADDING; end
9
+
10
+ end # module Anim
11
+ end # module DCLExt
12
+
13
+ end # module NumRu
@@ -0,0 +1,70 @@
1
+ require "numru/dcl"
2
+
3
+
4
+ module NumRu
5
+ module DCL
6
+
7
+ alias :__gropn :gropn
8
+ def gropn(wsn)
9
+
10
+ pr, pw = IO.pipe
11
+
12
+ width = NumRu::DCLExt::Anim.width
13
+ height = NumRu::DCLExt::Anim.height
14
+
15
+ fork do
16
+
17
+ require "numru/dclext/anim/stream"
18
+
19
+ pw.close
20
+
21
+ stream = NumRu::DCLExt::Anim::Stream.new(pr)
22
+ stream.start
23
+
24
+ end # fork
25
+
26
+ require "gtk2"
27
+ require "numru/dclext/gtk"
28
+ require "numru/dclext/anim/source"
29
+
30
+ pr.close
31
+
32
+ Gtk.init
33
+
34
+ drw = Gtk::DrawingArea.new
35
+ drw.set_width_request NumRu::DCLExt::Anim.width
36
+ drw.set_height_request NumRu::DCLExt::Anim.height
37
+ drw.show
38
+
39
+ wnd = Gtk::Window.new
40
+ wnd.add drw
41
+ drw.realize
42
+
43
+ pixmap = Gdk::Pixmap.new(drw.window, width, height, -1)
44
+
45
+ NumRu::DCLExt.zgsdrw(drw)
46
+ NumRu::DCLExt.zgspmp(pixmap)
47
+
48
+ @source = NumRu::DCLExt::Anim::Source.new(pixmap, pw)
49
+
50
+ __gropn(4)
51
+ end # gropn
52
+ module_function :__gropn, :gropn
53
+
54
+ alias :__grfrm :grfrm
55
+ def grfrm
56
+ @source.new_frame
57
+ __grfrm
58
+ end
59
+ module_function :__grfrm, :grfrm
60
+
61
+ alias :__grcls :grcls
62
+ def grcls
63
+ @source.close
64
+ __grcls
65
+ end
66
+ module_function :__grcls, :grcls
67
+
68
+ end # module DCL
69
+
70
+ end # module NumRu
@@ -0,0 +1,39 @@
1
+ module NumRu
2
+ module DCLExt
3
+ module Anim
4
+
5
+ class Source
6
+
7
+ include Anim
8
+
9
+ def initialize(pixmap, pipe)
10
+ @pixmap = pixmap
11
+ @pipe = pipe
12
+ @first_frame = true
13
+ end
14
+
15
+ def new_frame
16
+ if @first_frame
17
+ @first_frame = false
18
+ else
19
+ put_data
20
+ end
21
+ end
22
+
23
+ def close
24
+ put_data unless @first_frame
25
+ @pipe.close
26
+ end
27
+
28
+
29
+ private
30
+ def put_data
31
+ pixbuf = Gdk::Pixbuf.from_drawable(nil, @pixmap, 0, 0, width, height)
32
+ @pipe.write pixbuf.pixels
33
+ end
34
+
35
+ end # class DCL
36
+
37
+ end # module Anim
38
+ end # module DCLExt
39
+ end # module NumRu
@@ -0,0 +1,131 @@
1
+ module NumRu
2
+ module DCLExt
3
+ module Anim
4
+
5
+ class Stream
6
+
7
+ include Anim
8
+
9
+ DEPTH = 24
10
+ BPP = 24
11
+
12
+ DEFAULT_FRAMERATE = 4
13
+ DEFAULT_FILENAME = "dcl.mp4"
14
+
15
+
16
+
17
+ attr_accessor :filename, :framerate
18
+ attr_reader :pipe
19
+ attr_reader :buffersize
20
+
21
+ def initialize(pipe)
22
+ @pipe = pipe
23
+ @buffersize = width * height * DEPTH
24
+ @num_frames = 0
25
+ @source_id = nil
26
+ ARGV.each do |arg|
27
+ case arg
28
+ when /\A--dclext-anim-framerate=/
29
+ @framerate = $'.to_i
30
+ when /\A--dclext-anim-filename=/
31
+ @filename = $'
32
+ end
33
+ end
34
+ @framerate ||= ((c=ENV["DCLEXT_ANIM_FRAMERATE"]) && c.to_i) || DEFAULT_FRAMERATE
35
+ @filename ||= ENV["DCLEXT_ANIM_FILENAME"] || DEFAULT_FILENAME
36
+ end
37
+
38
+ def start
39
+ require "gst"
40
+
41
+ Gst.init
42
+
43
+ loop = GLib::MainLoop.new(nil, false)
44
+
45
+ x264opts = "path=qual quantizer=18 qp-min=10 qp-max=25 me=umh subme=6 ref=3 threads=0 cabac=true dct8x8=false"
46
+ # x264opts = "bitrate=10000"
47
+ cmd = "appsrc min-latency=100000000 block=true name=dclsource caps=\"#{caps_str}\" ! queue ! ffmpegcolorspace ! video/x-raw-yuv,format=(fourcc)I420,width=#{width},height=#{height} ! videorate ! video/x-raw-yuv,framerate=#{@framerate}/1 ! queue ! x264enc #{x264opts} ! queue ! mp4mux ! filesink location=#{@filename}"
48
+
49
+ bin = Gst::Parse.launch(cmd)
50
+
51
+ appsrc = bin.get_child("dclsource")
52
+ appsrc.format = Gst::Format::TIME
53
+ appsrc.max_bytes = height*width*DEPTH*5
54
+
55
+ bus = bin.bus
56
+ bus.add_watch do |bus, message|
57
+ case message.type
58
+ when Gst::Message::EOS
59
+ loop.quit
60
+ when Gst::Message::ERROR
61
+ p message.parse
62
+ loop.quit
63
+ end
64
+ true
65
+ end
66
+
67
+ appsrc.signal_connect('need-data') do |elm, length|
68
+ start_feed(elm)
69
+ end
70
+ appsrc.signal_connect('enough-data') do |elm|
71
+ stop_feed
72
+ end
73
+
74
+ bin.play
75
+ begin
76
+ loop.run
77
+ rescue Interrupt
78
+ ensure
79
+ @pipe.close
80
+ bin.stop
81
+ end
82
+ end
83
+
84
+ def caps_str
85
+ "video/x-raw-rgb,width=(int)#{width},height=(int)#{height},depth=(int)#{DEPTH},bpp=(int)#{BPP},framerate=#{@framerate}/1,endianness=4321,red_mask=16711680,green_mask=65280,blue_mask=255"
86
+ end
87
+
88
+ def get_data
89
+ sleep(0.1)
90
+ @pipe.read(@buffersize/8)
91
+ end
92
+
93
+ def start_feed(appsrc)
94
+ unless @source_id
95
+ @source_id = GLib::Idle.add do
96
+ if data = get_data
97
+ buffer = Gst::Buffer.new(data.size*8)
98
+ buffer.caps = Gst::Caps.parse(caps_str)
99
+ buffer.duration = 10**9/@framerate
100
+ buffer.timestamp = buffer.duration * @num_frames
101
+ buffer.set_data(data)
102
+ # ret = appsrc.signal_emit("push-buffer", buffer)
103
+ ret = appsrc.push_buffer(buffer)
104
+ if ret.name == "GST_FLOW_OK"
105
+ @num_frames += 1
106
+ true
107
+ else
108
+ p ret.name
109
+ appsrc.end_of_stream
110
+ false
111
+ end
112
+ else
113
+ appsrc.end_of_stream
114
+ false
115
+ end
116
+ end
117
+ end
118
+ end
119
+ def stop_feed
120
+ if @source_id
121
+ GLib::Source.remove(@source_id)
122
+ @source_id = nil
123
+ end
124
+ end
125
+
126
+ end # class Stream
127
+
128
+ end # module Anim
129
+ end # module DCLExt
130
+
131
+ end # module NumRu
@@ -0,0 +1,7 @@
1
+ module NumRu
2
+ module DCLExt
3
+ module Anim
4
+ VERSION = "0.2.0"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "numru/dclext/anim"
3
+ include NumRu
4
+
5
+ N = 100
6
+ x = NArray.sfloat(N).indgen*Math::PI*2/N
7
+
8
+ width = 724
9
+ height = 484
10
+
11
+ DCL.gropn(4)
12
+
13
+ 100.times do |i|
14
+ DCL.grfrm
15
+ DCL.usgrph(x, NMath.sin(x + i*Math::PI/10))
16
+ DCL.uxsttl("t", "t=#{i}", 0)
17
+ end
18
+
19
+ DCL.grcls
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dclext-anim
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
+ platform: ruby
12
+ authors:
13
+ - Seiya Nishizawa
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-02-17 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: gtk2
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: gst
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ description: |-
49
+ RubyDCLExt-Anim is an extension for RubyDCL to output animation (movie) file.
50
+ Currently, output file is MP4 file formated and h264 encoded .
51
+ email:
52
+ - seiya@gfd-dennou.org
53
+ executables: []
54
+
55
+ extensions: []
56
+
57
+ extra_rdoc_files: []
58
+
59
+ files:
60
+ - Gemfile
61
+ - LICENSE.txt
62
+ - README.rdoc
63
+ - Rakefile
64
+ - dclext-anim.gemspec
65
+ - lib/numru/dclext/anim.rb
66
+ - lib/numru/dclext/anim/anim.rb
67
+ - lib/numru/dclext/anim/anim_dcl.rb
68
+ - lib/numru/dclext/anim/source.rb
69
+ - lib/numru/dclext/anim/stream.rb
70
+ - lib/numru/dclext/anim/version.rb
71
+ - sample/sample1.rb
72
+ homepage: http://ruby.gfd-dennou.org/products/ruby-dclext-anim/
73
+ licenses: []
74
+
75
+ post_install_message:
76
+ rdoc_options: []
77
+
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ hash: 3
95
+ segments:
96
+ - 0
97
+ version: "0"
98
+ requirements: []
99
+
100
+ rubyforge_project: dclext-anim
101
+ rubygems_version: 1.8.11
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: Anim extension for RubyDCL
105
+ test_files: []
106
+