mxfinfo 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 04f2a628fdfb8dcb1e11e86e810b1e1d2997b7f1
4
- data.tar.gz: d119c5a3daceb9b5d21b6b4c5233719637337c73
2
+ SHA256:
3
+ metadata.gz: aa3df278ee25b7a72dc59e151ac43a9b6fb68322b024f4a1936ca26b07fa8510
4
+ data.tar.gz: 26769c4edb88678e718507f1c7d3b90b5f3ab9ca24c2d019a1f9989f7eafe628
5
5
  SHA512:
6
- metadata.gz: 0327bfcf08e67ad75439cfe96ef602f4ffd03a9d7495427404fcf62758939c8eb16bdb7e12d75ecb8a5ffab6c6ef4c0ab534de33989631daac4bb854a53ec32b
7
- data.tar.gz: eb63696cd53097e802306e7ea7a44f2f0d253de2d4584394c6195938e1ce90db76a2cd87e5fe05de3a9d08caae5657c863858c41782c723e197c9f096e6ab4e0
6
+ metadata.gz: 7d9fb19f7d1b9f505992c62e6573b6509255036f8ef95795d9d82196c75314190bdb0e207170760372571e23dfc6ccc03cd25c9425004b84a60eede1f6f0fc5d
7
+ data.tar.gz: e350f2325a5ade79be7d7bf08b8a5719498833dc56b47475add0625511dc0631a34f210b4659c9ad470c125b42711dec5c72be4edba9a1c0094b895dba5043b8
data/.gitignore CHANGED
@@ -15,6 +15,7 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ .clangd
18
19
 
19
20
  # YARD artifacts
20
21
  .yardoc
@@ -0,0 +1,52 @@
1
+ [
2
+ {
3
+ "arguments": [
4
+ "gcc",
5
+ "-c",
6
+ "-I.",
7
+ "-I/home/steved/.rbenv/versions/2.5.8/include/ruby-2.5.0/x86_64-linux",
8
+ "-I/home/steved/.rbenv/versions/2.5.8/include/ruby-2.5.0/ruby/backward",
9
+ "-I/home/steved/.rbenv/versions/2.5.8/include/ruby-2.5.0",
10
+ "-I../../../../ext/mxfinfo",
11
+ "-I/opt/environments/strawberry/include/libMXF-1.0",
12
+ "--std=gnu99",
13
+ "-D_GNU_SOURCE",
14
+ "-Wall",
15
+ "-I/home/steved/.rbenv/versions/2.5.8/include",
16
+ "-fPIC",
17
+ "-O3",
18
+ "-ggdb3",
19
+ "-fPIC",
20
+ "-o",
21
+ "avid_mxf_info.o",
22
+ "../../../../ext/mxfinfo/avid_mxf_info.c"
23
+ ],
24
+ "directory": "/home/steved/Documents/projective/github/mxfinfo/tmp/x86_64-linux/mxfinfo/2.5.8",
25
+ "file": "../../../../ext/mxfinfo/avid_mxf_info.c"
26
+ },
27
+ {
28
+ "arguments": [
29
+ "gcc",
30
+ "-c",
31
+ "-I.",
32
+ "-I/home/steved/.rbenv/versions/2.5.8/include/ruby-2.5.0/x86_64-linux",
33
+ "-I/home/steved/.rbenv/versions/2.5.8/include/ruby-2.5.0/ruby/backward",
34
+ "-I/home/steved/.rbenv/versions/2.5.8/include/ruby-2.5.0",
35
+ "-I../../../../ext/mxfinfo",
36
+ "-I/opt/environments/strawberry/include/libMXF-1.0",
37
+ "--std=gnu99",
38
+ "-D_GNU_SOURCE",
39
+ "-Wall",
40
+ "-I/home/steved/.rbenv/versions/2.5.8/include",
41
+ "-fPIC",
42
+ "-O3",
43
+ "-ggdb3",
44
+ "-fPIC",
45
+ "-o",
46
+ "mxfinfo.o",
47
+ "../../../../ext/mxfinfo/mxfinfo.c"
48
+ ],
49
+ "directory": "/home/steved/Documents/projective/github/mxfinfo/tmp/x86_64-linux/mxfinfo/2.5.8",
50
+ "file": "../../../../ext/mxfinfo/mxfinfo.c"
51
+ }
52
+ ]
@@ -9,13 +9,12 @@ static
9
9
  VALUE rb_time_from_mxf_timestamp(mxfTimestamp *ts)
