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,24 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleAuxiliaryInformationOffsets < BMFF::Box::Full
5
+ attr_accessor :aux_info_type, :aux_info_type_parameter, :entry_count, :offsets
6
+ register_box "saio"
7
+
8
+ def parse_data
9
+ super
10
+ if flags & 1 > 0
11
+ @aux_info_type = io.get_uint32
12
+ @aux_info_type_parameter = io.get_uint32
13
+ end
14
+ @entry_count = io.get_uint32
15
+ @offsets = []
16
+ @entry_count.times do
17
+ if version == 0
18
+ @offsets << io.get_uint32
19
+ else
20
+ @offsets << io.get_uint64
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleAuxiliaryInformationSizes < BMFF::Box::Full
5
+ attr_accessor :aux_info_type, :aux_info_type_parameter, :default_sample_info_size, :sample_count, :sample_info_size
6
+ register_box "saiz"
7
+
8
+ def parse_data
9
+ super
10
+ if flags & 1 > 0
11
+ @aux_info_type = io.get_uint32
12
+ @aux_info_type_parameter = io.get_uint32
13
+ end
14
+ @default_sample_info_size = io.get_uint8
15
+ @sample_count = io.get_uint32
16
+ if @default_sample_info_size == 0
17
+ @sample_info_size = []
18
+ @sample_count.times do
19
+ @sample_info_size << io.get_uint8
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleDependencyType < BMFF::Box::Full
5
+ attr_accessor :is_leading, :sample_depends_on, :sample_is_depended_on, :sample_has_redundancy
6
+ register_box "sdtp"
7
+
8
+ def parse_data
9
+ super
10
+ sample_size_box = parent.find(BMFF::Box::SampleSize)
11
+ if sample_size_box
12
+ sample_count = sample_size_box.sample_count
13
+ @is_leading = []
14
+ @sample_depends_on = []
15
+ @sample_is_depended_on = []
16
+ @sample_has_redundancy = []
17
+ sample_count.times do
18
+ tmp = io.get_uint8
19
+ @is_leading << (tmp >> 6)
20
+ @sample_depends_on << ((tmp >> 4) & 0x03)
21
+ @sample_is_depended_on << ((tmp >> 2) & 0x03)
22
+ @sample_has_redundancy << (tmp & 0x03)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleDescription < BMFF::Box::Full
5
+ attr_accessor :entry_count
6
+ register_box "stsd"
7
+ include(BMFF::Box::Container)
8
+
9
+ def parse_data
10
+ super
11
+ @entry_count = io.get_uint32
12
+ if handler = parent.parent.parent.find(BMFF::Box::Handler)
13
+ @entry_count.times do
14
+ case handler.handler_type
15
+ when "soun"
16
+ add_child BMFF::Box.get_box(io, self, BMFF::Box::AudioSampleEntry)
17
+ when "vide"
18
+ add_child BMFF::Box.get_box(io, self, BMFF::Box::VisualSampleEntry)
19
+ when "hint"
20
+ add_child BMFF::Box.get_box(io, self, BMFF::Box::HintSampleEntry)
21
+ when "meta"
22
+ add_child BMFF::Box.get_box(io, self)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleEntry < BMFF::Box::Base
5
+ attr_accessor :reserved1, :data_reference_index
6
+
7
+ def parse_data
8
+ super
9
+ @reserved1 = []
10
+ 6.times do
11
+ @reserved1 << io.get_uint8
12
+ end
13
+ @data_reference_index = io.get_uint16
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleSize < BMFF::Box::Full
5
+ attr_accessor :sample_size, :sample_count, :entry_size
6
+ register_box "stsz"
7
+
8
+ def parse_data
9
+ super
10
+ @sample_size = io.get_uint32
11
+ @sample_count = io.get_uint32
12
+ @entry_size = []
13
+ if @sample_size == 0
14
+ @sample_count.times do
15
+ @entry_size << io.get_uint32
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleTable < BMFF::Box::Base
5
+ register_box "stbl"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SampleToChunk < BMFF::Box::Full
5
+ attr_accessor :entry_count, :first_chunk, :samples_per_chunk, :sample_description_index
6
+ register_box "stsc"
7
+
8
+ def parse_data
9
+ super
10
+ @entry_count = io.get_uint32
11
+ @first_chunk = []
12
+ @samples_per_chunk = []
13
+ @sample_description_index = []
14
+ @entry_count.times do
15
+ @first_chunk << io.get_uint32
16
+ @samples_per_chunk << io.get_uint32
17
+ @sample_description_index << io.get_uint32
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::ShadowSyncSample < BMFF::Box::Full
5
+ attr_accessor :entry_count, :shadowed_sample_number, :sync_sample_number
6
+ register_box "stsh"
7
+
8
+ def parse_data
9
+ super
10
+ @entry_count = io.get_uint32
11
+ @shadowed_sample_number = []
12
+ @sync_sample_number = []
13
+ @entry_count.times do
14
+ @shadowed_sample_number << io.get_uint32
15
+ @sync_sample_number << io.get_uint32
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SoundMediaHeader < BMFF::Box::Full
5
+ attr_accessor :balance, :reserved1
6
+ register_box "smhd"
7
+
8
+ def parse_data
9
+ super
10
+ @balance = io.get_int16
11
+ @reserved1 = io.get_uint16
12
+ end
13
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SubSampleInformation < BMFF::Box::Full
5
+ attr_accessor :entry_count, :sample_delta, :subsample_count, :subsamples
6
+ register_box "subs"
7
+
8
+ class SubSample
9
+ attr_accessor :subsample_size, :subsample_priority, :discardable, :reserved1
10
+ def initialize
11
+ @subsample_size = []
12
+ @subsample_priority = []
13
+ @discardable = []
14
+ @reserved1 = []
15
+ end
16
+ end
17
+
18
+ def parse_data
19
+ super
20
+ @entry_count = io.get_uint32
21
+ @sample_delta = []
22
+ @subsample_count = []
23
+ @subsamples = []
24
+ @entry_count.times do
25
+ @sample_delta << io.get_uint32
26
+ @subsample_count << io.get_uint16
27
+ subsample = SubSample.new
28
+ @subsample_count.last.times do
29
+ if version == 1
30
+ subsample.subsample_size << io.get_uint32
31
+ else
32
+ subsample.subsample_size << io.get_uint16
33
+ end
34
+ subsample.subsample_priority << io.get_uint8
35
+ subsample.discardable << io.get_uint8
36
+ subsample.reserved1 << io.get_uint32
37
+ end
38
+ @subsamples << subsample
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,16 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::SyncSample < BMFF::Box::Full
5
+ attr_accessor :entry_count, :sample_number
6
+ register_box "stss"
7
+
8
+ def parse_data
9
+ super
10
+ @entry_count = io.get_uint32
11
+ @sample_number = []
12
+ @entry_count.times do
13
+ @sample_number << io.get_uint32
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TextMetaDataSampleEntry < BMFF::Box::MetaDataSampleEntry
5
+ attr_accessor :content_encoding, :mime_format, :bit_rate_box
6
+ register_box "mett"
7
+ include(BMFF::Box::Container)
8
+
9
+ def parse_data
10
+ super
11
+ @content_encoding = io.get_null_terminated_string unless eob?
12
+ @mime_format = io.get_null_terminated_string unless eob?
13
+ unless eob?
14
+ @bit_rate_box = BMFF::Box.get_box(io, self, BMFF::Box::BitRate)
15
+ add_child @bit_rate_box
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TimeToSample < BMFF::Box::Full
5
+ attr_accessor :entry_count, :sample_count, :sample_delta
6
+ register_box "stts"
7
+
8
+ def parse_data
9
+ super
10
+ @entry_count = io.get_uint32
11
+ @sample_count = []
12
+ @sample_delta = []
13
+ @entry_count.times do
14
+ @sample_count << io.get_uint32
15
+ @sample_delta << io.get_uint32
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::Track < BMFF::Box::Base
5
+ register_box "trak"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackExtends < BMFF::Box::Full
5
+ attr_accessor :track_id, :default_sample_description_index, :default_sample_duration,
6
+ :default_sample_size, :default_sample_flags
7
+ register_box "trex"
8
+
9
+ def parse_data
10
+ super
11
+ @track_id = io.get_uint32
12
+ @default_sample_description_index = io.get_uint32
13
+ @default_sample_duration = io.get_uint32
14
+ @default_sample_size = io.get_uint32
15
+ @default_sample_flags = io.get_uint32
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackFragment < BMFF::Box::Base
5
+ register_box "traf"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackFragmentBaseMediaDecodeTime < BMFF::Box::Full
5
+ attr_accessor :base_media_decode_time
6
+ register_box "tfdt"
7
+
8
+ def parse_data
9
+ super
10
+ if version == 1
11
+ @base_media_decode_time = io.get_uint64
12
+ else
13
+ @base_media_decode_time = io.get_uint32
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackFragmentHeader < BMFF::Box::Full
5
+ attr_accessor :track_id, :base_data_offset, :sample_description_index,
6
+ :default_sample_duration, :default_sample_size, :default_sample_flags
7
+ register_box "tfhd"
8
+
9
+ def parse_data
10
+ super
11
+ @track_id = io.get_uint32
12
+ @base_data_offset = io.get_uint64 if flags & 0x01 > 0
13
+ @sample_description_index = io.get_uint32 if flags & 0x02 > 0
14
+ @default_sample_duration = io.get_uint32 if flags & 0x08 > 0
15
+ @default_sample_size = io.get_uint32 if flags & 0x10 > 0
16
+ @default_sample_flags = io.get_uint32 if flags & 0x20 > 0
17
+ end
18
+ end
@@ -0,0 +1,54 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackFragmentRandomAccess < BMFF::Box::Full
5
+ attr_accessor :track_id, :reserved1,
6
+ :length_size_of_traf_num, :length_size_of_trun_num, :length_size_of_sample_num,
7
+ :number_of_entry, :time, :moof_offset, :traf_number, :trun_number, :sample_number
8
+ register_box "tfra"
9
+
10
+ def parse_data
11
+ super
12
+ @track_id = io.get_uint32
13
+ tmp = io.get_uint32
14
+ @reserved1 = (tmp >> 6)
15
+ @length_size_of_traf_num = (tmp >> 4) & 0x03
16
+ @length_size_of_trun_num = (tmp >> 2) & 0x03
17
+ @length_size_of_sample_num = (tmp & 0x03)
18
+ @number_of_entry = io.get_uint32
19
+ @time = []
20
+ @moof_offset = []
21
+ @traf_number = []
22
+ @trun_number = []
23
+ @sample_number = []
24
+ @number_of_entry.times do
25
+ if version == 1
26
+ @time << io.get_uint64
27
+ @moof_offset << io.get_uint64
28
+ else
29
+ @time << io.get_uint32
30
+ @moof_offset << io.get_uint32
31
+ end
32
+ @traf_number << get_variable_size_uint((@length_size_of_traf_num + 1) * 8)
33
+ @trun_number << get_variable_size_uint((@length_size_of_trun_num + 1) * 8)
34
+ @sample_number << get_variable_size_uint((@length_size_of_sample_num + 1) * 8)
35
+ end
36
+ end
37
+
38
+ def get_variable_size_uint(size)
39
+ case size
40
+ when 8
41
+ io.get_uint8
42
+ when 16
43
+ io.get_uint16
44
+ when 24
45
+ io.get_uint24
46
+ when 32
47
+ io.get_uint32
48
+ else
49
+ raise ArgumentError, "Unsupported field size."
50
+ end
51
+ end
52
+
53
+ private :get_variable_size_uint
54
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackGroup < BMFF::Box::Base
5
+ register_box "trgr"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackGroupType < BMFF::Box::Full
5
+ attr_accessor :track_group_id
6
+ register_box "msrc"
7
+
8
+ def parse_data
9
+ super
10
+ @track_group_id = io.get_uint32
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackHeader < BMFF::Box::Full
5
+ attr_accessor :creation_time, :modification_time, :track_id, :reserved1, :duration,
6
+ :reserved2, :layer, :alternate_group, :volume, :reserved3, :matrix, :width, :height
7
+ register_box "tkhd"
8
+
9
+ def parse_data
10
+ super
11
+ if version == 1
12
+ @creation_time = io.get_uint64
13
+ @modification_time = io.get_uint64
14
+ @track_id = io.get_uint32
15
+ @reserved1 = io.get_uint32
16
+ @duration = io.get_uint64
17
+ else
18
+ @creation_time = io.get_uint32
19
+ @modification_time = io.get_uint32
20
+ @track_id = io.get_uint32
21
+ @reserved1 = io.get_uint32
22
+ @duration = io.get_uint32
23
+ end
24
+ @reserved2 = [io.get_uint32, io.get_uint32]
25
+ @layer = io.get_int16
26
+ @alternate_group = io.get_int16
27
+ @volume = io.get_int16
28
+ @reserved3 = io.get_uint16
29
+ @matrix = []
30
+ 9.times do
31
+ @matrix << io.get_int32
32
+ end
33
+ @width = io.get_uint32
34
+ @height = io.get_uint32
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackReference < BMFF::Box::Base
5
+ register_box "tref"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackReferenceType < BMFF::Box::Base
5
+ attr_accessor :track_ids
6
+ register_box "hint", "cdsc", "hind", "vdep", "vplx"
7
+
8
+ def parse_data
9
+ super
10
+ @track_ids = []
11
+ until eob?
12
+ @track_ids << io.get_uint32
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackRun < BMFF::Box::Full
5
+ attr_accessor :sample_count, :data_offset, :first_sample_flags,
6
+ :sample_duration, :sample_size, :sample_flags, :sample_composition_time_offset
7
+ register_box "trun"
8
+
9
+ def parse_data
10
+ super
11
+ @sample_count = io.get_uint32
12
+ @data_offset = io.get_int32 if flags & 0x01 > 0
13
+ @first_sample_flags = io.get_uint32 if flags & 0x04 > 0
14
+ @sample_duration = [] if flags & 0x0100 > 0
15
+ @sample_size = [] if flags & 0x0200 > 0
16
+ @sample_flags = [] if flags & 0x0400 > 0
17
+ @sample_composition_time_offset = [] if flags & 0x0800 > 0
18
+ @sample_count.times do
19
+ @sample_duration << io.get_uint32 if flags & 0x0100 > 0
20
+ @sample_size << io.get_uint32 if flags & 0x0200 > 0
21
+ @sample_flags << io.get_uint32 if flags & 0x0400 > 0
22
+ if flags & 0x0800 > 0
23
+ if version == 0
24
+ @sample_composition_time_offset << io.get_uint32
25
+ else
26
+ @sample_composition_time_offset << io.get_int32
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::TrackSelection < BMFF::Box::Full
5
+ attr_accessor :switch_group, :attribute_list
6
+ register_box "tsel"
7
+
8
+ def parse_data
9
+ super
10
+ @switch_group = io.get_int32
11
+ @attribute_list = []
12
+ until eob?
13
+ @attribute_list << io.get_ascii(4)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::Unknown < BMFF::Box::Base
5
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::URI < BMFF::Box::Full
5
+ attr_accessor :the_uri
6
+ register_box "uri "
7
+
8
+ def parse_data
9
+ super
10
+ @the_uri = io.get_null_terminated_string
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::URIInit < BMFF::Box::Full
5
+ attr_accessor :uri_initialization_data
6
+ register_box "uriI"
7
+
8
+ def parse_data
9
+ super
10
+ @uri_initialization_data = []
11
+ until eob?
12
+ @uri_initialization_data << io.get_uint8
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::URIMetaSampleEntry < BMFF::Box::MetaDataSampleEntry
5
+ attr_accessor :uri_box, :uri_init_box, :mpeg4_bit_rate_box
6
+ register_box "urim"
7
+ include(BMFF::Box::Container)
8
+
9
+ def parse_data
10
+ super
11
+ @uri_box = BMFF::Box.get_box(io, self, BMFF::Box::URI)
12
+ add_child @uri_box
13
+ until eob?
14
+ box = BMFF::Box.get_box(io, self)
15
+ add_child box
16
+ case box
17
+ when BMFF::Box::URIInit
18
+ @uri_init_box = box
19
+ when BMFF::Box::BitRate
20
+ @mpeg4_bit_rate_box = box
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::UserData < BMFF::Box::Base
5
+ register_box "udta"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end