ffmpeg-ruby 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +2 -0
- data/README.rdoc +6 -3
- data/Rakefile +2 -2
- data/ext/ffmpeg_ruby/conftest.dSYM/Contents/Resources/DWARF/conftest +0 -0
- data/ext/ffmpeg_ruby/ffmpeg_avcodec.c +39 -3
- data/ext/ffmpeg_ruby/ffmpeg_avcodec.h +2 -0
- data/ext/ffmpeg_ruby/ffmpeg_avformat.c +16 -0
- data/ext/ffmpeg_ruby/ffmpeg_avformat.h +6 -1
- data/ext/ffmpeg_ruby/ffmpeg_avstream.c +50 -0
- data/ext/ffmpeg_ruby/ffmpeg_avstream.h +20 -0
- data/ext/ffmpeg_ruby/ffmpeg_ruby.c +1 -0
- data/ffmpeg-ruby.gemspec +4 -4
- data/test/test.rb +11 -1
- metadata +6 -2
data/Manifest
CHANGED
@@ -8,6 +8,8 @@ ext/ffmpeg_ruby/ffmpeg_avcodec.c
|
|
8
8
|
ext/ffmpeg_ruby/ffmpeg_avcodec.h
|
9
9
|
ext/ffmpeg_ruby/ffmpeg_avformat.c
|
10
10
|
ext/ffmpeg_ruby/ffmpeg_avformat.h
|
11
|
+
ext/ffmpeg_ruby/ffmpeg_avstream.c
|
12
|
+
ext/ffmpeg_ruby/ffmpeg_avstream.h
|
11
13
|
ext/ffmpeg_ruby/ffmpeg_ruby.c
|
12
14
|
ext/ffmpeg_ruby/ffmpeg_ruby.h
|
13
15
|
ffmpeg-ruby.gemspec
|
data/README.rdoc
CHANGED
@@ -21,12 +21,15 @@ If you run into trouble, it could be the C bundle not building. This is known to
|
|
21
21
|
|
22
22
|
You may need to add +--with+ on mac, to point it to macports' /opt/local for the libraries.
|
23
23
|
|
24
|
-
|
24
|
+
== Mac Notes
|
25
|
+
|
26
|
+
Because of the way the library gets built, it needs to match the architecture type of your ruby. You can force it to do this by specifying the ++-arch++ flag. For a 64-bit ruby on Snow Leopard:
|
25
27
|
|
26
28
|
$ sudo port install ffmpeg
|
27
29
|
(go have coffee)
|
28
|
-
$ env ARCHFLAGS="-arch x86_64"
|
29
|
-
|
30
|
+
$ sudo env ARCHFLAGS="-arch x86_64" gem install ffmpeg-ruby
|
31
|
+
|
32
|
+
If your machine is 32 bit, the +ARCHFLAGS+ above should be ++ARCHFLAGS="-arch i386"+
|
30
33
|
|
31
34
|
This will provide you with a bundle you can require.
|
32
35
|
|
data/Rakefile
CHANGED
@@ -2,11 +2,11 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new("ffmpeg-ruby", "0.1.
|
5
|
+
Echoe.new("ffmpeg-ruby", "0.1.2") do |p|
|
6
6
|
p.description = "FFMpeg Ruby Bridge. Call FFMpeg/LibAVCodec/LibAVFormat directly"
|
7
7
|
p.url = "http://github.com/hackerdude/ffmpeg-ruby"
|
8
8
|
p.author = "David Martinez"
|
9
|
-
p.ignore_pattern = ["tmp/*", "script/*"]
|
9
|
+
p.ignore_pattern = ["tmp/*", "script/*", "pkg/*"]
|
10
10
|
p.development_dependencies = [] # TODO How to do native dependencies?
|
11
11
|
end
|
12
12
|
|
Binary file
|
@@ -82,11 +82,9 @@ VALUE AVCodec_long_name(VALUE self)
|
|
82
82
|
|
83
83
|
VALUE AVCodec_name(VALUE self)
|
84
84
|
{
|
85
|
-
char* tm;
|
86
85
|
AVCodec *ptr;
|
87
86
|
Data_Get_Struct(self, AVCodec, ptr);
|
88
|
-
|
89
|
-
return rb_str_new2(tm);
|
87
|
+
return rb_str_new2(ptr->name);
|
90
88
|
}
|
91
89
|
|
92
90
|
VALUE AVCodec_codec_type(VALUE self)
|
@@ -167,6 +165,44 @@ VALUE supported_audio_codecs()
|
|
167
165
|
}
|
168
166
|
return result;
|
169
167
|
}
|
168
|
+
/*
|
169
|
+
* Similar to avcodec_string but only
|
170
|
+
* gets the name using thse same logic
|
171
|
+
*/
|
172
|
+
VALUE avcodec_canonical_name(AVCodecContext *enc)
|
173
|
+
{
|
174
|
+
const char *codec_name;
|
175
|
+
AVCodec *p;
|
176
|
+
char buf1[128];
|
177
|
+
|
178
|
+
p = avcodec_find_decoder(enc->codec_id);
|
179
|
+
if (p) {
|
180
|
+
codec_name = p->name;
|
181
|
+
} else if (enc->codec_id == CODEC_ID_MPEG2TS) {
|
182
|
+
/* fake mpeg2 transport stream codec (currently not
|
183
|
+
* registered) */
|
184
|
+
codec_name = "mpeg2ts";
|
185
|
+
} else if (enc->codec_name[0] != '\0') {
|
186
|
+
codec_name = enc->codec_name;
|
187
|
+
} else {
|
188
|
+
/* output avi tags */
|
189
|
+
if( isprint(enc->codec_tag&0xFF) && isprint((enc->codec_tag>>8)&0xFF)
|
190
|
+
&& isprint((enc->codec_tag>>16)&0xFF) && isprint((enc->codec_tag>>24)&0xFF)){
|
191
|
+
snprintf(buf1, sizeof(buf1), "%c%c%c%c / 0x%04X",
|
192
|
+
enc->codec_tag & 0xff,
|
193
|
+
(enc->codec_tag >> 8) & 0xff,
|
194
|
+
(enc->codec_tag >> 16) & 0xff,
|
195
|
+
(enc->codec_tag >> 24) & 0xff,
|
196
|
+
enc->codec_tag);
|
197
|
+
} else {
|
198
|
+
snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag);
|
199
|
+
}
|
200
|
+
codec_name = buf1;
|
201
|
+
}
|
202
|
+
|
203
|
+
return rb_str_new2(codec_name); // TODO on the ruby side, check enc->mb_decision to add the (hq) if we want to.
|
204
|
+
}
|
205
|
+
|
170
206
|
|
171
207
|
void Init_ffmpeg_ruby_avcodec(VALUE module)
|
172
208
|
{
|
@@ -1,4 +1,5 @@
|
|
1
1
|
VALUE cFFMpegAVCodecContext;
|
2
|
+
VALUE cFFMpegAVCodec;
|
2
3
|
|
3
4
|
void Init_ffmpeg_ruby_avcodec(VALUE module)
|
4
5
|
|
@@ -24,4 +25,5 @@ VALUE AVCodecContext_codec_name(VALUE self);
|
|
24
25
|
VALUE supported_avcodecs();
|
25
26
|
VALUE supported_video_codecs();
|
26
27
|
VALUE supported_audio_codecs();
|
28
|
+
VALUE avcodec_canonical_name(AVCodecContext *enc);
|
27
29
|
|
@@ -72,6 +72,21 @@ VALUE AVFormatContext_new(VALUE klaas, VALUE ruby_filename) {
|
|
72
72
|
return result;
|
73
73
|
}
|
74
74
|
|
75
|
+
VALUE AVFormatContext_streams(VALUE self) {
|
76
|
+
AVFormatContext *ptr;
|
77
|
+
Data_Get_Struct(self, AVFormatContext, ptr);
|
78
|
+
VALUE result = rb_ary_new();
|
79
|
+
int i;
|
80
|
+
for(i=0; i<ptr->nb_streams; i++) {
|
81
|
+
// Get a pointer to the codec context for the video stream
|
82
|
+
AVStream *pStream = ptr->streams[i];
|
83
|
+
VALUE rStream = Data_Wrap_Struct(cFFMpegAVStream, AVStream_mark, AVStream_free, pStream);
|
84
|
+
rb_obj_call_init(rStream,0,0);
|
85
|
+
rb_ary_push(result, rStream);
|
86
|
+
}
|
87
|
+
return result;
|
88
|
+
}
|
89
|
+
|
75
90
|
/* Return all the AVCodecContext entries for all streams in the file */
|
76
91
|
VALUE AVFormatContext_codec_contexts(VALUE self) {
|
77
92
|
AVFormatContext *ptr;
|
@@ -135,6 +150,7 @@ void Init_ffmpeg_ruby_avformat(VALUE module)
|
|
135
150
|
cFFMpegAVFormatContext = rb_define_class_under(module, "AVFormatContext", rb_cObject);
|
136
151
|
rb_define_singleton_method(cFFMpegAVFormatContext, "new", AVFormatContext_new, 1);
|
137
152
|
rb_define_method(cFFMpegAVFormatContext, "close_file", AVFormatContext_close_file, 0);
|
153
|
+
rb_define_method(cFFMpegAVFormatContext, "streams", AVFormatContext_streams, 0);
|
138
154
|
rb_define_method(cFFMpegAVFormatContext, "duration", AVFormatContext_duration, 0);
|
139
155
|
rb_define_method(cFFMpegAVFormatContext, "title", AVFormatContext_title, 0);
|
140
156
|
rb_define_method(cFFMpegAVFormatContext, "copyright", AVFormatContext_copyright, 0);
|
@@ -15,6 +15,7 @@ VALUE AVFormatContext_duration(VALUE);
|
|
15
15
|
VALUE AVFormatContext_close_file(VALUE);
|
16
16
|
VALUE AVFormatContext_new(VALUE, VALUE);
|
17
17
|
VALUE AVFormatContext_codec_contexts(VALUE);
|
18
|
+
VALUE AVFormatContext_streams(VALUE);
|
18
19
|
VALUE AVFormatContext_title(VALUE);
|
19
20
|
VALUE AVFormatContext_author(VALUE);
|
20
21
|
VALUE AVFormatContext_copyright(VALUE);
|
@@ -22,7 +23,11 @@ VALUE AVFormatContext_bit_rate(VALUE);
|
|
22
23
|
VALUE AVFormatContext_album(VALUE);
|
23
24
|
void Init_ffmpeg_ruby_avformat(VALUE module);
|
24
25
|
|
25
|
-
// Forward declaring some necessary
|
26
|
+
// Forward declaring some necessary stuff from other modules
|
26
27
|
void AVCodecContext_mark(void *v);
|
27
28
|
void AVCodecContext_free(void *v);
|
28
29
|
extern VALUE cFFMpegAVCodecContext;
|
30
|
+
|
31
|
+
void AVStream_mark(void *v);
|
32
|
+
void AVStream_free(void *v);
|
33
|
+
extern VALUE cFFMpegAVStream;
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#include "ruby.h"
|
2
|
+
#include <libavformat/avformat.h>
|
3
|
+
#include "ffmpeg_avstream.h"
|
4
|
+
|
5
|
+
void Init_ffmpeg_ruby_avstream(VALUE module)
|
6
|
+
{
|
7
|
+
cFFMpegAVStream = rb_define_class_under(module, "AVStream", rb_cObject);
|
8
|
+
rb_define_method(cFFMpegAVStream, "canonical_codec_name", AVStream_canonical_codec_name, 0);
|
9
|
+
rb_define_method(cFFMpegAVStream, "codec", AVStream_codec, 0);
|
10
|
+
rb_define_method(cFFMpegAVStream, "codec_context", AVStream_codec_context, 0);
|
11
|
+
}
|
12
|
+
|
13
|
+
void AVStream_free(void *v) {}
|
14
|
+
void AVStream_mark(void *v) {}
|
15
|
+
|
16
|
+
VALUE AVStream_canonical_codec_name(VALUE self)
|
17
|
+
{
|
18
|
+
AVStream *ptr;
|
19
|
+
AVCodec *c;
|
20
|
+
|
21
|
+
Data_Get_Struct(self, AVStream, ptr);
|
22
|
+
//char buf[256];
|
23
|
+
c =avcodec_canonical_name(ptr->codec);
|
24
|
+
return c;
|
25
|
+
}
|
26
|
+
|
27
|
+
VALUE AVStream_codec(VALUE self)
|
28
|
+
{
|
29
|
+
AVStream *pStream;
|
30
|
+
AVCodec *c;
|
31
|
+
Data_Get_Struct(self, AVStream, pStream);
|
32
|
+
c = avcodec_find_decoder(pStream->codec->codec_id);
|
33
|
+
if (!c) {
|
34
|
+
return Qnil;
|
35
|
+
}
|
36
|
+
VALUE rCodec = Data_Wrap_Struct(cFFMpegAVCodec, AVCodec_mark, AVCodec_free, c);
|
37
|
+
rb_obj_call_init(rCodec,0,0);
|
38
|
+
return rCodec;
|
39
|
+
}
|
40
|
+
|
41
|
+
VALUE AVStream_codec_context(VALUE self)
|
42
|
+
{
|
43
|
+
AVStream *pStream;
|
44
|
+
AVCodecContext *c;
|
45
|
+
Data_Get_Struct(self, AVStream, pStream);
|
46
|
+
c = pStream->codec;
|
47
|
+
VALUE rCodec = Data_Wrap_Struct(cFFMpegAVCodecContext, AVCodecContext_mark, AVCodecContext_free, c);
|
48
|
+
rb_obj_call_init(rCodec,0,0);
|
49
|
+
return rCodec;
|
50
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#include <libavformat/avformat.h>
|
2
|
+
#include <ruby.h>
|
3
|
+
|
4
|
+
VALUE cFFMpegAVStream;
|
5
|
+
|
6
|
+
void AVStream_mark(void *v);
|
7
|
+
void AVStream_free(void *v);
|
8
|
+
VALUE AVStream_canonical_codec_name(VALUE);
|
9
|
+
VALUE AVStream_codec(VALUE);
|
10
|
+
VALUE AVStream_codec_context(VALUE);
|
11
|
+
|
12
|
+
|
13
|
+
// forward declaring some stuff from codec module
|
14
|
+
void AVCodec_mark(void *v);
|
15
|
+
void AVCodec_free(void *v);
|
16
|
+
void AVCodecContext_mark(void *v);
|
17
|
+
void AVCodecContext_free(void *v);
|
18
|
+
extern VALUE cFFMpegAVCodec;
|
19
|
+
extern VALUE cFFMpegAVCodecContext;
|
20
|
+
VALUE avcodec_canonical_name(AVCodecContext *enc);
|
data/ffmpeg-ruby.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{ffmpeg-ruby}
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["David Martinez"]
|
9
|
-
s.date = %q{2010-02-
|
9
|
+
s.date = %q{2010-02-16}
|
10
10
|
s.description = %q{FFMpeg Ruby Bridge. Call FFMpeg/LibAVCodec/LibAVFormat directly}
|
11
11
|
s.email = %q{}
|
12
12
|
s.extensions = ["ext/ffmpeg_ruby/extconf.rb"]
|
13
|
-
s.extra_rdoc_files = ["README.rdoc", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Info.plist", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Resources/DWARF/conftest", "ext/ffmpeg_ruby/extconf.rb", "ext/ffmpeg_ruby/ffmpeg_avcodec.c", "ext/ffmpeg_ruby/ffmpeg_avcodec.h", "ext/ffmpeg_ruby/ffmpeg_avformat.c", "ext/ffmpeg_ruby/ffmpeg_avformat.h", "ext/ffmpeg_ruby/ffmpeg_ruby.c", "ext/ffmpeg_ruby/ffmpeg_ruby.h", "lib/ffmpeg-ruby.rb", "tasks/mac_specific.rake"]
|
14
|
-
s.files = ["Manifest", "README.rdoc", "Rakefile", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Info.plist", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Resources/DWARF/conftest", "ext/ffmpeg_ruby/extconf.rb", "ext/ffmpeg_ruby/ffmpeg_avcodec.c", "ext/ffmpeg_ruby/ffmpeg_avcodec.h", "ext/ffmpeg_ruby/ffmpeg_avformat.c", "ext/ffmpeg_ruby/ffmpeg_avformat.h", "ext/ffmpeg_ruby/ffmpeg_ruby.c", "ext/ffmpeg_ruby/ffmpeg_ruby.h", "ffmpeg-ruby.gemspec", "lib/ffmpeg-ruby.rb", "tasks/mac_specific.rake", "test/test.rb"]
|
13
|
+
s.extra_rdoc_files = ["README.rdoc", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Info.plist", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Resources/DWARF/conftest", "ext/ffmpeg_ruby/extconf.rb", "ext/ffmpeg_ruby/ffmpeg_avcodec.c", "ext/ffmpeg_ruby/ffmpeg_avcodec.h", "ext/ffmpeg_ruby/ffmpeg_avformat.c", "ext/ffmpeg_ruby/ffmpeg_avformat.h", "ext/ffmpeg_ruby/ffmpeg_avstream.c", "ext/ffmpeg_ruby/ffmpeg_avstream.h", "ext/ffmpeg_ruby/ffmpeg_ruby.c", "ext/ffmpeg_ruby/ffmpeg_ruby.h", "lib/ffmpeg-ruby.rb", "tasks/mac_specific.rake"]
|
14
|
+
s.files = ["Manifest", "README.rdoc", "Rakefile", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Info.plist", "ext/ffmpeg_ruby/conftest.dSYM/Contents/Resources/DWARF/conftest", "ext/ffmpeg_ruby/extconf.rb", "ext/ffmpeg_ruby/ffmpeg_avcodec.c", "ext/ffmpeg_ruby/ffmpeg_avcodec.h", "ext/ffmpeg_ruby/ffmpeg_avformat.c", "ext/ffmpeg_ruby/ffmpeg_avformat.h", "ext/ffmpeg_ruby/ffmpeg_avstream.c", "ext/ffmpeg_ruby/ffmpeg_avstream.h", "ext/ffmpeg_ruby/ffmpeg_ruby.c", "ext/ffmpeg_ruby/ffmpeg_ruby.h", "ffmpeg-ruby.gemspec", "lib/ffmpeg-ruby.rb", "tasks/mac_specific.rake", "test/test.rb"]
|
15
15
|
s.homepage = %q{http://github.com/hackerdude/ffmpeg-ruby}
|
16
16
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Ffmpeg-ruby", "--main", "README.rdoc"]
|
17
17
|
s.require_paths = ["lib", "ext"]
|
data/test/test.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/../lib/ffmpeg-ruby"
|
2
|
+
require 'rubygems'
|
3
|
+
require 'ruby-debug'
|
2
4
|
|
3
5
|
puts "Here are the video codecs I support, of the #{FFMpeg::AVCodec.supported_avcodecs.length} codecs:"
|
4
6
|
FFMpeg::AVCodec.supported_video_codecs.each{|k,v|
|
@@ -22,7 +24,13 @@ puts " Author: #{f.author}"
|
|
22
24
|
puts " Album: #{f.album}"
|
23
25
|
puts " Bit Rate: #{f.bit_rate}"
|
24
26
|
|
25
|
-
puts "\
|
27
|
+
puts "\nStream information:"
|
28
|
+
f.streams.each{|s|
|
29
|
+
puts " Canonical Codec: #{s.canonical_codec_name}"
|
30
|
+
puts " Codec Long Name: #{s.codec_context.long_name}"
|
31
|
+
}
|
32
|
+
|
33
|
+
puts "\nCodec Context Information for #{filename}"
|
26
34
|
f.codec_contexts.each_with_index{|ctx,i|
|
27
35
|
puts "Codec info for stream ##{i}"
|
28
36
|
puts " Type: #{ctx.codec_type} (#{FFMpeg::MAP_CODEC_TYPES[ctx.codec_type]})"
|
@@ -34,6 +42,8 @@ f.codec_contexts.each_with_index{|ctx,i|
|
|
34
42
|
puts " Audio Sample Rate: #{ctx.sample_rate}"
|
35
43
|
}
|
36
44
|
|
45
|
+
|
46
|
+
|
37
47
|
puts "-- Now dumping the format:"
|
38
48
|
f.dump_format
|
39
49
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffmpeg-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Martinez
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-16 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -28,6 +28,8 @@ extra_rdoc_files:
|
|
28
28
|
- ext/ffmpeg_ruby/ffmpeg_avcodec.h
|
29
29
|
- ext/ffmpeg_ruby/ffmpeg_avformat.c
|
30
30
|
- ext/ffmpeg_ruby/ffmpeg_avformat.h
|
31
|
+
- ext/ffmpeg_ruby/ffmpeg_avstream.c
|
32
|
+
- ext/ffmpeg_ruby/ffmpeg_avstream.h
|
31
33
|
- ext/ffmpeg_ruby/ffmpeg_ruby.c
|
32
34
|
- ext/ffmpeg_ruby/ffmpeg_ruby.h
|
33
35
|
- lib/ffmpeg-ruby.rb
|
@@ -43,6 +45,8 @@ files:
|
|
43
45
|
- ext/ffmpeg_ruby/ffmpeg_avcodec.h
|
44
46
|
- ext/ffmpeg_ruby/ffmpeg_avformat.c
|
45
47
|
- ext/ffmpeg_ruby/ffmpeg_avformat.h
|
48
|
+
- ext/ffmpeg_ruby/ffmpeg_avstream.c
|
49
|
+
- ext/ffmpeg_ruby/ffmpeg_avstream.h
|
46
50
|
- ext/ffmpeg_ruby/ffmpeg_ruby.c
|
47
51
|
- ext/ffmpeg_ruby/ffmpeg_ruby.h
|
48
52
|
- ffmpeg-ruby.gemspec
|