10
10
  {
11
11
  /*
12
- * NOTE: This is probably not thread-safe, since struct tm*
13
- * returned by localtime is shared static.
12
+ * NOTE: This is probably not thread-safe, since struct tm* returned by localtime is shared static.
14
13
  */
15
14
  time_t t;
16
15
  time(&t);
17
16
  struct tm *tmts;
18
- tmts = localtime(&t);
17
+ tmts = gmtime(&t);
19
18
 
20
19
  tmts->tm_year = (int) ts->year - 1900;
21
20
  tmts->tm_mon = (int) ts->month - 1;
@@ -23,6 +22,7 @@ VALUE rb_time_from_mxf_timestamp(mxfTimestamp *ts)
23
22
  tmts->tm_hour = (int) ts->hour;
24
23
  tmts->tm_min = (int) ts->min;
25
24
  tmts->tm_sec = (int) ts->sec;
25
+ tmts->tm_isdst = -1;
26
26
 
27
27
  return rb_time_new(mktime(tmts), ts->qmsec);
28
28
  }
@@ -74,8 +74,12 @@ VALUE rb_str_from_label(const unsigned char *lbl, int len)
74
74
  { \
75
75
  AvidMXFInfo *info; \
76
76
  Data_Get_Struct(self, AvidMXFInfo, info); \
77
- return rb_rational_new(INT2FIX((info-> attr ).numerator), \
78
- INT2FIX((info-> attr ).denominator)); \
77
+ if((info->attr).denominator == 0) { \
78
+ return Qnil; \
79
+ } else { \
80
+ return rb_rational_new(INT2FIX((info-> attr ).numerator), \
81
+ INT2FIX((info-> attr ).denominator)); \
82
+ } \
79
83
  }
80
84
 
81
85
  #define CIO_INT_GETTER(name, attr) CIO_GENERIC_GETTER(INT2FIX, name, attr)
@@ -86,6 +90,9 @@ VALUE rb_str_from_label(const unsigned char *lbl, int len)
86
90
 
87
91
  VALUE m_mxfinfo = Qnil;
88
92
  VALUE c_infoobject = Qnil;
93
+ VALUE c_error = Qnil;
94
+ VALUE c_eNotOpAtom = Qnil;
95
+ VALUE c_eNotReadable = Qnil;
89
96
 
90
97
  static
91
98
  void cio_free(void *ptr) {
@@ -106,7 +113,7 @@ void* ami_read_info_without_gvl(void* ptr)
106
113
  return NULL;
107
114
  }
108
115
 
109
- static
116
+ static
110
117
  VALUE cio_new(VALUE class, VALUE path)
111
118
  {
112
119
  Check_Type(path, T_STRING);
@@ -129,22 +136,22 @@ VALUE cio_new(VALUE class, VALUE path)
129
136
  switch(params.result)
130
137
  {
131
138
  case -2:
132
- rb_raise(rb_eIOError, "Failed to open file.");
139
+ rb_raise(c_eNotReadable, "Failed to open file.");
133
140
  break;
134
141
  case -3:
135
- rb_raise(rb_eIOError, "Failed to read header partition.");
142
+ rb_raise(c_eNotReadable, "Failed to read header partition.");
136
143
  break;
137
144
  case -4:
138
- rb_raise(rb_eStandardError, "File is not OP-Atom.");
145
+ rb_raise(c_eNotOpAtom, "File is not OP-Atom.");
139
146
  break;
140
147
  case -1:
141
148
  default:
142
- rb_raise(rb_eStandardError, "Failed to read info.");
149
+ rb_raise(c_eNotReadable, "Failed to read info.");
143
150
  break;
144
151
  }
145
152
 
146
153
  return Qnil;
147
- }
154
+ }
148
155
  else
