aviglitch 0.1.3 → 0.1.4
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/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/{ChangeLog → ChangeLog.md} +17 -7
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/README.md +45 -0
- data/Rakefile +6 -43
- data/aviglitch.gemspec +32 -0
- data/bin/datamosh +11 -3
- data/lib/aviglitch.rb +4 -5
- data/lib/aviglitch/base.rb +29 -16
- data/lib/aviglitch/frames.rb +30 -15
- data/spec/aviglitch_spec.rb +39 -3
- data/spec/frames_spec.rb +80 -3
- data/spec/spec_helper.rb +1 -1
- metadata +113 -40
- data/README.rdoc +0 -42
- data/VERSION +0 -1
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/{ChangeLog → ChangeLog.md}
RENAMED
@@ -1,32 +1,42 @@
|
|
1
|
-
|
1
|
+
### 0.1.4 / 2014-04-10
|
2
|
+
|
3
|
+
* Added an enumerator style on AviGlitch::Base#glitch and
|
4
|
+
AviGlitch::Frames#each
|
5
|
+
* Added AviGlitch::Base#remove_all_keyframes!
|
6
|
+
* Renamed #clear_keyframes! to #mutate_keyframes_into_deltaframes!
|
7
|
+
* Improved the processing speed in some measure.
|
8
|
+
* Some minor fixes.
|
9
|
+
|
10
|
+
### 0.1.3 / 2011-08-19
|
11
|
+
|
2
12
|
* Added has_keyframe? method to AviGlitch::Base
|
3
13
|
* Added a --fake option to datamosh cli.
|
4
14
|
|
5
|
-
|
15
|
+
### 0.1.2 / 2011-04-10
|
6
16
|
|
7
17
|
* Fix to be able to handle data with offsets from 0 of the file.
|
8
18
|
* Added clear_keyframes! method to AviGlitch::Frames and AviGlitch::Base.
|
9
19
|
* Changed to be able to access frame's meta data.
|
10
20
|
* Changed datamosh command to handle wildcard char.
|
11
21
|
|
12
|
-
|
22
|
+
### 0.1.1 / 2010-09-09
|
13
23
|
|
14
24
|
* Fixed a bug with windows.
|
15
25
|
* Some tiny fixes.
|
16
26
|
|
17
|
-
|
27
|
+
### 0.1.0 / 2010-07-09
|
18
28
|
|
19
29
|
* Minor version up.
|
20
30
|
* Fixed bugs with Ruby 1.8.7.
|
21
31
|
* Fixed the synchronization problem with datamosh cli.
|
22
32
|
|
23
|
-
|
33
|
+
### 0.0.3 / 2010-07-07
|
24
34
|
|
25
35
|
* Changed AviGlitch::Frames allowing to slice and concatenate frames
|
26
36
|
(like Array).
|
27
37
|
* Changed datamosh cli to accept multiple files.
|
28
38
|
|
29
|
-
|
39
|
+
### 0.0.2 / 2010-05-17
|
30
40
|
|
31
41
|
* Removed AviGlitch#new. Use AviGlitch#open instead of #new.
|
32
42
|
* Added warning for a large file.
|
@@ -34,7 +44,7 @@
|
|
34
44
|
* Changed the library file layout.
|
35
45
|
* And tiny internal changes.
|
36
46
|
|
37
|
-
|
47
|
+
### 0.0.1 / 2009-08-01
|
38
48
|
|
39
49
|
* initial release
|
40
50
|
|
data/Gemfile
ADDED
data/LICENSE
CHANGED
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# AviGlitch
|
2
|
+
[](https://travis-ci.org/ucnv/aviglitch)
|
3
|
+
|
4
|
+
AviGlitch destroys your AVI files.
|
5
|
+
|
6
|
+
I can't explain why they're going to destroy their own data, but they do.
|
7
|
+
|
8
|
+
You can find a short guide at <http://ucnv.github.com/aviglitch/>.
|
9
|
+
It provides a way to manipulate the data in each AVI frames.
|
10
|
+
It will mostly be used for making datamoshing videos.
|
11
|
+
It parses only container level structure, doesn't parse codecs.
|
12
|
+
|
13
|
+
See following urls for details about visual glitch;
|
14
|
+
|
15
|
+
* vimeo <http://www.vimeo.com/groups/artifacts>
|
16
|
+
* wikipedia <http://en.wikipedia.org/wiki/Compression_artifact>
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
require 'aviglitch'
|
22
|
+
|
23
|
+
avi = AviGlitch.open('/path/to/your.avi')
|
24
|
+
avi.glitch(:keyframe) do |data|
|
25
|
+
data.gsub(/\d/, '0')
|
26
|
+
end
|
27
|
+
avi.output('/path/to/broken.avi')
|
28
|
+
```
|
29
|
+
|
30
|
+
This library also includes a command line tool named `datamosh`.
|
31
|
+
It creates the keyframes removed video.
|
32
|
+
|
33
|
+
```sh
|
34
|
+
$ datamosh /path/to/your.avi -o /path/to/broken.avi
|
35
|
+
```
|
36
|
+
|
37
|
+
## Installation
|
38
|
+
|
39
|
+
```sh
|
40
|
+
gem install aviglitch
|
41
|
+
```
|
42
|
+
|
43
|
+
## Copyright
|
44
|
+
|
45
|
+
Copyright (c) 2009 - 2014 ucnv. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,50 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "aviglitch"
|
8
|
-
gem.summary = "A Ruby library to destroy your AVI files."
|
9
|
-
gem.email = "ucnvvv@gmail.com"
|
10
|
-
gem.homepage = "http://ucnv.github.com/aviglitch/"
|
11
|
-
gem.authors = ["ucnv"]
|
12
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
|
-
gem.files = %w(README.rdoc ChangeLog Rakefile VERSION) +
|
14
|
-
Dir.glob("{bin,spec,lib}/**/*")
|
15
|
-
gem.add_development_dependency "rspec", ">= 2.0.0"
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
rescue LoadError
|
20
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
21
|
-
end
|
22
|
-
|
23
|
-
require 'rspec/core/rake_task'
|
24
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
25
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
26
|
-
end
|
27
|
-
|
28
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
29
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
30
|
-
spec.rcov = true
|
31
|
-
end
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
32
3
|
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
33
5
|
|
34
6
|
task :default => :spec
|
35
7
|
|
36
|
-
require '
|
8
|
+
require 'rdoc/task'
|
37
9
|
Rake::RDocTask.new do |rdoc|
|
38
|
-
|
39
|
-
config = YAML.load(File.read('VERSION.yml'))
|
40
|
-
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
41
|
-
else
|
42
|
-
version = ""
|
43
|
-
end
|
44
|
-
|
10
|
+
rdoc.main = "README.md"
|
45
11
|
rdoc.rdoc_dir = 'rdoc'
|
46
|
-
rdoc.
|
47
|
-
rdoc.rdoc_files.include('README*')
|
48
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
12
|
+
rdoc.rdoc_files.include(%w{LICENSE *.md lib/**/*.rb})
|
49
13
|
end
|
50
|
-
|
data/aviglitch.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'aviglitch'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "aviglitch"
|
8
|
+
spec.version = AviGlitch::VERSION
|
9
|
+
spec.authors = ["ucnv"]
|
10
|
+
spec.email = ["ucnvvv@gmail.com"]
|
11
|
+
spec.description = %q{AviGlitch destroys your AVI files.
|
12
|
+
This library provides ways to manipulate data in each AVI frames.
|
13
|
+
It can easily generate keyframes-removed video known as "datamoshing".
|
14
|
+
}
|
15
|
+
spec.summary = %q{A Ruby library to destroy your AVI files.}
|
16
|
+
spec.homepage = "http://ucnv.github.com/aviglitch/"
|
17
|
+
spec.license = "MIT"
|
18
|
+
|
19
|
+
spec.files = `git ls-files`.split($/)
|
20
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.has_rdoc = true
|
25
|
+
spec.extra_rdoc_files = ["README.md", "LICENSE"]
|
26
|
+
spec.rdoc_options << "-m" << "README.md"
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
29
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
30
|
+
spec.add_development_dependency "rspec", "~> 2.0"
|
31
|
+
spec.add_development_dependency "rdoc", "~> 4.0"
|
32
|
+
end
|
data/bin/datamosh
CHANGED
@@ -34,10 +34,18 @@ opts = OptionParser.new do |opts|
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
input =
|
37
|
+
input = opts.parse!
|
38
38
|
if input.empty?
|
39
39
|
puts opts
|
40
40
|
exit 1
|
41
|
+
else
|
42
|
+
input.each do |file|
|
43
|
+
if !File.exist?(file) || File.directory?(file)
|
44
|
+
opts.banner = "#{file}: No such file.\n\n"
|
45
|
+
puts opts
|
46
|
+
exit 1
|
47
|
+
end
|
48
|
+
end
|
41
49
|
end
|
42
50
|
|
43
51
|
a = AviGlitch.open input.shift
|
@@ -46,7 +54,7 @@ unless fake
|
|
46
54
|
(!all && i == 0) ? frame : "" # keep the first frame
|
47
55
|
end
|
48
56
|
end
|
49
|
-
a.
|
57
|
+
a.mutate_keyframes_into_deltaframes!(!all && !fake ? 1..a.frames.size : nil)
|
50
58
|
|
51
59
|
input.each do |file|
|
52
60
|
b = AviGlitch.open file
|
@@ -55,7 +63,7 @@ input.each do |file|
|
|
55
63
|
""
|
56
64
|
end
|
57
65
|
end
|
58
|
-
b.
|
66
|
+
b.mutate_keyframes_into_deltaframes!
|
59
67
|
a.frames.concat b.frames
|
60
68
|
end
|
61
69
|
|
data/lib/aviglitch.rb
CHANGED
@@ -15,7 +15,7 @@ require 'aviglitch/tempfile'
|
|
15
15
|
# You can manipulate each frame, like:
|
16
16
|
#
|
17
17
|
# avi = AviGlitch.open '/path/to/your.avi'
|
18
|
-
# avi.frames.each |frame|
|
18
|
+
# avi.frames.each do |frame|
|
19
19
|
# if frame.is_keyframe?
|
20
20
|
# frame.data = frame.data.gsub(/\d/, '0')
|
21
21
|
# end
|
@@ -30,12 +30,11 @@ require 'aviglitch/tempfile'
|
|
30
30
|
# end
|
31
31
|
# avi.output '/path/to/broken.avi'
|
32
32
|
#
|
33
|
-
#--
|
34
|
-
# It does not support AVI2, interleave format.
|
35
|
-
#
|
36
33
|
module AviGlitch
|
37
34
|
|
38
|
-
VERSION = '0.1.
|
35
|
+
VERSION = '0.1.4'
|
36
|
+
|
37
|
+
BUFFER_SIZE = 2 ** 24
|
39
38
|
|
40
39
|
class << self
|
41
40
|
##
|
data/lib/aviglitch/base.rb
CHANGED
@@ -19,7 +19,7 @@ module AviGlitch
|
|
19
19
|
# copy as tempfile
|
20
20
|
@file = Tempfile.open 'aviglitch'
|
21
21
|
f.rewind
|
22
|
-
while d = f.read(
|
22
|
+
while d = f.read(BUFFER_SIZE) do
|
23
23
|
@file.print d
|
24
24
|
end
|
25
25
|
end
|
@@ -59,34 +59,38 @@ module AviGlitch
|
|
59
59
|
# It also requires a block. In the block, you take the frame data
|
60
60
|
# as a String parameter.
|
61
61
|
# To modify the data, simply return a modified data.
|
62
|
-
#
|
62
|
+
# With a block it returns Enumerator, without a block it returns +self+.
|
63
63
|
def glitch target = :all, &block # :yield: data
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
if block_given?
|
65
|
+
@frames.each do |frame|
|
66
|
+
if valid_target? target, frame
|
67
|
+
frame.data = yield frame.data
|
68
|
+
end
|
67
69
|
end
|
70
|
+
self
|
71
|
+
else
|
72
|
+
self.enum_for :glitch, target
|
68
73
|
end
|
69
|
-
self
|
70
74
|
end
|
71
75
|
|
72
76
|
##
|
73
77
|
# Do glitch with index.
|
74
78
|
def glitch_with_index target = :all, &block # :yield: data, index
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
frame.data = yield(frame.data, i)
|
79
|
-
i += 1
|
79
|
+
if block_given?
|
80
|
+
self.glitch(target).with_index do |x, i|
|
81
|
+
yield x, i
|
80
82
|
end
|
83
|
+
self
|
84
|
+
else
|
85
|
+
self.glitch target
|
81
86
|
end
|
82
|
-
self
|
83
87
|
end
|
84
88
|
|
85
89
|
##
|
86
|
-
#
|
87
|
-
# It's an alias for Frames#
|
88
|
-
def
|
89
|
-
self.frames.
|
90
|
+
# Mutates all (or in +range+) keyframes into deltaframes.
|
91
|
+
# It's an alias for Frames#mutate_keyframes_into_deltaframes!
|
92
|
+
def mutate_keyframes_into_deltaframes! range = nil
|
93
|
+
self.frames.mutate_keyframes_into_deltaframes! range
|
90
94
|
self
|
91
95
|
end
|
92
96
|
|
@@ -103,6 +107,15 @@ module AviGlitch
|
|
103
107
|
result
|
104
108
|
end
|
105
109
|
|
110
|
+
##
|
111
|
+
# Removes all keyframes.
|
112
|
+
# It is same as +glitch(:keyframes){|f| nil }+
|
113
|
+
def remove_all_keyframes!
|
114
|
+
self.glitch :keyframe do |f|
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
106
119
|
##
|
107
120
|
# Swaps the frames with other Frames data.
|
108
121
|
def frames= other
|
data/lib/aviglitch/frames.rb
CHANGED
@@ -18,8 +18,10 @@ module AviGlitch
|
|
18
18
|
class Frames
|
19
19
|
include Enumerable
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
# :stopdoc:
|
22
|
+
SAFE_FRAMES_COUNT = 150000
|
23
|
+
@@warn_if_frames_are_too_large = true
|
24
|
+
# :startdoc:
|
23
25
|
|
24
26
|
attr_reader :meta
|
25
27
|
|
@@ -56,11 +58,16 @@ module AviGlitch
|
|
56
58
|
|
57
59
|
##
|
58
60
|
# Enumerates the frames.
|
61
|
+
# It returns Enumerator if a block is not given.
|
59
62
|
def each
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
63
|
+
if block_given?
|
64
|
+
temp = Tempfile.new 'frames'
|
65
|
+
frames_data_as_io(temp, Proc.new)
|
66
|
+
overwrite temp
|
67
|
+
temp.close!
|
68
|
+
else
|
69
|
+
self.enum_for :each
|
70
|
+
end
|
64
71
|
end
|
65
72
|
|
66
73
|
##
|
@@ -69,6 +76,15 @@ module AviGlitch
|
|
69
76
|
@meta.size
|
70
77
|
end
|
71
78
|
|
79
|
+
##
|
80
|
+
# Returns the number of the specific +frame_type+.
|
81
|
+
def size_of frame_type
|
82
|
+
detection = "is_#{frame_type.to_s.sub(/frames$/, 'frame')}?"
|
83
|
+
@meta.select { |m|
|
84
|
+
Frame.new(nil, m[:id], m[:flag]).send detection
|
85
|
+
}.size
|
86
|
+
end
|
87
|
+
|
72
88
|
def frames_data_as_io io = nil, block = nil #:nodoc:
|
73
89
|
io = Tempfile.new('tmep') if io.nil?
|
74
90
|
@meta = @meta.select do |m|
|
@@ -99,20 +115,19 @@ module AviGlitch
|
|
99
115
|
exit
|
100
116
|
end
|
101
117
|
# Overwrite the file
|
102
|
-
data.seek 0, IO::SEEK_END
|
103
118
|
@io.pos = @pos_of_movi - 4 # 4 for size
|
104
119
|
@io.print [data.pos + 4].pack('V') # 4 for 'movi'
|
105
120
|
@io.print 'movi'
|
106
121
|
data.rewind
|
107
|
-
while d = data.read(
|
122
|
+
while d = data.read(BUFFER_SIZE) do
|
108
123
|
@io.print d
|
109
124
|
end
|
110
125
|
@io.print 'idx1'
|
111
126
|
@io.print [@meta.size * 16].pack('V')
|
112
|
-
@meta.
|
113
|
-
|
114
|
-
|
115
|
-
|
127
|
+
idx = @meta.collect { |m|
|
128
|
+
m[:id] + [m[:flag], m[:offset], m[:size]].pack('V3')
|
129
|
+
}.join
|
130
|
+
@io.print idx
|
116
131
|
eof = @io.pos
|
117
132
|
@io.truncate eof
|
118
133
|
|
@@ -152,7 +167,7 @@ module AviGlitch
|
|
152
167
|
this_data.seek 0, IO::SEEK_END
|
153
168
|
this_size = this_data.pos
|
154
169
|
other_data.rewind
|
155
|
-
while d = other_data.read(
|
170
|
+
while d = other_data.read(BUFFER_SIZE) do
|
156
171
|
this_data.print d
|
157
172
|
end
|
158
173
|
other_data.close!
|
@@ -324,8 +339,8 @@ module AviGlitch
|
|
324
339
|
end
|
325
340
|
|
326
341
|
##
|
327
|
-
#
|
328
|
-
def
|
342
|
+
# Mutates keyframes into deltaframes at given range, or all.
|
343
|
+
def mutate_keyframes_into_deltaframes! range = nil
|
329
344
|
range = 0..self.size if range.nil?
|
330
345
|
self.each_with_index do |frame, i|
|
331
346
|
if range.include? i
|
data/spec/aviglitch_spec.rb
CHANGED
@@ -52,13 +52,24 @@ describe AviGlitch do
|
|
52
52
|
|
53
53
|
it 'can glitch each keyframe with index' do
|
54
54
|
avi = AviGlitch.open @in
|
55
|
+
|
56
|
+
a_size = 0
|
57
|
+
avi.glitch :keyframe do |f|
|
58
|
+
a_size += 1
|
59
|
+
f
|
60
|
+
end
|
61
|
+
|
62
|
+
b_size = 0
|
55
63
|
avi.glitch_with_index :keyframe do |kf, idx|
|
64
|
+
b_size += 1
|
56
65
|
if idx < 25
|
57
66
|
kf.slice(10..kf.size)
|
58
67
|
else
|
59
68
|
kf
|
60
69
|
end
|
61
70
|
end
|
71
|
+
expect(a_size).to be == b_size
|
72
|
+
|
62
73
|
avi.output @out
|
63
74
|
i_size = File.stat(@in).size
|
64
75
|
o_size = File.stat(@out).size
|
@@ -143,9 +154,9 @@ describe AviGlitch do
|
|
143
154
|
AviGlitch::Base.surely_formatted?(@out, true).should be true
|
144
155
|
end
|
145
156
|
|
146
|
-
it 'should
|
157
|
+
it 'should mutate keyframes into deltaframes' do
|
147
158
|
a = AviGlitch.open @in
|
148
|
-
a.
|
159
|
+
a.mutate_keyframes_into_deltaframes!
|
149
160
|
a.output @out
|
150
161
|
a = AviGlitch.open @out
|
151
162
|
a.frames.each do |f|
|
@@ -153,7 +164,7 @@ describe AviGlitch do
|
|
153
164
|
end
|
154
165
|
|
155
166
|
a = AviGlitch.open @in
|
156
|
-
a.
|
167
|
+
a.mutate_keyframes_into_deltaframes! 0..50
|
157
168
|
a.output @out
|
158
169
|
a = AviGlitch.open @out
|
159
170
|
a.frames.each_with_index do |f, i|
|
@@ -172,4 +183,29 @@ describe AviGlitch do
|
|
172
183
|
a.has_keyframe?.should be false
|
173
184
|
end
|
174
185
|
|
186
|
+
it 'should #remove_all_keyframes!' do
|
187
|
+
a = AviGlitch.open @in
|
188
|
+
a.has_keyframe?.should be true
|
189
|
+
a.remove_all_keyframes!
|
190
|
+
a.has_keyframe?.should be false
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'should count same number of specific frames' do
|
194
|
+
a = AviGlitch.open @in
|
195
|
+
dc1 = 0
|
196
|
+
dc2 = 0
|
197
|
+
a.frames.each do |f|
|
198
|
+
dc1 += 1 if f.is_deltaframe?
|
199
|
+
end
|
200
|
+
a.glitch(:deltaframe) do |d|
|
201
|
+
dc2 += 1
|
202
|
+
d
|
203
|
+
end
|
204
|
+
|
205
|
+
expect(dc1).to eq(dc2)
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
end
|
210
|
+
|
175
211
|
end
|
data/spec/frames_spec.rb
CHANGED
@@ -460,9 +460,9 @@ describe AviGlitch::Frames do
|
|
460
460
|
end
|
461
461
|
end
|
462
462
|
|
463
|
-
it 'should
|
463
|
+
it 'should mutate keyframes into deltaframe' do
|
464
464
|
a = AviGlitch.open @in
|
465
|
-
a.frames.
|
465
|
+
a.frames.mutate_keyframes_into_deltaframes!
|
466
466
|
a.output @out
|
467
467
|
a = AviGlitch.open @out
|
468
468
|
a.frames.each do |f|
|
@@ -470,7 +470,7 @@ describe AviGlitch::Frames do
|
|
470
470
|
end
|
471
471
|
|
472
472
|
a = AviGlitch.open @in
|
473
|
-
a.frames.
|
473
|
+
a.frames.mutate_keyframes_into_deltaframes! 0..50
|
474
474
|
a.output @out
|
475
475
|
a = AviGlitch.open @out
|
476
476
|
a.frames.each_with_index do |f, i|
|
@@ -480,4 +480,81 @@ describe AviGlitch::Frames do
|
|
480
480
|
end
|
481
481
|
end
|
482
482
|
|
483
|
+
it 'should return Enumerator with #each' do
|
484
|
+
a = AviGlitch.open @in
|
485
|
+
enum = a.frames.each
|
486
|
+
enum.each do |f, i|
|
487
|
+
if f.is_keyframe?
|
488
|
+
f.data = f.data.gsub(/\d/, '')
|
489
|
+
end
|
490
|
+
end
|
491
|
+
a.output @out
|
492
|
+
AviGlitch::Base.surely_formatted?(@out, true).should be true
|
493
|
+
expect(File.size(@out)).to be < File.size(@in)
|
494
|
+
end
|
495
|
+
|
496
|
+
it 'should use Enumerator as an external iterator',
|
497
|
+
:skip => Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('1.9.0') || RUBY_PLATFORM == 'java' do
|
498
|
+
a = AviGlitch.open @in
|
499
|
+
e = a.frames.each
|
500
|
+
expect {
|
501
|
+
while f = e.next do
|
502
|
+
expect(f).to be_a(AviGlitch::Frame)
|
503
|
+
if f.is_keyframe?
|
504
|
+
f.data = f.data.gsub(/\d/, '')
|
505
|
+
end
|
506
|
+
end
|
507
|
+
}.to raise_error(StopIteration)
|
508
|
+
a.output @out
|
509
|
+
AviGlitch::Base.surely_formatted?(@out, true).should be true
|
510
|
+
expect(File.size(@out)).to be < File.size(@in)
|
511
|
+
end
|
512
|
+
|
513
|
+
it 'should count the size of specific frames' do
|
514
|
+
a = AviGlitch.open @in
|
515
|
+
f = a.frames
|
516
|
+
|
517
|
+
kc1 = f.size_of :keyframes
|
518
|
+
kc2 = f.size_of :keyframe
|
519
|
+
kc3 = f.size_of :iframes
|
520
|
+
kc4 = f.size_of :iframe
|
521
|
+
|
522
|
+
dc1 = f.size_of :deltaframes
|
523
|
+
dc2 = f.size_of :deltaframe
|
524
|
+
dc3 = f.size_of :pframes
|
525
|
+
dc4 = f.size_of :pframe
|
526
|
+
|
527
|
+
vc1 = f.size_of :videoframes
|
528
|
+
vc2 = f.size_of :videoframe
|
529
|
+
|
530
|
+
ac1 = f.size_of :audioframes
|
531
|
+
ac2 = f.size_of :audioframe
|
532
|
+
|
533
|
+
kc = dc = vc = ac = 0
|
534
|
+
a.frames.each do |x|
|
535
|
+
vc += x.is_videoframe? ? 1 : 0
|
536
|
+
kc += x.is_keyframe? ? 1 : 0
|
537
|
+
dc += x.is_deltaframe? ? 1 : 0
|
538
|
+
ac += x.is_audioframe? ? 1 : 0
|
539
|
+
end
|
540
|
+
|
541
|
+
a.close
|
542
|
+
|
543
|
+
expect(kc1).to eq(kc)
|
544
|
+
expect(kc2).to eq(kc)
|
545
|
+
expect(kc3).to eq(kc)
|
546
|
+
expect(kc4).to eq(kc)
|
547
|
+
|
548
|
+
expect(dc1).to eq(dc)
|
549
|
+
expect(dc2).to eq(dc)
|
550
|
+
expect(dc3).to eq(dc)
|
551
|
+
expect(dc4).to eq(dc)
|
552
|
+
|
553
|
+
expect(vc1).to eq(vc)
|
554
|
+
expect(vc2).to eq(vc)
|
555
|
+
|
556
|
+
expect(ac1).to eq(ac)
|
557
|
+
expect(ac2).to eq(ac)
|
558
|
+
end
|
559
|
+
|
483
560
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,41 +1,103 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: aviglitch
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- ucnv
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
+
|
18
|
+
date: 2014-04-10 00:00:00 +09:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 9
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 3
|
31
|
+
version: "1.3"
|
32
|
+
prerelease: false
|
33
|
+
requirement: *id001
|
34
|
+
type: :development
|
35
|
+
name: bundler
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ~>
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 35
|
43
|
+
segments:
|
44
|
+
- 10
|
45
|
+
- 0
|
46
|
+
version: "10.0"
|
47
|
+
prerelease: false
|
48
|
+
requirement: *id002
|
49
|
+
type: :development
|
50
|
+
name: rake
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
17
53
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 2
|
60
|
+
- 0
|
61
|
+
version: "2.0"
|
62
|
+
prerelease: false
|
63
|
+
requirement: *id003
|
22
64
|
type: :development
|
65
|
+
name: rspec
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ~>
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 27
|
73
|
+
segments:
|
74
|
+
- 4
|
75
|
+
- 0
|
76
|
+
version: "4.0"
|
23
77
|
prerelease: false
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
78
|
+
requirement: *id004
|
79
|
+
type: :development
|
80
|
+
name: rdoc
|
81
|
+
description: "AviGlitch destroys your AVI files.\n This library provides ways to manipulate data in each AVI frames.\n It can easily generate keyframes-removed video known as \"datamoshing\".\n "
|
82
|
+
email:
|
83
|
+
- ucnvvv@gmail.com
|
84
|
+
executables:
|
28
85
|
- datamosh
|
29
86
|
extensions: []
|
30
|
-
|
31
|
-
|
87
|
+
|
88
|
+
extra_rdoc_files:
|
89
|
+
- README.md
|
32
90
|
- LICENSE
|
33
|
-
|
34
|
-
|
35
|
-
-
|
36
|
-
-
|
91
|
+
files:
|
92
|
+
- .gitignore
|
93
|
+
- .rspec
|
94
|
+
- .travis.yml
|
95
|
+
- ChangeLog.md
|
96
|
+
- Gemfile
|
97
|
+
- LICENSE
|
98
|
+
- README.md
|
37
99
|
- Rakefile
|
38
|
-
-
|
100
|
+
- aviglitch.gemspec
|
39
101
|
- bin/datamosh
|
40
102
|
- lib/aviglitch.rb
|
41
103
|
- lib/aviglitch/base.rb
|
@@ -47,33 +109,44 @@ files:
|
|
47
109
|
- spec/files/sample.avi
|
48
110
|
- spec/frames_spec.rb
|
49
111
|
- spec/spec_helper.rb
|
50
|
-
|
112
|
+
has_rdoc: true
|
51
113
|
homepage: http://ucnv.github.com/aviglitch/
|
52
|
-
licenses:
|
114
|
+
licenses:
|
115
|
+
- MIT
|
53
116
|
post_install_message:
|
54
|
-
rdoc_options:
|
55
|
-
|
117
|
+
rdoc_options:
|
118
|
+
- -m
|
119
|
+
- README.md
|
120
|
+
require_paths:
|
56
121
|
- lib
|
57
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
123
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
|
63
|
-
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
132
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
hash: 3
|
137
|
+
segments:
|
138
|
+
- 0
|
139
|
+
version: "0"
|
69
140
|
requirements: []
|
141
|
+
|
70
142
|
rubyforge_project:
|
71
|
-
rubygems_version: 1.
|
143
|
+
rubygems_version: 1.6.2
|
72
144
|
signing_key:
|
73
145
|
specification_version: 3
|
74
146
|
summary: A Ruby library to destroy your AVI files.
|
75
|
-
test_files:
|
147
|
+
test_files:
|
76
148
|
- spec/aviglitch_spec.rb
|
77
149
|
- spec/datamosh_spec.rb
|
150
|
+
- spec/files/sample.avi
|
78
151
|
- spec/frames_spec.rb
|
79
152
|
- spec/spec_helper.rb
|
data/README.rdoc
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
= AviGlitch
|
2
|
-
|
3
|
-
* http://ucnv.github.com/aviglitch/
|
4
|
-
|
5
|
-
== Description
|
6
|
-
|
7
|
-
AviGlitch destroys your AVI files.
|
8
|
-
|
9
|
-
I can't explain why they're going to destroy their own data.
|
10
|
-
|
11
|
-
See following urls for details;
|
12
|
-
* vimeo http://www.vimeo.com/groups/artifacts
|
13
|
-
* wikipedia http://en.wikipedia.org/wiki/Compression_artifact
|
14
|
-
|
15
|
-
== Features/Problems
|
16
|
-
|
17
|
-
* Not supports AVI2 files right now.
|
18
|
-
* Not supports files with interleave.
|
19
|
-
* Parses only container level structure, doesn't parse codecs.
|
20
|
-
|
21
|
-
== Synopsis
|
22
|
-
|
23
|
-
require 'aviglitch'
|
24
|
-
|
25
|
-
avi = AviGlitch.open('/path/to/your.avi')
|
26
|
-
avi.glitch(:keyframe) do |data|
|
27
|
-
data.gsub(/\d/, '0')
|
28
|
-
end
|
29
|
-
avi.output('/path/to/broken.avi')
|
30
|
-
|
31
|
-
This library also includes a command line tool named +datamosh+.
|
32
|
-
It creates the keyframes removed video.
|
33
|
-
|
34
|
-
$ datamosh /path/to/your.avi -o /path/to/broken.avi
|
35
|
-
|
36
|
-
== Installation
|
37
|
-
|
38
|
-
gem install aviglitch
|
39
|
-
|
40
|
-
== Copyright
|
41
|
-
|
42
|
-
Copyright (c) 2009 - 2010 ucnv. See LICENSE for details.
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.1.3
|