rays-video 0.1.2

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.
@@ -0,0 +1,57 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __RAYS_VIDEO_SRC_VIDEO_AUDIO_IN_H__
4
+ #define __RAYS_VIDEO_SRC_VIDEO_AUDIO_IN_H__
5
+
6
+
7
+ #include <vector>
8
+ #include <beeps/processor.h>
9
+ #include <rays/defs.h>
10
+
11
+
12
+ namespace Rays
13
+ {
14
+
15
+
16
+ class VideoAudioIn : public Beeps::Generator
17
+ {
18
+
19
+ typedef Beeps::Generator Super;
20
+
21
+ public:
22
+
23
+ virtual ~VideoAudioIn ();
24
+
25
+ virtual double sample_rate () const;
26
+
27
+ virtual uint nchannels () const;
28
+
29
+ virtual uint nsamples () const;
30
+
31
+ virtual float seconds () const;
32
+
33
+ virtual operator bool () const override;
34
+
35
+ bool seekable () const override;
36
+
37
+ struct Data;
38
+
39
+ Xot::PSharedImpl<Data> self;
40
+
41
+ VideoAudioIn (Data* data);
42
+
43
+ protected:
44
+
45
+ virtual void generate (
46
+ Context* context, Beeps::Signals* signals, uint* offset) override;
47
+
48
+ };// VideoAudioIn
49
+
50
+
51
+ typedef std::vector<Xot::Ref<VideoAudioIn>> VideoAudioInList;
52
+
53
+
54
+ }// Rays
55
+
56
+
57
+ #endif//EOH
@@ -0,0 +1,86 @@
1
+ #include "../video.h"
2
+
3
+
4
+ #include "rays/exception.h"
5
+
6
+
7
+ namespace Rays
8
+ {
9
+
10
+
11
+ struct VideoReader::Data
12
+ {
13
+ };// VideoReader::Data
14
+
15
+
16
+ VideoReader::VideoReader ()
17
+ {
18
+ }
19
+
20
+ VideoReader::VideoReader (const char*)
21
+ {
22
+ not_implemented_error(__FILE__, __LINE__);
23
+ }
24
+
25
+ Image
26
+ VideoReader::decode_image (size_t, float) const
27
+ {
28
+ not_implemented_error(__FILE__, __LINE__);
29
+ }
30
+
31
+ VideoAudioInList
32
+ VideoReader::get_audio_tracks () const
33
+ {
34
+ return {};
35
+ }
36
+
37
+ coord
38
+ VideoReader::width () const
39
+ {
40
+ return 0;
41
+ }
42
+
43
+ coord
44
+ VideoReader::height () const
45
+ {
46
+ return 0;
47
+ }
48
+
49
+ float
50
+ VideoReader::fps () const
51
+ {
52
+ return 0;
53
+ }
54
+
55
+ size_t
56
+ VideoReader::size () const
57
+ {
58
+ return 0;
59
+ }
60
+
61
+ VideoReader::operator bool () const
62
+ {
63
+ return false;
64
+ }
65
+
66
+ bool
67
+ VideoReader::operator ! () const
68
+ {
69
+ return !operator bool();
70
+ }
71
+
72
+
73
+ void
74
+ Video::save (const char*)
75
+ {
76
+ not_implemented_error(__FILE__, __LINE__);
77
+ }
78
+
79
+ const StringList&
80
+ get_video_exts ()
81
+ {
82
+ not_implemented_error(__FILE__, __LINE__);
83
+ }
84
+
85
+
86
+ }// Rays
@@ -0,0 +1,63 @@
1
+ #include "../video_audio_in.h"
2
+
3
+
4
+ namespace Rays
5
+ {
6
+
7
+
8
+ struct VideoAudioIn::Data
9
+ {
10
+ };// VideoAudioIn::Data
11
+
12
+
13
+ VideoAudioIn::VideoAudioIn (Data* data)
14
+ : self(data)
15
+ {
16
+ }
17
+
18
+ VideoAudioIn::~VideoAudioIn ()
19
+ {
20
+ }
21
+
22
+ double
23
+ VideoAudioIn::sample_rate () const
24
+ {
25
+ return 0;
26
+ }
27
+
28
+ uint
29
+ VideoAudioIn::nchannels () const
30
+ {
31
+ return 0;
32
+ }
33
+
34
+ uint
35
+ VideoAudioIn::nsamples () const
36
+ {
37
+ return 0;
38
+ }
39
+
40
+ float
41
+ VideoAudioIn::seconds () const
42
+ {
43
+ return 0;
44
+ }
45
+
46
+ VideoAudioIn::operator bool () const
47
+ {
48
+ return false;
49
+ }
50
+
51
+ bool
52
+ VideoAudioIn::seekable () const
53
+ {
54
+ return false;
55
+ }
56
+
57
+ void
58
+ VideoAudioIn::generate (Context* context, Beeps::Signals* signals, uint* offset)
59
+ {
60
+ }
61
+
62
+
63
+ }// Rays
data/test/helper.rb ADDED
@@ -0,0 +1,15 @@
1
+ %w[../xot ../rucy ../beeps ../rays .]
2
+ .map {|s| File.expand_path "../#{s}/lib", __dir__}
3
+ .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
4
+
5
+ require 'xot/test'
6
+ require 'rays'
7
+ require 'rays-video'
8
+
9
+ require 'test/unit'
10
+ require 'tmpdir'
11
+
12
+ include Xot::Test
13
+
14
+
15
+ def tmpdir(&block) = Dir.mktmpdir(&block)
@@ -0,0 +1,165 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ return unless osx? || ios?
5
+
6
+
7
+ class TestVideo < Test::Unit::TestCase
8
+
9
+ def video(w = 10, h = 10, fps = 0, pd = 1)
10
+ Rays::Video.new(w, h, fps: fps, pixel_density: pd)
11
+ end
12
+
13
+ def image(w = 10, h = 10)
14
+ Rays::Image.new(w, h)
15
+ end
16
+
17
+ def test_initialize()
18
+ assert_equal 1, video(1, 2, 3, 4).width
19
+ assert_equal 2, video(1, 2, 3, 4).height
20
+ assert_equal 3, video(1, 2, 3, 4).fps
21
+ assert_equal 30, video(1, 2, 0, 4).fps
22
+ assert_equal 30, video(1, 2, -1, 4).fps
23
+ assert_equal 4, video(1, 2, 3, 4).pixel_density
24
+
25
+ assert_raise(ArgumentError) {video 0, 2, 3, 4}
26
+ assert_raise(ArgumentError) {video(-1, 2, 3, 4)}
27
+ assert_raise(ArgumentError) {video 1, 0, 3, 4}
28
+ assert_raise(ArgumentError) {video 1, -1, 3, 4}
29
+ assert_raise(ArgumentError) {video 1, 2, 3, 0}
30
+ assert_raise(ArgumentError) {video 1, 2, 3, -1}
31
+ end
32
+
33
+ def test_dup()
34
+ assert_equal 1, video(1, 2, 3, 4).dup.width
35
+ assert_equal 2, video(1, 2, 3, 4).dup.height
36
+ assert_equal 3, video(1, 2, 3, 4).dup.fps
37
+ assert_equal 4, video(1, 2, 3, 4).dup.pixel_density
38
+
39
+ v1 = video.tap {_1.append image}
40
+ v2 = v1.dup; assert_equal [1, 1], [v1.size, v2.size]
41
+ v2.append image; assert_equal [1, 2], [v1.size, v2.size]
42
+ end
43
+
44
+ def test_insert()
45
+ v = video; assert_equal [], v.map(&:width)
46
+ v.append image(1), image(2); assert_equal [1, 2], v.map(&:width)
47
+ v.insert 1, image(3); assert_equal [1, 3, 2], v.map(&:width)
48
+ v.insert 2, image(4), image(5); assert_equal [1, 3, 4, 5, 2], v.map(&:width)
49
+
50
+ end
51
+
52
+ def test_append()
53
+ v = video; assert_equal [], v.map(&:width)
54
+ v.append image(1); assert_equal [1], v.map(&:width)
55
+ v.append image(2), image(3); assert_equal [1, 2, 3], v.map(&:width)
56
+
57
+ end
58
+
59
+ def test_remove()
60
+ v = video; assert_equal [], v.map(&:width)
61
+ v.append image(1), image(2), image(3); assert_equal [1, 2, 3], v.map(&:width)
62
+ v.remove 1; assert_equal [1, 3], v.map(&:width)
63
+
64
+ assert_raise(NotImplementedError) {v.remove 1..}
65
+ end
66
+
67
+ def test_size()
68
+ v = video; assert_equal 0, v.size
69
+ v.append image, image; assert_equal 2, v.size
70
+ end
71
+
72
+ def test_empty()
73
+ v = video; assert_true v.empty?
74
+ v.append image; assert_false v.empty?
75
+ end
76
+
77
+ def test_position()
78
+ v = video
79
+ v.append image, image, image; assert_equal 0, v.pos
80
+ v.pos = 2; assert_equal 2, v.pos
81
+ v.pos = 3; assert_equal 2, v.pos
82
+
83
+ assert_raise(RangeError) {v.pos = -1}
84
+ end
85
+
86
+ def test_each()
87
+ v = video
88
+ v.append image(1), image(2), image(3)
89
+
90
+ assert_equal(
91
+ [[0, 1], [1, 2], [2, 3]],
92
+ v.map.with_index {|image, index| [index, image.width]})
93
+ end
94
+
95
+ def test_to_image()
96
+ v = video.tap {_1.append image(1), image(2), image(3)}
97
+ assert_equal 1, v.to_image.width
98
+ v.pos = 1; assert_equal 2, v.to_image.width
99
+ v.pos = 2; assert_equal 3, v.to_image.width
100
+ v.pos = 3; assert_equal 3, v.to_image.width
101
+ v.pos = 9; assert_equal 3, v.to_image.width
102
+ end
103
+
104
+ def test_at()
105
+ v = video
106
+ v.append image(1), image(2), image(3)
107
+ assert_equal 1, v[0].width
108
+ assert_equal 3, v[2].width
109
+
110
+ assert_raise(IndexError) {v[-1]}
111
+ assert_raise(IndexError) {v[3]}
112
+ end
113
+
114
+ def test_save_mp4()
115
+ tmpdir do |dir|
116
+ v = video.tap {_1.append image, image, image}
117
+ path = File.join dir, 'test.mp4'
118
+ v.save path
119
+ assert File.exist?(path)
120
+ assert File.size(path) > 0
121
+ end
122
+ end
123
+
124
+ def test_save_gif()
125
+ tmpdir do |dir|
126
+ v = video.tap {_1.append image, image, image}
127
+ path = File.join dir, 'test.gif'
128
+ v.save path
129
+ assert File.exist?(path)
130
+ assert File.size(path) > 0
131
+ end
132
+ end
133
+
134
+ def test_save_empty()
135
+ v = video
136
+ tmpdir do |dir|
137
+ assert_raise(Rucy::NativeError) {v.save File.expand_path dir, 'test.mp4'}
138
+ assert_raise(Rucy::NativeError) {v.save File.expand_path dir, 'test.gif'}
139
+ end
140
+ end
141
+
142
+ def test_load_mp4()
143
+ tmpdir do |dir|
144
+ v = video.tap {_1.append image, image, image}
145
+ path = File.join dir, 'test.mp4'
146
+ v.save path
147
+ assert_equal 3, Rays::Video.load(path).size
148
+ end
149
+ end
150
+
151
+ def test_load_gif()
152
+ tmpdir do |dir|
153
+ v = video.tap {_1.append image, image, image}
154
+ path = File.join dir, 'test.gif'
155
+ v.save path
156
+ assert_equal 3, Rays::Video.load(path).size
157
+ end
158
+ end
159
+
160
+ def test_exts()
161
+ assert_include Rays::Video.exts, 'mp4'
162
+ assert_include Rays::Video.exts, 'gif'
163
+ end
164
+
165
+ end# TestVideo
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rays-video
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - xordog
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-05-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: xot
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.3.13
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.3.13
27
+ - !ruby/object:Gem::Dependency
28
+ name: rucy
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.13
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.13
41
+ - !ruby/object:Gem::Dependency
42
+ name: beeps
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.3.13
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.3.13
55
+ - !ruby/object:Gem::Dependency
56
+ name: rays
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.3.13
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.3.13
69
+ description: Video encoding/decoding with audio support using Rays and Beeps.
70
+ email: xordog@gmail.com
71
+ executables: []
72
+ extensions:
73
+ - Rakefile
74
+ extra_rdoc_files:
75
+ - ".doc/ext/rays-video/native.cpp"
76
+ - ".doc/ext/rays-video/video.cpp"
77
+ files:
78
+ - ".doc/ext/rays-video/native.cpp"
79
+ - ".doc/ext/rays-video/video.cpp"
80
+ - ".github/PULL_REQUEST_TEMPLATE.md"
81
+ - ".github/workflows/release-gem.yml"
82
+ - ".github/workflows/tag.yml"
83
+ - ".github/workflows/test.yml"
84
+ - ".github/workflows/utils.rb"
85
+ - CONTRIBUTING.md
86
+ - ChangeLog.md
87
+ - Gemfile
88
+ - LICENSE
89
+ - README.md
90
+ - Rakefile
91
+ - VERSION
92
+ - ext/rays-video/defs.h
93
+ - ext/rays-video/extconf.rb
94
+ - ext/rays-video/native.cpp
95
+ - ext/rays-video/video.cpp
96
+ - include/rays-video.h
97
+ - include/rays-video/ruby.h
98
+ - include/rays-video/ruby/video.h
99
+ - include/rays/video.h
100
+ - lib/rays-video.rb
101
+ - lib/rays-video/ext.rb
102
+ - lib/rays-video/extension.rb
103
+ - lib/rays/video.rb
104
+ - rays-video.gemspec
105
+ - src/ios/video.mm
106
+ - src/ios/video_audio_in.h
107
+ - src/ios/video_audio_in.mm
108
+ - src/osx/video.mm
109
+ - src/osx/video_audio_in.h
110
+ - src/osx/video_audio_in.mm
111
+ - src/sdl/video.cpp
112
+ - src/sdl/video_audio_in.cpp
113
+ - src/video.cpp
114
+ - src/video.h
115
+ - src/video_audio_in.h
116
+ - src/win32/video.cpp
117
+ - src/win32/video_audio_in.cpp
118
+ - test/helper.rb
119
+ - test/test_video.rb
120
+ homepage: https://github.com/xord/rays-video
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 3.0.0
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubygems_version: 3.4.19
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: Video support for Rays.
143
+ test_files:
144
+ - test/helper.rb
145
+ - test/test_video.rb