tracksperanto 2.2.0 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +11 -0
- data/Rakefile +1 -1
- data/bin/tracksperanto +11 -7
- data/lib/export/pfmatchit.rb +12 -9
- data/lib/export/pftrack_5.rb +5 -0
- data/lib/import/base.rb +1 -1
- data/lib/import/flame_stabilizer.rb +4 -0
- data/lib/import/shake_script.rb +2 -2
- data/lib/pipeline/base.rb +50 -27
- data/lib/tracksperanto.rb +1 -1
- data/lib/tracksperanto/accumulator.rb +11 -7
- data/test/export/samples/ref_PFMatchit.2dt +54 -54
- data/test/export/test_pfmatchit_export.rb +2 -5
- data/test/test_cli.rb +1 -1
- data/test/test_pipeline.rb +6 -6
- data/test/test_progressive_io.rb +11 -2
- metadata +4 -4
data/History.txt
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
=== 2.2.2 / 2011-04-03
|
2
|
+
|
3
|
+
* The last change to PFMatchit exporter had adverse effects on pftrack files, now fixed.
|
4
|
+
* Pipeline now has it's own exceptions, all inheriting from RuntimeError
|
5
|
+
|
6
|
+
=== 2.2.1 / 2011-04-01
|
7
|
+
|
8
|
+
* April fool!
|
9
|
+
* PFMAtchit requires LF in it's files instead of CRLF, but our FPTrack exporter used CRLF. Now fixed.
|
10
|
+
* Changed PFMatchit exporter to export .txt files instead of .2dt
|
11
|
+
|
1
12
|
=== 2.2.0 / 2011-03-01
|
2
13
|
|
3
14
|
* Improve documentation substantially
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ begin
|
|
9
9
|
|
10
10
|
Hoe.spec('tracksperanto') do | p |
|
11
11
|
p.readme_file = 'README.rdoc'
|
12
|
-
p.extra_rdoc_files = FileList['*.rdoc']
|
12
|
+
p.extra_rdoc_files = FileList['*.rdoc'] + FileList['*.txt']
|
13
13
|
p.version = Tracksperanto::VERSION
|
14
14
|
|
15
15
|
p.extra_deps = {"progressbar" => ">=0"}
|
data/bin/tracksperanto
CHANGED
@@ -18,10 +18,10 @@ require "net/http"
|
|
18
18
|
require "open-uri"
|
19
19
|
require "timeout"
|
20
20
|
|
21
|
-
def version_check
|
21
|
+
def version_check(version_present)
|
22
22
|
begin
|
23
23
|
version_info = open("http://rubygems.org/api/v1/gems/tracksperanto.xml").string.scan(/<version>(.+)<\/version>/).to_s
|
24
|
-
int_available, int_present = [version_info,
|
24
|
+
int_available, int_present = [version_info, version_present].map{|v| v.scan(/(\d+)/).to_s.to_i }
|
25
25
|
if int_available > int_present
|
26
26
|
puts "Your version of Tracksperanto is probably out of date (the current version is #{version_info}, but you have #{Tracksperanto::VERSION})."
|
27
27
|
puts "Please consider updating (run 'gem update tracksperanto')"
|
@@ -30,8 +30,12 @@ def version_check
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
def disclaimer
|
34
|
+
"Please consider a small donation to keep Tracksperanto going. http://guerilla-di.org/source-and-license/\n"+
|
35
|
+
"For information and support please contact info#{64.chr}guerilla-di.org"
|
36
|
+
end
|
37
|
+
|
33
38
|
options = {}
|
34
|
-
$notice = "Please consider a small donation to keep Tracksperanto going. http://guerilla-di.org/source-and-license/"
|
35
39
|
$middlewares = []
|
36
40
|
writer_klass_name = nil
|
37
41
|
readers = Tracksperanto.importer_names
|
@@ -77,8 +81,7 @@ op.on("--flop", "Flop the comp vertically", &mw("Flop", :enabled, true))
|
|
77
81
|
op.on("--version", "Show the version and exit") do |v|
|
78
82
|
puts "Tracksperanto v.#{Tracksperanto::VERSION} running on Ruby #{RUBY_VERSION} on #{RUBY_PLATFORM}"
|
79
83
|
puts "Copyright 2008-#{Time.now.year} by Guerilla-DI (Julik Tarkhanov and contributors)"
|
80
|
-
puts
|
81
|
-
puts $notice
|
84
|
+
puts disclaimer
|
82
85
|
version_check()
|
83
86
|
exit(0)
|
84
87
|
end
|
@@ -107,5 +110,6 @@ pipe.exporters = [Tracksperanto.get_exporter(writer_klass_name)] if writer_klass
|
|
107
110
|
pipe.run(input_file, options)
|
108
111
|
pbar.finish
|
109
112
|
|
110
|
-
puts "Converted #{pipe.converted_points} trackers with #{pipe.converted_keyframes} keys.
|
111
|
-
|
113
|
+
puts "Converted #{pipe.converted_points} trackers with #{pipe.converted_keyframes} keys."
|
114
|
+
puts disclaimer
|
115
|
+
version_check(Tracksperanto::VERSION)
|
data/lib/export/pfmatchit.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
# Export for PFMatchit
|
2
2
|
class Tracksperanto::Export::PFMatchit < Tracksperanto::Export::Base
|
3
3
|
|
4
|
-
|
5
|
-
LINEBREAK = "\r\n"
|
6
|
-
KEYFRAME_TEMPLATE = "%s %.3f %.3f %.3f\r\n"
|
4
|
+
KEYFRAME_TEMPLATE = "%s %.3f %.3f %.3f"
|
7
5
|
|
8
6
|
def self.desc_and_extension
|
9
|
-
"pfmatchit.
|
7
|
+
"pfmatchit.txt"
|
10
8
|
end
|
11
9
|
|
12
10
|
def self.human_name
|
13
|
-
"PFMatchit
|
11
|
+
"PFMatchit user track export file (single camera)"
|
14
12
|
end
|
15
13
|
|
16
14
|
def start_tracker_segment(tracker_name)
|
@@ -22,13 +20,13 @@ class Tracksperanto::Export::PFMatchit < Tracksperanto::Export::Base
|
|
22
20
|
|
23
21
|
# TODO: currently exports to one camera
|
24
22
|
def end_tracker_segment
|
25
|
-
2.times { @io.write(
|
23
|
+
2.times { @io.write(linebreak) }
|
26
24
|
@io.write(@tracker_name.inspect) # autoquotes
|
27
|
-
@io.write
|
25
|
+
@io.write linebreak
|
28
26
|
@io.write camera_name # For primary/secondary cam in stereo pair
|
29
|
-
@io.write
|
27
|
+
@io.write linebreak
|
30
28
|
@io.write @frame_count
|
31
|
-
@io.write
|
29
|
+
@io.write linebreak
|
32
30
|
|
33
31
|
@tracker_io.rewind
|
34
32
|
@io.write(@tracker_io.read) until @tracker_io.eof?
|
@@ -39,10 +37,15 @@ class Tracksperanto::Export::PFMatchit < Tracksperanto::Export::Base
|
|
39
37
|
@frame_count += 1
|
40
38
|
line = KEYFRAME_TEMPLATE % [frame, abs_float_x, abs_float_y, float_residual / 8]
|
41
39
|
@tracker_io.write(line)
|
40
|
+
@tracker_io.write(linebreak)
|
42
41
|
end
|
43
42
|
|
44
43
|
private
|
45
44
|
|
45
|
+
def linebreak
|
46
|
+
"\n"
|
47
|
+
end
|
48
|
+
|
46
49
|
def camera_name
|
47
50
|
"1"
|
48
51
|
end
|
data/lib/export/pftrack_5.rb
CHANGED
data/lib/import/base.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# this class the inherited class will be included in the list of supported
|
3
3
|
# Tracksperanto importers. The API that an importer should present is very
|
4
4
|
# basic, and consists only of a few methods. The main method is
|
5
|
-
#
|
5
|
+
# `each`.
|
6
6
|
class Tracksperanto::Import::Base
|
7
7
|
include Enumerable
|
8
8
|
include Tracksperanto::Safety
|
@@ -14,6 +14,10 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
|
|
14
14
|
"Flame .stabilizer file"
|
15
15
|
end
|
16
16
|
|
17
|
+
class Key
|
18
|
+
attr_accessor :at, :value, :extrap, :interp, :left_tangent, :right_tangent
|
19
|
+
end
|
20
|
+
|
17
21
|
class ChannelBlock < Array
|
18
22
|
include ::Tracksperanto::Casts
|
19
23
|
cast_to_string :name
|
data/lib/import/shake_script.rb
CHANGED
@@ -13,13 +13,13 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
|
|
13
13
|
|
14
14
|
def each
|
15
15
|
progress_proc = lambda{|msg| report_progress(msg) }
|
16
|
-
|
16
|
+
TrackExtractor.new(@io, [Proc.new, progress_proc])
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
21
|
# Extractor. Here we define copies of Shake's standard node creation functions.
|
22
|
-
class
|
22
|
+
class TrackExtractor < Tracksperanto::ShakeGrammar::Catcher
|
23
23
|
include Tracksperanto::ZipTuples
|
24
24
|
|
25
25
|
# Normally, we wouldn't need to look for the variable name from inside of the funcall. However,
|
data/lib/pipeline/base.rb
CHANGED
@@ -1,17 +1,35 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
1
|
+
module Tracksperanto::Pipeline
|
2
|
+
|
3
|
+
class EmptySourceFileError < RuntimeError
|
4
|
+
def message; "This is an empty source file"; end
|
5
|
+
end
|
6
|
+
|
7
|
+
class UnknownFormatError < RuntimeError
|
8
|
+
def message; "Unknown input format"; end
|
9
|
+
end
|
10
|
+
|
11
|
+
class DimensionsRequiredError < RuntimeError
|
12
|
+
def message; "Width and height must be provided for this importer"; end
|
13
|
+
end
|
14
|
+
|
15
|
+
class NoTrackersRecoveredError < RuntimeError
|
16
|
+
def message; "Could not recover any non-empty trackers from this file. Wrong import format maybe?"; end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
# The base pipeline is the whole process of track conversion from start to finish. The pipeline object organizes the import formats, scans them,
|
21
|
+
# applies the middlewares. Here's how a calling sequence for a pipeline looks like:
|
22
|
+
#
|
23
|
+
# pipe = Tracksperanto::Pipeline::Base.new
|
24
|
+
# pipe.middleware_tuples = ["Golden", {:enabled => true}]
|
25
|
+
# pipe.progress_block = lambda{|percent, msg| puts("#{msg}..#{percent.to_i}%") }
|
26
|
+
# pipe.run("/tmp/shakescript.shk", :width => 720, :height => 576)
|
27
|
+
#
|
28
|
+
# The pipeline will also automatically allocate output files with the right extensions
|
29
|
+
# at the same place where the original file resides,
|
30
|
+
# and setup outputs for all supported export formats.
|
31
|
+
class Base
|
32
|
+
|
15
33
|
EXTENSION = /\.([^\.]+)$/ #:nodoc:
|
16
34
|
PERMITTED_OPTIONS = [:importer, :width, :height]
|
17
35
|
|
@@ -36,6 +54,12 @@ class Tracksperanto::Pipeline::Base
|
|
36
54
|
# Contains arrays of the form ["MiddewareName", {:param => value}]
|
37
55
|
attr_accessor :middleware_tuples
|
38
56
|
|
57
|
+
|
58
|
+
def initialize(*any)
|
59
|
+
super
|
60
|
+
@ios = []
|
61
|
+
end
|
62
|
+
|
39
63
|
def wrap_output_with_middlewares(output)
|
40
64
|
return output unless (middleware_tuples && middleware_tuples.any?)
|
41
65
|
|
@@ -57,7 +81,7 @@ class Tracksperanto::Pipeline::Base
|
|
57
81
|
importer = initialize_importer_with_path_and_options(from_input_file_path, passed_options)
|
58
82
|
|
59
83
|
# Check for empty files
|
60
|
-
raise
|
84
|
+
raise EmptySourceFileError if File.stat(from_input_file_path).size.zero?
|
61
85
|
|
62
86
|
# Open the file
|
63
87
|
read_data = File.open(from_input_file_path, "rb")
|
@@ -89,12 +113,12 @@ class Tracksperanto::Pipeline::Base
|
|
89
113
|
require_dimensions_in!(options)
|
90
114
|
d.importer_klass.new(:width => options[:width], :height => options[:height])
|
91
115
|
else
|
92
|
-
raise
|
116
|
+
raise UnknownFormatError
|
93
117
|
end
|
94
118
|
end
|
95
119
|
|
96
120
|
def require_dimensions_in!(opts)
|
97
|
-
raise
|
121
|
+
raise DimensionsRequiredError unless (opts[:width] && opts[:height])
|
98
122
|
end
|
99
123
|
|
100
124
|
# Runs the export and returns the number of points and keyframes processed.
|
@@ -114,22 +138,22 @@ class Tracksperanto::Pipeline::Base
|
|
114
138
|
io_with_progress = Tracksperanto::ProgressiveIO.new(tracker_data_io) do | offset, of_total |
|
115
139
|
percent_complete = (50.0 / of_total) * offset
|
116
140
|
end
|
117
|
-
@ios
|
141
|
+
@ios.push(io_with_progress)
|
118
142
|
|
119
143
|
@accumulator = Tracksperanto::Accumulator.new
|
120
|
-
importer.io = io_with_progress
|
121
|
-
importer.each {|t| @accumulator.push(t) }
|
122
144
|
|
123
|
-
# OBSOLETE - for this version we are going to permit it
|
145
|
+
# OBSOLETE - for this version we are going to permit it.
|
124
146
|
if importer.respond_to?(:stream_parse)
|
147
|
+
STDERR.puts "Import::Base#stream_parse(io) is obsolete, please rewrite your importer to use each instead"
|
125
148
|
importer.receiver = @accumulator
|
126
149
|
importer.stream_parse(io_with_progress)
|
150
|
+
else
|
151
|
+
importer.io = io_with_progress
|
152
|
+
importer.each {|t| @accumulator.push(t) }
|
127
153
|
end
|
128
154
|
|
129
155
|
report_progress(percent_complete = 50.0, "Validating #{@accumulator.size} imported trackers")
|
130
|
-
if @accumulator.size.zero?
|
131
|
-
raise "Could not recover any non-empty trackers from this file. Wrong import format maybe?"
|
132
|
-
end
|
156
|
+
raise NoTrackersRecoveredError if @accumulator.size.zero?
|
133
157
|
|
134
158
|
report_progress(percent_complete, "Starting export")
|
135
159
|
|
@@ -162,8 +186,7 @@ class Tracksperanto::Pipeline::Base
|
|
162
186
|
ensure
|
163
187
|
@accumulator.clear
|
164
188
|
@ios.map!{|e| e.close! rescue e.close }
|
165
|
-
@ios
|
166
|
-
@accumulator = nil
|
189
|
+
@ios.clear
|
167
190
|
end
|
168
191
|
|
169
192
|
# Setup output files and return a single output
|
@@ -181,7 +204,7 @@ class Tracksperanto::Pipeline::Base
|
|
181
204
|
|
182
205
|
# Open the file for writing and register it to be closed automatically
|
183
206
|
def open_owned_export_file(path_to_file)
|
184
|
-
@ios ||= []
|
185
207
|
@ios.push(File.open(path_to_file, "wb"))[-1]
|
186
208
|
end
|
209
|
+
end
|
187
210
|
end
|
data/lib/tracksperanto.rb
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
# An accumulator buffer for Ruby objects. Use it to sequentially store a shitload
|
2
2
|
# of objects on disk and then retreive them one by one. Make sure to call clear when done
|
3
|
-
# with it to discard the stored blob.
|
4
|
-
#
|
5
|
-
# This object is intended to be used as a Tracksperanto::Import::Base#receiver, but can be used
|
6
|
-
# in general like a disk-based object buffer.
|
3
|
+
# with it to discard the stored blob. It can be used like a disk-based object buffer.
|
4
|
+
# (Tracksperanto stores parsed trackers into it)
|
7
5
|
#
|
8
6
|
# a = Tracksperanto::Accumulator.new
|
9
7
|
# parse_big_file do | one_node |
|
10
8
|
# a.push(one_node)
|
11
9
|
# end
|
12
10
|
#
|
13
|
-
# a.size #=> 30932
|
11
|
+
# a.size #=> 30932 # We've stored 30 thousand objects on disk without breaking a sweat
|
14
12
|
# a.each do | node_read_from_disk |
|
15
|
-
# # do something with node
|
13
|
+
# # do something with node that has been recovered from disk
|
16
14
|
# end
|
17
15
|
#
|
18
16
|
# a.clear # ensure that the file is deleted
|
@@ -24,6 +22,7 @@ class Tracksperanto::Accumulator
|
|
24
22
|
|
25
23
|
def initialize
|
26
24
|
@store = Tracksperanto::BufferIO.new
|
25
|
+
|
27
26
|
@size = 0
|
28
27
|
@byte_size = 0
|
29
28
|
|
@@ -33,15 +32,19 @@ class Tracksperanto::Accumulator
|
|
33
32
|
# Store an object
|
34
33
|
def push(object_to_store)
|
35
34
|
@store.seek(@byte_size)
|
35
|
+
|
36
36
|
blob = marshal_object(object_to_store)
|
37
37
|
@store.write(blob)
|
38
38
|
@size += 1
|
39
39
|
@byte_size = @byte_size + blob.size
|
40
|
+
|
40
41
|
object_to_store
|
41
42
|
end
|
42
43
|
|
44
|
+
alias_method :<<, :push
|
45
|
+
|
43
46
|
# Retreive each stored object in succession. All other Enumerable
|
44
|
-
# methods are also available (but be careful with Enumerable#map)
|
47
|
+
# methods are also available (but be careful with Enumerable#map and to_a)
|
45
48
|
def each
|
46
49
|
@store.rewind
|
47
50
|
@size.times { yield(recover_object) }
|
@@ -51,6 +54,7 @@ class Tracksperanto::Accumulator
|
|
51
54
|
def clear
|
52
55
|
@store.close!
|
53
56
|
@size = 0
|
57
|
+
@offsets = []
|
54
58
|
end
|
55
59
|
|
56
60
|
private
|
@@ -1,54 +1,54 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
"Parabolic_1_from_top_left"
|
4
|
-
1
|
5
|
-
19
|
6
|
-
0 0.000 1080.000 0.000
|
7
|
-
1 96.000 874.800 0.006
|
8
|
-
2 192.000 691.200 0.012
|
9
|
-
3 288.000 529.200 0.018
|
10
|
-
4 384.000 388.800 0.024
|
11
|
-
5 480.000 270.000 0.030
|
12
|
-
6 576.000 172.800 0.036
|
13
|
-
7 672.000 97.200 0.042
|
14
|
-
8 768.000 43.200 0.048
|
15
|
-
9 864.000 10.800 0.054
|
16
|
-
12 1152.000 43.200 0.071
|
17
|
-
13 1248.000 97.200 0.077
|
18
|
-
14 1344.000 172.800 0.083
|
19
|
-
15 1440.000 270.000 0.089
|
20
|
-
16 1536.000 388.800 0.095
|
21
|
-
17 1632.000 529.200 0.101
|
22
|
-
18 1728.000 691.200 0.107
|
23
|
-
19 1824.000 874.800 0.113
|
24
|
-
20 1920.000 1080.000 0.119
|
25
|
-
|
26
|
-
|
27
|
-
"Parabolic_2_from_bottom_right"
|
28
|
-
1
|
29
|
-
19
|
30
|
-
0 1920.000 0.000 0.000
|
31
|
-
1 1824.000 205.200 0.006
|
32
|
-
2 1728.000 388.800 0.012
|
33
|
-
3 1632.000 550.800 0.018
|
34
|
-
4 1536.000 691.200 0.024
|
35
|
-
5 1440.000 810.000 0.030
|
36
|
-
6 1344.000 907.200 0.036
|
37
|
-
7 1248.000 982.800 0.042
|
38
|
-
8 1152.000 1036.800 0.048
|
39
|
-
9 1056.000 1069.200 0.054
|
40
|
-
12 768.000 1036.800 0.071
|
41
|
-
13 672.000 982.800 0.077
|
42
|
-
14 576.000 907.200 0.083
|
43
|
-
15 480.000 810.000 0.089
|
44
|
-
16 384.000 691.200 0.095
|
45
|
-
17 288.000 550.800 0.101
|
46
|
-
18 192.000 388.800 0.107
|
47
|
-
19 96.000 205.200 0.113
|
48
|
-
20 0.000 0.000 0.119
|
49
|
-
|
50
|
-
|
51
|
-
"SingleFrame"
|
52
|
-
1
|
53
|
-
1
|
54
|
-
0 970.000 550.000 0.000
|
1
|
+
|
2
|
+
|
3
|
+
"Parabolic_1_from_top_left"
|
4
|
+
1
|
5
|
+
19
|
6
|
+
0 0.000 1080.000 0.000
|
7
|
+
1 96.000 874.800 0.006
|
8
|
+
2 192.000 691.200 0.012
|
9
|
+
3 288.000 529.200 0.018
|
10
|
+
4 384.000 388.800 0.024
|
11
|
+
5 480.000 270.000 0.030
|
12
|
+
6 576.000 172.800 0.036
|
13
|
+
7 672.000 97.200 0.042
|
14
|
+
8 768.000 43.200 0.048
|
15
|
+
9 864.000 10.800 0.054
|
16
|
+
12 1152.000 43.200 0.071
|
17
|
+
13 1248.000 97.200 0.077
|
18
|
+
14 1344.000 172.800 0.083
|
19
|
+
15 1440.000 270.000 0.089
|
20
|
+
16 1536.000 388.800 0.095
|
21
|
+
17 1632.000 529.200 0.101
|
22
|
+
18 1728.000 691.200 0.107
|
23
|
+
19 1824.000 874.800 0.113
|
24
|
+
20 1920.000 1080.000 0.119
|
25
|
+
|
26
|
+
|
27
|
+
"Parabolic_2_from_bottom_right"
|
28
|
+
1
|
29
|
+
19
|
30
|
+
0 1920.000 0.000 0.000
|
31
|
+
1 1824.000 205.200 0.006
|
32
|
+
2 1728.000 388.800 0.012
|
33
|
+
3 1632.000 550.800 0.018
|
34
|
+
4 1536.000 691.200 0.024
|
35
|
+
5 1440.000 810.000 0.030
|
36
|
+
6 1344.000 907.200 0.036
|
37
|
+
7 1248.000 982.800 0.042
|
38
|
+
8 1152.000 1036.800 0.048
|
39
|
+
9 1056.000 1069.200 0.054
|
40
|
+
12 768.000 1036.800 0.071
|
41
|
+
13 672.000 982.800 0.077
|
42
|
+
14 576.000 907.200 0.083
|
43
|
+
15 480.000 810.000 0.089
|
44
|
+
16 384.000 691.200 0.095
|
45
|
+
17 288.000 550.800 0.101
|
46
|
+
18 192.000 388.800 0.107
|
47
|
+
19 96.000 205.200 0.113
|
48
|
+
20 0.000 0.000 0.119
|
49
|
+
|
50
|
+
|
51
|
+
"SingleFrame"
|
52
|
+
1
|
53
|
+
1
|
54
|
+
0 970.000 550.000 0.000
|
@@ -3,12 +3,9 @@ require File.expand_path(File.dirname(__FILE__)) + '/../helper'
|
|
3
3
|
class PFMatchitExportTest < Test::Unit::TestCase
|
4
4
|
include ParabolicTracks
|
5
5
|
|
6
|
-
def test_human_name
|
7
|
-
assert_equal "PFMatchit .2dt file (single camera)", Tracksperanto::Export::PFMatchit.human_name
|
8
|
-
end
|
9
|
-
|
10
6
|
def test_desc_and_ext
|
11
|
-
assert_equal "
|
7
|
+
assert_equal "PFMatchit user track export file (single camera)", Tracksperanto::Export::PFMatchit.human_name
|
8
|
+
assert_equal "pfmatchit.txt", Tracksperanto::Export::PFMatchit.desc_and_extension
|
12
9
|
end
|
13
10
|
|
14
11
|
P = File.dirname(__FILE__) + "/samples/ref_PFMatchit.2dt"
|
data/test/test_cli.rb
CHANGED
@@ -49,7 +49,7 @@ class CliTest < Test::Unit::TestCase
|
|
49
49
|
assert_equal 0, status, "Should exit with a normal status"
|
50
50
|
fs = %w(. ..
|
51
51
|
flm.stabilizer flm_3de_v3.txt flm_3de_v4.txt flm_boujou_text.txt flm_flame.stabilizer
|
52
|
-
flm_matchmover.rz2 flm_mayalive.txt flm_nuke.nk flm_pfmatchit.
|
52
|
+
flm_matchmover.rz2 flm_mayalive.txt flm_nuke.nk flm_pfmatchit.txt flm_pftrack_v4.2dt
|
53
53
|
flm_pftrack_v5.2dt flm_shake_trackers.txt flm_syntheyes_2dt.txt
|
54
54
|
)
|
55
55
|
|
data/test/test_pipeline.rb
CHANGED
@@ -47,7 +47,7 @@ class PipelineTest < Test::Unit::TestCase
|
|
47
47
|
empty_file_path = "./input_empty.stabilizer"
|
48
48
|
f = File.open(empty_file_path, "w"){|f| f.write('') }
|
49
49
|
pipeline = Tracksperanto::Pipeline::Base.new
|
50
|
-
assert_raise(
|
50
|
+
assert_raise(Tracksperanto::Pipeline::EmptySourceFileError) { pipeline.run(empty_file_path) }
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_middleware_initialization_from_tuples
|
@@ -72,7 +72,7 @@ class PipelineTest < Test::Unit::TestCase
|
|
72
72
|
def test_run_with_autodetected_importer_that_requires_size
|
73
73
|
FileUtils.cp("./import/samples/shake_script/four_tracks_in_one_stabilizer.shk", "./input.shk")
|
74
74
|
pipeline = Tracksperanto::Pipeline::Base.new
|
75
|
-
assert_raise(
|
75
|
+
assert_raise(Tracksperanto::Pipeline::DimensionsRequiredError) { pipeline.run("./input.shk") }
|
76
76
|
end
|
77
77
|
|
78
78
|
def test_run_with_autodetected_importer_that_requires_size_when_size_supplied
|
@@ -97,15 +97,15 @@ class PipelineTest < Test::Unit::TestCase
|
|
97
97
|
def test_run_with_unknown_format_raises
|
98
98
|
FileUtils.touch("./input.txt")
|
99
99
|
pipeline = Tracksperanto::Pipeline::Base.new
|
100
|
-
assert_raise(
|
101
|
-
assert_raise(
|
102
|
-
assert_raise(
|
100
|
+
assert_raise(Tracksperanto::Pipeline::UnknownFormatError) { pipeline.run("./input.txt") }
|
101
|
+
assert_raise(Tracksperanto::Pipeline::UnknownFormatError) { pipeline.run("./input.txt", :width => 100, :height => 100) }
|
102
|
+
assert_raise(Tracksperanto::Pipeline::DimensionsRequiredError) { pipeline.run("./input.txt", :importer => "Syntheyes") }
|
103
103
|
end
|
104
104
|
|
105
105
|
def test_run_with_overridden_importer_and_size
|
106
106
|
FileUtils.cp("./import/samples/3de_v4/3de_export_cube.txt", "./input.txt")
|
107
107
|
pipeline = Tracksperanto::Pipeline::Base.new
|
108
|
-
assert_raise(
|
108
|
+
assert_raise(Tracksperanto::Pipeline::DimensionsRequiredError) { pipeline.run("./input.txt", :importer => "Equalizer4") }
|
109
109
|
assert_nothing_raised { pipeline.run("./input.txt", :importer => "Equalizer4", :width => 720, :height => 576) }
|
110
110
|
end
|
111
111
|
|
data/test/test_progressive_io.rb
CHANGED
@@ -43,7 +43,11 @@ class TestProgressiveIO < Test::Unit::TestCase
|
|
43
43
|
io.progress_block = lambda do | offset, total |
|
44
44
|
assert_equal [1, 3], [offset, total]
|
45
45
|
end
|
46
|
-
|
46
|
+
if RUBY_VERSION < "1.9"
|
47
|
+
assert_equal 49, io.getc
|
48
|
+
else
|
49
|
+
assert_equal "1", io.getc
|
50
|
+
end
|
47
51
|
end
|
48
52
|
|
49
53
|
def test_gets
|
@@ -67,7 +71,12 @@ class TestProgressiveIO < Test::Unit::TestCase
|
|
67
71
|
io.progress_block = lambda do | offset, total |
|
68
72
|
assert_equal [1, 3], [offset, total]
|
69
73
|
end
|
70
|
-
|
74
|
+
|
75
|
+
if RUBY_VERSION < "1.9"
|
76
|
+
assert_equal 49, io.getc
|
77
|
+
else
|
78
|
+
assert_equal "1", io.getc
|
79
|
+
end
|
71
80
|
end
|
72
81
|
|
73
82
|
def test_readline
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tracksperanto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 2.2.
|
9
|
+
- 2
|
10
|
+
version: 2.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Julik Tarkhanov
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-02 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|