ffruby 0.0.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +504 -0
- data/README.rdoc +44 -0
- data/Rakefile +40 -139
- data/VERSION +1 -0
- data/ext/ffruby/extconf.rb +20 -7
- data/ext/ffruby/ffruby.c +41 -6
- data/ext/ffruby/ffruby.h +34 -0
- data/ext/ffruby/ffrubyfile.c +56 -31
- data/ext/ffruby/ffrubystream.c +78 -52
- metadata +59 -46
- data/README +0 -1
- data/lib/ffruby/version.rb +0 -9
data/ext/ffruby/ffrubystream.c
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c) 2007 James Le Cuirot
|
2
|
+
* Copyright (c) 2007-2010 James Le Cuirot
|
3
3
|
*
|
4
4
|
* This file is part of FFruby.
|
5
5
|
*
|
@@ -18,36 +18,38 @@
|
|
18
18
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
19
|
*/
|
20
20
|
|
21
|
-
#
|
22
|
-
#include <ruby.h>
|
23
|
-
#include <ffmpeg/avformat.h>
|
24
|
-
#include <ffmpeg/avcodec.h>
|
21
|
+
#include "ffruby.h"
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
/* Satisfy stupid RDoc. This hopefully gets optimised away. */
|
24
|
+
static void rdoc() { mFFruby = rb_define_module("FFruby"); }
|
25
|
+
|
26
|
+
static VALUE ffrs_alloc(VALUE klass)
|
27
|
+
{
|
28
|
+
return Data_Wrap_Struct(klass, 0, 0, NULL);
|
29
|
+
}
|
30
|
+
|
31
|
+
static AVStream* ffrs_get_stream(VALUE self)
|
32
|
+
{
|
33
|
+
AVStream *stream;
|
34
|
+
Data_Get_Struct(self, AVStream, stream);
|
35
|
+
return stream;
|
36
|
+
}
|
29
37
|
|
30
38
|
static void ffrs_open_codec(AVStream* stream)
|
31
39
|
{
|
32
40
|
AVCodec *codec;
|
33
|
-
|
41
|
+
|
34
42
|
if (stream->codec->codec == NULL)
|
35
43
|
{
|
36
44
|
if ((codec = avcodec_find_decoder(stream->codec->codec_id)) == NULL)
|
37
45
|
rb_raise(rb_eIOError, "Cannot find codec!");
|
38
|
-
|
46
|
+
|
39
47
|
if (avcodec_open(stream->codec, codec) < 0)
|
40
48
|
rb_raise(rb_eIOError, "Cannot open codec!");
|
41
49
|
}
|
42
50
|
}
|
43
51
|
|
44
|
-
|
45
|
-
{
|
46
|
-
AVStream *stream;
|
47
|
-
Data_Get_Struct(self, AVStream, stream);
|
48
|
-
return stream;
|
49
|
-
}
|
50
|
-
|
52
|
+
/* Returns the codec name. */
|
51
53
|
static VALUE ffrs_codec(VALUE self)
|
52
54
|
{
|
53
55
|
AVStream *stream = ffrs_get_stream(self);
|
@@ -55,142 +57,166 @@ static VALUE ffrs_codec(VALUE self)
|
|
55
57
|
return rb_str_new2(stream->codec->codec->name);
|
56
58
|
}
|
57
59
|
|
60
|
+
/* Returns the FourCC tag. */
|
58
61
|
static VALUE ffrs_tag(VALUE self)
|
59
62
|
{
|
60
63
|
char tag[4];
|
61
64
|
signed int i, j;
|
62
65
|
AVStream *stream = ffrs_get_stream(self);
|
63
|
-
|
66
|
+
|
64
67
|
i = stream->codec->codec_tag;
|
65
|
-
|
68
|
+
|
66
69
|
for (j = 3; j >= 0; j -= 1)
|
67
70
|
{
|
68
71
|
tag[j] = i >> (j * 8);
|
69
72
|
i -= tag[j] << (j * 8);
|
70
73
|
}
|
71
|
-
|
74
|
+
|
72
75
|
for (j = 3; j >= 0; j -= 1)
|
73
76
|
{
|
74
77
|
if (tag[j] != '\0')
|
75
78
|
break;
|
76
79
|
}
|
77
|
-
|
80
|
+
|
78
81
|
return rb_str_new(tag, j + 1);
|
79
82
|
}
|
80
83
|
|
84
|
+
/* Returns the bit rate. */
|
81
85
|
static VALUE ffrs_bit_rate(VALUE self)
|
82
86
|
{
|
83
87
|
AVStream *stream = ffrs_get_stream(self);
|
84
88
|
return INT2NUM(stream->codec->bit_rate);
|
85
89
|
}
|
86
90
|
|
87
|
-
|
88
|
-
{
|
89
|
-
return Data_Wrap_Struct(klass, 0, 0, NULL);
|
90
|
-
}
|
91
|
-
|
92
|
-
static VALUE ffrs_initialize(VALUE self, VALUE file, VALUE index)
|
93
|
-
{
|
94
|
-
AVFormatContext *fmt;
|
95
|
-
AVStream *stream;
|
96
|
-
unsigned int i = FIX2UINT(index);
|
97
|
-
|
98
|
-
Data_Get_Struct(file, AVFormatContext, fmt);
|
99
|
-
|
100
|
-
if (i < 0 || i >= fmt->nb_streams)
|
101
|
-
rb_raise(rb_eIndexError, "Stream index out of range!");
|
102
|
-
|
103
|
-
DATA_PTR(self) = fmt->streams[i];
|
104
|
-
stream = ffrs_get_stream(self);
|
105
|
-
|
106
|
-
return self;
|
107
|
-
}
|
108
|
-
|
91
|
+
/* Returns the frame width. */
|
109
92
|
static VALUE ffrvs_width(VALUE self)
|
110
93
|
{
|
111
94
|
AVStream *stream = ffrs_get_stream(self);
|
112
95
|
return INT2NUM(stream->codec->width);
|
113
96
|
}
|
114
97
|
|
98
|
+
/* Returns the frame height. */
|
115
99
|
static VALUE ffrvs_height(VALUE self)
|
116
100
|
{
|
117
101
|
AVStream *stream = ffrs_get_stream(self);
|
118
102
|
return INT2NUM(stream->codec->height);
|
119
103
|
}
|
120
104
|
|
105
|
+
/* Returns the frame aspect ratio. */
|
121
106
|
static VALUE ffrvs_frame_aspect_ratio(VALUE self)
|
122
107
|
{
|
123
108
|
AVStream *stream = ffrs_get_stream(self);
|
124
|
-
|
109
|
+
|
125
110
|
if (stream->codec->width == 0 || stream->codec->height == 0)
|
126
111
|
return Qnil;
|
127
112
|
else
|
128
113
|
return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->codec->width), INT2NUM(stream->codec->height));
|
129
114
|
}
|
130
115
|
|
116
|
+
/* Returns the sample aspect ratio. */
|
131
117
|
static VALUE ffrvs_sample_aspect_ratio(VALUE self)
|
132
118
|
{
|
133
119
|
AVStream *stream = ffrs_get_stream(self);
|
134
|
-
|
120
|
+
|
135
121
|
if (stream->codec->sample_aspect_ratio.den == 0 || stream->codec->sample_aspect_ratio.num == 0)
|
136
122
|
return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2FIX(1), INT2FIX(1));
|
137
123
|
else
|
138
124
|
return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->codec->sample_aspect_ratio.num), INT2NUM(stream->codec->sample_aspect_ratio.den));
|
139
125
|
}
|
140
126
|
|
127
|
+
/* Returns the real aspect ratio. */
|
141
128
|
static VALUE ffrvs_real_aspect_ratio(VALUE self)
|
142
129
|
{
|
143
130
|
VALUE x, y;
|
144
131
|
x = ffrvs_frame_aspect_ratio(self);
|
145
132
|
y = ffrvs_sample_aspect_ratio(self);
|
146
|
-
|
133
|
+
|
147
134
|
if (x == Qnil || y == Qnil)
|
148
135
|
return Qnil;
|
149
136
|
else
|
150
137
|
return rb_funcall(x, rb_intern("*"), 1, y);
|
151
138
|
}
|
152
139
|
|
140
|
+
/* Returns the frame rate as a Rational. */
|
153
141
|
static VALUE ffrvs_frame_rate(VALUE self)
|
154
142
|
{
|
155
143
|
AVStream *stream = ffrs_get_stream(self);
|
156
144
|
ffrs_open_codec(stream);
|
157
|
-
|
145
|
+
|
158
146
|
if (stream->r_frame_rate.den && stream->r_frame_rate.num)
|
159
147
|
return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->r_frame_rate.num), INT2NUM(stream->r_frame_rate.den));
|
160
148
|
else
|
161
149
|
return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->codec->time_base.den), INT2NUM(stream->codec->time_base.num));
|
162
150
|
}
|
163
151
|
|
152
|
+
/* Returns the number of audio channels. */
|
164
153
|
static VALUE ffras_channels(VALUE self)
|
165
154
|
{
|
166
155
|
AVStream *stream = ffrs_get_stream(self);
|
167
156
|
return INT2FIX(stream->codec->channels);
|
168
157
|
}
|
169
158
|
|
159
|
+
/* Returns the sample rate. */
|
170
160
|
static VALUE ffras_sample_rate(VALUE self)
|
171
161
|
{
|
172
162
|
AVStream *stream = ffrs_get_stream(self);
|
173
163
|
return INT2NUM(stream->codec->sample_rate);
|
174
164
|
}
|
175
165
|
|
166
|
+
/* call-seq:
|
167
|
+
* new(file, index) -> FFruby::Stream
|
168
|
+
*
|
169
|
+
* Creates an FFruby::Stream instance using the given FFruby::File and
|
170
|
+
* stream index. This should usually only be called by FFruby
|
171
|
+
* itself. Access stream instances using FFruby::File#streams
|
172
|
+
* instead. */
|
173
|
+
static VALUE ffrs_initialize(VALUE self, VALUE file, VALUE index)
|
174
|
+
{
|
175
|
+
AVFormatContext *fmt;
|
176
|
+
AVStream *stream;
|
177
|
+
unsigned int i = FIX2UINT(index);
|
178
|
+
|
179
|
+
Data_Get_Struct(file, AVFormatContext, fmt);
|
180
|
+
|
181
|
+
if (i < 0 || i >= fmt->nb_streams)
|
182
|
+
rb_raise(rb_eIndexError, "Stream index out of range!");
|
183
|
+
|
184
|
+
DATA_PTR(self) = fmt->streams[i];
|
185
|
+
stream = ffrs_get_stream(self);
|
186
|
+
|
187
|
+
return self;
|
188
|
+
}
|
189
|
+
|
176
190
|
void Init_ffrs()
|
177
191
|
{
|
178
|
-
|
192
|
+
/* Document-class: FFruby::Stream
|
193
|
+
*
|
194
|
+
* An interface to FFmpeg on any type of stream. Provides access
|
195
|
+
* to generic metadata. */
|
196
|
+
cFFrubyStream = rb_define_class_under(mFFruby, "Stream", rb_cObject);
|
179
197
|
rb_define_alloc_func(cFFrubyStream, ffrs_alloc);
|
180
198
|
rb_define_method(cFFrubyStream, "initialize", ffrs_initialize, 2);
|
181
199
|
rb_define_method(cFFrubyStream, "codec", ffrs_codec, 0);
|
182
200
|
rb_define_method(cFFrubyStream, "tag", ffrs_tag, 0);
|
183
201
|
rb_define_method(cFFrubyStream, "bit_rate", ffrs_bit_rate, 0);
|
184
|
-
|
185
|
-
|
202
|
+
|
203
|
+
/* Document-class: FFruby::VideoStream
|
204
|
+
*
|
205
|
+
* An interface to FFmpeg on video streams. Provides access to
|
206
|
+
* video metadata. */
|
207
|
+
cFFrubyVideoStream = rb_define_class_under(mFFruby, "VideoStream", cFFrubyStream);
|
186
208
|
rb_define_method(cFFrubyVideoStream, "width", ffrvs_width, 0);
|
187
209
|
rb_define_method(cFFrubyVideoStream, "height", ffrvs_height, 0);
|
188
210
|
rb_define_method(cFFrubyVideoStream, "frame_aspect_ratio", ffrvs_frame_aspect_ratio, 0);
|
189
211
|
rb_define_method(cFFrubyVideoStream, "sample_aspect_ratio", ffrvs_sample_aspect_ratio, 0);
|
190
212
|
rb_define_method(cFFrubyVideoStream, "real_aspect_ratio", ffrvs_real_aspect_ratio, 0);
|
191
213
|
rb_define_method(cFFrubyVideoStream, "frame_rate", ffrvs_frame_rate, 0);
|
192
|
-
|
193
|
-
|
214
|
+
|
215
|
+
/* Document-class: FFruby::AudioStream
|
216
|
+
*
|
217
|
+
* An interface to FFmpeg on audio streams. Provides access to
|
218
|
+
* audio metadata. */
|
219
|
+
cFFrubyAudioStream = rb_define_class_under(mFFruby, "AudioStream", cFFrubyStream);
|
194
220
|
rb_define_method(cFFrubyAudioStream, "channels", ffras_channels, 0);
|
195
221
|
rb_define_method(cFFrubyAudioStream, "sample_rate", ffras_sample_rate, 0);
|
196
222
|
}
|
metadata
CHANGED
@@ -1,65 +1,78 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4.6
|
3
|
-
specification_version: 2
|
4
2
|
name: ffruby
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- James Le Cuirot
|
15
14
|
autorequire:
|
16
|
-
default_executable:
|
17
15
|
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-24 00:00:00 +00:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: A Ruby interface to FFmpeg's libavformat and libavcodec. It allows you to query metadata from a wide variety of media files through some simple classes.
|
23
|
+
email: chewi@aura-online.co.uk
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions:
|
27
|
+
- ext/ffruby/extconf.rb
|
28
|
+
extra_rdoc_files:
|
29
|
+
- README.rdoc
|
30
|
+
- ext/ffruby/ffruby.c
|
31
|
+
- ext/ffruby/ffrubyfile.c
|
32
|
+
- ext/ffruby/ffrubystream.c
|
33
|
+
files:
|
34
|
+
- LICENSE
|
35
|
+
- README.rdoc
|
36
|
+
- Rakefile
|
37
|
+
- VERSION
|
38
|
+
- ext/ffruby/extconf.rb
|
39
|
+
- ext/ffruby/ffruby.c
|
40
|
+
- ext/ffruby/ffruby.h
|
41
|
+
- ext/ffruby/ffrubyfile.c
|
42
|
+
- ext/ffruby/ffrubystream.c
|
18
43
|
has_rdoc: true
|
44
|
+
homepage: http://rubyforge.org/projects/ffruby/
|
45
|
+
licenses:
|
46
|
+
- LGPL-2.1
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options:
|
49
|
+
- --charset=UTF-8
|
50
|
+
require_paths:
|
51
|
+
- lib
|
19
52
|
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
20
54
|
requirements:
|
21
55
|
- - ">="
|
22
56
|
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
23
60
|
version: "0"
|
24
|
-
version:
|
25
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
26
63
|
requirements:
|
27
64
|
- - ">="
|
28
65
|
- !ruby/object:Gem::Version
|
66
|
+
hash: 3
|
67
|
+
segments:
|
68
|
+
- 0
|
29
69
|
version: "0"
|
30
|
-
|
31
|
-
|
70
|
+
requirements:
|
71
|
+
- FFmpeg libraries and also development headers if building.
|
72
|
+
rubyforge_project: ffruby
|
73
|
+
rubygems_version: 1.3.7
|
32
74
|
signing_key:
|
33
|
-
|
34
|
-
|
35
|
-
post_install_message:
|
36
|
-
authors:
|
37
|
-
- "ffruby: James Le Cuirot, gem: Wayne E. Seguin"
|
38
|
-
files:
|
39
|
-
- README
|
40
|
-
- Rakefile
|
41
|
-
- lib/ffruby
|
42
|
-
- lib/ffruby/version.rb
|
43
|
-
- ext/ffruby/ffruby.c
|
44
|
-
- ext/ffruby/ffrubyfile.c
|
45
|
-
- ext/ffruby/ffrubystream.c
|
46
|
-
- ext/ffruby/extconf.rb
|
75
|
+
specification_version: 3
|
76
|
+
summary: A Ruby interface to FFmpeg's libavformat and libavcodec.
|
47
77
|
test_files: []
|
48
78
|
|
49
|
-
rdoc_options:
|
50
|
-
- --quiet
|
51
|
-
- --title
|
52
|
-
- FFruby Reference
|
53
|
-
- --main
|
54
|
-
- README
|
55
|
-
- --inline-source
|
56
|
-
extra_rdoc_files:
|
57
|
-
- README
|
58
|
-
executables: []
|
59
|
-
|
60
|
-
extensions:
|
61
|
-
- ext/ffruby/extconf.rb
|
62
|
-
requirements: []
|
63
|
-
|
64
|
-
dependencies: []
|
65
|
-
|
data/README
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
README
|