qtrefmovie 0.1.1

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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Jonathan Block
2
+ Based on PHPRefMovie Copyright (C) 2003 Juergen Enge (GPL V2 or later)
3
+ http://www.phpclasses.org/browse/file/7719.html
4
+ juergen@info-age.net
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
+
20
+ The GPL V2 is available at http://www.gnu.org/licenses/gpl-2.0.html
data/README.rdoc ADDED
@@ -0,0 +1,76 @@
1
+ = QTRefMovie
2
+
3
+ QTRefMovie is based on PHPRefMovie Copyright (C) 2003 Juergen Enge (GPL V2 or later)
4
+ http://www.phpclasses.org/browse/file/7719.html
5
+ juergen@info-age.net
6
+
7
+ Most of the code design is Juergen's.
8
+ Most code comments are from Apple's QuickTime File Format specification.
9
+ I just translated the code to Ruby, simplified usage, and made it a Ruby Gem.
10
+
11
+
12
+ == Usage
13
+
14
+ * Install the qtrefmovie gem
15
+
16
+ * Load the library (some or all may not be needed)
17
+ require 'rubygems'
18
+ gem 'qtrefmovie'
19
+ require 'lib/qtrefmovie'
20
+
21
+ * Make a reference movie
22
+ movie = QTRefMovie::QTMovie.new [{:reference => "rtsp://127.0.0.1:80/test.mov",
23
+ :data_rate => 'intranet',
24
+ :cpu_speed => 'fast'},
25
+ {:reference => "rtsp://127.0.0.1:80/test2.mov",
26
+ :data_rate => 't1',
27
+ :quality => 650}]
28
+ File.open("refmovie.mov", "w") { |f| f.write movie.to_s }
29
+
30
+ * Make the reference movie useful
31
+ This part's up to you
32
+
33
+
34
+ == Options
35
+
36
+ You can have as many movie references as you'd like within a reference movie. The QuickTime client will consider the parameters of each reference, as well as its own settings, to decide which reference to actually load.
37
+
38
+ Each reference may have the following parameters:
39
+
40
+ reference:: (required) A URL pointing to a distinct version of the movie available somewhere online
41
+ Any URL accessible to the client and playable by QuickTime
42
+
43
+ data_rate:: (optional) The minimum connection speed for displaying this version
44
+ A 32-bit number, or: '28.8 modem', '56k modem', 'isdn', 'dual isdn',
45
+ '256 kbps', '384 kbps', '512 kbps', '768 kbps', '1 mbps', 't1', 'intranet'
46
+
47
+ cpu_speed:: (optional) An indicator of processor capability needed to view this version
48
+ A 32-bit number divisible by 100, or: 'very slow', 'slow', 'medium', 'fast', 'very fast'
49
+
50
+ quality:: (optional) A relative measure of the quality of this version compared to others referenced
51
+ A 32-bit number
52
+
53
+
54
+ == More Information
55
+
56
+ Juergen provided detailed comments with the code, which I have maintained intact.
57
+ These are largely from Apple's QuickTime File Format specification.
58
+
59
+ Apple's QuickTime File Format Specification is currently available at this URL:
60
+ http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/
61
+
62
+
63
+ == Note on Patches/Pull Requests
64
+
65
+ * Fork the project.
66
+ * Make your feature addition or bug fix.
67
+ * Add tests for it. This is important so I don't break it in a
68
+ future version unintentionally.
69
+ * Commit, do not mess with rakefile, version, or history.
70
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
71
+ * Send me a pull request. Bonus points for topic branches.
72
+
73
+
74
+ == Copyright
75
+
76
+ Copyright (c) 2010 Jonathan Block. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "qtrefmovie"
8
+ gem.summary = %Q{Simple code for generating QuickTime Reference Movies from Ruby}
9
+ gem.description = %Q{QTRefMovie is a simple tool for generating QuickTime Reference Movie files from a Ruby script.}
10
+ gem.email = "jonblock@jonblock.com"
11
+ gem.homepage = "http://github.com/jonblock/qtrefmovie"
12
+ gem.authors = ["Jonathan Block"]
13
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
+ end
20
+
21
+ require 'rake/testtask'
22
+ Rake::TestTask.new(:test) do |test|
23
+ test.libs << 'lib' << 'test'
24
+ test.pattern = 'test/**/test_*.rb'
25
+ test.verbose = true
26
+ end
27
+
28
+ begin
29
+ require 'rcov/rcovtask'
30
+ Rcov::RcovTask.new do |test|
31
+ test.libs << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+ rescue LoadError
36
+ task :rcov do
37
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
38
+ end
39
+ end
40
+
41
+ task :test => :check_dependencies
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "qtrefmovie #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
data/lib/qtrefmovie.rb ADDED
@@ -0,0 +1,513 @@
1
+ # Copyright (c) 2010 Jonathan Block
2
+ # jonblock@jonblock.com
3
+ # Based on PHPRefMovie Copyright (C) 2003 Juergen Enge (GPL V2 or later)
4
+ # http://www.phpclasses.org/browse/file/7719.html
5
+ # juergen@info-age.net
6
+ #
7
+ # Translated to Ruby 2010 by Jonathan Block
8
+ # Most of the code design is Juergen's.
9
+ # Most code comments are from Apple's QuickTime File Format specification.
10
+ # I just translated it to Ruby, simplified usage, and made it a Ruby Gem.
11
+ # Please see the README.
12
+
13
+
14
+ module QTRefMovie
15
+
16
+ # USAGE
17
+ def qt_sample_code
18
+ ref_movie = QTRefMovie.new
19
+
20
+ data_reference = QTDataReference.new "rtsp://127.0.0.1:80/test.mov"
21
+ data_rate = QTDataRate.new("intranet")
22
+ cpu_speed = QTCPUSpeed.new("fast")
23
+
24
+ movie_descriptor = QTRefMovieDescriptor.new
25
+ movie_descriptor.add_chunk data_reference
26
+ movie_descriptor.add_chunk data_rate
27
+ movie_descriptor.add_chunk cpu_speed
28
+
29
+ ref_movie.add_chunk movie_descriptor
30
+
31
+ data_reference = QTDataReference.new "rtsp://127.0.0.1:80/test2.mov"
32
+ data_rate = QTDataRate.new("t1")
33
+ cpu_speed = QTQuality.new(650)
34
+
35
+ movie_descriptor = QTRefMovieDescriptor.new
36
+ movie_descriptor.add_chunk data_reference
37
+ movie_descriptor.add_chunk data_rate
38
+ movie_descriptor.add_chunk cpu_speed
39
+
40
+ ref_movie.add_chunk movie_descriptor
41
+
42
+ movie = QTMovie.new
43
+ movie.add_chunk ref_movie
44
+ movie.to_s
45
+ end
46
+
47
+ def qt_easier_sample_code
48
+ movie = QTMovie.new [{:reference => "rtsp://127.0.0.1:80/test.mov",
49
+ :data_rate => 'intranet',
50
+ :cpu_speed => 'fast'},
51
+ {:reference => "rtsp://127.0.0.1:80/test2.mov",
52
+ :data_rate => 't1',
53
+ :quality => 650}]
54
+ movie.to_s
55
+ end
56
+
57
+
58
+ class QTBase
59
+ def initialize
60
+ @list = []
61
+ @type = ' '
62
+ end
63
+
64
+ def add_chunk( chunk, pos = -1 )
65
+ if pos < 0
66
+ @list << chunk
67
+ else
68
+ @list[pos] = chunk
69
+ end
70
+ end
71
+
72
+ def size
73
+ size = 0
74
+ (0..(@list.count-1)).each do |i|
75
+ size += @list[i].size
76
+ end
77
+ size += 2*4
78
+ end
79
+
80
+ def to_s
81
+ str = [size].pack('N')
82
+ str += @type
83
+ if @list.count > 0
84
+ (0..(@list.count-1)).each do |i|
85
+ str += @list[i].to_s
86
+ end
87
+ end
88
+ str
89
+ end
90
+ end
91
+
92
+
93
+ # The Movie Atom
94
+ # You use movie atoms to specify the information that defines a movie-that is, the
95
+ # information that allows your application to understand the data that is stored in the
96
+ # movie data atom. The movie atom normally contains a movie header atom, which defines
97
+ # the time scale and duration information for the entire movie, as well as its display
98
+ # characteristics. In addition, the movie atom contains a track atom for each track in
99
+ # the movie.
100
+ #
101
+ # The movie atom has an atom type of 'moov'. It contains other types of atoms, including
102
+ # at least one of three possible parent atoms-the movie header atom ('mvhd'), the
103
+ # compressed movie atom ('cmov'), or a reference movie atom ('rmra'). An uncompressed
104
+ # movie atom can contain both a movie header atom and a reference movie atom, but it
105
+ # must contain at least one of the two. It can also contain several other atoms, such
106
+ # as a clipping atom ( 'clip'), one or more track atoms ( 'trak'), a color table atom
107
+ # ( 'ctab'), and a user data atom 'udta').
108
+ #
109
+ # Compressed movie atoms and reference movie atoms are discussed separately. This
110
+ # section describes normal uncompressed movie atoms.
111
+ #
112
+ # A movie atom may contain the following information.
113
+ #
114
+ #
115
+ # Size
116
+ # The number of bytes in this movie atom.
117
+ #
118
+ # Type
119
+ # The type of this movie atom; this field must be set to 'moov'.
120
+ #
121
+ # Movie header atom
122
+ # See "Movie Header Atoms" for more information.
123
+ #
124
+ # Movie clipping atom
125
+ # See "Clipping Atoms" for more information.
126
+ #
127
+ # Track list atoms
128
+ # See "Track Atoms" for details on track atoms and their associated atoms.
129
+ #
130
+ # User data atom
131
+ # See "User Data Atoms" for more infomation about user data atoms.
132
+ #
133
+ # Color table atom
134
+ # See"Color Table Atoms" for a discussion of the color table atom.
135
+ #
136
+ # Compressed movie atom
137
+ # See "Compressed Movie Resources" for a discussion of compressed movie atoms.
138
+ #
139
+ # Reference movie atom
140
+ # See "Reference Movies" for a discussion of reference movie atoms.
141
+
142
+ class QTMovie < QTBase
143
+ def initialize( options = nil )
144
+ super()
145
+ @type = 'moov'
146
+ unless options.nil?
147
+ ref_movie = QTRefMovie.new
148
+ options.each do |opt|
149
+ movie_descriptor = QTRefMovieDescriptor.new
150
+ movie_descriptor.add_chunk QTDataReference.new opt[:reference] unless opt[:reference].nil?
151
+ movie_descriptor.add_chunk QTDataRate.new opt[:data_rate] unless opt[:data_rate].nil?
152
+ movie_descriptor.add_chunk QTCPUSpeed.new opt[:cpu_speed] unless opt[:cpu_speed].nil?
153
+ movie_descriptor.add_chunk QTQuality.new opt[:quality ] unless opt[:quality ].nil?
154
+ ref_movie.add_chunk movie_descriptor
155
+ end
156
+ add_chunk ref_movie
157
+ end
158
+ end
159
+
160
+ #def set_ref_movie( qt_ref_movie )
161
+ # add_chunk qt_ref_movie, 0
162
+ #end
163
+ end
164
+
165
+
166
+ # Reference Movie Atom
167
+ # A reference movie atom contains references to one or more movies. It can optionally
168
+ # contain a list of system requirements in order for each movie to play, and a quality
169
+ # rating for each movie. It is typically used to specify a list of alternate movies to
170
+ # be played under different conditions.
171
+ #
172
+ # A reference movie atom's parent is always a movie atom ('moov'). Only one reference
173
+ # movie atom is allowed in a given movie atom.
174
+ #
175
+ #
176
+ # A reference movie atom may contain the following information.
177
+ #
178
+ # Size
179
+ # The number of bytes in this reference movie atom.
180
+ #
181
+ # Type
182
+ # The type of this atom; this field must be set to 'rmra'.
183
+ #
184
+ # Reference movie descriptor atom
185
+ # A reference movie atom must contain at least one reference movie descriptor atom, and
186
+ # typically contains more than one. See "Reference Movie Descriptor Atom" for more
187
+ # information.
188
+
189
+ class QTRefMovie < QTBase
190
+ def initialize
191
+ super
192
+ @type = 'rmra'
193
+ end
194
+ end
195
+
196
+
197
+ # Reference Movie Descriptor Atom
198
+ # Each reference movie descriptor atom contains other atoms that describe where a
199
+ # particular movie can be found, and optionally what the system requirements are to
200
+ # play that movie, as well as an optional quality rating for that movie.
201
+ #
202
+ # A reference movie descriptor atom's parent is always a movie reference atom ('rmra').
203
+ # Multiple reference movie descriptor atoms are allowed in a given movie reference atom,
204
+ # and more than one is usually present.
205
+ #
206
+ # A reference movie descriptor atom may contain the following information.
207
+ #
208
+ #
209
+ #
210
+ # Size
211
+ # The number of bytes in this reference movie descriptor atom.
212
+ #
213
+ # Type
214
+ # The type of this atom; this field must be set to 'rmda'.
215
+ #
216
+ # Data reference atom
217
+ # Each reference movie atom must contain exactly one data reference atom. See "Data
218
+ # Reference Atoms" for more information.
219
+ #
220
+ # Data rate atom
221
+ # A reference movie atom may contain an optional data rate atom. Only one data rate
222
+ # atom can be present. See "Data Rate Atom" for more information.
223
+ #
224
+ # CPU speed atom
225
+ # A reference movie atom may contain an optional CPU speed atom. Only one CPU speed
226
+ # atom can be present. See "CPU Speed Atom" for more information.
227
+ #
228
+ # Version check atom
229
+ # A reference movie atom may contain an optional version check atom. Multiple version
230
+ # check atoms can be present. See "Version Check Atom" for more information.
231
+ #
232
+ # Component detect atom
233
+ # A reference movie atom may contain an optional component detect atom. Multiple
234
+ # component detect atoms can be present. See "Component Detect Atom" for more
235
+ # information.
236
+ #
237
+ # Quality atom
238
+ # A reference movie atom may contain an optional quality atom. Only one quality atom
239
+ # can be present. See "Quality Atom" for more information
240
+
241
+ class QTRefMovieDescriptor < QTBase
242
+ def initialize
243
+ super
244
+ @type = 'rmda'
245
+ end
246
+
247
+ #def set_data_reference( qt_data_reference )
248
+ # add_chunk qt_data_reference, 0
249
+ #end
250
+
251
+ #def set_data_rate( qt_data_rate )
252
+ # add_chunk qt_data_rate, 1
253
+ #end
254
+ end
255
+
256
+
257
+ # Data Reference Atom
258
+ # A data reference atom contains the information necessary to locate a movie, or a
259
+ # stream or file that QuickTime can play, typically in the form of a URL or a file
260
+ # alias.
261
+ #
262
+ # Only one data reference atom is allowed in a given movie reference descriptor atom.
263
+ #
264
+ #
265
+ #
266
+ # A data reference atom may contain the following information.
267
+ #
268
+ # Size
269
+ # The number of bytes in this data reference atom.
270
+ #
271
+ # Type
272
+ # The type of this atom; this field must be set to 'rdrf'.
273
+ #
274
+ # Flags
275
+ # A 32-bit integer containing flags. One flag is currently defined: movie is
276
+ # self-contained. If the least-significant bit is set to 1, the movie is self-contained.
277
+ # This requires that the parent movie contain a movie header atom as well as a reference
278
+ # movie atom. In other words, the current 'moov' atom must contain both a 'rmra' atom
279
+ # and a 'mvhd' atom. To resolve this data reference, an application uses the movie
280
+ # defined in the movie header atom, ignoring the remainder of the fields in this data
281
+ # reference atom, which are used only to specify external movies.
282
+ #
283
+ # Data reference type
284
+ # The data reference type. A value of 'alis' indicates a file system alias record. A
285
+ # value of 'url ' indicates a string containing a uniform resource locator. Note that
286
+ # the fourth character in 'url ' is an ASCII blank (hex 20).
287
+ #
288
+ # Data reference size
289
+ # The size of the data reference in bytes, expressed as a 32-bit integer.
290
+ #
291
+ # Data reference
292
+ # A data reference to a QuickTime movie, or to a stream or file that QuickTime can play.
293
+ # If the reference type is 'alis' this field contains the contents of an AliasHandle.
294
+ # If the reference type is 'url ' this field contains a null-terminated string that can
295
+ # be interpreted as a URL. The URL can be absolute or relative, and can specify any
296
+ # protocol that QuickTime supports, including http://, ftp://, rtsp://, file:///, and
297
+ # data:.
298
+
299
+ class QTDataReference < QTBase
300
+ def initialize( reference = nil )
301
+ super()
302
+ @type = 'rdrf'
303
+ @flag = 0
304
+ @ref_type = 'url '
305
+ @size = 0
306
+ @reference = ''
307
+ set_reference(reference) unless reference.nil?
308
+ end
309
+
310
+ def set_reference( reference )
311
+ @reference = reference
312
+ @size = reference.length
313
+ end
314
+
315
+ def size
316
+ @size + 5 * 4
317
+ end
318
+
319
+ def to_s
320
+ str = [size].pack('N')
321
+ str += @type
322
+ str += [@flag].pack('N')
323
+ str += @ref_type
324
+ str += [@size].pack('N')
325
+ str += @reference
326
+ end
327
+ end
328
+
329
+
330
+ # Data Rate Atom
331
+ # A data rate atom specifies the minimum data rate required to play a movie. This is
332
+ # normally compared to the connection speed setting in the user's QuickTime Settings
333
+ # control panel. Applications should play the movie with the highest data rate less
334
+ # than or equal to the user's connection speed. If the connection speed is slower than
335
+ # any movie's data rate, applications should play the movie with the lowest data rate.
336
+ # The movie with the highest data rate is assumed to have the highest quality.
337
+ #
338
+ # Only one data rate atom is allowed in a given reference movie descriptor atom.
339
+ #
340
+ # A data rate atom may contain the following information.
341
+ #
342
+ # Size
343
+ # The number of bytes in this data rate atom.
344
+ #
345
+ # Type
346
+ # The type of this atom; this field must be set to 'rmdr'.
347
+ #
348
+ # Flags
349
+ # A 32-bit integer that is currently always 0.
350
+ #
351
+ # Data rate
352
+ # The required data rate in bits per second, expressed as a 32-bit integer.
353
+
354
+ class QTDataRate < QTBase
355
+ def initialize( rate = nil )
356
+ super()
357
+ @type = 'rmdr'
358
+ @flag = 0
359
+ @rate = 256000
360
+ set_rate(rate) unless rate.nil?
361
+ end
362
+
363
+ def rates
364
+ { '28.8 modem' => 28800,
365
+ '56k modem' => 56000,
366
+ 'isdn' => 64000,
367
+ 'dual isdn' => 128000,
368
+ '256 kbps' => 256000,
369
+ '384 kbps' => 384000,
370
+ '512 kbps' => 512000,
371
+ '768 kbps' => 768000,
372
+ '1 mbps' => 1000000,
373
+ 't1' => 1500000,
374
+ 'intranet' => 2147483647 }
375
+ end
376
+
377
+ def set_rate( rate )
378
+ @rate = rates[rate] || rate
379
+ end
380
+
381
+ def size
382
+ 4 * 4
383
+ end
384
+
385
+ def to_s
386
+ str = [size].pack('N')
387
+ str += @type
388
+ str += [@flag].pack('N')
389
+ str += [@rate].pack('N')
390
+ end
391
+
392
+ end
393
+
394
+
395
+ # CPU Speed Atom
396
+ # A CPU speed atom specifies the minimum computing power needed to display a movie.
397
+ # QuickTime performs an internal test to determine the speed of the user's computer.
398
+ #
399
+ # This is not a simple measurement of clock speed-it is a measurement of performance
400
+ # for QuickTime-related operations. Speed is expressed as a relative value between 100
401
+ # and 2^31, in multiples of 100.
402
+ #
403
+ # Note: Typical scores might range from a minimum score of 100, which would describe a
404
+ # computer as slow as, or slower than, a 166 MHz Pentium or 120 MHz PowerPC, to a
405
+ # maximum score of 600 for a 500 MHz Pentium III or 400 MHz G4 PowerPC. A computer with
406
+ # a graphics accelerator and a Gigahertz clock speed might score as high as 1000.
407
+ # Future computers will score higher.
408
+ #
409
+ # Applications should play the movie with the highest specified CPU speed that is less
410
+ # than or equal to the user's speed. If the user's speed is lower than any movie's CPU
411
+ # speed, applications should play the movie with the lowest CPU speed requirement. The
412
+ # movie with the highest CPU speed is assumed to be the highest quality.
413
+ #
414
+ # Only one CPU speed atom is allowed in a given reference movie descriptor atom.
415
+ #
416
+ #
417
+ # A CPU speed atom may contain the following information.
418
+ #
419
+ # Size
420
+ # The number of bytes in this CPU speed atom.
421
+ #
422
+ # Type
423
+ # The type of this atom; this field must be set to 'rmcs'.
424
+ #
425
+ # Flags
426
+ # A 32-bit integer that is currently always 0.
427
+ #
428
+ # CPU speed
429
+ # A relative ranking of required computer speed, expressed as a 32-bit integer
430
+ # divisible by 100, with larger numbers indicating higher speed.
431
+
432
+ class QTCPUSpeed < QTBase
433
+ def initialize( speed = nil )
434
+ super()
435
+ @type = 'rmcs'
436
+ @flag = 0
437
+ @speed = 500
438
+ set_speed(speed) unless speed.nil?
439
+ end
440
+
441
+ def speeds
442
+ { 'very slow' => 100,
443
+ 'slow' => 300,
444
+ 'medium' => 500,
445
+ 'fast' => 700,
446
+ 'very fast' => 1000 }
447
+ end
448
+
449
+ def set_speed( speed )
450
+ @speed = speeds[speed] || speed
451
+ end
452
+
453
+ def size
454
+ 4 * 4
455
+ end
456
+
457
+ def to_s
458
+ str = [size].pack('N')
459
+ str += @type
460
+ str += [@flag].pack('N')
461
+ str += [@speed].pack('N')
462
+ end
463
+ end
464
+
465
+
466
+ # Quality Atom
467
+ # A quality atom describes the relative quality of a movie. This acts as a tie-breaker
468
+ # if more than one movie meets the specified requirements, and it is not otherwise
469
+ # obvious which movie should be played.
470
+ # This would be the case if two qualified movies have the same data rate and CPU speed
471
+ # requirements, for example, or if one movie requires a higher data rate and another
472
+ # requires a higher CPU speed, but both can be played on the current system. In these
473
+ # cases, applications should play the movie with the highest quality, as specified in
474
+ # the quality atom.
475
+ # Only one quality atom is allowed in a given reference movie descriptor atom.
476
+ #
477
+ # A quality atom may contain the following information.
478
+ #
479
+ # Size
480
+ # The number of bytes in this quality atom.
481
+ #
482
+ # Type
483
+ # The type of this atom; this field must be set to 'rmqu'.
484
+ #
485
+ # Quality
486
+ # The relative quality of the movie, expressed as a 32-bit integer. A larger number indicates higher quality. A unique value should be given to each movie.
487
+
488
+ class QTQuality < QTBase
489
+ def initialize( quality = nil )
490
+ super()
491
+ @type = 'rmqu'
492
+ @flag = 0
493
+ @quality = 500
494
+ set_quality(quality) if quality
495
+ end
496
+
497
+ def set_quality( quality )
498
+ @quality = quality
499
+ end
500
+
501
+ def size
502
+ 4 * 4
503
+ end
504
+
505
+ def to_s
506
+ str = [size].pack('N')
507
+ str += @type
508
+ str += [@flag].pack('N')
509
+ str += [@quality].pack('N')
510
+ end
511
+ end
512
+
513
+ end
@@ -0,0 +1,55 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{qtrefmovie}
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jonathan Block"]
12
+ s.date = %q{2010-08-17}
13
+ s.description = %q{QTRefMovie is a simple tool for generating QuickTime Reference Movie files from a Ruby script.}
14
+ s.email = %q{jonblock@jonblock.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/qtrefmovie.rb",
27
+ "qtrefmovie.gemspec",
28
+ "test/helper.rb",
29
+ "test/sample.mov",
30
+ "test/test_qtrefmovie.rb"
31
+ ]
32
+ s.homepage = %q{http://github.com/jonblock/qtrefmovie}
33
+ s.rdoc_options = ["--charset=UTF-8"]
34
+ s.require_paths = ["lib"]
35
+ s.rubygems_version = %q{1.3.7}
36
+ s.summary = %q{Simple code for generating QuickTime Reference Movies from Ruby}
37
+ s.test_files = [
38
+ "test/helper.rb",
39
+ "test/test_qtrefmovie.rb"
40
+ ]
41
+
42
+ if s.respond_to? :specification_version then
43
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
48
+ else
49
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
50
+ end
51
+ else
52
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
53
+ end
54
+ end
55
+
data/test/helper.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'qtrefmovie'
8
+
9
+ class Test::Unit::TestCase
10
+ end
data/test/sample.mov ADDED
Binary file
@@ -0,0 +1,15 @@
1
+ require 'helper'
2
+
3
+ class TestQtrefmovie < Test::Unit::TestCase
4
+ should "create a reference movie matching the stored sample" do
5
+ QTRefMovie
6
+ movie = QTRefMovie::QTMovie.new [{:reference => "rtsp://127.0.0.1:80/test.mov",
7
+ :data_rate => 'intranet',
8
+ :cpu_speed => 'fast'},
9
+ {:reference => "rtsp://127.0.0.1:80/test2.mov",
10
+ :data_rate => 't1',
11
+ :quality => 650}]
12
+ sample = File.read("test/sample.mov")
13
+ assert_equal movie.to_s, sample
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qtrefmovie
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
11
+ platform: ruby
12
+ authors:
13
+ - Jonathan Block
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-08-17 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: thoughtbot-shoulda
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ description: QTRefMovie is a simple tool for generating QuickTime Reference Movie files from a Ruby script.
36
+ email: jonblock@jonblock.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - LICENSE
43
+ - README.rdoc
44
+ files:
45
+ - .document
46
+ - .gitignore
47
+ - LICENSE
48
+ - README.rdoc
49
+ - Rakefile
50
+ - VERSION
51
+ - lib/qtrefmovie.rb
52
+ - qtrefmovie.gemspec
53
+ - test/helper.rb
54
+ - test/sample.mov
55
+ - test/test_qtrefmovie.rb
56
+ has_rdoc: true
57
+ homepage: http://github.com/jonblock/qtrefmovie
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options:
62
+ - --charset=UTF-8
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ hash: 3
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.3.7
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: Simple code for generating QuickTime Reference Movies from Ruby
90
+ test_files:
91
+ - test/helper.rb
92
+ - test/test_qtrefmovie.rb