bmff 0.0.1

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.
Files changed (167) hide show
  1. data/.gitignore +25 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +183 -0
  5. data/Rakefile +9 -0
  6. data/bmff.gemspec +25 -0
  7. data/lib/bmff/binary_accessor.rb +186 -0
  8. data/lib/bmff/box/audio_sample_entry.rb +16 -0
  9. data/lib/bmff/box/base.rb +66 -0
  10. data/lib/bmff/box/bit_rate.rb +14 -0
  11. data/lib/bmff/box/chunk_large_offset.rb +16 -0
  12. data/lib/bmff/box/chunk_offset.rb +16 -0
  13. data/lib/bmff/box/clean_aperture.rb +20 -0
  14. data/lib/bmff/box/colour_information.rb +27 -0
  15. data/lib/bmff/box/compact_sample_size.rb +32 -0
  16. data/lib/bmff/box/composition_offset.rb +25 -0
  17. data/lib/bmff/box/composition_to_decode.rb +17 -0
  18. data/lib/bmff/box/container.rb +70 -0
  19. data/lib/bmff/box/copyright.rb +13 -0
  20. data/lib/bmff/box/data_entry_url.rb +12 -0
  21. data/lib/bmff/box/data_entry_urn.rb +13 -0
  22. data/lib/bmff/box/data_information.rb +12 -0
  23. data/lib/bmff/box/data_reference.rb +14 -0
  24. data/lib/bmff/box/degradation_priority.rb +19 -0
  25. data/lib/bmff/box/edit.rb +12 -0
  26. data/lib/bmff/box/edit_list.rb +27 -0
  27. data/lib/bmff/box/file_type.rb +17 -0
  28. data/lib/bmff/box/free_space.rb +6 -0
  29. data/lib/bmff/box/full.rb +11 -0
  30. data/lib/bmff/box/handler.rb +15 -0
  31. data/lib/bmff/box/hint_media_header.rb +16 -0
  32. data/lib/bmff/box/hint_sample_entry.rb +14 -0
  33. data/lib/bmff/box/level_assignment.rb +35 -0
  34. data/lib/bmff/box/map.rb +15 -0
  35. data/lib/bmff/box/media.rb +12 -0
  36. data/lib/bmff/box/media_data.rb +6 -0
  37. data/lib/bmff/box/media_header.rb +25 -0
  38. data/lib/bmff/box/media_information.rb +12 -0
  39. data/lib/bmff/box/meta_data_sample_entry.rb +5 -0
  40. data/lib/bmff/box/movie.rb +12 -0
  41. data/lib/bmff/box/movie_extends.rb +12 -0
  42. data/lib/bmff/box/movie_extends_header.rb +16 -0
  43. data/lib/bmff/box/movie_fragment.rb +12 -0
  44. data/lib/bmff/box/movie_fragment_header.rb +12 -0
  45. data/lib/bmff/box/movie_fragment_random_access.rb +12 -0
  46. data/lib/bmff/box/movie_fragment_random_access_offset.rb +12 -0
  47. data/lib/bmff/box/movie_header.rb +36 -0
  48. data/lib/bmff/box/null_media_header.rb +6 -0
  49. data/lib/bmff/box/padding_bits.rb +23 -0
  50. data/lib/bmff/box/pixel_aspect_ratio.rb +13 -0
  51. data/lib/bmff/box/progressive_download_info.rb +17 -0
  52. data/lib/bmff/box/sample_auxiliary_information_offsets.rb +24 -0
  53. data/lib/bmff/box/sample_auxiliary_information_sizes.rb +23 -0
  54. data/lib/bmff/box/sample_dependency_type.rb +26 -0
  55. data/lib/bmff/box/sample_description.rb +27 -0
  56. data/lib/bmff/box/sample_entry.rb +15 -0
  57. data/lib/bmff/box/sample_size.rb +19 -0
  58. data/lib/bmff/box/sample_table.rb +12 -0
  59. data/lib/bmff/box/sample_to_chunk.rb +20 -0
  60. data/lib/bmff/box/shadow_sync_sample.rb +18 -0
  61. data/lib/bmff/box/sound_media_header.rb +13 -0
  62. data/lib/bmff/box/sub_sample_information.rb +41 -0
  63. data/lib/bmff/box/sync_sample.rb +16 -0
  64. data/lib/bmff/box/text_meta_data_sample_entry.rb +18 -0
  65. data/lib/bmff/box/time_to_sample.rb +18 -0
  66. data/lib/bmff/box/track.rb +12 -0
  67. data/lib/bmff/box/track_extends.rb +17 -0
  68. data/lib/bmff/box/track_fragment.rb +12 -0
  69. data/lib/bmff/box/track_fragment_base_media_decode_time.rb +16 -0
  70. data/lib/bmff/box/track_fragment_header.rb +18 -0
  71. data/lib/bmff/box/track_fragment_random_access.rb +54 -0
  72. data/lib/bmff/box/track_group.rb +12 -0
  73. data/lib/bmff/box/track_group_type.rb +12 -0
  74. data/lib/bmff/box/track_header.rb +36 -0
  75. data/lib/bmff/box/track_reference.rb +12 -0
  76. data/lib/bmff/box/track_reference_type.rb +15 -0
  77. data/lib/bmff/box/track_run.rb +31 -0
  78. data/lib/bmff/box/track_selection.rb +16 -0
  79. data/lib/bmff/box/unknown.rb +5 -0
  80. data/lib/bmff/box/uri.rb +12 -0
  81. data/lib/bmff/box/uri_init.rb +15 -0
  82. data/lib/bmff/box/uri_meta_sample_entry.rb +24 -0
  83. data/lib/bmff/box/user_data.rb +12 -0
  84. data/lib/bmff/box/video_media_header.rb +13 -0
  85. data/lib/bmff/box/visual_sample_entry.rb +37 -0
  86. data/lib/bmff/box/xml_meta_data_sample_entry.rb +19 -0
  87. data/lib/bmff/box.rb +115 -0
  88. data/lib/bmff/file_container.rb +20 -0
  89. data/lib/bmff/version.rb +3 -0
  90. data/lib/bmff.rb +7 -0
  91. data/test/bmff/box/test_audio_sample_entry.rb +46 -0
  92. data/test/bmff/box/test_base.rb +37 -0
  93. data/test/bmff/box/test_bit_rate.rb +30 -0
  94. data/test/bmff/box/test_chunk_large_offset.rb +35 -0
  95. data/test/bmff/box/test_chunk_offset.rb +35 -0
  96. data/test/bmff/box/test_clean_aperture.rb +40 -0
  97. data/test/bmff/box/test_colour_information.rb +73 -0
  98. data/test/bmff/box/test_compact_sample_size.rb +99 -0
  99. data/test/bmff/box/test_composition_offset.rb +64 -0
  100. data/test/bmff/box/test_composition_to_decode.rb +38 -0
  101. data/test/bmff/box/test_copyright.rb +55 -0
  102. data/test/bmff/box/test_data_entry_url.rb +30 -0
  103. data/test/bmff/box/test_data_entry_urn.rb +32 -0
  104. data/test/bmff/box/test_data_information.rb +26 -0
  105. data/test/bmff/box/test_data_reference.rb +58 -0
  106. data/test/bmff/box/test_degradation_priority.rb +62 -0
  107. data/test/bmff/box/test_edit.rb +26 -0
  108. data/test/bmff/box/test_edit_list.rb +72 -0
  109. data/test/bmff/box/test_file_type.rb +30 -0
  110. data/test/bmff/box/test_free_space.rb +42 -0
  111. data/test/bmff/box/test_handler.rb +67 -0
  112. data/test/bmff/box/test_hint_media_header.rb +38 -0
  113. data/test/bmff/box/test_hint_sample_entry.rb +38 -0
  114. data/test/bmff/box/test_level_assignment.rb +50 -0
  115. data/test/bmff/box/test_media.rb +26 -0
  116. data/test/bmff/box/test_media_data.rb +25 -0
  117. data/test/bmff/box/test_media_header.rb +72 -0
  118. data/test/bmff/box/test_media_information.rb +26 -0
  119. data/test/bmff/box/test_movie.rb +26 -0
  120. data/test/bmff/box/test_movie_extends.rb +26 -0
  121. data/test/bmff/box/test_movie_extends_header.rb +52 -0
  122. data/test/bmff/box/test_movie_fragment.rb +26 -0
  123. data/test/bmff/box/test_movie_fragment_header.rb +30 -0
  124. data/test/bmff/box/test_movie_fragment_random_access.rb +26 -0
  125. data/test/bmff/box/test_movie_fragment_random_access_offset.rb +30 -0
  126. data/test/bmff/box/test_movie_header.rb +110 -0
  127. data/test/bmff/box/test_null_media_header.rb +28 -0
  128. data/test/bmff/box/test_padding_bits.rb +38 -0
  129. data/test/bmff/box/test_pixel_aspect_ratio.rb +28 -0
  130. data/test/bmff/box/test_progressive_download_info.rb +36 -0
  131. data/test/bmff/box/test_sample_auxiliary_information_offsets.rb +94 -0
  132. data/test/bmff/box/test_sample_auxiliary_information_sizes.rb +70 -0
  133. data/test/bmff/box/test_sample_dependency_type.rb +70 -0
  134. data/test/bmff/box/test_sample_description.rb +355 -0
  135. data/test/bmff/box/test_sample_size.rb +61 -0
  136. data/test/bmff/box/test_sample_table.rb +26 -0
  137. data/test/bmff/box/test_sample_to_chunk.rb +39 -0
  138. data/test/bmff/box/test_shadow_sync_sample.rb +36 -0
  139. data/test/bmff/box/test_sound_media_header.rb +32 -0
  140. data/test/bmff/box/test_sub_sample_information.rb +90 -0
  141. data/test/bmff/box/test_sync_sample.rb +34 -0
  142. data/test/bmff/box/test_text_meta_data_sample_entry.rb +49 -0
  143. data/test/bmff/box/test_time_to_sample.rb +36 -0
  144. data/test/bmff/box/test_track.rb +26 -0
  145. data/test/bmff/box/test_track_extends.rb +38 -0
  146. data/test/bmff/box/test_track_fragment.rb +26 -0
  147. data/test/bmff/box/test_track_fragment_base_media_decode_time.rb +52 -0
  148. data/test/bmff/box/test_track_fragment_header.rb +200 -0
  149. data/test/bmff/box/test_track_fragment_random_access.rb +96 -0
  150. data/test/bmff/box/test_track_group.rb +26 -0
  151. data/test/bmff/box/test_track_group_type.rb +30 -0
  152. data/test/bmff/box/test_track_header.rb +118 -0
  153. data/test/bmff/box/test_track_reference.rb +26 -0
  154. data/test/bmff/box/test_track_reference_type.rb +100 -0
  155. data/test/bmff/box/test_track_run.rb +282 -0
  156. data/test/bmff/box/test_track_selection.rb +33 -0
  157. data/test/bmff/box/test_uri.rb +30 -0
  158. data/test/bmff/box/test_uri_init.rb +32 -0
  159. data/test/bmff/box/test_uri_meta_sample_entry.rb +74 -0
  160. data/test/bmff/box/test_user_data.rb +26 -0
  161. data/test/bmff/box/test_video_media_header.rb +34 -0
  162. data/test/bmff/box/test_visual_sample_entry.rb +95 -0
  163. data/test/bmff/box/test_xml_meta_data_sample_entry.rb +51 -0
  164. data/test/bmff/test_binary_accessor.rb +805 -0
  165. data/test/bmff/test_file_container.rb +58 -0
  166. data/test/minitest_helper.rb +7 -0
  167. metadata +323 -0
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxCompositionToDecode < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("cslg")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_int32(1) # composition_to_dts_shift
17
+ io.write_int32(2) # least_decode_to_display_delta
18
+ io.write_int32(3) # greatest_decode_to_display_delta
19
+ io.write_int32(4) # composition_start_time
20
+ io.write_int32(5) # composition_end_time
21
+ size = io.pos
22
+ io.pos = 0
23
+ io.write_uint32(size)
24
+ io.pos = 0
25
+
26
+ box = BMFF::Box.get_box(io, nil)
27
+ assert_instance_of(BMFF::Box::CompositionToDecode, box)
28
+ assert_equal(size, box.actual_size)
29
+ assert_equal("cslg", box.type)
30
+ assert_equal(0, box.version)
31
+ assert_equal(0, box.flags)
32
+ assert_equal(1, box.composition_to_dts_shift)
33
+ assert_equal(2, box.least_decode_to_display_delta)
34
+ assert_equal(3, box.greatest_decode_to_display_delta)
35
+ assert_equal(4, box.composition_start_time)
36
+ assert_equal(5, box.composition_end_time)
37
+ end
38
+ end
@@ -0,0 +1,55 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxCopyright < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("cprt")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_byte("\x15\xC7") # language (eng)
17
+ io.write_null_terminated_string("Copyright (c)") # notice
18
+ size = io.pos
19
+ io.pos = 0
20
+ io.write_uint32(size)
21
+ io.pos = 0
22
+
23
+ box = BMFF::Box.get_box(io, nil)
24
+ assert_instance_of(BMFF::Box::Copyright, box)
25
+ assert_equal(size, box.actual_size)
26
+ assert_equal("cprt", box.type)
27
+ assert_equal(0, box.version)
28
+ assert_equal(0, box.flags)
29
+ assert_equal("eng", box.language)
30
+ assert_equal("Copyright (c)", box.notice)
31
+ end
32
+
33
+ def test_parse_without_notice
34
+ io = StringIO.new("", "r+:ascii-8bit")
35
+ io.extend(BMFF::BinaryAccessor)
36
+ io.write_uint32(0)
37
+ io.write_ascii("cprt")
38
+ io.write_uint8(0) # version
39
+ io.write_uint24(0) # flags
40
+ io.write_byte("\x2A\x0E") # language (jpn)
41
+ size = io.pos
42
+ io.pos = 0
43
+ io.write_uint32(size)
44
+ io.pos = 0
45
+
46
+ box = BMFF::Box.get_box(io, nil)
47
+ assert_instance_of(BMFF::Box::Copyright, box)
48
+ assert_equal(size, box.actual_size)
49
+ assert_equal("cprt", box.type)
50
+ assert_equal(0, box.version)
51
+ assert_equal(0, box.flags)
52
+ assert_equal("jpn", box.language)
53
+ assert_nil(box.notice)
54
+ end
55
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxDataEntryUrl < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("url ")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_null_terminated_string("http://example.com/") # location
17
+ size = io.pos
18
+ io.pos = 0
19
+ io.write_uint32(size)
20
+ io.pos = 0
21
+
22
+ box = BMFF::Box.get_box(io, nil)
23
+ assert_instance_of(BMFF::Box::DataEntryUrl, box)
24
+ assert_equal(size, box.actual_size)
25
+ assert_equal("url ", box.type)
26
+ assert_equal(0, box.version)
27
+ assert_equal(0, box.flags)
28
+ assert_equal("http://example.com/", box.location)
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxDataEntryUrn < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("urn ")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_null_terminated_string("bmff") # name
17
+ io.write_null_terminated_string("urn:example") # location
18
+ size = io.pos
19
+ io.pos = 0
20
+ io.write_uint32(size)
21
+ io.pos = 0
22
+
23
+ box = BMFF::Box.get_box(io, nil)
24
+ assert_instance_of(BMFF::Box::DataEntryUrn, box)
25
+ assert_equal(size, box.actual_size)
26
+ assert_equal("urn ", box.type)
27
+ assert_equal(0, box.version)
28
+ assert_equal(0, box.flags)
29
+ assert_equal("bmff", box.name)
30
+ assert_equal("urn:example", box.location)
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxDataInformation < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("dinf")
14
+ size = io.pos
15
+ io.pos = 0
16
+ io.write_uint32(size)
17
+ io.pos = 0
18
+
19
+ box = BMFF::Box.get_box(io, nil)
20
+ assert_instance_of(BMFF::Box::DataInformation, box)
21
+ assert_equal(size, box.actual_size)
22
+ assert_equal("dinf", box.type)
23
+ assert_equal([], box.children)
24
+ assert(box.container?)
25
+ end
26
+ end
@@ -0,0 +1,58 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxDataReference < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("dref")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint32(2) # entry_count
17
+ # DataEntryUrn
18
+ io.write_uint32(29) # size
19
+ io.write_ascii("urn ") # type
20
+ io.write_uint8(0) # version
21
+ io.write_uint24(0) # flags
22
+ io.write_null_terminated_string("bmff") # name
23
+ io.write_null_terminated_string("urn:example") # location
24
+ # DataEntryUrl
25
+ io.write_uint32(32) # size
26
+ io.write_ascii("url ") # type
27
+ io.write_uint8(0) # version
28
+ io.write_uint24(0) # flags
29
+ io.write_null_terminated_string("http://example.com/") # location
30
+ size = io.pos
31
+ io.pos = 0
32
+ io.write_uint32(size)
33
+ io.pos = 0
34
+
35
+ box = BMFF::Box.get_box(io, nil)
36
+ assert_instance_of(BMFF::Box::DataReference, box)
37
+ assert_equal(size, box.actual_size)
38
+ assert_equal("dref", box.type)
39
+ assert_equal(0, box.version)
40
+ assert_equal(0, box.flags)
41
+ assert_equal(2, box.entry_count)
42
+
43
+ assert_instance_of(BMFF::Box::DataEntryUrn, box.children[0])
44
+ assert_equal(29, box.children[0].actual_size)
45
+ assert_equal("urn ", box.children[0].type)
46
+ assert_equal(0, box.children[0].version)
47
+ assert_equal(0, box.children[0].flags)
48
+ assert_equal("bmff", box.children[0].name)
49
+ assert_equal("urn:example", box.children[0].location)
50
+
51
+ assert_instance_of(BMFF::Box::DataEntryUrl, box.children[1])
52
+ assert_equal(32, box.children[1].actual_size)
53
+ assert_equal("url ", box.children[1].type)
54
+ assert_equal(0, box.children[1].version)
55
+ assert_equal(0, box.children[1].flags)
56
+ assert_equal("http://example.com/", box.children[1].location)
57
+ end
58
+ end
@@ -0,0 +1,62 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxDegradationPriority < MiniTest::Unit::TestCase
9
+ class DummyBox
10
+ attr_accessor :box
11
+ def find(type)
12
+ @box
13
+ end
14
+ end
15
+
16
+ def get_sample_size(count = 1)
17
+ io = StringIO.new("", "r+:ascii-8bit")
18
+ io.extend(BMFF::BinaryAccessor)
19
+ io.write_uint32(0)
20
+ io.write_ascii("stsz")
21
+ io.write_uint8(0) # version
22
+ io.write_uint24(0) # flags
23
+ io.write_uint32(0) # sample_size
24
+ io.write_uint32(count) # sample_count
25
+ count.times do |i|
26
+ io.write_uint32(i) # entry_size
27
+ end
28
+ size = io.pos
29
+ io.pos = 0
30
+ io.write_uint32(size)
31
+ io.pos = 0
32
+
33
+ box = BMFF::Box.get_box(io, nil)
34
+ dummy = DummyBox.new
35
+ dummy.box = box
36
+ dummy
37
+ end
38
+
39
+ def test_parse
40
+ io = StringIO.new("", "r+:ascii-8bit")
41
+ io.extend(BMFF::BinaryAccessor)
42
+ io.write_uint32(0)
43
+ io.write_ascii("stdp")
44
+ io.write_uint8(0) # version
45
+ io.write_uint24(0) # flags
46
+ io.write_uint16(1) # priority
47
+ io.write_uint16(2) # priority
48
+ io.write_uint16(3) # priority
49
+ size = io.pos
50
+ io.pos = 0
51
+ io.write_uint32(size)
52
+ io.pos = 0
53
+
54
+ box = BMFF::Box.get_box(io, get_sample_size(3))
55
+ assert_instance_of(BMFF::Box::DegradationPriority, box)
56
+ assert_equal(size, box.actual_size)
57
+ assert_equal("stdp", box.type)
58
+ assert_equal(0, box.version)
59
+ assert_equal(0, box.flags)
60
+ assert_equal([1, 2, 3], box.priority)
61
+ end
62
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxEdit < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("edts")
14
+ size = io.pos
15
+ io.pos = 0
16
+ io.write_uint32(size)
17
+ io.pos = 0
18
+
19
+ box = BMFF::Box.get_box(io, nil)
20
+ assert_instance_of(BMFF::Box::Edit, box)
21
+ assert_equal(size, box.actual_size)
22
+ assert_equal("edts", box.type)
23
+ assert_equal([], box.children)
24
+ assert(box.container?)
25
+ end
26
+ end
@@ -0,0 +1,72 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxEditList < MiniTest::Unit::TestCase
9
+ def test_parse_v0
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("elst")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint32(3) # entry_count
17
+ 3.times do |i|
18
+ io.write_uint32(10 + i) # segment_duration
19
+ io.write_int32(20 + i) # media_time
20
+ io.write_int16(i) # media_rate_integer
21
+ io.write_int16(0) # media_rate_fraction
22
+ end
23
+ size = io.pos
24
+ io.pos = 0
25
+ io.write_uint32(size)
26
+ io.pos = 0
27
+
28
+ box = BMFF::Box.get_box(io, nil)
29
+ assert_instance_of(BMFF::Box::EditList, box)
30
+ assert_equal(size, box.actual_size)
31
+ assert_equal("elst", box.type)
32
+ assert_equal(0, box.version)
33
+ assert_equal(0, box.flags)
34
+ assert_equal(3, box.entry_count)
35
+ assert_equal([10, 11, 12], box.segment_duration)
36
+ assert_equal([20, 21, 22], box.media_time)
37
+ assert_equal([0, 1, 2], box.media_rate_integer)
38
+ assert_equal([0, 0, 0], box.media_rate_fraction)
39
+ end
40
+
41
+ def test_parse_v1
42
+ io = StringIO.new("", "r+:ascii-8bit")
43
+ io.extend(BMFF::BinaryAccessor)
44
+ io.write_uint32(0)
45
+ io.write_ascii("elst")
46
+ io.write_uint8(1) # version
47
+ io.write_uint24(0) # flags
48
+ io.write_uint32(3) # entry_count
49
+ 3.times do |i|
50
+ io.write_uint64(10 + i) # segment_duration
51
+ io.write_int64(20 + i) # media_time
52
+ io.write_int16(i) # media_rate_integer
53
+ io.write_int16(0) # media_rate_fraction
54
+ end
55
+ size = io.pos
56
+ io.pos = 0
57
+ io.write_uint32(size)
58
+ io.pos = 0
59
+
60
+ box = BMFF::Box.get_box(io, nil)
61
+ assert_instance_of(BMFF::Box::EditList, box)
62
+ assert_equal(size, box.actual_size)
63
+ assert_equal("elst", box.type)
64
+ assert_equal(1, box.version)
65
+ assert_equal(0, box.flags)
66
+ assert_equal(3, box.entry_count)
67
+ assert_equal([10, 11, 12], box.segment_duration)
68
+ assert_equal([20, 21, 22], box.media_time)
69
+ assert_equal([0, 1, 2], box.media_rate_integer)
70
+ assert_equal([0, 0, 0], box.media_rate_fraction)
71
+ end
72
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxFileType < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("ftyp")
14
+ io.write_ascii("isml") # major_brand
15
+ io.write_uint32(1) # minor_version
16
+ io.write_ascii("piffiso2iso6") # compatible_brands
17
+ size = io.pos
18
+ io.pos = 0
19
+ io.write_uint32(size)
20
+ io.pos = 0
21
+
22
+ box = BMFF::Box.get_box(io, nil)
23
+ assert_instance_of(BMFF::Box::FileType, box)
24
+ assert_equal(size, box.actual_size)
25
+ assert_equal("ftyp", box.type)
26
+ assert_equal("isml", box.major_brand)
27
+ assert_equal(1, box.minor_version)
28
+ assert_equal(%w(piff iso2 iso6), box.compatible_brands)
29
+ end
30
+ end
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxFreeSpace < MiniTest::Unit::TestCase
9
+ def test_parse_free
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("free")
14
+ io.write_byte("abcdefg") # data
15
+ size = io.pos
16
+ io.pos = 0
17
+ io.write_uint32(size)
18
+ io.pos = 0
19
+
20
+ box = BMFF::Box.get_box(io, nil)
21
+ assert_instance_of(BMFF::Box::FreeSpace, box)
22
+ assert_equal(size, box.actual_size)
23
+ assert_equal("free", box.type)
24
+ end
25
+
26
+ def test_parse_skip
27
+ io = StringIO.new("", "r+:ascii-8bit")
28
+ io.extend(BMFF::BinaryAccessor)
29
+ io.write_uint32(0)
30
+ io.write_ascii("skip")
31
+ io.write_byte("abcdefg") # data
32
+ size = io.pos
33
+ io.pos = 0
34
+ io.write_uint32(size)
35
+ io.pos = 0
36
+
37
+ box = BMFF::Box.get_box(io, nil)
38
+ assert_instance_of(BMFF::Box::FreeSpace, box)
39
+ assert_equal(size, box.actual_size)
40
+ assert_equal("skip", box.type)
41
+ end
42
+ end
@@ -0,0 +1,67 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxHandler < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("hdlr")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint32(0) # pre_defined
17
+ io.write_ascii("vide") # handler_type
18
+ io.write_uint32(0) # reserved1
19
+ io.write_uint32(0) # reserved1
20
+ io.write_uint32(0) # reserved1
21
+ io.write_null_terminated_string("bmff test") # name
22
+ size = io.pos
23
+ io.pos = 0
24
+ io.write_uint32(size)
25
+ io.pos = 0
26
+
27
+ box = BMFF::Box.get_box(io, nil)
28
+ assert_instance_of(BMFF::Box::Handler, box)
29
+ assert_equal(size, box.actual_size)
30
+ assert_equal("hdlr", box.type)
31
+ assert_equal(0, box.version)
32
+ assert_equal(0, box.flags)
33
+ assert_equal(0, box.pre_defined)
34
+ assert_equal("vide", box.handler_type)
35
+ assert_equal([0, 0, 0], box.reserved1)
36
+ assert_equal("bmff test", box.name)
37
+ end
38
+
39
+ def test_parse_without_name
40
+ io = StringIO.new("", "r+:ascii-8bit")
41
+ io.extend(BMFF::BinaryAccessor)
42
+ io.write_uint32(0)
43
+ io.write_ascii("hdlr")
44
+ io.write_uint8(0) # version
45
+ io.write_uint24(0) # flags
46
+ io.write_uint32(0) # pre_defined
47
+ io.write_ascii("vide") # handler_type
48
+ io.write_uint32(0) # reserved1
49
+ io.write_uint32(0) # reserved1
50
+ io.write_uint32(0) # reserved1
51
+ size = io.pos
52
+ io.pos = 0
53
+ io.write_uint32(size)
54
+ io.pos = 0
55
+
56
+ box = BMFF::Box.get_box(io, nil)
57
+ assert_instance_of(BMFF::Box::Handler, box)
58
+ assert_equal(size, box.actual_size)
59
+ assert_equal("hdlr", box.type)
60
+ assert_equal(0, box.version)
61
+ assert_equal(0, box.flags)
62
+ assert_equal(0, box.pre_defined)
63
+ assert_equal("vide", box.handler_type)
64
+ assert_equal([0, 0, 0], box.reserved1)
65
+ assert_nil(box.name)
66
+ end
67
+ end
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxHintMediaHeader < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("hmhd")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint16(10) # max_pdu_size
17
+ io.write_uint16(5) # avg_pdu_size
18
+ io.write_uint32(1000000) # maxbitrate
19
+ io.write_uint32(500000) # avgbitrate
20
+ io.write_uint32(0) # reserved1
21
+ size = io.pos
22
+ io.pos = 0
23
+ io.write_uint32(size)
24
+ io.pos = 0
25
+
26
+ box = BMFF::Box.get_box(io, nil)
27
+ assert_instance_of(BMFF::Box::HintMediaHeader, box)
28
+ assert_equal(size, box.actual_size)
29
+ assert_equal("hmhd", box.type)
30
+ assert_equal(0, box.version)
31
+ assert_equal(0, box.flags)
32
+ assert_equal(10, box.max_pdu_size)
33
+ assert_equal(5, box.avg_pdu_size)
34
+ assert_equal(1000000, box.maxbitrate)
35
+ assert_equal(500000, box.avgbitrate)
36
+ assert_equal(0, box.reserved1)
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxHintSampleEntry < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("hint")
14
+ io.write_uint8(0) # reserved1
15
+ io.write_uint8(0) # reserved1
16
+ io.write_uint8(0) # reserved1
17
+ io.write_uint8(0) # reserved1
18
+ io.write_uint8(0) # reserved1
19
+ io.write_uint8(0) # reserved1
20
+ io.write_uint16(1) # data_reference_index
21
+ io.write_uint8(0) # data
22
+ io.write_uint8(1) # data
23
+ io.write_uint8(2) # data
24
+ io.write_uint8(3) # data
25
+ size = io.pos
26
+ io.pos = 0
27
+ io.write_uint32(size)
28
+ io.pos = 0
29
+
30
+ box = BMFF::Box.get_box(io, nil, BMFF::Box::HintSampleEntry)
31
+ assert_instance_of(BMFF::Box::HintSampleEntry, box)
32
+ assert_equal(size, box.actual_size)
33
+ assert_equal("hint", box.type)
34
+ assert_equal([0, 0, 0, 0, 0, 0], box.reserved1)
35
+ assert_equal(1, box.data_reference_index)
36
+ assert_equal([0, 1, 2, 3], box.data)
37
+ end
38
+ end
@@ -0,0 +1,50 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../../minitest_helper'
5
+ require 'bmff/box'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBoxLevelAssignment < MiniTest::Unit::TestCase
9
+ def test_parse
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("leva")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint8(5) # level_count
17
+ 5.times do |i|
18
+ io.write_uint32(i) # track_id
19
+ io.write_uint8(i) # padding_flag, assignment_type
20
+ case i
21
+ when 0
22
+ io.write_uint32(10 + i) # grouping_type
23
+ when 1
24
+ io.write_uint32(10 + i) # grouping_type
25
+ io.write_uint32(20 + i) # grouping_type_parameter
26
+ when 4
27
+ io.write_uint32(30 + i) # sub_track_id
28
+ end
29
+ end
30
+ size = io.pos
31
+ io.pos = 0
32
+ io.write_uint32(size)
33
+ io.pos = 0
34
+
35
+ box = BMFF::Box.get_box(io, nil)
36
+ assert_instance_of(BMFF::Box::LevelAssignment, box)
37
+ assert_equal(size, box.actual_size)
38
+ assert_equal("leva", box.type)
39
+ assert_equal(0, box.version)
40
+ assert_equal(0, box.flags)
41
+ assert_equal(5, box.level_count)
42
+ assert_equal(5, box.levels.count)
43
+ assert_equal([0, 1, 2, 3, 4], box.levels.map{|e| e.track_id})
44
+ assert_equal([0, 0, 0, 0, 0], box.levels.map{|e| e.padding_flag})
45
+ assert_equal([0, 1, 2, 3, 4], box.levels.map{|e| e.assignment_type})
46
+ assert_equal([10, 11, nil, nil, nil], box.levels.map{|e| e.grouping_type})
47
+ assert_equal([nil, 21, nil, nil, nil], box.levels.map{|e| e.grouping_type_parameter})
48
+ assert_equal([nil, nil, nil, nil, 34], box.levels.map{|e| e.sub_track_id})
49
+ end
50
+ end