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,96 @@
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 TestBMFFBoxTrackFragmentRandomAccess < 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("tfra")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint32(1) # track_id
17
+ io.write_uint32(6) # reserved1,
18
+ # length_size_of_traf_num (0),
19
+ # length_size_of_trun_num (1),
20
+ # length_size_of_sample_num (2)
21
+ io.write_uint32(3) # number_of_entry
22
+ 3.times do |i|
23
+ io.write_uint32(i) # time
24
+ io.write_uint32(10 + i) # moof_offset
25
+
26
+ io.write_uint8(20 + i) # traf_number
27
+ io.write_uint16(30 + i) # trun_number
28
+ io.write_uint24(40 + i) # sample_number
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::TrackFragmentRandomAccess, box)
37
+ assert_equal(size, box.actual_size)
38
+ assert_equal("tfra", box.type)
39
+ assert_equal(0, box.version)
40
+ assert_equal(0, box.flags)
41
+ assert_equal(1, box.track_id)
42
+ assert_equal(0, box.reserved1)
43
+ assert_equal(0, box.length_size_of_traf_num)
44
+ assert_equal(1, box.length_size_of_trun_num)
45
+ assert_equal(2, box.length_size_of_sample_num)
46
+ assert_equal([0, 1, 2], box.time)
47
+ assert_equal([10, 11, 12], box.moof_offset)
48
+ assert_equal([20, 21, 22], box.traf_number)
49
+ assert_equal([30, 31, 32], box.trun_number)
50
+ assert_equal([40, 41, 42], box.sample_number)
51
+ end
52
+
53
+ def test_parse_v1
54
+ io = StringIO.new("", "r+:ascii-8bit")
55
+ io.extend(BMFF::BinaryAccessor)
56
+ io.write_uint32(0)
57
+ io.write_ascii("tfra")
58
+ io.write_uint8(1) # version
59
+ io.write_uint24(0) # flags
60
+ io.write_uint32(1) # track_id
61
+ io.write_uint32(57) # reserved1,
62
+ # length_size_of_traf_num (3),
63
+ # length_size_of_trun_num (2),
64
+ # length_size_of_sample_num (1)
65
+ io.write_uint32(3) # number_of_entry
66
+ 3.times do |i|
67
+ io.write_uint64(4294967296 + i) # time
68
+ io.write_uint64(4294967306 + i) # moof_offset
69
+
70
+ io.write_uint32(20 + i) # traf_number
71
+ io.write_uint24(30 + i) # trun_number
72
+ io.write_uint16(40 + i) # sample_number
73
+ end
74
+ size = io.pos
75
+ io.pos = 0
76
+ io.write_uint32(size)
77
+ io.pos = 0
78
+
79
+ box = BMFF::Box.get_box(io, nil)
80
+ assert_instance_of(BMFF::Box::TrackFragmentRandomAccess, box)
81
+ assert_equal(size, box.actual_size)
82
+ assert_equal("tfra", box.type)
83
+ assert_equal(1, box.version)
84
+ assert_equal(0, box.flags)
85
+ assert_equal(1, box.track_id)
86
+ assert_equal(0, box.reserved1)
87
+ assert_equal(3, box.length_size_of_traf_num)
88
+ assert_equal(2, box.length_size_of_trun_num)
89
+ assert_equal(1, box.length_size_of_sample_num)
90
+ assert_equal([4294967296, 4294967297, 4294967298], box.time)
91
+ assert_equal([4294967306, 4294967307, 4294967308], box.moof_offset)
92
+ assert_equal([20, 21, 22], box.traf_number)
93
+ assert_equal([30, 31, 32], box.trun_number)
94
+ assert_equal([40, 41, 42], box.sample_number)
95
+ end
96
+ 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 TestBMFFBoxTrackGroup < 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("trgr")
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::TrackGroup, box)
21
+ assert_equal(size, box.actual_size)
22
+ assert_equal("trgr", box.type)
23
+ assert_equal([], box.children)
24
+ assert(box.container?)
25
+ end
26
+ 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 TestBMFFBoxTrackGroupType < 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("msrc")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint32(1) # track_group_id
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::TrackGroupType, box)
24
+ assert_equal(size, box.actual_size)
25
+ assert_equal("msrc", box.type)
26
+ assert_equal(0, box.version)
27
+ assert_equal(0, box.flags)
28
+ assert_equal(1, box.track_group_id)
29
+ end
30
+ end
@@ -0,0 +1,118 @@
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 TestBMFFBoxTrackHeader < 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("tkhd")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0) # flags
16
+ io.write_uint32(3482338006) # creation_time
17
+ io.write_uint32(3482338007) # modification_time
18
+ io.write_uint32(1) # track_id
19
+ io.write_uint32(0) # reserved1
20
+ io.write_uint32(30000000) # duration
21
+ io.write_uint32(0) # reserved2
22
+ io.write_uint32(0) # reserved2
23
+ io.write_int16(0) # layer
24
+ io.write_int16(0) # alternate_group
25
+ io.write_int16(256) # volume
26
+ io.write_uint16(0) # reserved3
27
+ io.write_int32(65536) # matrix
28
+ io.write_int32(0) # matrix
29
+ io.write_int32(0) # matrix
30
+ io.write_int32(0) # matrix
31
+ io.write_int32(65536) # matrix
32
+ io.write_int32(0) # matrix
33
+ io.write_int32(0) # matrix
34
+ io.write_int32(0) # matrix
35
+ io.write_int32(1073741824) # matrix
36
+ io.write_uint32(1920)
37
+ io.write_uint32(1080)
38
+ size = io.pos
39
+ io.pos = 0
40
+ io.write_uint32(size)
41
+ io.pos = 0
42
+
43
+ box = BMFF::Box.get_box(io, nil)
44
+ assert_instance_of(BMFF::Box::TrackHeader, box)
45
+ assert_equal(size, box.actual_size)
46
+ assert_equal("tkhd", box.type)
47
+ assert_equal(0, box.version)
48
+ assert_equal(0, box.flags)
49
+ assert_equal(3482338006, box.creation_time)
50
+ assert_equal(3482338007, box.modification_time)
51
+ assert_equal(1, box.track_id)
52
+ assert_equal(0, box.reserved1)
53
+ assert_equal(30000000, box.duration)
54
+ assert_equal([0, 0], box.reserved2)
55
+ assert_equal(0, box.layer)
56
+ assert_equal(0, box.alternate_group)
57
+ assert_equal(256, box.volume)
58
+ assert_equal(0, box.reserved3)
59
+ assert_equal([65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824], box.matrix)
60
+ assert_equal(1920, box.width)
61
+ assert_equal(1080, box.height)
62
+ end
63
+
64
+ def test_parse_v1
65
+ io = StringIO.new("", "r+:ascii-8bit")
66
+ io.extend(BMFF::BinaryAccessor)
67
+ io.write_uint32(0)
68
+ io.write_ascii("tkhd")
69
+ io.write_uint8(1) # version
70
+ io.write_uint24(0) # flags
71
+ io.write_uint64(3482338006) # creation_time
72
+ io.write_uint64(3482338007) # modification_time
73
+ io.write_uint32(1) # track_id
74
+ io.write_uint32(0) # reserved1
75
+ io.write_uint64(30000000) # duration
76
+ io.write_uint32(0) # reserved2
77
+ io.write_uint32(0) # reserved2
78
+ io.write_int16(0) # layer
79
+ io.write_int16(0) # alternate_group
80
+ io.write_int16(0) # volume
81
+ io.write_uint16(0) # reserved3
82
+ io.write_int32(65536) # matrix
83
+ io.write_int32(0) # matrix
84
+ io.write_int32(0) # matrix
85
+ io.write_int32(0) # matrix
86
+ io.write_int32(65536) # matrix
87
+ io.write_int32(0) # matrix
88
+ io.write_int32(0) # matrix
89
+ io.write_int32(0) # matrix
90
+ io.write_int32(1073741824) # matrix
91
+ io.write_uint32(1920)
92
+ io.write_uint32(1080)
93
+ size = io.pos
94
+ io.pos = 0
95
+ io.write_uint32(size)
96
+ io.pos = 0
97
+
98
+ box = BMFF::Box.get_box(io, nil)
99
+ assert_instance_of(BMFF::Box::TrackHeader, box)
100
+ assert_equal(size, box.actual_size)
101
+ assert_equal("tkhd", box.type)
102
+ assert_equal(1, box.version)
103
+ assert_equal(0, box.flags)
104
+ assert_equal(3482338006, box.creation_time)
105
+ assert_equal(3482338007, box.modification_time)
106
+ assert_equal(1, box.track_id)
107
+ assert_equal(0, box.reserved1)
108
+ assert_equal(30000000, box.duration)
109
+ assert_equal([0, 0], box.reserved2)
110
+ assert_equal(0, box.layer)
111
+ assert_equal(0, box.alternate_group)
112
+ assert_equal(0, box.volume)
113
+ assert_equal(0, box.reserved3)
114
+ assert_equal([65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824], box.matrix)
115
+ assert_equal(1920, box.width)
116
+ assert_equal(1080, box.height)
117
+ end
118
+ 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 TestBMFFBoxTrackReference < 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("tref")
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::TrackReference, box)
21
+ assert_equal(size, box.actual_size)
22
+ assert_equal("tref", box.type)
23
+ assert_equal([], box.children)
24
+ assert(box.container?)
25
+ end
26
+ end
@@ -0,0 +1,100 @@
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 TestBMFFBoxTrackReferenceType < MiniTest::Unit::TestCase
9
+ def test_parse_hint
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_uint32(1) # track_ids
15
+ io.write_uint32(2) # track_ids
16
+ io.write_uint32(3) # track_ids
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::TrackReferenceType, box)
24
+ assert_equal(size, box.actual_size)
25
+ assert_equal("hint", box.type)
26
+ assert_equal([1, 2, 3], box.track_ids)
27
+ end
28
+
29
+ def test_parse_cdsc
30
+ io = StringIO.new("", "r+:ascii-8bit")
31
+ io.extend(BMFF::BinaryAccessor)
32
+ io.write_uint32(0)
33
+ io.write_ascii("cdsc")
34
+ io.write_uint32(1) # track_ids
35
+ size = io.pos
36
+ io.pos = 0
37
+ io.write_uint32(size)
38
+ io.pos = 0
39
+
40
+ box = BMFF::Box.get_box(io, nil)
41
+ assert_instance_of(BMFF::Box::TrackReferenceType, box)
42
+ assert_equal(size, box.actual_size)
43
+ assert_equal("cdsc", box.type)
44
+ assert_equal([1], box.track_ids)
45
+ end
46
+
47
+ def test_parse_hind
48
+ io = StringIO.new("", "r+:ascii-8bit")
49
+ io.extend(BMFF::BinaryAccessor)
50
+ io.write_uint32(0)
51
+ io.write_ascii("hind")
52
+ io.write_uint32(1) # track_ids
53
+ size = io.pos
54
+ io.pos = 0
55
+ io.write_uint32(size)
56
+ io.pos = 0
57
+
58
+ box = BMFF::Box.get_box(io, nil)
59
+ assert_instance_of(BMFF::Box::TrackReferenceType, box)
60
+ assert_equal(size, box.actual_size)
61
+ assert_equal("hind", box.type)
62
+ assert_equal([1], box.track_ids)
63
+ end
64
+
65
+ def test_parse_vdep
66
+ io = StringIO.new("", "r+:ascii-8bit")
67
+ io.extend(BMFF::BinaryAccessor)
68
+ io.write_uint32(0)
69
+ io.write_ascii("vdep")
70
+ io.write_uint32(1) # track_ids
71
+ size = io.pos
72
+ io.pos = 0
73
+ io.write_uint32(size)
74
+ io.pos = 0
75
+
76
+ box = BMFF::Box.get_box(io, nil)
77
+ assert_instance_of(BMFF::Box::TrackReferenceType, box)
78
+ assert_equal(size, box.actual_size)
79
+ assert_equal("vdep", box.type)
80
+ assert_equal([1], box.track_ids)
81
+ end
82
+
83
+ def test_parse_cdsc
84
+ io = StringIO.new("", "r+:ascii-8bit")
85
+ io.extend(BMFF::BinaryAccessor)
86
+ io.write_uint32(0)
87
+ io.write_ascii("vplx")
88
+ io.write_uint32(1) # track_ids
89
+ size = io.pos
90
+ io.pos = 0
91
+ io.write_uint32(size)
92
+ io.pos = 0
93
+
94
+ box = BMFF::Box.get_box(io, nil)
95
+ assert_instance_of(BMFF::Box::TrackReferenceType, box)
96
+ assert_equal(size, box.actual_size)
97
+ assert_equal("vplx", box.type)
98
+ assert_equal([1], box.track_ids)
99
+ end
100
+ end
@@ -0,0 +1,282 @@
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 TestBMFFBoxTrackRun < MiniTest::Unit::TestCase
9
+ def test_parse_v0_flags_full_present
10
+ io = StringIO.new("", "r+:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ io.write_uint32(0)
13
+ io.write_ascii("trun")
14
+ io.write_uint8(0) # version
15
+ io.write_uint24(0x01 | 0x04 | 0x0100 | 0x0200 | 0x0400 | 0x0800) # flags
16
+ io.write_uint32(3) # sample_count
17
+ io.write_int32(2) # data_offset
18
+ io.write_uint32(3) # first_sample_flags
19
+ 3.times do |i|
20
+ io.write_uint32(4 + i) # sample_duration
21
+ io.write_uint32(5 + i) # sample_size
22
+ io.write_uint32(6 + i) # sample_flags
23
+ io.write_uint32(7 + i) # sample_composition_time_offset
24
+ end
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)
31
+ assert_instance_of(BMFF::Box::TrackRun, box)
32
+ assert_equal(size, box.actual_size)
33
+ assert_equal("trun", box.type)
34
+ assert_equal(0, box.version)
35
+ assert_equal(3845, box.flags)
36
+ assert_equal(3, box.sample_count)
37
+ assert_equal(2, box.data_offset)
38
+ assert_equal(3, box.first_sample_flags)
39
+ assert_equal([4, 5, 6], box.sample_duration)
40
+ assert_equal([5, 6, 7], box.sample_size)
41
+ assert_equal([6, 7, 8], box.sample_flags)
42
+ assert_equal([7, 8, 9], box.sample_composition_time_offset)
43
+ end
44
+
45
+ def test_parse_v0_flags_data_offset_present
46
+ io = StringIO.new("", "r+:ascii-8bit")
47
+ io.extend(BMFF::BinaryAccessor)
48
+ io.write_uint32(0)
49
+ io.write_ascii("trun")
50
+ io.write_uint8(0) # version
51
+ io.write_uint24(0x01) # flags
52
+ io.write_uint32(3) # sample_count
53
+ io.write_int32(2) # data_offset
54
+ size = io.pos
55
+ io.pos = 0
56
+ io.write_uint32(size)
57
+ io.pos = 0
58
+
59
+ box = BMFF::Box.get_box(io, nil)
60
+ assert_instance_of(BMFF::Box::TrackRun, box)
61
+ assert_equal(size, box.actual_size)
62
+ assert_equal("trun", box.type)
63
+ assert_equal(0, box.version)
64
+ assert_equal(1, box.flags)
65
+ assert_equal(3, box.sample_count)
66
+ assert_equal(2, box.data_offset)
67
+ assert_nil(box.first_sample_flags)
68
+ assert_nil(box.sample_duration)
69
+ assert_nil(box.sample_size)
70
+ assert_nil(box.sample_flags)
71
+ assert_nil(box.sample_composition_time_offset)
72
+ end
73
+
74
+ def test_parse_v0_flags_first_sample_flags_present
75
+ io = StringIO.new("", "r+:ascii-8bit")
76
+ io.extend(BMFF::BinaryAccessor)
77
+ io.write_uint32(0)
78
+ io.write_ascii("trun")
79
+ io.write_uint8(0) # version
80
+ io.write_uint24(0x04) # flags
81
+ io.write_uint32(3) # sample_count
82
+ io.write_uint32(3) # first_sample_flags
83
+ size = io.pos
84
+ io.pos = 0
85
+ io.write_uint32(size)
86
+ io.pos = 0
87
+
88
+ box = BMFF::Box.get_box(io, nil)
89
+ assert_instance_of(BMFF::Box::TrackRun, box)
90
+ assert_equal(size, box.actual_size)
91
+ assert_equal("trun", box.type)
92
+ assert_equal(0, box.version)
93
+ assert_equal(4, box.flags)
94
+ assert_equal(3, box.sample_count)
95
+ assert_nil(box.data_offset)
96
+ assert_equal(3, box.first_sample_flags)
97
+ assert_nil(box.sample_duration)
98
+ assert_nil(box.sample_size)
99
+ assert_nil(box.sample_flags)
100
+ assert_nil(box.sample_composition_time_offset)
101
+ end
102
+
103
+ def test_parse_v0_flags_sample_duration_present
104
+ io = StringIO.new("", "r+:ascii-8bit")
105
+ io.extend(BMFF::BinaryAccessor)
106
+ io.write_uint32(0)
107
+ io.write_ascii("trun")
108
+ io.write_uint8(0) # version
109
+ io.write_uint24(0x0100) # flags
110
+ io.write_uint32(3) # sample_count
111
+ #io.write_int32(2) # data_offset
112
+ #io.write_uint32(3) # first_sample_flags
113
+ 3.times do |i|
114
+ io.write_uint32(4 + i) # sample_duration
115
+ #io.write_uint32(5 + i) # sample_size
116
+ #io.write_uint32(6 + i) # sample_flags
117
+ #io.write_uint32(7 + i) # sample_composition_time_offset
118
+ end
119
+ size = io.pos
120
+ io.pos = 0
121
+ io.write_uint32(size)
122
+ io.pos = 0
123
+
124
+ box = BMFF::Box.get_box(io, nil)
125
+ assert_instance_of(BMFF::Box::TrackRun, box)
126
+ assert_equal(size, box.actual_size)
127
+ assert_equal("trun", box.type)
128
+ assert_equal(0, box.version)
129
+ assert_equal(256, box.flags)
130
+ assert_equal(3, box.sample_count)
131
+ assert_nil(box.data_offset)
132
+ assert_nil(box.first_sample_flags)
133
+ assert_equal([4, 5, 6], box.sample_duration)
134
+ assert_nil(box.sample_size)
135
+ assert_nil(box.sample_flags)
136
+ assert_nil(box.sample_composition_time_offset)
137
+ end
138
+
139
+ def test_parse_v0_flags_sample_size_present
140
+ io = StringIO.new("", "r+:ascii-8bit")
141
+ io.extend(BMFF::BinaryAccessor)
142
+ io.write_uint32(0)
143
+ io.write_ascii("trun")
144
+ io.write_uint8(0) # version
145
+ io.write_uint24(0x0200) # flags
146
+ io.write_uint32(3) # sample_count
147
+ #io.write_int32(2) # data_offset
148
+ #io.write_uint32(3) # first_sample_flags
149
+ 3.times do |i|
150
+ #io.write_uint32(4 + i) # sample_duration
151
+ io.write_uint32(5 + i) # sample_size
152
+ #io.write_uint32(6 + i) # sample_flags
153
+ #io.write_uint32(7 + i) # sample_composition_time_offset
154
+ end
155
+ size = io.pos
156
+ io.pos = 0
157
+ io.write_uint32(size)
158
+ io.pos = 0
159
+
160
+ box = BMFF::Box.get_box(io, nil)
161
+ assert_instance_of(BMFF::Box::TrackRun, box)
162
+ assert_equal(size, box.actual_size)
163
+ assert_equal("trun", box.type)
164
+ assert_equal(0, box.version)
165
+ assert_equal(512, box.flags)
166
+ assert_equal(3, box.sample_count)
167
+ assert_nil(box.data_offset)
168
+ assert_nil(box.first_sample_flags)
169
+ assert_nil(box.sample_duration)
170
+ assert_equal([5, 6, 7], box.sample_size)
171
+ assert_nil(box.sample_flags)
172
+ assert_nil(box.sample_composition_time_offset)
173
+ end
174
+
175
+ def test_parse_v0_flags_sample_flags_present
176
+ io = StringIO.new("", "r+:ascii-8bit")
177
+ io.extend(BMFF::BinaryAccessor)
178
+ io.write_uint32(0)
179
+ io.write_ascii("trun")
180
+ io.write_uint8(0) # version
181
+ io.write_uint24(0x0400) # flags
182
+ io.write_uint32(3) # sample_count
183
+ #io.write_int32(2) # data_offset
184
+ #io.write_uint32(3) # first_sample_flags
185
+ 3.times do |i|
186
+ #io.write_uint32(4 + i) # sample_duration
187
+ #io.write_uint32(5 + i) # sample_size
188
+ io.write_uint32(6 + i) # sample_flags
189
+ #io.write_uint32(7 + i) # sample_composition_time_offset
190
+ end
191
+ size = io.pos
192
+ io.pos = 0
193
+ io.write_uint32(size)
194
+ io.pos = 0
195
+
196
+ box = BMFF::Box.get_box(io, nil)
197
+ assert_instance_of(BMFF::Box::TrackRun, box)
198
+ assert_equal(size, box.actual_size)
199
+ assert_equal("trun", box.type)
200
+ assert_equal(0, box.version)
201
+ assert_equal(1024, box.flags)
202
+ assert_equal(3, box.sample_count)
203
+ assert_nil(box.data_offset)
204
+ assert_nil(box.first_sample_flags)
205
+ assert_nil(box.sample_duration)
206
+ assert_nil(box.sample_size)
207
+ assert_equal([6, 7, 8], box.sample_flags)
208
+ assert_nil(box.sample_composition_time_offset)
209
+ end
210
+
211
+ def test_parse_v0_flags_sample_composition_time_offset_present
212
+ io = StringIO.new("", "r+:ascii-8bit")
213
+ io.extend(BMFF::BinaryAccessor)
214
+ io.write_uint32(0)
215
+ io.write_ascii("trun")
216
+ io.write_uint8(0) # version
217
+ io.write_uint24(0x0800) # flags
218
+ io.write_uint32(3) # sample_count
219
+ #io.write_int32(2) # data_offset
220
+ #io.write_uint32(3) # first_sample_flags
221
+ 3.times do |i|
222
+ #io.write_uint32(4 + i) # sample_duration
223
+ #io.write_uint32(5 + i) # sample_size
224
+ #io.write_uint32(6 + i) # sample_flags
225
+ io.write_uint32(7 + i) # sample_composition_time_offset
226
+ end
227
+ size = io.pos
228
+ io.pos = 0
229
+ io.write_uint32(size)
230
+ io.pos = 0
231
+
232
+ box = BMFF::Box.get_box(io, nil)
233
+ assert_instance_of(BMFF::Box::TrackRun, box)
234
+ assert_equal(size, box.actual_size)
235
+ assert_equal("trun", box.type)
236
+ assert_equal(0, box.version)
237
+ assert_equal(2048, box.flags)
238
+ assert_equal(3, box.sample_count)
239
+ assert_nil(box.data_offset)
240
+ assert_nil(box.first_sample_flags)
241
+ assert_nil(box.sample_duration)
242
+ assert_nil(box.sample_size)
243
+ assert_nil(box.sample_flags)
244
+ assert_equal([7, 8, 9], box.sample_composition_time_offset)
245
+ end
246
+
247
+ def test_parse_v1_flags_sample_composition_time_offset_present
248
+ io = StringIO.new("", "r+:ascii-8bit")
249
+ io.extend(BMFF::BinaryAccessor)
250
+ io.write_uint32(0)
251
+ io.write_ascii("trun")
252
+ io.write_uint8(1) # version
253
+ io.write_uint24(0x0800) # flags
254
+ io.write_uint32(3) # sample_count
255
+ #io.write_int32(2) # data_offset
256
+ #io.write_uint32(3) # first_sample_flags
257
+ 3.times do |i|
258
+ #io.write_uint32(4 + i) # sample_duration
259
+ #io.write_uint32(5 + i) # sample_size
260
+ #io.write_uint32(6 + i) # sample_flags
261
+ io.write_int32(0 - i) # sample_composition_time_offset
262
+ end
263
+ size = io.pos
264
+ io.pos = 0
265
+ io.write_uint32(size)
266
+ io.pos = 0
267
+
268
+ box = BMFF::Box.get_box(io, nil)
269
+ assert_instance_of(BMFF::Box::TrackRun, box)
270
+ assert_equal(size, box.actual_size)
271
+ assert_equal("trun", box.type)
272
+ assert_equal(1, box.version)
273
+ assert_equal(2048, box.flags)
274
+ assert_equal(3, box.sample_count)
275
+ assert_nil(box.data_offset)
276
+ assert_nil(box.first_sample_flags)
277
+ assert_nil(box.sample_duration)
278
+ assert_nil(box.sample_size)
279
+ assert_nil(box.sample_flags)
280
+ assert_equal([0, -1, -2], box.sample_composition_time_offset)
281
+ end
282
+ end