flvtool2 1.0.6
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/CHANGELOG +109 -0
- data/LICENSE +24 -0
- data/README +27 -0
- data/Rakefile +76 -0
- data/bin/flvtool2 +3 -0
- data/examples/tags.xml +39 -0
- data/flvtool2.exy +22 -0
- data/lib/flv.rb +1 -0
- data/lib/flv/amf_string_buffer.rb +280 -0
- data/lib/flv/audio_tag.rb +93 -0
- data/lib/flv/core_extensions.rb +141 -0
- data/lib/flv/meta_tag.rb +78 -0
- data/lib/flv/stream.rb +492 -0
- data/lib/flv/tag.rb +120 -0
- data/lib/flv/video_tag.rb +114 -0
- data/lib/flvtool2.rb +230 -0
- data/lib/flvtool2/base.rb +297 -0
- data/lib/flvtool2/version.rb +10 -0
- data/lib/mixml.rb +119 -0
- data/lib/miyaml.rb +63 -0
- data/setup.rb +1585 -0
- metadata +70 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
= Changelog FLVTool2 - Flash video manipulation
|
2
|
+
|
3
|
+
== Version 1.0.6
|
4
|
+
|
5
|
+
* FLVTool2 is now published also as a gem
|
6
|
+
* fixed inspect at audio tags (thanks Andrew Wason)
|
7
|
+
* updated exe generation to new exerb version (4.1.0)
|
8
|
+
* small bugfix for mencoder encoded files causing a segmentation fault
|
9
|
+
* Changed newline character of tags.xml file to \n
|
10
|
+
|
11
|
+
== Version 1.0.5 RC6
|
12
|
+
|
13
|
+
* Fixed bug, that prevented injection of custom metadata
|
14
|
+
* Fixed several bugs, that would cause errors if flv-file has only audio tags (Ticket #7)
|
15
|
+
|
16
|
+
== Version 1.0.4 RC5
|
17
|
+
|
18
|
+
* Reorganized directory structure and namespaces
|
19
|
+
* Implemented setup for linux OS
|
20
|
+
* Made flvtool2 command systemwide available (Ticket #2)
|
21
|
+
* Added rake tasks for svn tagging and rubyforge uploads
|
22
|
+
* Added README and CHANGELOG
|
23
|
+
* Moved version output to separate file to include in Rakefile
|
24
|
+
* Recoded calling of before and after filters (Ticket #5)
|
25
|
+
* Fixed that header type flag was not written (Ticket #3)
|
26
|
+
* Added hasVideo, hasAudio, hasMetadata, hasCuePoints and hasKeyframes metadata
|
27
|
+
|
28
|
+
== Version 1.0.3 RC4
|
29
|
+
|
30
|
+
* Redesigned error handling
|
31
|
+
* Introduced -a switch, that collapses cutted regions
|
32
|
+
|
33
|
+
== Version 1.0.2 RC3
|
34
|
+
|
35
|
+
* stream.log will now be overwritten if exists
|
36
|
+
* Fixed that files without keyframes could not be updated
|
37
|
+
* Fullfilled help screen
|
38
|
+
|
39
|
+
== Version 1.0.1 RC2
|
40
|
+
|
41
|
+
* Introduced l switch, that logs down infomation to stream.log while infile is read. Very handy for debugging!
|
42
|
+
* 'pipe' is also recognized as a keyword for in or out pipes
|
43
|
+
* Frame sequence calculations will now be cached, resulting in a much better performance.
|
44
|
+
* Removed a bug that lets MiXML fail while reading multiline comments.
|
45
|
+
* Windows pipes are broken. Linux pipes work as expected. Will fix that later.
|
46
|
+
* Removed a bug, that is caused by one byte too long files, generated by ffmpeg.
|
47
|
+
|
48
|
+
== Version 1.0.0 RC1
|
49
|
+
|
50
|
+
* added cut command
|
51
|
+
* added add command
|
52
|
+
* redesigned command line option parsing
|
53
|
+
* improved FLVStream
|
54
|
+
* added cue point support (onCuePoint tags)
|
55
|
+
* made Flash 8 compatible
|
56
|
+
* added keyframes in onMetaTag
|
57
|
+
* introduced command chaining
|
58
|
+
* introduced pipes and redirects
|
59
|
+
* improved debug command
|
60
|
+
* added simulation mode
|
61
|
+
* added Linux start script
|
62
|
+
* added automatic exe generation and packaging in Rakefile
|
63
|
+
* added version command
|
64
|
+
|
65
|
+
== Version 0.18
|
66
|
+
|
67
|
+
* made MetaTag read procedure more stable
|
68
|
+
|
69
|
+
== Version 0.17
|
70
|
+
|
71
|
+
* added -a switch, that prints out meta data even on files not converted to FLV 1.1 (-a means print out [a]ll files)
|
72
|
+
* added -c switch, that makes FLVTool2 compatible to flashcom (currently only duration is computed like flashcom would)
|
73
|
+
* changed the help screen a bit
|
74
|
+
|
75
|
+
== Version 0.16
|
76
|
+
|
77
|
+
* print command results are now in the same format, as the flash to_string method would produce
|
78
|
+
* new meta-data-creator string
|
79
|
+
* application does not shut down anymore, if an error occurs in batch processing
|
80
|
+
* added lastkeyframetimestamp
|
81
|
+
* added onLastSecond event
|
82
|
+
* changed lasttimestamp unit to seconds
|
83
|
+
* changed lastkeyframetimestamp unit to seconds
|
84
|
+
* added debug command
|
85
|
+
|
86
|
+
== Version 0.15
|
87
|
+
|
88
|
+
* removed a bug, that removed first video frame, if a meta tag was inserted
|
89
|
+
|
90
|
+
== Version 0.14
|
91
|
+
|
92
|
+
* added print command (YAML and XML support)
|
93
|
+
* made -n switch update files if metadatacreator is not FLVTool2
|
94
|
+
* removed a bug, that occurs when input file was corrupt
|
95
|
+
|
96
|
+
== Version 0.13
|
97
|
+
|
98
|
+
* added -n switch, that only makes updates to FLV v1 files (wich have no meta tag yet or are not taged by FLVTool2)
|
99
|
+
|
100
|
+
== Version 0.12
|
101
|
+
|
102
|
+
* updated help screen using directories as in-files
|
103
|
+
|
104
|
+
== Version 0.11
|
105
|
+
|
106
|
+
* first release version
|
107
|
+
|
108
|
+
|
109
|
+
|
data/LICENSE
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
FLVTool2 - Copyright (c) 2005 Norman Timmler (inlet media e.K., Hamburg, Germany)
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions
|
6
|
+
are met:
|
7
|
+
1. Redistributions of source code must retain the above copyright
|
8
|
+
notice, this list of conditions and the following disclaimer.
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright
|
10
|
+
notice, this list of conditions and the following disclaimer in the
|
11
|
+
documentation and/or other materials provided with the distribution.
|
12
|
+
3. The name of the author may not be used to endorse or promote products
|
13
|
+
derived from this software without specific prior written permission.
|
14
|
+
|
15
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
16
|
+
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
17
|
+
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
18
|
+
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
19
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
20
|
+
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
21
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
22
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
23
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
24
|
+
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
= FLVTool2 - Flash video manipulation
|
2
|
+
|
3
|
+
== Download
|
4
|
+
|
5
|
+
http://www.inlet-media.de/flvtool2
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
|
9
|
+
Unix/Linux/BSD etc.:
|
10
|
+
|
11
|
+
Execute following commands in directory of README file:
|
12
|
+
|
13
|
+
ruby setup.rb config
|
14
|
+
ruby setup.rb setup
|
15
|
+
sudo ruby setup.rb install
|
16
|
+
|
17
|
+
Windows:
|
18
|
+
No installation needed.
|
19
|
+
|
20
|
+
== Bug reports
|
21
|
+
|
22
|
+
info@inlet-media.de
|
23
|
+
|
24
|
+
== License
|
25
|
+
|
26
|
+
See LICENSE file.
|
27
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require File.dirname(__FILE__) + '/lib/flvtool2/version.rb'
|
5
|
+
|
6
|
+
PKG_NAME = 'flvtool2'
|
7
|
+
PKG_VERSION = FLVTool2.version
|
8
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION.downcase.gsub(/\s/, '_')}"
|
9
|
+
PKG_DESTINATION = "../#{PKG_NAME}"
|
10
|
+
RELEASE_NAME = "REL #{PKG_VERSION}"
|
11
|
+
RUBY_FORGE_PROJECT = PKG_NAME
|
12
|
+
RUBY_FORGE_USER = 'inlet'
|
13
|
+
|
14
|
+
PKG_FILES = FileList[
|
15
|
+
'[a-zA-Z]*',
|
16
|
+
'bin/**/*',
|
17
|
+
'examples/**/*',
|
18
|
+
'lib/**/*'
|
19
|
+
] - [
|
20
|
+
'test',
|
21
|
+
'flvtool2.exe',
|
22
|
+
'pkg'
|
23
|
+
]
|
24
|
+
|
25
|
+
task :default => :all_packages
|
26
|
+
task :windows => [:make_exe, :zip]
|
27
|
+
task :all_packages => [:package, :windows]
|
28
|
+
task :release => [:all_packages, :tag_svn, :rubyforge]
|
29
|
+
|
30
|
+
task :make_exe do
|
31
|
+
`exerb flvtool2.exy`
|
32
|
+
end
|
33
|
+
|
34
|
+
task :zip => :make_exe do
|
35
|
+
files = %w{ flvtool2.exe LICENSE CHANGELOG README examples examples/tags.xml }
|
36
|
+
`zip pkg/#{PKG_FILE_NAME}.zip #{files.join(' ')} -x .svn`
|
37
|
+
end
|
38
|
+
|
39
|
+
task :tag_svn do
|
40
|
+
system("svn cp http://svn.inlet-media.de/svn/flvtool2/trunk http://svn.inlet-media.de/svn/flvtool2/tags/#{PKG_FILE_NAME} -m '* Tag release #{PKG_FILE_NAME}'")
|
41
|
+
end
|
42
|
+
|
43
|
+
spec = Gem::Specification.new do |s|
|
44
|
+
s.name = PKG_NAME
|
45
|
+
s.version = PKG_VERSION
|
46
|
+
s.summary = 'Flash video (FLV) manipulation tool'
|
47
|
+
s.description = <<-EOF
|
48
|
+
FLVTool2 is a manipulation tool for Macromedia Flash Video files (FLV). It can calculate a lot of meta data, insert an onMetaData tag, cut FLV files, add cue points (onCuePoint), show the FLV structure and print meta data information in XML or YAML.
|
49
|
+
EOF
|
50
|
+
|
51
|
+
s.files = PKG_FILES.to_a.delete_if {|f| f.include?('.svn')}
|
52
|
+
s.require_path = 'lib'
|
53
|
+
|
54
|
+
s.bindir = 'bin' # Use these for applications.
|
55
|
+
s.executables = ['flvtool2']
|
56
|
+
s.default_executable = 'flvtool2'
|
57
|
+
|
58
|
+
s.author = "Norman Timmler"
|
59
|
+
s.email = "norman.timmler@inlet-media.de"
|
60
|
+
s.homepage = "http://www.inlet-media.de/flvtool2"
|
61
|
+
s.rubyforge_project = "flvtool2"
|
62
|
+
end
|
63
|
+
|
64
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
65
|
+
pkg.gem_spec = spec
|
66
|
+
pkg.need_zip = false
|
67
|
+
pkg.need_tar = true
|
68
|
+
end
|
69
|
+
|
70
|
+
desc "Publish the release files to RubyForge."
|
71
|
+
task :rubyforge => [ :gem ] do
|
72
|
+
`rubyforge login`
|
73
|
+
system("rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.gem")
|
74
|
+
system("rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.tgz")
|
75
|
+
system("rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.zip -t i386")
|
76
|
+
end
|
data/bin/flvtool2
ADDED
data/examples/tags.xml
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<tags>
|
3
|
+
<!-- an event cue point -->
|
4
|
+
<metatag event="onCuePoint">
|
5
|
+
<name>TestEvent1</name>
|
6
|
+
<timestamp>333</timestamp>
|
7
|
+
<parameters>
|
8
|
+
<speaker>Peter</speaker>
|
9
|
+
<says>Hello my Name is Peter.</says>
|
10
|
+
</parameters>
|
11
|
+
<type>event</type>
|
12
|
+
</metatag>
|
13
|
+
|
14
|
+
<!-- a navigation cue point -->
|
15
|
+
<metatag event="onCuePoint">
|
16
|
+
<name>TestEvent2</name>
|
17
|
+
<timestamp>1000</timestamp>
|
18
|
+
<parameters>
|
19
|
+
<index>1</index>
|
20
|
+
<title>Chapter 1</title>
|
21
|
+
</parameters>
|
22
|
+
<type>navigation</type>
|
23
|
+
</metatag>
|
24
|
+
|
25
|
+
<!-- this cuepoint overwrites the previuos cue point, because of it's
|
26
|
+
identical timestamps and the overwrite parameter was set -->
|
27
|
+
|
28
|
+
<metatag event="onCuePoint" overwrite="true">
|
29
|
+
<name>TestEvent3</name>
|
30
|
+
<timestamp>1000</timestamp>
|
31
|
+
<parameters>
|
32
|
+
<index>1</index>
|
33
|
+
<title>Chapter 2</title>
|
34
|
+
</parameters>
|
35
|
+
<type>navigation</type>
|
36
|
+
</metatag>
|
37
|
+
</tags>
|
38
|
+
|
39
|
+
|
data/flvtool2.exy
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
general:
|
2
|
+
startup: flvtool2.rb
|
3
|
+
core: cui
|
4
|
+
kcode: none
|
5
|
+
|
6
|
+
path:
|
7
|
+
- lib
|
8
|
+
|
9
|
+
file:
|
10
|
+
flvtool2.rb:
|
11
|
+
flv.rb:
|
12
|
+
flv/amf_string_buffer.rb:
|
13
|
+
flv/audio_tag.rb:
|
14
|
+
flv/core_extensions.rb:
|
15
|
+
flv/meta_tag.rb:
|
16
|
+
flv/stream.rb:
|
17
|
+
flv/tag.rb:
|
18
|
+
flv/video_tag.rb:
|
19
|
+
flvtool2/base.rb:
|
20
|
+
flvtool2/version.rb:
|
21
|
+
mixml.rb:
|
22
|
+
miyaml.rb:
|
data/lib/flv.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'flv/stream'
|
@@ -0,0 +1,280 @@
|
|
1
|
+
# Copyright (c) 2005 Norman Timmler (inlet media e.K., Hamburg, Germany)
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions
|
6
|
+
# are met:
|
7
|
+
# 1. Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# 2. Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# 3. The name of the author may not be used to endorse or promote products
|
13
|
+
# derived from this software without specific prior written permission.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
16
|
+
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
17
|
+
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
18
|
+
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
19
|
+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
20
|
+
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
21
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
22
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
23
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
24
|
+
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
|
26
|
+
class AMFStringBuffer
|
27
|
+
def initialize(str = nil)
|
28
|
+
@buffer = str || ''
|
29
|
+
@pos = 0
|
30
|
+
end
|
31
|
+
|
32
|
+
def seek(pos)
|
33
|
+
@pos = pos
|
34
|
+
end
|
35
|
+
|
36
|
+
def read(length)
|
37
|
+
raise EOFError if @pos + length > @buffer.length
|
38
|
+
rt = @buffer[@pos, length]
|
39
|
+
@pos += length
|
40
|
+
rt
|
41
|
+
end
|
42
|
+
|
43
|
+
def readchar
|
44
|
+
read(1).unpack('C').first
|
45
|
+
end
|
46
|
+
|
47
|
+
def write(str)
|
48
|
+
if @pos + str.length > @buffer.length
|
49
|
+
@buffer << ' ' * (@pos + str.length - @buffer.length)
|
50
|
+
end
|
51
|
+
@buffer[@pos, str.length] = str
|
52
|
+
@pos += str.length
|
53
|
+
end
|
54
|
+
|
55
|
+
def close
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
@buffer
|
60
|
+
end
|
61
|
+
|
62
|
+
def length
|
63
|
+
@buffer.length
|
64
|
+
end
|
65
|
+
|
66
|
+
def eof?
|
67
|
+
@pos == length
|
68
|
+
end
|
69
|
+
|
70
|
+
def pos
|
71
|
+
@pos
|
72
|
+
end
|
73
|
+
|
74
|
+
def read__AMF_string
|
75
|
+
read(read__UI16)
|
76
|
+
end
|
77
|
+
|
78
|
+
def read__AMF_double
|
79
|
+
num = read(8).unpack('G').first.to_f
|
80
|
+
end
|
81
|
+
|
82
|
+
def read__AMF_boolean
|
83
|
+
read__UI8 == 1
|
84
|
+
end
|
85
|
+
|
86
|
+
def read__AMF_mixed_array
|
87
|
+
size = read__UI32 # is not used
|
88
|
+
hash = {}
|
89
|
+
while !eof?
|
90
|
+
key = read__AMF_string
|
91
|
+
break if key.empty? && (type = read__UI8) == 9
|
92
|
+
hash[key] = read__AMF_data(type)
|
93
|
+
end
|
94
|
+
hash
|
95
|
+
end
|
96
|
+
|
97
|
+
def read__AMF_object
|
98
|
+
object = Object.new
|
99
|
+
while !eof?
|
100
|
+
key = read__AMF_string
|
101
|
+
break if key.empty? && (type = read__UI8) == 9
|
102
|
+
object.instance_variable_set( eval(":@#{key}"), read__AMF_data(type) )
|
103
|
+
end
|
104
|
+
object
|
105
|
+
end
|
106
|
+
|
107
|
+
def read__AMF_array
|
108
|
+
size = read__UI32
|
109
|
+
array = []
|
110
|
+
(1..size).step do |pos|
|
111
|
+
break if eof?
|
112
|
+
array << read__AMF_data
|
113
|
+
end
|
114
|
+
array
|
115
|
+
end
|
116
|
+
|
117
|
+
def read__AMF_date
|
118
|
+
utc_time = Time.at((read__AMF_double / 1000).to_i)
|
119
|
+
utc_time + (read__SI16 * 60) - Time.now.gmtoff
|
120
|
+
end
|
121
|
+
|
122
|
+
def read__AMF_data(type = nil)
|
123
|
+
type ||= read__UI8
|
124
|
+
value = case type.to_i
|
125
|
+
when 0
|
126
|
+
read__AMF_double
|
127
|
+
when 1
|
128
|
+
read__AMF_boolean
|
129
|
+
when 2
|
130
|
+
read__AMF_string
|
131
|
+
when 3
|
132
|
+
read__AMF_object
|
133
|
+
when 8
|
134
|
+
read__AMF_mixed_array
|
135
|
+
when 10
|
136
|
+
read__AMF_array
|
137
|
+
when 11
|
138
|
+
read__AMF_date
|
139
|
+
else
|
140
|
+
end
|
141
|
+
return value
|
142
|
+
end
|
143
|
+
|
144
|
+
def write__AMF_string(str)
|
145
|
+
write__UI8 2
|
146
|
+
write__UI16 str.length
|
147
|
+
write str
|
148
|
+
end
|
149
|
+
|
150
|
+
def write__AMF_double(value)
|
151
|
+
write__UI8 0
|
152
|
+
write [value].pack('G')
|
153
|
+
end
|
154
|
+
|
155
|
+
def write__AMF_boolean(value)
|
156
|
+
write__UI8 1
|
157
|
+
value = value ? 1 : 0
|
158
|
+
write [value].pack('C')
|
159
|
+
end
|
160
|
+
|
161
|
+
def write__AMF_date(time)
|
162
|
+
write__UI8 11
|
163
|
+
write [(time.to_f * 1000.0)].pack('G')
|
164
|
+
write__SI16( (Time.now.gmtoff / 60).to_i )
|
165
|
+
end
|
166
|
+
|
167
|
+
def write__AMF_data(object)
|
168
|
+
if object === true || object === false
|
169
|
+
write__AMF_boolean object
|
170
|
+
elsif object.kind_of? Numeric
|
171
|
+
write__AMF_double object
|
172
|
+
elsif object.kind_of? Time
|
173
|
+
write__AMF_date object
|
174
|
+
elsif object.kind_of? Hash
|
175
|
+
write__AMF_mixed_array object
|
176
|
+
elsif object.kind_of? String
|
177
|
+
write__AMF_string object
|
178
|
+
elsif object.kind_of? Array
|
179
|
+
write__AMF_array object
|
180
|
+
else
|
181
|
+
write__AMF_object object
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def write__AMF_key(key)
|
186
|
+
write__UI16 key.length
|
187
|
+
write key
|
188
|
+
end
|
189
|
+
|
190
|
+
def write__AMF_mixed_array(hash)
|
191
|
+
write__UI8 8
|
192
|
+
write__UI32 hash.length # length will never be read
|
193
|
+
|
194
|
+
hash.each_pair do |key, value|
|
195
|
+
write__AMF_key key
|
196
|
+
write__AMF_data value
|
197
|
+
end
|
198
|
+
|
199
|
+
write__UI16 0
|
200
|
+
write__UI8 9
|
201
|
+
end
|
202
|
+
|
203
|
+
def write__AMF_array(array)
|
204
|
+
write__UI8 10
|
205
|
+
write__UI32 array.length
|
206
|
+
|
207
|
+
array.each do |value|
|
208
|
+
write__AMF_data value
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def write__AMF_object(object)
|
213
|
+
write__UI8 3
|
214
|
+
|
215
|
+
object.instance_variables.each do |variable|
|
216
|
+
write__AMF_key variable.gsub('@', '')
|
217
|
+
write__AMF_data object.instance_variable_get( variable.intern )
|
218
|
+
end
|
219
|
+
|
220
|
+
write__UI16 0
|
221
|
+
write__UI8 9
|
222
|
+
end
|
223
|
+
|
224
|
+
# FIXME: This methods are copied from flv_stream.rb. Should get in here per
|
225
|
+
# include? or something like this.
|
226
|
+
def read__UI8
|
227
|
+
readchar
|
228
|
+
end
|
229
|
+
|
230
|
+
def read__UI16
|
231
|
+
(readchar << 8) + readchar
|
232
|
+
end
|
233
|
+
|
234
|
+
def read__UI24
|
235
|
+
(readchar << 16) + (readchar << 8) + readchar
|
236
|
+
end
|
237
|
+
|
238
|
+
def read__UI32
|
239
|
+
(readchar << 24) + (readchar << 16) + (readchar << 8) + readchar
|
240
|
+
end
|
241
|
+
|
242
|
+
def read__STRING(length)
|
243
|
+
read length
|
244
|
+
end
|
245
|
+
|
246
|
+
def read__SI16
|
247
|
+
read(2).reverse.unpack('s').first.to_i
|
248
|
+
end
|
249
|
+
|
250
|
+
def write__UI8(value)
|
251
|
+
write [value].pack('C')
|
252
|
+
end
|
253
|
+
|
254
|
+
def write__UI16(value)
|
255
|
+
write [(value >> 8) & 0xff].pack('c')
|
256
|
+
write [value & 0xff].pack('c')
|
257
|
+
end
|
258
|
+
|
259
|
+
def write__UI24(value)
|
260
|
+
write [value >> 16].pack('c')
|
261
|
+
write [(value >> 8) & 0xff].pack('c')
|
262
|
+
write [value & 0xff].pack('c')
|
263
|
+
end
|
264
|
+
|
265
|
+
def write__UI32(value)
|
266
|
+
write [value].pack('N')
|
267
|
+
end
|
268
|
+
|
269
|
+
def write__SI16(value)
|
270
|
+
write [(value >> 8) & 0xff].pack('c')
|
271
|
+
write [value & 0xff].pack('c')
|
272
|
+
end
|
273
|
+
|
274
|
+
def write__STRING(string)
|
275
|
+
write string
|
276
|
+
end
|
277
|
+
alias_method :<<, :write__STRING
|
278
|
+
|
279
|
+
end
|
280
|
+
|