149
156
  {
150
157
  VALUE tdata = Data_Wrap_Struct(class, 0, cio_free, info);
@@ -205,7 +212,7 @@ VALUE cio_get_material_package_uid(VALUE self)
205
212
  unsigned char *uid = (unsigned char*) &info->materialPackageUID;
206
213
 
207
214
  VALUE ary = rb_ary_new2(32);
208
- for(unsigned int i = 0; i < 32; i++)
215
+ for(unsigned int i = 0; i < 32; i++)
209
216
  {
210
217
  rb_ary_store(ary, i, CHR2FIX(uid[i]));
211
218
  }
@@ -238,7 +245,7 @@ VALUE cio_get_aspect_ratio(VALUE self)
238
245
  if(info->isVideo && info->aspectRatio.denominator != 0)
239
246
  {
240
247
  return rb_rational_new(INT2FIX(info->aspectRatio.numerator),
241
- INT2FIX(info->aspectRatio.denominator));
248
+ INT2FIX(info->aspectRatio.denominator));
242
249
  }
243
250
  else
244
251
  {
@@ -286,12 +293,16 @@ VALUE cio_get_clip_track_string(VALUE self)
286
293
 
287
294
  void Init_mxfinfo()
288
295
  {
289
- m_mxfinfo = rb_define_module("MXFInfo");
296
+ m_mxfinfo = rb_define_module("MXFInfo");
297
+
298
+ c_error = rb_define_class_under(m_mxfinfo, "Error", rb_eStandardError);
299
+ c_eNotOpAtom = rb_define_class_under(c_error, "NotOpAtom", c_error);
300
+ c_eNotReadable = rb_define_class_under(c_error, "NotReadable", c_error);
290
301
 
291
302
  c_infoobject = rb_define_class_under(m_mxfinfo, "InfoObject", rb_cObject);
292
303
  rb_define_singleton_method(c_infoobject, "new", cio_new, 1);
293
-
294
- rb_define_method(c_infoobject, "clip_name", cio_get_clip_name, 0);
304
+
305
+ rb_define_method(c_infoobject, "_clip_name", cio_get_clip_name, 0);
295
306
  rb_define_method(c_infoobject, "project_name", cio_get_project_name, 0);
296
307
  rb_define_method(c_infoobject, "clip_created", cio_get_clip_created, 0);
297
308
  rb_define_method(c_infoobject, "project_edit_rate", cio_get_project_edit_rate, 0);
@@ -302,7 +313,7 @@ void Init_mxfinfo()
302
313
  /* int numUserComments */
303
314
  /* AvidTaggedValue *materialPackageAttributes */
304
315
  /* int numMaterialPackageAttributes */
305
-
316
+
306
317
  rb_define_method(c_infoobject, "num_video_tracks", cio_get_num_video_tracks, 0);
307
318
  rb_define_method(c_infoobject, "num_audio_tracks", cio_get_num_audio_tracks, 0);
308
319
  rb_define_method(c_infoobject, "tracks_string", cio_get_tracks_string, 0);
data/lib/mxfinfo.rb CHANGED
@@ -15,7 +15,7 @@ module MXFInfo
15
15
 
16
16
  class InfoObject
17
17
  alias_method :videotracks, :num_video_tracks
18
- alias_method :v_tracks, :num_video_tracks
18
+ alias_method :v_tracks, :num_video_tracks
19
19
  alias_method :video_tracks, :num_video_tracks
20
20
  alias_method :audiotracks, :num_audio_tracks
21
21
  alias_method :audio_tracks, :num_audio_tracks
@@ -33,13 +33,8 @@ module MXFInfo
33
33
  physical_package_name == "Precompute Source Mob"
34
34
  end
35
35
 
36
- alias_method :essence_type_orig, :essence_type
37
- def essence_type
38
- result = self.send(:essence_type_orig)
39
- if result.start_with?("DNxHD")
40
- result.gsub!(/ \(\d+\)/, "")
41
- end
42
- result
36
+ def clip_name
37
+ _clip_name&.force_encoding('UTF-8')
43
38
  end
44
39
  end
45
40
  end
@@ -1,4 +1,3 @@
1
1
  module MXFInfo
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.1'.freeze
3
3
  end
4
-
data/mxfinfo.gemspec CHANGED
@@ -1,14 +1,14 @@
1
- require File.expand_path('../lib/mxfinfo/version', __FILE__)
1
+ require File.expand_path('lib/mxfinfo/version', __dir__)
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.authors = ['Steve Dierker', 'Malte Rohde']
5
- gem.email = ['technology@flavoursys.com']
6
- gem.description = %q{MXFinfo is a gem that wraps avidmxfinfo from libmxf in a native ruby extension.}
7
- gem.summary = %q{MXFinfo is a gem that wraps avidmxfinfo from libmxf in a native ruby extension.}
8
- gem.homepage = 'http://github.com/flavoursys/mxfinfo'
5
+ gem.email = ['technology@projective.io']
6
+ gem.description = 'MXFinfo is a gem that wraps avidmxfinfo from libmxf in a native ruby extension.'
7
+ gem.summary = 'MXFinfo is a gem that wraps avidmxfinfo from libmxf in a native ruby extension.'
8
+ gem.homepage = 'http://github.com/projectivetech/mxfinfo'
9
9
 
10
- gem.files = `git ls-files`.split($\)
11
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
10
+ gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
11
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.extensions = ['ext/mxfinfo/extconf.rb']
14
14
  gem.name = 'mxfinfo'
@@ -18,8 +18,7 @@ Gem::Specification.new do |gem|
18
18
 
19
19
  gem.required_ruby_version = '>= 1.9.3'
20
20
 
21
+ gem.add_development_dependency 'rake-compiler', '~> 1.0'
21
22
  gem.add_development_dependency 'rspec', '~> 3'
22
- gem.add_development_dependency 'rspec-its', '1.2.0'
23
- gem.add_development_dependency 'rake-compiler', '~> 0.9'
23
+ gem.add_development_dependency 'rspec-its', '1.3.0'
24
24
  end
25
-
File without changes
@@ -1,29 +1,30 @@
1
1
  require 'spec_helper'
2
+ require 'time'
2
3
 
3
4
  describe 'MXFInfo::InfoObject' do
4
- context 'when created from an valid MXF file' do
5
+ context 'with a valid MXF file' do
5
6
  subject do
6
- MXFInfo.scan File.expand_path('../fixtures/IMG_0395.MOV.A14DC7130D.mxf', __FILE__)
7
+ MXFInfo.scan File.expand_path('fixtures/IMG_0395.MOV.A14DC7130D.mxf', __dir__)
7
8
  end
8
9
 
9
10
  its(:project_name) { should eq('Ballerinas_zippy') }
10
11
  its(:clip_name) { should eq('IMG_0395.MOV') }
11
12
  its(:clip_created_at) { should eq(Time.parse('2011-05-08 22:02:53.000')) }
12
- its(:project_edit_rate) { should eq((25/1)) }
13
+ its(:project_edit_rate) { should eq((25 / 1)) }
13
14
  its(:clip_duration) { should eq(287) }
14
- its(:clip_edit_rate) { should eq((25/1)) }
15
+ its(:clip_edit_rate) { should eq((25 / 1)) }
15
16
  its(:video_tracks) { should eq(1) }
16
17
  its(:audio_tracks) { should eq(1) }
17
18
  its(:clip_track_string) { should eq('V1 A1') }
18
19
  its(:essence_type) { should eq('PCM') }
19
20
  its(:essence_label) { should eq('060e2b34040101010d01030102060200') }
20
21
  its(:track_number) { should eq(1) }
21
- its(:edit_rate) { should eq((48000/1)) }
22
- its(:track_duration) { should eq(551040) }
23
- its(:segment_duration) { should eq(551040) }
22
+ its(:edit_rate) { should eq((48_000 / 1)) }
23
+ its(:track_duration) { should eq(551_040) }
24
+ its(:segment_duration) { should eq(551_040) }
24
25
  its(:segment_offset) { should eq(0) }
25
26
  its(:start_timecode) { should eq(0) }
26
- its(:audio_sampling_rate) { should eq((48000/1)) }
27
+ its(:audio_sampling_rate) { should eq((48_000 / 1)) }
27
28
  its(:quantization_bits) { should eq(16) }
28
29
  its(:channel_count) { should eq(1) }
29
30
  its(:material_package_uid) { should eq('060a2b340101010101010f00130000004dc7130d05831a0a060e2b347f7f2a80') }
data/spec/mxfinfo_spec.rb CHANGED
@@ -20,7 +20,11 @@ describe 'MXFInfo' do
20
20
  it 'should return an InfoObject instance' do
21
21
  expect(MXFInfo.scan File.expand_path('../fixtures/IMG_0395.MOV.A14DC7130D.mxf', __FILE__)).to be_a(MXFInfo::InfoObject)
22
22
  end
23
- end
23
+
24
+ it 'should return an UTF-8 clip_name' do
25
+ expect(MXFInfo.scan(File.expand_path('../fixtures/IMG_0395.MOV.A14DC7130D.mxf', __FILE__)).clip_name.encoding).to eq(Encoding::UTF_8)
26
+ end
27
+ end
24
28
  end
25
29
  end
26
30
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mxfinfo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Dierker
@@ -9,54 +9,54 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-04-13 00:00:00.000000000 Z
12
+ date: 2021-03-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rspec
15
+ name: rake-compiler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '3'
20
+ version: '1.0'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '3'
27
+ version: '1.0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: rspec-its
29
+ name: rspec
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '='
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: 1.2.0
34
+ version: '3'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '='
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: 1.2.0
41
+ version: '3'
42
42
  - !ruby/object:Gem::Dependency
43
- name: rake-compiler
43
+ name: rspec-its
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - "~>"
46
+ - - '='
47
47
  - !ruby/object:Gem::Version
48
- version: '0.9'
48
+ version: 1.3.0
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - "~>"
53
+ - - '='
54
54
  - !ruby/object:Gem::Version
55
- version: '0.9'
55
+ version: 1.3.0
56
56
  description: MXFinfo is a gem that wraps avidmxfinfo from libmxf in a native ruby
57
57
  extension.
58
58
  email:
59
- - technology@flavoursys.com
59
+ - technology@projective.io
60
60
  executables: []
61
61
  extensions:
62
62
  - ext/mxfinfo/extconf.rb
@@ -67,6 +67,7 @@ files:
67
67
  - LICENSE
68
68
  - README.md
69
69
  - Rakefile
70
+ - compile_commands.json
70
71
  - ext/mxfinfo/avid_mxf_info.c
71
72
  - ext/mxfinfo/avid_mxf_info.h
72
73
  - ext/mxfinfo/extconf.rb
@@ -79,7 +80,7 @@ files:
79
80
  - spec/info_object_spec.rb
80
81
  - spec/mxfinfo_spec.rb
81
82
  - spec/spec_helper.rb
82
- homepage: http://github.com/flavoursys/mxfinfo
83
+ homepage: http://github.com/projectivetech/mxfinfo
83
84
  licenses:
84
85
  - MIT
85
86
  metadata: {}
@@ -99,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
100
  version: '0'
100
101
  requirements: []
101
102
  rubyforge_project:
102
- rubygems_version: 2.5.2
103
+ rubygems_version: 2.7.6.2
103
104
  signing_key:
104
105
  specification_version: 4
105
106
  summary: MXFinfo is a gem that wraps avidmxfinfo from libmxf in a native ruby extension.