rmov 0.1.2 → 0.1.3
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 +8 -0
- data/README.rdoc +1 -1
- data/Rakefile +1 -1
- data/ext/exporter.c +11 -11
- data/ext/extconf.rb +1 -1
- data/ext/movie.c +32 -15
- data/ext/rmov_ext.c +4 -4
- data/ext/rmov_ext.h +1 -1
- data/ext/track.c +50 -4
- data/lib/quicktime/exporter.rb +1 -1
- data/lib/quicktime/movie.rb +27 -1
- data/lib/quicktime/track.rb +6 -1
- data/lib/rmov.rb +2 -2
- data/rmov.gemspec +2 -2
- data/spec/output/saved_settings.st +0 -0
- data/spec/quicktime/exporter_spec.rb +5 -5
- data/spec/quicktime/movie_spec.rb +42 -15
- data/spec/quicktime/track_spec.rb +2 -2
- metadata +1 -1
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
0.1.3 (October 3rd, 2008)
|
2
|
+
|
3
|
+
* some support for text tracks
|
4
|
+
|
5
|
+
* adding movie.new_video_track and movie.new_audio_track methods for creating new tracks
|
6
|
+
|
7
|
+
* changing Quicktime module name to QuickTime to match proper casing
|
8
|
+
|
1
9
|
0.1.2 (October 3rd, 2008)
|
2
10
|
|
3
11
|
* movie.poster_time and movie.poster_time=(seconds) for getting and setting a movie's poster time
|
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('rmov', '0.1.
|
5
|
+
Echoe.new('rmov', '0.1.3') do |p|
|
6
6
|
p.summary = "Ruby wrapper for the QuickTime C API."
|
7
7
|
p.description = "Ruby wrapper for the QuickTime C API."
|
8
8
|
p.url = "http://github.com/ryanb/rmov"
|
data/ext/exporter.c
CHANGED
@@ -58,12 +58,12 @@ static VALUE exporter_export_to_file(VALUE obj, VALUE filepath)
|
|
58
58
|
|
59
59
|
err = NativePathNameToFSSpec(RSTRING(filepath)->ptr, &fs, 0);
|
60
60
|
if (err != fnfErr)
|
61
|
-
rb_raise(
|
61
|
+
rb_raise(eQuickTime, "Error %d occurred while opening file for export at %s.", err, RSTRING(filepath)->ptr);
|
62
62
|
|
63
63
|
// TODO use exporter settings when converting movie
|
64
64
|
err = ConvertMovieToFile(movie, 0, &fs, 'MooV', 'TVOD', 0, 0, 0, component);
|
65
65
|
if (err != noErr)
|
66
|
-
rb_raise(
|
66
|
+
rb_raise(eQuickTime, "Error %d occurred while attempting to export movie to file %s.", err, RSTRING(filepath)->ptr);
|
67
67
|
|
68
68
|
if (rb_block_given_p())
|
69
69
|
SetMovieProgressProc(movie, 0, 0);
|
@@ -93,14 +93,14 @@ static VALUE exporter_open_settings_dialog(VALUE obj)
|
|
93
93
|
// Bring this process to the front
|
94
94
|
err = TransformProcessType(¤t_process, kProcessTransformToForegroundApplication);
|
95
95
|
if (err != noErr) {
|
96
|
-
rb_raise(
|
96
|
+
rb_raise(eQuickTime, "Error %d occurred while brining this application to the forground.", err);
|
97
97
|
}
|
98
98
|
SetFrontProcess(¤t_process);
|
99
99
|
|
100
100
|
// Show export dialog and save settings
|
101
101
|
err = MovieExportDoUserDialog(component, movie, 0, 0, GetMovieDuration(movie), &canceled);
|
102
102
|
if (err != noErr) {
|
103
|
-
rb_raise(
|
103
|
+
rb_raise(eQuickTime, "Error %d occurred while opening export dialog.", err);
|
104
104
|
}
|
105
105
|
|
106
106
|
if (!canceled) {
|
@@ -132,7 +132,7 @@ static VALUE exporter_load_settings(VALUE obj, VALUE filepath)
|
|
132
132
|
|
133
133
|
file = fopen(RSTRING(filepath)->ptr, "r+b");
|
134
134
|
if (!file) {
|
135
|
-
rb_raise(
|
135
|
+
rb_raise(eQuickTime, "Unable to open file for loading at %s.", RSTRING(filepath)->ptr);
|
136
136
|
}
|
137
137
|
|
138
138
|
// obtain file size:
|
@@ -149,7 +149,7 @@ static VALUE exporter_load_settings(VALUE obj, VALUE filepath)
|
|
149
149
|
REXPORTER(obj)->settings = (QTAtomContainer)NewHandleClear(length);
|
150
150
|
read_length = fread(*(Handle)REXPORTER(obj)->settings, 1, length, file);
|
151
151
|
if (read_length != length) {
|
152
|
-
rb_raise(
|
152
|
+
rb_raise(eQuickTime, "Unable to read entire file at %s.", RSTRING(filepath)->ptr);
|
153
153
|
}
|
154
154
|
|
155
155
|
fclose(file);
|
@@ -169,12 +169,12 @@ static VALUE exporter_save_settings(VALUE obj, VALUE filepath)
|
|
169
169
|
QTAtomContainer settings = REXPORTER(obj)->settings;
|
170
170
|
|
171
171
|
if (!settings) {
|
172
|
-
rb_raise(
|
172
|
+
rb_raise(eQuickTime, "Unable to save settings because no settings are specified.");
|
173
173
|
}
|
174
174
|
|
175
175
|
file = fopen(RSTRING(filepath)->ptr, "wb");
|
176
176
|
if (!file) {
|
177
|
-
rb_raise(
|
177
|
+
rb_raise(eQuickTime, "Unable to open file for saving at %s.", RSTRING(filepath)->ptr);
|
178
178
|
}
|
179
179
|
fwrite(&settings, GetHandleSize((Handle)settings), 1, file);
|
180
180
|
fclose(file);
|
@@ -184,9 +184,9 @@ static VALUE exporter_save_settings(VALUE obj, VALUE filepath)
|
|
184
184
|
|
185
185
|
void Init_quicktime_exporter()
|
186
186
|
{
|
187
|
-
VALUE
|
188
|
-
|
189
|
-
cExporter = rb_define_class_under(
|
187
|
+
VALUE mQuickTime;
|
188
|
+
mQuickTime = rb_define_module("QuickTime");
|
189
|
+
cExporter = rb_define_class_under(mQuickTime, "Exporter", rb_cObject);
|
190
190
|
rb_define_alloc_func(cExporter, exporter_new);
|
191
191
|
rb_define_method(cExporter, "export", exporter_export_to_file, 1);
|
192
192
|
rb_define_method(cExporter, "open_settings_dialog", exporter_open_settings_dialog, 0);
|
data/ext/extconf.rb
CHANGED
data/ext/movie.c
CHANGED
@@ -60,7 +60,7 @@ static VALUE movie_dispose(VALUE obj)
|
|
60
60
|
static VALUE movie_load_from_file(VALUE obj, VALUE filepath)
|
61
61
|
{
|
62
62
|
if (MOVIE(obj)) {
|
63
|
-
rb_raise(
|
63
|
+
rb_raise(eQuickTime, "Movie has already been loaded.");
|
64
64
|
} else {
|
65
65
|
OSErr err;
|
66
66
|
FSSpec fs;
|
@@ -70,19 +70,19 @@ static VALUE movie_load_from_file(VALUE obj, VALUE filepath)
|
|
70
70
|
|
71
71
|
err = NativePathNameToFSSpec(RSTRING(filepath)->ptr, &fs, 0);
|
72
72
|
if (err != 0)
|
73
|
-
rb_raise(
|
73
|
+
rb_raise(eQuickTime, "Error %d occurred while reading file at %s", err, RSTRING(filepath)->ptr);
|
74
74
|
|
75
75
|
err = OpenMovieFile(&fs, &frefnum, fsRdPerm);
|
76
76
|
if (err != 0)
|
77
|
-
rb_raise(
|
77
|
+
rb_raise(eQuickTime, "Error %d occurred while opening movie at %s", err, RSTRING(filepath)->ptr);
|
78
78
|
|
79
79
|
err = NewMovieFromFile(movie, frefnum, &movie_resid, 0, newMovieActive, 0);
|
80
80
|
if (err != 0)
|
81
|
-
rb_raise(
|
81
|
+
rb_raise(eQuickTime, "Error %d occurred while loading movie at %s", err, RSTRING(filepath)->ptr);
|
82
82
|
|
83
83
|
err = CloseMovieFile(frefnum);
|
84
84
|
if (err != 0)
|
85
|
-
rb_raise(
|
85
|
+
rb_raise(eQuickTime, "Error %d occurred while closing movie file at %s", err, RSTRING(filepath)->ptr);
|
86
86
|
|
87
87
|
RMOVIE(obj)->movie = *movie;
|
88
88
|
|
@@ -100,7 +100,7 @@ static VALUE movie_load_from_file(VALUE obj, VALUE filepath)
|
|
100
100
|
static VALUE movie_load_empty(VALUE obj)
|
101
101
|
{
|
102
102
|
if (MOVIE(obj)) {
|
103
|
-
rb_raise(
|
103
|
+
rb_raise(eQuickTime, "Movie has already been loaded.");
|
104
104
|
} else {
|
105
105
|
RMOVIE(obj)->movie = NewMovie(0);
|
106
106
|
return obj;
|
@@ -333,7 +333,7 @@ static VALUE movie_flatten(VALUE obj, VALUE filepath)
|
|
333
333
|
|
334
334
|
err = NativePathNameToFSSpec(RSTRING(filepath)->ptr, &fs, 0);
|
335
335
|
if (err != fnfErr)
|
336
|
-
rb_raise(
|
336
|
+
rb_raise(eQuickTime, "Error %d occurred while opening file for export at %s", err, RSTRING(filepath)->ptr);
|
337
337
|
|
338
338
|
// TODO make these flags settable through an options hash
|
339
339
|
RMOVIE(new_movie_obj)->movie = FlattenMovieData(MOVIE(obj),
|
@@ -364,26 +364,26 @@ static VALUE movie_export_pict(VALUE obj, VALUE filepath, VALUE frame_time)
|
|
364
364
|
|
365
365
|
err = NativePathNameToFSSpec(RSTRING(filepath)->ptr, &fs, 0);
|
366
366
|
if (err != fnfErr)
|
367
|
-
rb_raise(
|
367
|
+
rb_raise(eQuickTime, "Error %d occurred while opening file for export at %s.", err, RSTRING(filepath)->ptr);
|
368
368
|
|
369
369
|
// Convert the picture handle into a PICT file (still in a handle)
|
370
370
|
// by adding a 512-byte header to the start.
|
371
371
|
handle = NewHandleClear(512);
|
372
372
|
err = HandAndHand((Handle)picture, handle);
|
373
373
|
if (err != noErr)
|
374
|
-
rb_raise(
|
374
|
+
rb_raise(eQuickTime, "Error %d occurred while converting handle for pict export %s.", err, RSTRING(filepath)->ptr);
|
375
375
|
|
376
376
|
err = OpenADefaultComponent(GraphicsImporterComponentType, kQTFileTypePicture, &component);
|
377
377
|
if (err != noErr)
|
378
|
-
rb_raise(
|
378
|
+
rb_raise(eQuickTime, "Error %d occurred while opening picture component for %s.", err, RSTRING(filepath)->ptr);
|
379
379
|
|
380
380
|
err = GraphicsImportSetDataHandle(component, handle);
|
381
381
|
if (err != noErr)
|
382
|
-
rb_raise(
|
382
|
+
rb_raise(eQuickTime, "Error %d occurred while setting graphics importer data handle for %s.", err, RSTRING(filepath)->ptr);
|
383
383
|
|
384
384
|
err = GraphicsImportExportImageFile(component, 0, 0, &fs, smSystemScript);
|
385
385
|
if (err != noErr)
|
386
|
-
rb_raise(
|
386
|
+
rb_raise(eQuickTime, "Error %d occurred while exporting pict to file %s.", err, RSTRING(filepath)->ptr);
|
387
387
|
|
388
388
|
CloseComponent(component);
|
389
389
|
DisposeHandle(handle);
|
@@ -413,11 +413,27 @@ static VALUE movie_set_poster_time(VALUE obj, VALUE seconds)
|
|
413
413
|
return Qnil;
|
414
414
|
}
|
415
415
|
|
416
|
+
/*
|
417
|
+
call-seq: new_track(width, height) -> track
|
418
|
+
|
419
|
+
Creates a new track with the given width/height on the movie and returns it.
|
420
|
+
|
421
|
+
This method is generally not called directly. Instead you should call
|
422
|
+
new_video_track or new_audio_track. If you call method make sure to
|
423
|
+
call new_media on track to setup the media.
|
424
|
+
*/
|
425
|
+
static VALUE movie_new_track(VALUE obj, VALUE width, VALUE height)
|
426
|
+
{
|
427
|
+
VALUE track_obj = rb_obj_alloc(cTrack);
|
428
|
+
RTRACK(track_obj)->track = NewMovieTrack(MOVIE(obj), NUM2INT(width), NUM2INT(height), kFullVolume);
|
429
|
+
return track_obj;
|
430
|
+
}
|
431
|
+
|
416
432
|
void Init_quicktime_movie()
|
417
433
|
{
|
418
|
-
VALUE
|
419
|
-
|
420
|
-
cMovie = rb_define_class_under(
|
434
|
+
VALUE mQuickTime;
|
435
|
+
mQuickTime = rb_define_module("QuickTime");
|
436
|
+
cMovie = rb_define_class_under(mQuickTime, "Movie", rb_cObject);
|
421
437
|
rb_define_alloc_func(cMovie, movie_new);
|
422
438
|
rb_define_method(cMovie, "load_from_file", movie_load_from_file, 1);
|
423
439
|
rb_define_method(cMovie, "load_empty", movie_load_empty, 0);
|
@@ -438,4 +454,5 @@ void Init_quicktime_movie()
|
|
438
454
|
rb_define_method(cMovie, "dispose", movie_dispose, 0);
|
439
455
|
rb_define_method(cMovie, "poster_time", movie_get_poster_time, 0);
|
440
456
|
rb_define_method(cMovie, "poster_time=", movie_set_poster_time, 1);
|
457
|
+
rb_define_method(cMovie, "new_track", movie_new_track, 2);
|
441
458
|
}
|
data/ext/rmov_ext.c
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
#include "rmov_ext.h"
|
2
2
|
|
3
|
-
VALUE
|
3
|
+
VALUE eQuickTime;
|
4
4
|
|
5
5
|
void Init_rmov_ext()
|
6
6
|
{
|
7
|
-
VALUE
|
7
|
+
VALUE mQuickTime;
|
8
8
|
|
9
9
|
EnterMovies(); // Enables the QuickTime framework
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
mQuickTime = rb_define_module("QuickTime");
|
12
|
+
eQuickTime = rb_define_class_under(mQuickTime, "Error", rb_eStandardError);
|
13
13
|
Init_quicktime_movie();
|
14
14
|
Init_quicktime_track();
|
15
15
|
Init_quicktime_exporter();
|
data/ext/rmov_ext.h
CHANGED
data/ext/track.c
CHANGED
@@ -32,7 +32,7 @@ static VALUE track_load(VALUE obj, VALUE movie_obj, VALUE index_obj)
|
|
32
32
|
{
|
33
33
|
RTRACK(obj)->track = GetMovieIndTrack(MOVIE(movie_obj), NUM2INT(index_obj));
|
34
34
|
if (!RTRACK(obj)->track)
|
35
|
-
rb_raise(
|
35
|
+
rb_raise(eQuickTime, "Unable to fetch track for movie at index %d", NUM2INT(index_obj));
|
36
36
|
|
37
37
|
return obj;
|
38
38
|
}
|
@@ -83,6 +83,8 @@ static VALUE track_media_type(VALUE obj)
|
|
83
83
|
return ID2SYM(rb_intern("audio"));
|
84
84
|
} else if (media_type == VideoMediaType) {
|
85
85
|
return ID2SYM(rb_intern("video"));
|
86
|
+
} else if (media_type == TextMediaType) {
|
87
|
+
return ID2SYM(rb_intern("text"));
|
86
88
|
} else {
|
87
89
|
return Qnil;
|
88
90
|
}
|
@@ -188,12 +190,53 @@ static VALUE track_set_offset(VALUE obj, VALUE seconds)
|
|
188
190
|
return Qnil;
|
189
191
|
}
|
190
192
|
|
193
|
+
/*
|
194
|
+
call-seq: new_video_media
|
195
|
+
|
196
|
+
Creates a new video media for this track.
|
197
|
+
|
198
|
+
Generally this method is not called directly, instead you can make a
|
199
|
+
new video track using Movie#new_video_track.
|
200
|
+
*/
|
201
|
+
static VALUE track_new_video_media(VALUE obj)
|
202
|
+
{
|
203
|
+
NewTrackMedia(TRACK(obj), VideoMediaType, 600, 0, 0);
|
204
|
+
return obj;
|
205
|
+
}
|
206
|
+
|
207
|
+
/*
|
208
|
+
call-seq: new_audio_media
|
209
|
+
|
210
|
+
Creates a new audio media for this track.
|
211
|
+
|
212
|
+
Generally this method is not called directly, instead you can make a
|
213
|
+
new audio track using Movie#new_audio_track.
|
214
|
+
*/
|
215
|
+
static VALUE track_new_audio_media(VALUE obj)
|
216
|
+
{
|
217
|
+
NewTrackMedia(TRACK(obj), SoundMediaType, 44100, 0, 0);
|
218
|
+
return obj;
|
219
|
+
}
|
220
|
+
|
221
|
+
/*
|
222
|
+
call-seq: new_text_media
|
223
|
+
|
224
|
+
Creates a new text media for this track.
|
225
|
+
|
226
|
+
Generally this method is not called directly, instead you can make a
|
227
|
+
new text track using Movie#new_text_track.
|
228
|
+
*/
|
229
|
+
static VALUE track_new_text_media(VALUE obj)
|
230
|
+
{
|
231
|
+
NewTrackMedia(TRACK(obj), TextMediaType, 600, 0, 0);
|
232
|
+
return obj;
|
233
|
+
}
|
191
234
|
|
192
235
|
void Init_quicktime_track()
|
193
236
|
{
|
194
|
-
VALUE
|
195
|
-
|
196
|
-
cTrack = rb_define_class_under(
|
237
|
+
VALUE mQuickTime;
|
238
|
+
mQuickTime = rb_define_module("QuickTime");
|
239
|
+
cTrack = rb_define_class_under(mQuickTime, "Track", rb_cObject);
|
197
240
|
rb_define_alloc_func(cTrack, track_new);
|
198
241
|
rb_define_method(cTrack, "load_from_movie", track_load, 2);
|
199
242
|
rb_define_method(cTrack, "raw_duration", track_raw_duration, 0);
|
@@ -209,4 +252,7 @@ void Init_quicktime_track()
|
|
209
252
|
rb_define_method(cTrack, "volume=", track_set_volume, 1);
|
210
253
|
rb_define_method(cTrack, "offset", track_get_offset, 0);
|
211
254
|
rb_define_method(cTrack, "offset=", track_set_offset, 1);
|
255
|
+
rb_define_method(cTrack, "new_video_media", track_new_video_media, 0);
|
256
|
+
rb_define_method(cTrack, "new_audio_media", track_new_audio_media, 0);
|
257
|
+
rb_define_method(cTrack, "new_text_media", track_new_text_media, 0);
|
212
258
|
}
|
data/lib/quicktime/exporter.rb
CHANGED
data/lib/quicktime/movie.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module QuickTime
|
2
2
|
# see ext/movie.c for additional methods
|
3
3
|
class Movie
|
4
4
|
# Opens a movie at filepath.
|
@@ -44,6 +44,11 @@ module Quicktime
|
|
44
44
|
tracks.select { |t| t.video? }
|
45
45
|
end
|
46
46
|
|
47
|
+
# Returns an array of text tracks in this movie.
|
48
|
+
def text_tracks
|
49
|
+
tracks.select { |t| t.text? }
|
50
|
+
end
|
51
|
+
|
47
52
|
# Returns an Exporter instance for this movie.
|
48
53
|
def exporter
|
49
54
|
Exporter.new(self)
|
@@ -53,5 +58,26 @@ module Quicktime
|
|
53
58
|
def export(*args, &block)
|
54
59
|
exporter.export(*args, &block)
|
55
60
|
end
|
61
|
+
|
62
|
+
# Creates a new video track with given width/height on movie and returns it.
|
63
|
+
def new_video_track(width, height)
|
64
|
+
track = new_track(width, height)
|
65
|
+
track.new_video_media
|
66
|
+
track
|
67
|
+
end
|
68
|
+
|
69
|
+
# Creates a new audio track with given width/height on movie and returns it.
|
70
|
+
def new_audio_track(width, height)
|
71
|
+
track = new_track(width, height)
|
72
|
+
track.new_audio_media
|
73
|
+
track
|
74
|
+
end
|
75
|
+
|
76
|
+
# Creates a new text track with given width/height on movie and returns it.
|
77
|
+
def new_text_track(width, height)
|
78
|
+
track = new_track(width, height)
|
79
|
+
track.new_text_media
|
80
|
+
track
|
81
|
+
end
|
56
82
|
end
|
57
83
|
end
|
data/lib/quicktime/track.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module QuickTime
|
2
2
|
# see ext/track.c for additional methods
|
3
3
|
class Track
|
4
4
|
# Returns the length of this track in seconds
|
@@ -21,5 +21,10 @@ module Quicktime
|
|
21
21
|
def video?
|
22
22
|
media_type == :video
|
23
23
|
end
|
24
|
+
|
25
|
+
# Returns true/false depending on if track is a text track.
|
26
|
+
def text?
|
27
|
+
media_type == :text
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
data/lib/rmov.rb
CHANGED
data/rmov.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Rmov-0.1.
|
2
|
+
# Gem::Specification for Rmov-0.1.3
|
3
3
|
# Originally generated by Echoe
|
4
4
|
|
5
5
|
--- !ruby/object:Gem::Specification
|
6
6
|
name: rmov
|
7
7
|
version: !ruby/object:Gem::Version
|
8
|
-
version: 0.1.
|
8
|
+
version: 0.1.3
|
9
9
|
platform: ruby
|
10
10
|
authors:
|
11
11
|
- Ryan Bates
|
Binary file
|
@@ -1,18 +1,18 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe QuickTime::Exporter do
|
4
4
|
it "should raise error when saving with no settings" do
|
5
|
-
lambda {
|
5
|
+
lambda { QuickTime::Exporter.new(nil).save_settings('foo') }.should raise_error(QuickTime::Error)
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should raise error when atempting to load no file" do
|
9
|
-
lambda {
|
9
|
+
lambda { QuickTime::Exporter.new(nil).load_settings('foo/bar/baz') }.should raise_error(QuickTime::Error)
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "loaded settings.st" do
|
13
13
|
before(:each) do
|
14
14
|
@load_path = File.dirname(__FILE__) + '/../fixtures/settings.st'
|
15
|
-
@exporter =
|
15
|
+
@exporter = QuickTime::Exporter.new(nil)
|
16
16
|
@exporter.load_settings(@load_path)
|
17
17
|
end
|
18
18
|
|
@@ -23,7 +23,7 @@ describe Quicktime::Exporter do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should complain when attempting to save to an invalid file" do
|
26
|
-
lambda { @exporter.save_settings('foo/bar/baz') }.should raise_error(
|
26
|
+
lambda { @exporter.save_settings('foo/bar/baz') }.should raise_error(QuickTime::Error)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe QuickTime::Movie do
|
4
4
|
it "should raise an exception when attempting to open a nonexisting file" do
|
5
|
-
lambda {
|
5
|
+
lambda { QuickTime::Movie.open('foo.mov') }.should raise_error(QuickTime::Error)
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should raise an exception when attempting to open a non movie file" do
|
9
|
-
lambda {
|
9
|
+
lambda { QuickTime::Movie.open(__FILE__) }.should raise_error(QuickTime::Error)
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "example.mov" do
|
13
13
|
before(:each) do
|
14
|
-
@movie =
|
14
|
+
@movie = QuickTime::Movie.open(File.dirname(__FILE__) + '/../fixtures/example.mov')
|
15
15
|
end
|
16
16
|
|
17
17
|
it "duration should be 3.1 seconds" do
|
@@ -31,7 +31,7 @@ describe Quicktime::Movie do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should have 2 tracks" do
|
34
|
-
@movie.tracks.map { |t| t.class }.should == [
|
34
|
+
@movie.tracks.map { |t| t.class }.should == [QuickTime::Track, QuickTime::Track]
|
35
35
|
@movie.tracks.map { |t| t.id }.should == [1, 2]
|
36
36
|
end
|
37
37
|
|
@@ -43,7 +43,7 @@ describe Quicktime::Movie do
|
|
43
43
|
@movie.export(path) { |p| progress = p }
|
44
44
|
progress.should == 1.0
|
45
45
|
|
46
|
-
exported_movie =
|
46
|
+
exported_movie = QuickTime::Movie.open(path)
|
47
47
|
exported_movie.duration.should == @movie.duration
|
48
48
|
exported_movie.tracks.size == @movie.tracks.size
|
49
49
|
end
|
@@ -57,19 +57,19 @@ describe Quicktime::Movie do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it "composite should add another movie's tracks at a given location" do
|
60
|
-
m2 =
|
60
|
+
m2 = QuickTime::Movie.open(File.dirname(__FILE__) + '/../fixtures/example.mov')
|
61
61
|
@movie.composite_movie(m2, 2)
|
62
62
|
@movie.duration.should == 5.1
|
63
63
|
end
|
64
64
|
|
65
65
|
it "insert should insert another movie's tracks at a given location" do
|
66
|
-
m2 =
|
66
|
+
m2 = QuickTime::Movie.open(File.dirname(__FILE__) + '/../fixtures/example.mov')
|
67
67
|
@movie.insert_movie(m2, 2)
|
68
68
|
@movie.duration.should == 6.2
|
69
69
|
end
|
70
70
|
|
71
71
|
it "append_movie should insert movie at the end" do
|
72
|
-
m2 =
|
72
|
+
m2 = QuickTime::Movie.open(File.dirname(__FILE__) + '/../fixtures/example.mov')
|
73
73
|
@movie.append_movie(m2)
|
74
74
|
@movie.duration.should == 6.2
|
75
75
|
end
|
@@ -93,7 +93,7 @@ describe Quicktime::Movie do
|
|
93
93
|
|
94
94
|
it "should have an exporter with this movie" do
|
95
95
|
exporter = @movie.exporter
|
96
|
-
exporter.should be_kind_of(
|
96
|
+
exporter.should be_kind_of(QuickTime::Exporter)
|
97
97
|
exporter.movie.should == @movie
|
98
98
|
end
|
99
99
|
|
@@ -113,7 +113,7 @@ describe Quicktime::Movie do
|
|
113
113
|
path = File.dirname(__FILE__) + '/../output/flattened_example.mov'
|
114
114
|
File.delete(path) rescue nil
|
115
115
|
@movie.flatten(path)
|
116
|
-
mov =
|
116
|
+
mov = QuickTime::Movie.open(path)
|
117
117
|
mov.duration.should == 3.1
|
118
118
|
end
|
119
119
|
|
@@ -135,7 +135,7 @@ describe Quicktime::Movie do
|
|
135
135
|
|
136
136
|
describe "empty movie" do
|
137
137
|
before(:each) do
|
138
|
-
@movie =
|
138
|
+
@movie = QuickTime::Movie.empty
|
139
139
|
end
|
140
140
|
|
141
141
|
it "should have 0 duration" do
|
@@ -143,14 +143,41 @@ describe Quicktime::Movie do
|
|
143
143
|
end
|
144
144
|
|
145
145
|
it "should be able to append an existing movie" do
|
146
|
-
m2 =
|
146
|
+
m2 = QuickTime::Movie.open(File.dirname(__FILE__) + '/../fixtures/example.mov')
|
147
147
|
@movie.append_movie(m2)
|
148
148
|
@movie.duration.should == 3.1
|
149
149
|
end
|
150
150
|
|
151
151
|
it "should raise MovieAlreadyLoaded exception when attempting to load it again" do
|
152
|
-
lambda { @movie.load_empty }.should raise_error(
|
153
|
-
lambda { @movie.load_from_file('example.mov') }.should raise_error(
|
152
|
+
lambda { @movie.load_empty }.should raise_error(QuickTime::Error)
|
153
|
+
lambda { @movie.load_from_file('example.mov') }.should raise_error(QuickTime::Error)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should be able to create a new track" do
|
157
|
+
track = @movie.new_track(300, 500)
|
158
|
+
track.should be_kind_of(QuickTime::Track)
|
159
|
+
@movie.tracks.should have(1).record
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should be able to create a new video track" do
|
163
|
+
track = @movie.new_video_track(300, 500)
|
164
|
+
track.should be_kind_of(QuickTime::Track)
|
165
|
+
track.should be_video
|
166
|
+
@movie.video_tracks.should have(1).record
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should be able to create a new audio track" do
|
170
|
+
track = @movie.new_audio_track(300, 500)
|
171
|
+
track.should be_kind_of(QuickTime::Track)
|
172
|
+
track.should be_audio
|
173
|
+
@movie.audio_tracks.should have(1).record
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should be able to create a new text track" do
|
177
|
+
track = @movie.new_text_track(300, 500)
|
178
|
+
track.should be_kind_of(QuickTime::Track)
|
179
|
+
track.should be_text
|
180
|
+
@movie.text_tracks.should have(1).record
|
154
181
|
end
|
155
182
|
end
|
156
183
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe QuickTime::Track do
|
4
4
|
describe "example.mov" do
|
5
5
|
before(:each) do
|
6
|
-
@movie =
|
6
|
+
@movie = QuickTime::Movie.open(File.dirname(__FILE__) + '/../fixtures/example.mov')
|
7
7
|
end
|
8
8
|
|
9
9
|
describe "example.mov video track" do
|