hornetseye-ffmpeg 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +98 -5
- data/ext/avinput.cc +12 -0
- data/ext/avinput.hh +14 -0
- data/ext/avoutput.cc +8 -0
- data/ext/avoutput.hh +12 -0
- data/ext/frame.cc +10 -3
- data/ext/frame.hh +1 -0
- metadata +3 -3
data/Rakefile
CHANGED
@@ -7,12 +7,12 @@ require 'rake/loaders/makefile'
|
|
7
7
|
require 'rbconfig'
|
8
8
|
|
9
9
|
PKG_NAME = 'hornetseye-ffmpeg'
|
10
|
-
PKG_VERSION = '0.4.
|
10
|
+
PKG_VERSION = '0.4.1'
|
11
11
|
CXX = ENV[ 'CXX' ] || 'g++'
|
12
12
|
STRIP = ENV[ 'STRIP' ] || 'strip'
|
13
13
|
RB_FILES = FileList[ 'lib/**/*.rb' ]
|
14
14
|
CC_FILES = FileList[ 'ext/*.cc' ]
|
15
|
-
HH_FILES = FileList[ 'ext/*.hh' ]
|
15
|
+
HH_FILES = FileList[ 'ext/*.hh' ] + FileList[ 'ext/*.tcc' ]
|
16
16
|
TC_FILES = FileList[ 'test/tc_*.rb' ]
|
17
17
|
TS_FILES = FileList[ 'test/ts_*.rb' ]
|
18
18
|
SO_FILE = "ext/#{PKG_NAME.tr '\-', '_'}.so"
|
@@ -28,7 +28,7 @@ HOMEPAGE = %q{http://wedesoft.github.com/hornetseye-ffmpeg/}
|
|
28
28
|
|
29
29
|
OBJ = CC_FILES.ext 'o'
|
30
30
|
$CXXFLAGS = ENV[ 'CXXFLAGS' ] || ''
|
31
|
-
$CXXFLAGS = "#{$CXXFLAGS} -fPIC -DNDEBUG"
|
31
|
+
$CXXFLAGS = "#{$CXXFLAGS} -fPIC -DNDEBUG -DHAVE_CONFIG_H"
|
32
32
|
if RbConfig::CONFIG[ 'rubyhdrdir' ]
|
33
33
|
$CXXFLAGS = "#{$CXXFLAGS} -I#{RbConfig::CONFIG[ 'rubyhdrdir' ]} " +
|
34
34
|
"-I#{RbConfig::CONFIG[ 'rubyhdrdir' ]}/#{RbConfig::CONFIG[ 'arch' ]}"
|
@@ -73,6 +73,99 @@ task :uninstall do
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
desc 'Create config.h'
|
77
|
+
task :config_h => 'ext/config.h'
|
78
|
+
|
79
|
+
def check_program
|
80
|
+
f_base_name = 'rakeconf'
|
81
|
+
begin
|
82
|
+
File.open( "#{f_base_name}.cc", 'w' ) { |f| yield f }
|
83
|
+
`#{CXX} -S #{$CXXFLAGS} -c -o #{f_base_name}.o #{f_base_name}.cc 2>&1 >> rake.log`
|
84
|
+
$?.exitstatus == 0
|
85
|
+
ensure
|
86
|
+
File.delete *Dir.glob( "#{f_base_name}.*" )
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def check_c_header( name )
|
91
|
+
check_program do |c|
|
92
|
+
c.puts <<EOS
|
93
|
+
extern "C" {
|
94
|
+
#include <#{name}>
|
95
|
+
}
|
96
|
+
int main(void) { return 0; }
|
97
|
+
EOS
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
file 'ext/config.h' do |t|
|
102
|
+
s = "/* config.h. Generated from Rakefile by rake. */\n"
|
103
|
+
if check_c_header 'libswscale/swscale.h'
|
104
|
+
s << "#define HAVE_LIBSWSCALE_INCDIR 1\n"
|
105
|
+
elsif check_c_header 'ffmpeg/swscale.h'
|
106
|
+
s << "#undef HAVE_LIBSWSCALE_INCDIR\n"
|
107
|
+
else
|
108
|
+
raise 'Cannot find swscale.h header file'
|
109
|
+
end
|
110
|
+
have_libavformat_incdir = check_c_header 'libavformat/avformat.h'
|
111
|
+
if have_libavformat_incdir
|
112
|
+
s << "#define HAVE_LIBAVFORMAT_INCDIR 1\n"
|
113
|
+
elsif check_c_header 'ffmpeg/avformat.h'
|
114
|
+
s << "#undef HAVE_LIBAVFORMAT_INCDIR\n"
|
115
|
+
else
|
116
|
+
raise 'Cannot find swscale.h header file'
|
117
|
+
end
|
118
|
+
have_libavformat_alloc_context = check_program do |c|
|
119
|
+
c.puts <<EOS
|
120
|
+
extern "C" {
|
121
|
+
#include <#{have_libavformat_incdir ? 'libavformat' : 'ffmpeg'}/avformat.h>
|
122
|
+
}
|
123
|
+
int main(void) { avformat_alloc_context(); return 0; }
|
124
|
+
EOS
|
125
|
+
end
|
126
|
+
if have_libavformat_alloc_context
|
127
|
+
s << "#define HAVE_LIBAVFORMAT_ALLOC_CONTEXT 1\n"
|
128
|
+
else
|
129
|
+
have_alloc_format_context = check_program do |c|
|
130
|
+
c.puts <<EOS
|
131
|
+
extern "C" {
|
132
|
+
#include <#{have_libavformat_incdir ? 'libavformat' : 'ffmpeg'}/avformat.h>
|
133
|
+
}
|
134
|
+
int main(void) { av_alloc_format_context(); return 0; }
|
135
|
+
EOS
|
136
|
+
end
|
137
|
+
unless have_alloc_format_context
|
138
|
+
raise 'Cannot find constructor for AVFormatContext'
|
139
|
+
end
|
140
|
+
s << "#undef HAVE_LIBAVFORMAT_ALLOC_CONTEXT\n"
|
141
|
+
end
|
142
|
+
have_byteio_ptr = check_program do |c|
|
143
|
+
c.puts <<EOS
|
144
|
+
extern "C" {
|
145
|
+
#include <#{have_libavformat_incdir ? 'libavformat' : 'ffmpeg'}/avformat.h>
|
146
|
+
}
|
147
|
+
int main(void) { AVFormatContext *c; url_fclose( c->pb ); return 0; }
|
148
|
+
EOS
|
149
|
+
end
|
150
|
+
if have_byteio_ptr
|
151
|
+
s << "#define HAVE_BYTEIO_PTR 1\n"
|
152
|
+
else
|
153
|
+
have_byteio_inst = check_program do |c|
|
154
|
+
c.puts <<EOS
|
155
|
+
extern "C" {
|
156
|
+
#include <#{have_libavformat_incdir ? 'libavformat' : 'ffmpeg'}/avformat.h>
|
157
|
+
}
|
158
|
+
int main(void) { AVFormatContext *c; url_fclose( &c->pb ); return 0; }
|
159
|
+
EOS
|
160
|
+
end
|
161
|
+
unless have_byteio_inst
|
162
|
+
raise 'Cannot find ByteIOContext member variable'
|
163
|
+
end
|
164
|
+
s << "#undef HAVE_BYTEIO_PTR\n"
|
165
|
+
end
|
166
|
+
File.open( t.name, 'w' ) { |f| f.puts s }
|
167
|
+
end
|
168
|
+
|
76
169
|
Rake::TestTask.new do |t|
|
77
170
|
t.libs << 'ext'
|
78
171
|
t.test_files = TC_FILES
|
@@ -170,7 +263,7 @@ rule '.o' => '.cc' do |t|
|
|
170
263
|
sh "#{CXX} #{$CXXFLAGS} -c -o #{t.name} #{t.source}"
|
171
264
|
end
|
172
265
|
|
173
|
-
file ".depends.mf" do |t|
|
266
|
+
file ".depends.mf" => :config_h do |t|
|
174
267
|
sh "g++ -MM #{$CXXFLAGS} #{CC_FILES.join ' '} | " +
|
175
268
|
"sed -e :a -e N -e 's/\\n/\\$/g' -e ta | " +
|
176
269
|
"sed -e 's/ *\\\\\\$ */ /g' -e 's/\\$/\\n/g' | sed -e 's/^/ext\\//' > #{t.name}"
|
@@ -181,5 +274,5 @@ end
|
|
181
274
|
import ".depends.mf"
|
182
275
|
|
183
276
|
CLEAN.include 'ext/*.o'
|
184
|
-
CLOBBER.include SO_FILE, 'doc', '.yardoc', '.depends.mf'
|
277
|
+
CLOBBER.include SO_FILE, 'doc', '.yardoc', '.depends.mf', 'ext/config.h'
|
185
278
|
|
data/ext/avinput.cc
CHANGED
@@ -131,6 +131,11 @@ FramePtr AVInput::read(void) throw (Error)
|
|
131
131
|
return retVal;
|
132
132
|
}
|
133
133
|
|
134
|
+
bool AVInput::status(void) const
|
135
|
+
{
|
136
|
+
return m_ic != NULL;
|
137
|
+
}
|
138
|
+
|
134
139
|
int AVInput::width(void) const throw (Error)
|
135
140
|
{
|
136
141
|
ERRORMACRO( m_dec != NULL, Error, , "Video \"" << m_mrl << "\" is not open. "
|
@@ -197,6 +202,7 @@ VALUE AVInput::registerRubyClass( VALUE rbModule )
|
|
197
202
|
rb_define_const( cRubyClass, "AV_TIME_BASE", INT2NUM( AV_TIME_BASE ) );
|
198
203
|
rb_define_method( cRubyClass, "close", RUBY_METHOD_FUNC( wrapClose ), 0 );
|
199
204
|
rb_define_method( cRubyClass, "read", RUBY_METHOD_FUNC( wrapRead ), 0 );
|
205
|
+
rb_define_method( cRubyClass, "status?", RUBY_METHOD_FUNC( wrapStatus ), 0 );
|
200
206
|
rb_define_method( cRubyClass, "time_base", RUBY_METHOD_FUNC( wrapTimeBase ), 0 );
|
201
207
|
rb_define_method( cRubyClass, "frame_rate", RUBY_METHOD_FUNC( wrapFrameRate ), 0 );
|
202
208
|
rb_define_method( cRubyClass, "duration", RUBY_METHOD_FUNC( wrapDuration ), 0 );
|
@@ -246,6 +252,12 @@ VALUE AVInput::wrapRead( VALUE rbSelf )
|
|
246
252
|
return retVal;
|
247
253
|
}
|
248
254
|
|
255
|
+
VALUE AVInput::wrapStatus( VALUE rbSelf )
|
256
|
+
{
|
257
|
+
AVInputPtr *self; Data_Get_Struct( rbSelf, AVInputPtr, self );
|
258
|
+
return (*self)->status() ? Qtrue : Qfalse;
|
259
|
+
}
|
260
|
+
|
249
261
|
VALUE AVInput::wrapTimeBase( VALUE rbSelf )
|
250
262
|
{
|
251
263
|
VALUE retVal = Qnil;
|
data/ext/avinput.hh
CHANGED
@@ -16,10 +16,22 @@
|
|
16
16
|
#ifndef AVINPUT_HH
|
17
17
|
#define AVINPUT_HH
|
18
18
|
|
19
|
+
#ifdef HAVE_CONFIG_H
|
20
|
+
#include "config.h"
|
21
|
+
#endif
|
22
|
+
|
19
23
|
#include <boost/shared_ptr.hpp>
|
20
24
|
extern "C" {
|
25
|
+
#ifdef HAVE_LIBSWSCALE_INCDIR
|
21
26
|
#include <libswscale/swscale.h>
|
27
|
+
#else
|
28
|
+
#include <ffmpeg/swscale.h>
|
29
|
+
#endif
|
30
|
+
#ifdef HAVE_LIBAVFORMAT_INCDIR
|
22
31
|
#include <libavformat/avformat.h>
|
32
|
+
#else
|
33
|
+
#include <ffmpeg/avformat.h>
|
34
|
+
#endif
|
23
35
|
}
|
24
36
|
#include "rubyinc.hh"
|
25
37
|
#include "error.hh"
|
@@ -32,6 +44,7 @@ public:
|
|
32
44
|
virtual ~AVInput(void);
|
33
45
|
void close(void);
|
34
46
|
FramePtr read(void) throw (Error);
|
47
|
+
bool status(void) const;
|
35
48
|
int width(void) const throw (Error);
|
36
49
|
int height(void) const throw (Error);
|
37
50
|
AVRational timeBase(void) throw (Error);
|
@@ -46,6 +59,7 @@ public:
|
|
46
59
|
static VALUE wrapNew( VALUE rbClass, VALUE rbMRL );
|
47
60
|
static VALUE wrapClose( VALUE rbSelf );
|
48
61
|
static VALUE wrapRead( VALUE rbSelf );
|
62
|
+
static VALUE wrapStatus( VALUE rbSelf );
|
49
63
|
static VALUE wrapTimeBase( VALUE rbSelf );
|
50
64
|
static VALUE wrapFrameRate( VALUE rbSelf );
|
51
65
|
static VALUE wrapDuration( VALUE rbSelf );
|
data/ext/avoutput.cc
CHANGED
@@ -37,7 +37,11 @@ AVOutput::AVOutput( const string &mrl, int bitrate, int width, int height,
|
|
37
37
|
if ( format == NULL ) format = guess_format( "mpeg", NULL, NULL );
|
38
38
|
ERRORMACRO( format != NULL, Error, ,
|
39
39
|
"Could not find suitable output format for \"" << mrl << "\"" );
|
40
|
+
#ifdef HAVE_LIBAVFORMAT_ALLOC_CONTEXT
|
40
41
|
m_oc = avformat_alloc_context();
|
42
|
+
#else
|
43
|
+
m_oc = av_alloc_format_context();
|
44
|
+
#endif
|
41
45
|
ERRORMACRO( m_oc != NULL, Error, , "Failure allocating format context" );
|
42
46
|
m_oc->oformat = format;
|
43
47
|
snprintf( m_oc->filename, sizeof( m_oc->filename ), "%s", mrl.c_str() );
|
@@ -131,7 +135,11 @@ void AVOutput::close(void)
|
|
131
135
|
};
|
132
136
|
m_video_st = NULL;
|
133
137
|
if ( m_file_open ) {
|
138
|
+
#ifdef HAVE_BYTEIO_PTR
|
134
139
|
url_fclose( m_oc->pb );
|
140
|
+
#else
|
141
|
+
url_fclose( &m_oc->pb );
|
142
|
+
#endif
|
135
143
|
m_file_open = false;
|
136
144
|
};
|
137
145
|
av_free( m_oc );
|
data/ext/avoutput.hh
CHANGED
@@ -16,10 +16,22 @@
|
|
16
16
|
#ifndef AVOUTPUT_HH
|
17
17
|
#define AVOUTPUT_HH
|
18
18
|
|
19
|
+
#ifdef HAVE_CONFIG_H
|
20
|
+
#include "config.h"
|
21
|
+
#endif
|
22
|
+
|
19
23
|
#include <boost/shared_ptr.hpp>
|
20
24
|
extern "C" {
|
25
|
+
#ifdef HAVE_LIBSWSCALE_INCDIR
|
21
26
|
#include <libswscale/swscale.h>
|
27
|
+
#else
|
28
|
+
#include <ffmpeg/swscale.h>
|
29
|
+
#endif
|
30
|
+
#ifdef HAVE_LIBAVFORMAT_INCDIR
|
22
31
|
#include <libavformat/avformat.h>
|
32
|
+
#else
|
33
|
+
#include <ffmpeg/avformat.h>
|
34
|
+
#endif
|
23
35
|
}
|
24
36
|
#include "rubyinc.hh"
|
25
37
|
#include "error.hh"
|
data/ext/frame.cc
CHANGED
@@ -23,9 +23,7 @@ Frame::Frame( const string &typecode, int width, int height, char *data ):
|
|
23
23
|
VALUE mModule = rb_define_module( "Hornetseye" );
|
24
24
|
VALUE cMalloc = rb_define_class_under( mModule, "Malloc", rb_cObject );
|
25
25
|
VALUE cFrame = rb_define_class_under( mModule, "Frame", rb_cObject );
|
26
|
-
VALUE rbSize =
|
27
|
-
rb_const_get( mModule, rb_intern( typecode.c_str() ) ),
|
28
|
-
INT2NUM( width ), INT2NUM( height ) );
|
26
|
+
VALUE rbSize = INT2NUM( storageSize( typecode, width, height ) );
|
29
27
|
VALUE rbMemory;
|
30
28
|
if ( data != NULL ) {
|
31
29
|
rbMemory = Data_Wrap_Struct( cMalloc, 0, 0, (void *)data );
|
@@ -67,3 +65,12 @@ void Frame::markRubyMember(void)
|
|
67
65
|
rb_gc_mark( m_frame );
|
68
66
|
}
|
69
67
|
|
68
|
+
int Frame::storageSize( const std::string &typecode, int width, int height )
|
69
|
+
{
|
70
|
+
VALUE mModule = rb_define_module( "Hornetseye" );
|
71
|
+
VALUE cFrame = rb_define_class_under( mModule, "Frame", rb_cObject );
|
72
|
+
return NUM2INT( rb_funcall( cFrame, rb_intern( "storage_size" ), 3,
|
73
|
+
rb_const_get( mModule, rb_intern( typecode.c_str() ) ),
|
74
|
+
INT2NUM( width ), INT2NUM( height ) ) );
|
75
|
+
}
|
76
|
+
|
data/ext/frame.hh
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 4
|
8
|
-
-
|
9
|
-
version: 0.4.
|
8
|
+
- 1
|
9
|
+
version: 0.4.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jan Wedekind
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-08 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|