hornetseye-ffmpeg 0.1.0

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.md ADDED
@@ -0,0 +1,4 @@
1
+ Hornetseye-FFMPEG
2
+ ======
3
+ This Ruby extension defines the class {Hornetseye::AVInput} for reading frames from video files.
4
+
data/Rakefile ADDED
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env ruby
2
+ require 'date'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rbconfig'
7
+
8
+ PKG_NAME = 'hornetseye-ffmpeg'
9
+ PKG_VERSION = '0.1.0'
10
+ CXX = ENV[ 'CXX' ] || 'g++'
11
+ STRIP = ENV[ 'STRIP' ] || 'strip'
12
+ RB_FILES = FileList[ 'lib/**/*.rb' ]
13
+ CC_FILES = FileList[ 'ext/*.cc' ]
14
+ HH_FILES = FileList[ 'ext/*.hh' ]
15
+ TC_FILES = FileList[ 'test/tc_*.rb' ]
16
+ TS_FILES = FileList[ 'test/ts_*.rb' ]
17
+ SO_FILE = "ext/#{PKG_NAME.tr '\-', '_'}.so"
18
+ PKG_FILES = [ 'Rakefile', 'README.md', 'COPYING', '.document' ] +
19
+ RB_FILES + CC_FILES + HH_FILES + TS_FILES + TC_FILES
20
+ BIN_FILES = [ 'README.md', 'COPYING', '.document', SO_FILE ] +
21
+ RB_FILES + TS_FILES + TC_FILES
22
+ SUMMARY = %q{Read video frames using libffmpeg}
23
+ DESCRIPTION = %q{This Ruby extension defines the class Hornetseye::AVInput for reading frames from video files.}
24
+ AUTHOR = %q{Jan Wedekind}
25
+ EMAIL = %q{jan@wedesoft.de}
26
+ HOMEPAGE = %q{http://wedesoft.github.com/hornetseye-ffmpeg/}
27
+
28
+ OBJ = CC_FILES.ext 'o'
29
+ $CXXFLAGS = ENV[ 'CXXFLAGS' ] || ''
30
+ $CXXFLAGS = "#{$CXXFLAGS} -fPIC"
31
+ if Config::CONFIG[ 'rubyhdrdir' ]
32
+ $CXXFLAGS += "#{$CXXFLAGS} -I#{Config::CONFIG[ 'rubyhdrdir' ]} " +
33
+ "-I#{Config::CONFIG[ 'rubyhdrdir' ]}/#{Config::CONFIG[ 'arch' ]}"
34
+ else
35
+ $CXXFLAGS += "#{$CXXFLAGS} -I#{Config::CONFIG[ 'archdir' ]}"
36
+ end
37
+ $LIBRUBYARG = Config::CONFIG[ 'LIBRUBYARG' ]
38
+ $SITELIBDIR = Config::CONFIG[ 'sitelibdir' ]
39
+ $SITEARCHDIR = Config::CONFIG[ 'sitearchdir' ]
40
+
41
+ task :default => :all
42
+
43
+ desc 'Compile Ruby extension (default)'
44
+ task :all => [ SO_FILE ]
45
+
46
+ file SO_FILE => OBJ do |t|
47
+ sh "#{CXX} -shared -o #{t.name} #{OBJ} -lavformat -lswscale #{$LIBRUBYARG}"
48
+ # sh "#{STRIP} --strip-all #{t.name}"
49
+ end
50
+
51
+ task :test => [ SO_FILE ]
52
+
53
+ desc 'Install Ruby extension'
54
+ task :install => :all do
55
+ verbose true do
56
+ for f in RB_FILES do
57
+ FileUtils.mkdir_p "#{$SITELIBDIR}/#{File.dirname f.gsub( /^lib\//, '' )}"
58
+ FileUtils.cp_r f, "#{$SITELIBDIR}/#{f.gsub( /^lib\//, '' )}"
59
+ end
60
+ FileUtils.mkdir_p $SITEARCHDIR
61
+ FileUtils.cp SO_FILE, "#{$SITEARCHDIR}/#{File.basename SO_FILE}"
62
+ end
63
+ end
64
+
65
+ desc 'Uninstall Ruby extension'
66
+ task :uninstall do
67
+ verbose true do
68
+ for f in RB_FILES do
69
+ FileUtils.rm_f "#{$SITELIBDIR}/#{f.gsub /^lib\//, ''}"
70
+ end
71
+ FileUtils.rm_f "#{$SITEARCHDIR}/#{File.basename SO_FILE}"
72
+ end
73
+ end
74
+
75
+ Rake::TestTask.new do |t|
76
+ t.libs << 'ext'
77
+ t.test_files = TC_FILES
78
+ end
79
+
80
+ begin
81
+ require 'yard'
82
+ YARD::Rake::YardocTask.new :yard do |y|
83
+ y.options << '--no-private'
84
+ y.files << FileList[ 'lib/**/*.rb' ]
85
+ end
86
+ rescue LoadError
87
+ STDERR.puts 'Please install \'yard\' if you want to generate documentation'
88
+ end
89
+
90
+ Rake::PackageTask.new PKG_NAME, PKG_VERSION do |p|
91
+ p.need_tar = true
92
+ p.package_files = PKG_FILES
93
+ end
94
+
95
+ begin
96
+ require 'rubygems/builder'
97
+ $SPEC = Gem::Specification.new do |s|
98
+ s.name = PKG_NAME
99
+ s.version = PKG_VERSION
100
+ s.platform = Gem::Platform::RUBY
101
+ s.date = Date.today.to_s
102
+ s.summary = SUMMARY
103
+ s.description = DESCRIPTION
104
+ s.author = AUTHOR
105
+ s.email = EMAIL
106
+ s.homepage = HOMEPAGE
107
+ s.files = PKG_FILES
108
+ s.test_files = TC_FILES
109
+ s.require_paths = [ 'lib', 'ext' ]
110
+ s.rubyforge_project = %q{hornetseye}
111
+ s.extensions = %w{Rakefile}
112
+ s.has_rdoc = 'yard'
113
+ s.extra_rdoc_files = []
114
+ s.rdoc_options = %w{--no-private}
115
+ s.add_dependency %<malloc>, [ '~> 1.1' ]
116
+ s.add_dependency %<multiarray>, [ '~> 0.5' ]
117
+ s.add_dependency %<hornetseye-frame>, [ '~> 0.1' ]
118
+ s.add_development_dependency %q{rake}
119
+ end
120
+ GEM_SOURCE = "#{PKG_NAME}-#{PKG_VERSION}.gem"
121
+ $BINSPEC = Gem::Specification.new do |s|
122
+ s.name = PKG_NAME
123
+ s.version = PKG_VERSION
124
+ s.platform = Gem::Platform::CURRENT
125
+ s.date = Date.today.to_s
126
+ s.summary = SUMMARY
127
+ s.description = DESCRIPTION
128
+ s.author = AUTHOR
129
+ s.email = EMAIL
130
+ s.homepage = HOMEPAGE
131
+ s.files = BIN_FILES
132
+ s.test_files = TC_FILES
133
+ s.require_paths = [ 'lib', 'ext' ]
134
+ s.rubyforge_project = %q{hornetseye}
135
+ s.has_rdoc = 'yard'
136
+ s.extra_rdoc_files = []
137
+ s.rdoc_options = %w{--no-private}
138
+ s.add_dependency %<malloc>, [ '~> 1.1' ]
139
+ s.add_dependency %<multiarray>, [ '~> 0.5' ]
140
+ s.add_dependency %<hornetseye-frame>, [ '~> 0.1' ]
141
+ end
142
+ GEM_BINARY = "#{PKG_NAME}-#{PKG_VERSION}-#{$BINSPEC.platform}.gem"
143
+ desc "Build the gem file #{GEM_SOURCE}"
144
+ task :gem => [ "pkg/#{GEM_SOURCE}" ]
145
+ file "pkg/#{GEM_SOURCE}" => [ 'pkg' ] + $SPEC.files do
146
+ when_writing 'Creating GEM' do
147
+ Gem::Builder.new( $SPEC ).build
148
+ verbose true do
149
+ FileUtils.mv GEM_SOURCE, "pkg/#{GEM_SOURCE}"
150
+ end
151
+ end
152
+ end
153
+ desc "Build the gem file #{GEM_BINARY}"
154
+ task :gem_binary => [ "pkg/#{GEM_BINARY}" ]
155
+ file "pkg/#{GEM_BINARY}" => [ 'pkg' ] + $BINSPEC.files do
156
+ when_writing 'Creating binary GEM' do
157
+ Gem::Builder.new( $BINSPEC ).build
158
+ verbose true do
159
+ FileUtils.mv GEM_BINARY, "pkg/#{GEM_BINARY}"
160
+ end
161
+ end
162
+ end
163
+ rescue LoadError
164
+ STDERR.puts 'Please install \'rubygems\' if you want to create Gem packages'
165
+ end
166
+
167
+ rule '.o' => '.cc' do |t|
168
+ sh "#{CXX} #{$CXXFLAGS} -c -o #{t.name} #{t.source}"
169
+ end
170
+
171
+ file 'ext/avinput.o' => [ 'ext/avinput.cc', 'ext/avinput.hh', 'ext/error.hh',
172
+ 'ext/frame.hh' ]
173
+ file 'ext/frame.o' => [ 'ext/frame.cc', 'ext/frame.hh' ]
174
+ file 'ext/init.o' => [ 'ext/init.cc', 'ext/avinput.hh' ]
175
+
176
+ CLEAN.include 'ext/*.o'
177
+ CLOBBER.include SO_FILE, 'doc', '.yardoc'
178
+
data/ext/avinput.cc ADDED
@@ -0,0 +1,159 @@
1
+ /* HornetsEye - Computer Vision with Ruby
2
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Jan Wedekind
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
+ #include "avinput.hh"
17
+
18
+ using namespace std;
19
+
20
+ VALUE AVInput::cRubyClass = Qnil;
21
+
22
+ AVInput::AVInput( const string &mrl ) throw (Error):
23
+ m_mrl( mrl ), m_ic( NULL ), m_enc( NULL ), m_codec( NULL ), m_idx( -1 ),
24
+ m_frame( NULL )
25
+ {
26
+ try {
27
+ int err = av_open_input_file( &m_ic, mrl.c_str(), NULL, 0, NULL );
28
+ ERRORMACRO( err >= 0, Error, , "Error opening file \"" << mrl << "\": "
29
+ << strerror( -err ) );
30
+ err = av_find_stream_info( m_ic );
31
+ ERRORMACRO( err >= 0, Error, , "Error finding stream info for file \""
32
+ << mrl << "\": " << strerror( -err ) );
33
+ for ( int i=0; i<m_ic->nb_streams; i++ )
34
+ if ( m_ic->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) {
35
+ m_idx = i;
36
+ break;
37
+ };
38
+ ERRORMACRO( m_idx >= 0, Error, , "Could not find video stream in file \""
39
+ << mrl << "\"" );
40
+ m_enc = m_ic->streams[ m_idx ]->codec;
41
+ m_codec = avcodec_find_decoder( m_enc->codec_id );
42
+ ERRORMACRO( m_codec != NULL, Error, , "Could not find decoder for file \""
43
+ << mrl << "\"" );
44
+ err = avcodec_open( m_enc, m_codec );
45
+ ERRORMACRO( err >= 0, Error, , "Error opening codec for file \""
46
+ << mrl << "\": " << strerror( -err ) );
47
+ m_frame = avcodec_alloc_frame();
48
+ ERRORMACRO( m_frame, Error, , "Error allocating frame" );
49
+ } catch ( Error &e ) {
50
+ close();
51
+ throw e;
52
+ };
53
+ }
54
+
55
+ AVInput::~AVInput(void)
56
+ {
57
+ close();
58
+ }
59
+
60
+ void AVInput::close(void)
61
+ {
62
+ if ( m_frame ) {
63
+ av_free( m_frame );
64
+ m_frame = NULL;
65
+ };
66
+ if ( m_codec ) {
67
+ avcodec_close( m_enc );
68
+ m_codec = NULL;
69
+ };
70
+ m_enc = NULL;
71
+ m_idx = -1;
72
+ if ( m_ic ) {
73
+ av_close_input_file( m_ic );
74
+ m_ic = NULL;
75
+ };
76
+ }
77
+
78
+ FramePtr AVInput::read(void) throw (Error)
79
+ {
80
+ FramePtr retVal;
81
+ AVPacket packet;
82
+ while ( av_read_frame( m_ic, &packet ) >= 0 ) {
83
+ if ( packet.stream_index == m_idx ) {
84
+ int frameFinished;
85
+ int err = avcodec_decode_video( m_enc, m_frame, &frameFinished,
86
+ packet.data, packet.size );
87
+ ERRORMACRO( err >= 0, Error, ,
88
+ "Error decoding frame of video \"" << m_mrl << "\"" );
89
+ if ( frameFinished ) {
90
+ av_free_packet( &packet );
91
+ AVFrame frame;
92
+ m_data = boost::shared_array< char >( new char[ m_enc->width *
93
+ m_enc->height *
94
+ 3 / 2 ] );
95
+ frame.data[0] = (uint8_t *)m_data.get();
96
+ frame.data[1] = (uint8_t *)m_data.get() +
97
+ m_enc->width * m_enc->height * 5 / 4;
98
+ frame.data[2] = (uint8_t *)m_data.get() + m_enc->width * m_enc->height;
99
+ frame.linesize[0] = m_enc->width;
100
+ frame.linesize[1] = m_enc->width / 2;
101
+ frame.linesize[2] = m_enc->width / 2;
102
+ struct SwsContext *swsContext =
103
+ sws_getContext( m_enc->width, m_enc->height, m_enc->pix_fmt,
104
+ m_enc->width, m_enc->height, PIX_FMT_YUV420P,
105
+ SWS_BILINEAR, 0, 0, 0 );
106
+ sws_scale( swsContext, m_frame->data, m_frame->linesize, 0,
107
+ m_enc->height, frame.data, frame.linesize );
108
+ sws_freeContext( swsContext );
109
+ retVal = FramePtr( new Frame( "YV12", m_enc->width, m_enc->height,
110
+ m_data.get() ) );
111
+ break;
112
+ };
113
+ };
114
+ av_free_packet( &packet );
115
+ };
116
+ ERRORMACRO( retVal.get(), Error, , "No more frames available" );
117
+ return retVal;
118
+ }
119
+
120
+ VALUE AVInput::registerRubyClass( VALUE rbModule )
121
+ {
122
+ av_register_all();
123
+ cRubyClass = rb_define_class_under( rbModule, "AVInput", rb_cObject );
124
+ rb_define_singleton_method( cRubyClass, "new",
125
+ RUBY_METHOD_FUNC( wrapNew ), 1 );
126
+ rb_define_method( cRubyClass, "read", RUBY_METHOD_FUNC( wrapRead ), 0 );
127
+ }
128
+
129
+ void AVInput::deleteRubyObject( void *ptr )
130
+ {
131
+ delete (AVInputPtr *)ptr;
132
+ }
133
+
134
+ VALUE AVInput::wrapNew( VALUE rbClass, VALUE rbMRL )
135
+ {
136
+ VALUE retVal = Qnil;
137
+ try {
138
+ rb_check_type( rbMRL, T_STRING );
139
+ AVInputPtr ptr( new AVInput( StringValuePtr( rbMRL ) ) );
140
+ retVal = Data_Wrap_Struct( rbClass, 0, deleteRubyObject,
141
+ new AVInputPtr( ptr ) );
142
+ } catch ( exception &e ) {
143
+ rb_raise( rb_eRuntimeError, "%s", e.what() );
144
+ };
145
+ return retVal;
146
+ }
147
+
148
+ VALUE AVInput::wrapRead( VALUE rbSelf )
149
+ {
150
+ VALUE retVal = Qnil;
151
+ try {
152
+ AVInputPtr *self; Data_Get_Struct( rbSelf, AVInputPtr, self );
153
+ FramePtr frame( (*self)->read() );
154
+ retVal = frame->rubyObject();
155
+ } catch ( exception &e ) {
156
+ rb_raise( rb_eRuntimeError, "%s", e.what() );
157
+ };
158
+ return retVal;
159
+ }
data/ext/avinput.hh ADDED
@@ -0,0 +1,52 @@
1
+ /* HornetsEye - Computer Vision with Ruby
2
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Jan Wedekind
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
+ #ifndef AVFORMAT_HH
17
+ #define AVFORMAT_HH
18
+
19
+ #include <boost/shared_ptr.hpp>
20
+ #include <ruby.h>
21
+ extern "C" {
22
+ #include <libswscale/swscale.h>
23
+ #include <libavformat/avformat.h>
24
+ }
25
+ #include "error.hh"
26
+ #include "frame.hh"
27
+
28
+ class AVInput
29
+ {
30
+ public:
31
+ AVInput( const std::string &mrl ) throw (Error);
32
+ virtual ~AVInput(void);
33
+ void close(void);
34
+ FramePtr read(void) throw (Error);
35
+ static VALUE cRubyClass;
36
+ static VALUE registerRubyClass( VALUE rbModule );
37
+ static void deleteRubyObject( void *ptr );
38
+ static VALUE wrapNew( VALUE rbClass, VALUE rbMRL );
39
+ static VALUE wrapRead( VALUE rbSelf );
40
+ protected:
41
+ std::string m_mrl;
42
+ AVFormatContext *m_ic;
43
+ AVCodecContext *m_enc;
44
+ AVCodec *m_codec;
45
+ int m_idx;
46
+ AVFrame *m_frame;
47
+ boost::shared_array< char > m_data;
48
+ };
49
+
50
+ typedef boost::shared_ptr< AVInput > AVInputPtr;
51
+
52
+ #endif
data/ext/error.hh ADDED
@@ -0,0 +1,50 @@
1
+ /* HornetsEye - Computer Vision with Ruby
2
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Jan Wedekind
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
+ #ifndef ERROR_HH
17
+ #define ERROR_HH
18
+
19
+ #include <exception>
20
+ #include <sstream>
21
+
22
+ class Error: public std::exception
23
+ {
24
+ public:
25
+ Error(void) {}
26
+ Error( Error &e ): std::exception( e )
27
+ { m_message << e.m_message.str(); }
28
+ virtual ~Error(void) throw() {}
29
+ template< typename T >
30
+ std::ostream &operator<<( const T &t )
31
+ { m_message << t; return m_message; }
32
+ std::ostream &operator<<( std::ostream& (*__pf)(std::ostream&) )
33
+ { (*__pf)( m_message ); return m_message; }
34
+ virtual const char* what(void) const throw() {
35
+ temp = m_message.str();
36
+ return temp.c_str();
37
+ }
38
+ protected:
39
+ std::ostringstream m_message;
40
+ mutable std::string temp;
41
+ };
42
+
43
+ #define ERRORMACRO( condition, class, params, message ) \
44
+ if ( !( condition ) ) { \
45
+ class _e params; \
46
+ _e << message; \
47
+ throw _e; \
48
+ };
49
+
50
+ #endif
data/ext/frame.cc ADDED
@@ -0,0 +1,32 @@
1
+ /* HornetsEye - Computer Vision with Ruby
2
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Jan Wedekind
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
+ #include <iostream>
17
+ #include "frame.hh"
18
+
19
+ using namespace std;
20
+
21
+ Frame::Frame( const char *typecode, int width, int height, char *data ):
22
+ m_frame( Qnil )
23
+ {
24
+ VALUE mModule = rb_define_module( "Hornetseye" );
25
+ VALUE cMalloc = rb_define_class_under( mModule, "Malloc", rb_cObject );
26
+ VALUE cFrame = rb_define_class_under( mModule, "Frame", rb_cObject );
27
+ VALUE memory = Data_Wrap_Struct( cMalloc, 0, 0, (void *)data );
28
+ m_frame = rb_funcall( cFrame, rb_intern( "import" ), 4,
29
+ rb_const_get( mModule, rb_intern( typecode ) ),
30
+ INT2NUM( width ), INT2NUM( height ),
31
+ memory );
32
+ }
data/ext/frame.hh ADDED
@@ -0,0 +1,34 @@
1
+ /* HornetsEye - Computer Vision with Ruby
2
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Jan Wedekind
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
+ #ifndef FRAME_HH
17
+ #define FRAME_HH
18
+
19
+ #include <boost/smart_ptr.hpp>
20
+ #include <ruby.h>
21
+
22
+ class Frame
23
+ {
24
+ public:
25
+ Frame( const char *typecode, int width, int height, char *data );
26
+ virtual ~Frame(void) {}
27
+ VALUE rubyObject(void) { return m_frame; }
28
+ protected:
29
+ VALUE m_frame;
30
+ };
31
+
32
+ typedef boost::shared_ptr< Frame > FramePtr;
33
+
34
+ #endif
data/ext/init.cc ADDED
@@ -0,0 +1,38 @@
1
+ /* HornetsEye - Computer Vision with Ruby
2
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Jan Wedekind
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
+ #include "avinput.hh"
17
+
18
+ #ifdef WIN32
19
+ #define DLLEXPORT __declspec(dllexport)
20
+ #define DLLLOCAL
21
+ #else
22
+ #define DLLEXPORT __attribute__ ((visibility("default")))
23
+ #define DLLLOCAL __attribute__ ((visibility("hidden")))
24
+ #endif
25
+
26
+ extern "C" DLLEXPORT void Init_hornetseye_ffmpeg(void);
27
+
28
+ extern "C" {
29
+
30
+ void Init_hornetseye_ffmpeg(void)
31
+ {
32
+ rb_require( "hornetseye_frame" );
33
+ VALUE rbHornetseye = rb_define_module( "Hornetseye" );
34
+ AVInput::registerRubyClass( rbHornetseye );
35
+ rb_require( "hornetseye_ffmpeg_ext.rb" );
36
+ }
37
+
38
+ }
@@ -0,0 +1,18 @@
1
+ # hornetseye-frame - Colourspace conversions and compression
2
+ # Copyright (C) 2010 Jan Wedekind
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'hornetseye_frame'
18
+