ffruby 0.0.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/README ADDED
@@ -0,0 +1 @@
1
+ README
data/Rakefile ADDED
@@ -0,0 +1,147 @@
1
+ require "rake"
2
+ require "rake/clean"
3
+ require "rake/gempackagetask"
4
+ require "rake/rdoctask"
5
+ require "rake/testtask"
6
+ require "fileutils"
7
+ require "yaml"
8
+ include FileUtils
9
+ require "lib/ffruby/version"
10
+
11
+ GEM_NAME = "ffruby"
12
+ REV = nil
13
+
14
+ GEM_VERSION = FFruby::VERSION::STRING + (REV ? ".#{REV}" : "")
15
+ CLEAN.include [
16
+ "ext/ffruby/*.{bundle,so,obj,pdb,lib,def,exp}",
17
+ "ext/ffruby/Makefile",
18
+ "**/.*.sw?",
19
+ "*.gem",
20
+ ".config"
21
+ ]
22
+ RDOC_OPTS = ["--quiet", "--title", "FFruby Reference", "--main", "README", "--inline-source"]
23
+
24
+ @config_file = "~/.rubyforge/user-config.yml"
25
+ @config = nil
26
+ def rubyforge_username
27
+ unless @config
28
+ begin
29
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
30
+ rescue
31
+ puts <<-EOS
32
+ ERROR: No rubyforge config file found: #{@config_file}"
33
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
34
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
35
+ EOS
36
+ exit
37
+ end
38
+ end
39
+ @rubyforge_username ||= @config["username"]
40
+ end
41
+
42
+ desc "Does a full compile, test run"
43
+ task :default => [:compile, :test]
44
+
45
+ desc "Compiles all extensions"
46
+ task :compile => [:ffruby] do
47
+ if Dir.glob(File.join("lib","ffruby*.*")).length == 0
48
+ STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
49
+ STDERR.puts "Gem actually failed to build. Your system is"
50
+ STDERR.puts "NOT configured properly to build ffruby."
51
+ STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
52
+ exit(1)
53
+ end
54
+ end
55
+
56
+ desc "Packages up FFruby."
57
+ task :package => [:clean]
58
+
59
+ desc "Releases packages for all FFruby packages and platforms."
60
+ task :release => [:package]
61
+
62
+ desc "Run all the tests"
63
+ Rake::TestTask.new do | test_task |
64
+ test_task.libs << "test"
65
+ test_task.test_files = FileList["test/test_*.rb"]
66
+ test_task.verbose = true
67
+ end
68
+
69
+ Rake::RDocTask.new do | rdoc |
70
+ rdoc.rdoc_dir = "doc/rdoc"
71
+ rdoc.options += RDOC_OPTS
72
+ rdoc.main = "README"
73
+ rdoc.rdoc_files.add ["README", "lib/**/*.rb"]
74
+ end
75
+
76
+ spec =
77
+ Gem::Specification.new do | specification |
78
+ specification.name = GEM_NAME
79
+ specification.version = GEM_VERSION
80
+ specification.platform = Gem::Platform::RUBY
81
+ specification.has_rdoc = true
82
+ specification.rdoc_options += RDOC_OPTS
83
+ specification.extra_rdoc_files = ["README"]
84
+ specification.summary = "a library that does something with media files!"
85
+ specification.description = specification.summary
86
+ specification.author = "ffruby: James Le Cuirot, gem: Wayne E. Seguin"
87
+ specification.email = "wayneeseguin at gmail dot com"
88
+ specification.homepage = "ffruby.rubyforge.org"
89
+
90
+ specification.files = %w(README Rakefile) +
91
+ Dir.glob("{bin,doc,test,lib,extras}/**/*") +
92
+ Dir.glob("ext/**/*.{h,c,rb,rl}") +
93
+ %w[ext/ffruby/ffruby.c] # needed because it's generated later
94
+
95
+ specification.require_path = "lib"
96
+ specification.extensions = FileList["ext/**/extconf.rb"].to_a
97
+ specification.bindir = "bin"
98
+ end
99
+
100
+ Rake::GemPackageTask.new(spec) do | package |
101
+ package.need_tar = true
102
+ package.gem_spec = spec
103
+ end
104
+
105
+ extension = "ffruby"
106
+ ext = "ext/ffruby"
107
+ ext_so = "#{ext}/#{extension}.#{Config::CONFIG["DLEXT"]}"
108
+ ext_files = FileList[
109
+ "#{ext}/*.c",
110
+ "#{ext}/*.h",
111
+ "#{ext}/*.rl",
112
+ "#{ext}/extconf.rb",
113
+ "#{ext}/Makefile",
114
+ "lib"
115
+ ]
116
+
117
+ task "lib" do
118
+ directory "lib"
119
+ end
120
+
121
+ desc "Builds just the #{extension} extension"
122
+ task extension.to_sym => ["#{ext}/Makefile", ext_so ]
123
+
124
+ file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
125
+ #Dir.chdir(ext) do
126
+ if `uname.a`.match(/Darwin Kernel Version 9\.0\.0:.*i386/)
127
+ ENV["ARCHFLAGS"] = "-arch i386"
128
+ end
129
+ ruby "extconf.rb"
130
+ #end
131
+ end
132
+
133
+ file ext_so => ext_files do
134
+ Dir.chdir(ext) do
135
+ sh(PLATFORM =~ /win32/ ? "nmake" : "make")
136
+ end
137
+ cp ext_so, "lib"
138
+ end
139
+
140
+ task :install do
141
+ sh %{rake package}
142
+ sh %{sudo gem install pkg/#{GEM_NAME}-#{GEM_VERSION}}
143
+ end
144
+
145
+ task :uninstall => [:clean] do
146
+ sh %{sudo gem uninstall #{GEM_NAME}}
147
+ end
@@ -0,0 +1,13 @@
1
+ #!/bin/env ruby
2
+
3
+ require "mkmf"
4
+ dir_config("ffmpeg")
5
+ have_library("avformat")
6
+ have_library("avcodec")
7
+ create_makefile("ffruby")
8
+
9
+ # avcodec is not built for ppc
10
+ if `uname -a`.match(/i386/)
11
+ `sed '1,$s/-arch ppc//' Makefile >> ./Makefile.tmp`
12
+ `mv ./Makefile.tmp Makefile`
13
+ end
@@ -0,0 +1,35 @@
1
+ /*
2
+ * Copyright (c) 2007 James Le Cuirot
3
+ *
4
+ * This file is part of FFruby.
5
+ *
6
+ * FFruby is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * FFruby 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 GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with FFmpeg; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ #define _GNU_SOURCE
22
+ #include <ruby.h>
23
+ #include <ffmpeg/avformat.h>
24
+ #include <ffmpeg/avcodec.h>
25
+
26
+ extern void Init_ffrf();
27
+ extern void Init_ffrs();
28
+
29
+ void Init_ffruby()
30
+ {
31
+ av_register_all();
32
+
33
+ Init_ffrf();
34
+ Init_ffrs();
35
+ }
@@ -0,0 +1,239 @@
1
+ /*
2
+ * Copyright (c) 2007 James Le Cuirot
3
+ *
4
+ * This file is part of FFruby.
5
+ *
6
+ * FFruby is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * FFruby 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 GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with FFmpeg; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ #define _GNU_SOURCE
22
+ #include <ruby.h>
23
+ #include <ffmpeg/avformat.h>
24
+ #include <ffmpeg/avcodec.h>
25
+ #include <stdio.h>
26
+
27
+ VALUE cFFrubyFile;
28
+
29
+ extern VALUE cFFrubyVideoStream;
30
+ extern VALUE cFFrubyAudioStream;
31
+
32
+ static void ffrf_free(AVFormatContext *fmt)
33
+ {
34
+ unsigned int i;
35
+
36
+ if (fmt != NULL)
37
+ {
38
+ for (i = 0; i < fmt->nb_streams; i++)
39
+ {
40
+ if (fmt->streams[i]->codec->codec != NULL)
41
+ avcodec_close(fmt->streams[i]->codec);
42
+ }
43
+
44
+ av_close_input_file(fmt);
45
+ }
46
+ }
47
+
48
+ static AVFormatContext* ffrf_get_fmt(VALUE self)
49
+ {
50
+ AVFormatContext *fmt;
51
+ Data_Get_Struct(self, AVFormatContext, fmt);
52
+ return fmt;
53
+ }
54
+
55
+ static VALUE ffrf_alloc(VALUE klass)
56
+ {
57
+ return Data_Wrap_Struct(klass, 0, ffrf_free, NULL);
58
+ }
59
+
60
+ static VALUE ffrf_title(VALUE self)
61
+ {
62
+ AVFormatContext *fmt = ffrf_get_fmt(self);
63
+ return rb_str_new2(fmt->title);
64
+ }
65
+
66
+ static VALUE ffrf_author(VALUE self)
67
+ {
68
+ AVFormatContext *fmt = ffrf_get_fmt(self);
69
+ return rb_str_new2(fmt->author);
70
+ }
71
+
72
+ static VALUE ffrf_copyright(VALUE self)
73
+ {
74
+ AVFormatContext *fmt = ffrf_get_fmt(self);
75
+ return rb_str_new2(fmt->copyright);
76
+ }
77
+
78
+ static VALUE ffrf_comment(VALUE self)
79
+ {
80
+ AVFormatContext *fmt = ffrf_get_fmt(self);
81
+ return rb_str_new2(fmt->comment);
82
+ }
83
+
84
+ static VALUE ffrf_album(VALUE self)
85
+ {
86
+ AVFormatContext *fmt = ffrf_get_fmt(self);
87
+ return rb_str_new2(fmt->album);
88
+ }
89
+
90
+ static VALUE ffrf_genre(VALUE self)
91
+ {
92
+ AVFormatContext *fmt = ffrf_get_fmt(self);
93
+ return rb_str_new2(fmt->genre);
94
+ }
95
+
96
+ static VALUE ffrf_year(VALUE self)
97
+ {
98
+ AVFormatContext *fmt = ffrf_get_fmt(self);
99
+ return INT2NUM(fmt->year);
100
+ }
101
+
102
+ static VALUE ffrf_track(VALUE self)
103
+ {
104
+ AVFormatContext *fmt = ffrf_get_fmt(self);
105
+ return INT2NUM(fmt->track);
106
+ }
107
+
108
+ static VALUE ffrf_duration(VALUE self)
109
+ {
110
+ AVFormatContext *fmt = ffrf_get_fmt(self);
111
+ return rb_float_new((double) fmt->duration / (double) AV_TIME_BASE);
112
+ }
113
+
114
+ static VALUE ffrf_bit_rate(VALUE self)
115
+ {
116
+ AVFormatContext *fmt = ffrf_get_fmt(self);
117
+ return INT2NUM(fmt->bit_rate);
118
+ }
119
+
120
+ static VALUE ffrf_format(VALUE self)
121
+ {
122
+ AVFormatContext *fmt = ffrf_get_fmt(self);
123
+ return rb_str_new2(fmt->iformat->name);
124
+ }
125
+
126
+ static VALUE ffrf_streams(VALUE self)
127
+ {
128
+ unsigned int i;
129
+ AVFormatContext *fmt;
130
+ VALUE streams;
131
+ VALUE* args;
132
+
133
+ if ((streams = rb_iv_get(self, "@streams")) == Qnil)
134
+ {
135
+ fmt = ffrf_get_fmt(self);
136
+ streams = rb_ary_new();
137
+ rb_iv_set(self, "@streams", streams);
138
+
139
+ args = (VALUE*) ALLOCA_N(VALUE*, 2);
140
+ args[0] = self;
141
+
142
+ for (i = 0; i < fmt->nb_streams; i++)
143
+ {
144
+ args[1] = INT2FIX(i);
145
+
146
+ switch (fmt->streams[i]->codec->codec_type)
147
+ {
148
+ case CODEC_TYPE_VIDEO:
149
+ rb_ary_push(streams, rb_class_new_instance(2, args, cFFrubyVideoStream));
150
+ break;
151
+ case CODEC_TYPE_AUDIO:
152
+ rb_ary_push(streams, rb_class_new_instance(2, args, cFFrubyAudioStream));
153
+ break;
154
+ default:
155
+ break;
156
+ }
157
+ }
158
+ }
159
+
160
+ return streams;
161
+ }
162
+
163
+ static VALUE ffrf_av_streams(VALUE self, VALUE klass)
164
+ {
165
+ VALUE stream;
166
+ VALUE streams;
167
+ VALUE typed_streams;
168
+ unsigned int i;
169
+
170
+ streams = rb_funcall(self, rb_intern("streams"), 0);
171
+ typed_streams = rb_ary_new();
172
+ Check_Type(streams, T_ARRAY);
173
+
174
+ for (i = 0; i < RARRAY(streams)->len; i++)
175
+ {
176
+ if (rb_obj_is_kind_of((stream = rb_ary_entry(streams, i)), klass))
177
+ rb_ary_push(typed_streams, stream);
178
+ }
179
+
180
+ return typed_streams;
181
+ }
182
+
183
+ static VALUE ffrf_video_streams(VALUE self)
184
+ {
185
+ return ffrf_av_streams(self, cFFrubyVideoStream);
186
+ }
187
+
188
+ static VALUE ffrf_audio_streams(VALUE self)
189
+ {
190
+ return ffrf_av_streams(self, cFFrubyAudioStream);
191
+ }
192
+
193
+ static VALUE ffrf_initialize(VALUE self, VALUE filename)
194
+ {
195
+ char* msg;
196
+ AVFormatContext *fmt;
197
+ VALUE exception;
198
+ VALUE filename_str = rb_funcall(filename, rb_intern("to_s"), 0);
199
+
200
+ if (av_open_input_file(&fmt, RSTRING(filename_str)->ptr, NULL, 0, NULL) != 0)
201
+ {
202
+ asprintf(&msg, "Cannot open file %s!", RSTRING(filename_str)->ptr);
203
+ exception = rb_exc_new2(rb_eIOError, msg);
204
+ free(msg);
205
+ rb_exc_raise(exception);
206
+ }
207
+
208
+ if (av_find_stream_info(fmt) < 0)
209
+ {
210
+ asprintf(&msg, "Problem reading file %s!", RSTRING(filename_str)->ptr);
211
+ exception = rb_exc_new2(rb_eIOError, msg);
212
+ free(msg);
213
+ rb_exc_raise(exception);
214
+ }
215
+
216
+ DATA_PTR(self) = fmt;
217
+ return self;
218
+ }
219
+
220
+ void Init_ffrf()
221
+ {
222
+ cFFrubyFile = rb_define_class("FFrubyFile", rb_cObject);
223
+ rb_define_alloc_func(cFFrubyFile, ffrf_alloc);
224
+ rb_define_method(cFFrubyFile, "initialize", ffrf_initialize, 1);
225
+ rb_define_method(cFFrubyFile, "title", ffrf_title, 0);
226
+ rb_define_method(cFFrubyFile, "author", ffrf_author, 0);
227
+ rb_define_method(cFFrubyFile, "copyright", ffrf_copyright, 0);
228
+ rb_define_method(cFFrubyFile, "comment", ffrf_comment, 0);
229
+ rb_define_method(cFFrubyFile, "album", ffrf_album, 0);
230
+ rb_define_method(cFFrubyFile, "genre", ffrf_genre, 0);
231
+ rb_define_method(cFFrubyFile, "year", ffrf_year, 0);
232
+ rb_define_method(cFFrubyFile, "track", ffrf_track, 0);
233
+ rb_define_method(cFFrubyFile, "duration", ffrf_duration, 0);
234
+ rb_define_method(cFFrubyFile, "bit_rate", ffrf_bit_rate, 0);
235
+ rb_define_method(cFFrubyFile, "format", ffrf_format, 0);
236
+ rb_define_method(cFFrubyFile, "streams", ffrf_streams, 0);
237
+ rb_define_method(cFFrubyFile, "video_streams", ffrf_video_streams, 0);
238
+ rb_define_method(cFFrubyFile, "audio_streams", ffrf_audio_streams, 0);
239
+ }
@@ -0,0 +1,196 @@
1
+ /*
2
+ * Copyright (c) 2007 James Le Cuirot
3
+ *
4
+ * This file is part of FFruby.
5
+ *
6
+ * FFruby is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * FFruby 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 GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with FFmpeg; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ #define _GNU_SOURCE
22
+ #include <ruby.h>
23
+ #include <ffmpeg/avformat.h>
24
+ #include <ffmpeg/avcodec.h>
25
+
26
+ VALUE cFFrubyStream;
27
+ VALUE cFFrubyVideoStream;
28
+ VALUE cFFrubyAudioStream;
29
+
30
+ static void ffrs_open_codec(AVStream* stream)
31
+ {
32
+ AVCodec *codec;
33
+
34
+ if (stream->codec->codec == NULL)
35
+ {
36
+ if ((codec = avcodec_find_decoder(stream->codec->codec_id)) == NULL)
37
+ rb_raise(rb_eIOError, "Cannot find codec!");
38
+
39
+ if (avcodec_open(stream->codec, codec) < 0)
40
+ rb_raise(rb_eIOError, "Cannot open codec!");
41
+ }
42
+ }
43
+
44
+ static AVStream* ffrs_get_stream(VALUE self)
45
+ {
46
+ AVStream *stream;
47
+ Data_Get_Struct(self, AVStream, stream);
48
+ return stream;
49
+ }
50
+
51
+ static VALUE ffrs_codec(VALUE self)
52
+ {
53
+ AVStream *stream = ffrs_get_stream(self);
54
+ ffrs_open_codec(stream);
55
+ return rb_str_new2(stream->codec->codec->name);
56
+ }
57
+
58
+ static VALUE ffrs_tag(VALUE self)
59
+ {
60
+ char tag[4];
61
+ signed int i, j;
62
+ AVStream *stream = ffrs_get_stream(self);
63
+
64
+ i = stream->codec->codec_tag;
65
+
66
+ for (j = 3; j >= 0; j -= 1)
67
+ {
68
+ tag[j] = i >> (j * 8);
69
+ i -= tag[j] << (j * 8);
70
+ }
71
+
72
+ for (j = 3; j >= 0; j -= 1)
73
+ {
74
+ if (tag[j] != '\0')
75
+ break;
76
+ }
77
+
78
+ return rb_str_new(tag, j + 1);
79
+ }
80
+
81
+ static VALUE ffrs_bit_rate(VALUE self)
82
+ {
83
+ AVStream *stream = ffrs_get_stream(self);
84
+ return INT2NUM(stream->codec->bit_rate);
85
+ }
86
+
87
+ static VALUE ffrs_alloc(VALUE klass)
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
+
109
+ static VALUE ffrvs_width(VALUE self)
110
+ {
111
+ AVStream *stream = ffrs_get_stream(self);
112
+ return INT2NUM(stream->codec->width);
113
+ }
114
+
115
+ static VALUE ffrvs_height(VALUE self)
116
+ {
117
+ AVStream *stream = ffrs_get_stream(self);
118
+ return INT2NUM(stream->codec->height);
119
+ }
120
+
121
+ static VALUE ffrvs_frame_aspect_ratio(VALUE self)
122
+ {
123
+ AVStream *stream = ffrs_get_stream(self);
124
+
125
+ if (stream->codec->width == 0 || stream->codec->height == 0)
126
+ return Qnil;
127
+ else
128
+ return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->codec->width), INT2NUM(stream->codec->height));
129
+ }
130
+
131
+ static VALUE ffrvs_sample_aspect_ratio(VALUE self)
132
+ {
133
+ AVStream *stream = ffrs_get_stream(self);
134
+
135
+ if (stream->codec->sample_aspect_ratio.den == 0 || stream->codec->sample_aspect_ratio.num == 0)
136
+ return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2FIX(1), INT2FIX(1));
137
+ else
138
+ return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->codec->sample_aspect_ratio.num), INT2NUM(stream->codec->sample_aspect_ratio.den));
139
+ }
140
+
141
+ static VALUE ffrvs_real_aspect_ratio(VALUE self)
142
+ {
143
+ VALUE x, y;
144
+ x = ffrvs_frame_aspect_ratio(self);
145
+ y = ffrvs_sample_aspect_ratio(self);
146
+
147
+ if (x == Qnil || y == Qnil)
148
+ return Qnil;
149
+ else
150
+ return rb_funcall(x, rb_intern("*"), 1, y);
151
+ }
152
+
153
+ static VALUE ffrvs_frame_rate(VALUE self)
154
+ {
155
+ AVStream *stream = ffrs_get_stream(self);
156
+ ffrs_open_codec(stream);
157
+
158
+ if (stream->r_frame_rate.den && stream->r_frame_rate.num)
159
+ return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->r_frame_rate.num), INT2NUM(stream->r_frame_rate.den));
160
+ else
161
+ return rb_funcall(rb_mKernel, rb_intern("Rational"), 2, INT2NUM(stream->codec->time_base.den), INT2NUM(stream->codec->time_base.num));
162
+ }
163
+
164
+ static VALUE ffras_channels(VALUE self)
165
+ {
166
+ AVStream *stream = ffrs_get_stream(self);
167
+ return INT2FIX(stream->codec->channels);
168
+ }
169
+
170
+ static VALUE ffras_sample_rate(VALUE self)
171
+ {
172
+ AVStream *stream = ffrs_get_stream(self);
173
+ return INT2NUM(stream->codec->sample_rate);
174
+ }
175
+
176
+ void Init_ffrs()
177
+ {
178
+ cFFrubyStream = rb_define_class("FFrubyStream", rb_cObject);
179
+ rb_define_alloc_func(cFFrubyStream, ffrs_alloc);
180
+ rb_define_method(cFFrubyStream, "initialize", ffrs_initialize, 2);
181
+ rb_define_method(cFFrubyStream, "codec", ffrs_codec, 0);
182
+ rb_define_method(cFFrubyStream, "tag", ffrs_tag, 0);
183
+ rb_define_method(cFFrubyStream, "bit_rate", ffrs_bit_rate, 0);
184
+
185
+ cFFrubyVideoStream = rb_define_class("FFrubyVideoStream", cFFrubyStream);
186
+ rb_define_method(cFFrubyVideoStream, "width", ffrvs_width, 0);
187
+ rb_define_method(cFFrubyVideoStream, "height", ffrvs_height, 0);
188
+ rb_define_method(cFFrubyVideoStream, "frame_aspect_ratio", ffrvs_frame_aspect_ratio, 0);
189
+ rb_define_method(cFFrubyVideoStream, "sample_aspect_ratio", ffrvs_sample_aspect_ratio, 0);
190
+ rb_define_method(cFFrubyVideoStream, "real_aspect_ratio", ffrvs_real_aspect_ratio, 0);
191
+ rb_define_method(cFFrubyVideoStream, "frame_rate", ffrvs_frame_rate, 0);
192
+
193
+ cFFrubyAudioStream = rb_define_class("FFrubyAudioStream", cFFrubyStream);
194
+ rb_define_method(cFFrubyAudioStream, "channels", ffras_channels, 0);
195
+ rb_define_method(cFFrubyAudioStream, "sample_rate", ffras_sample_rate, 0);
196
+ }
@@ -0,0 +1,9 @@
1
+ module FFruby #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4.6
3
+ specification_version: 2
4
+ name: ffruby
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.1
7
+ date: 2007-11-06 00:00:00 -05:00
8
+ summary: a library that does something with media files!
9
+ require_paths:
10
+ - lib
11
+ email: wayneeseguin at gmail dot com
12
+ homepage: ffruby.rubyforge.org
13
+ rubyforge_project:
14
+ description: a library that does something with media files!
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ required_rubygems_version: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: "0"
30
+ version:
31
+ platform: ruby
32
+ signing_key:
33
+ cert_chain: []
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
47
+ test_files: []
48
+
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
+