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,25 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::CompositionOffset < BMFF::Box::Full
5
+ attr_accessor :entry_count, :sample_count, :sample_offset
6
+ register_box "ctts"
7
+
8
+ def parse_data
9
+ super
10
+ @entry_count = io.get_uint32
11
+ @sample_count = []
12
+ @sample_offset = []
13
+ if version == 0
14
+ @entry_count.times do
15
+ @sample_count << io.get_uint32
16
+ @sample_offset << io.get_uint32
17
+ end
18
+ elsif version == 1
19
+ @entry_count.times do
20
+ @sample_count << io.get_uint32
21
+ @sample_offset << io.get_int32
22
+ end
23
+ end
24
+ end
25
+ 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::CompositionToDecode < BMFF::Box::Full
5
+ attr_accessor :composition_to_dts_shift, :least_decode_to_display_delta, :greatest_decode_to_display_delta,
6
+ :composition_start_time, :composition_end_time
7
+ register_box "cslg"
8
+
9
+ def parse_data
10
+ super
11
+ @composition_to_dts_shift = io.get_int32
12
+ @least_decode_to_display_delta = io.get_int32
13
+ @greatest_decode_to_display_delta = io.get_int32
14
+ @composition_start_time = io.get_int32
15
+ @composition_end_time = io.get_int32
16
+ end
17
+ end
@@ -0,0 +1,70 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ module BMFF::Box::Container
5
+ attr_accessor :children
6
+
7
+ def container?
8
+ true
9
+ end
10
+
11
+ def parse_children
12
+ @children = []
13
+ until eob?
14
+ @children << BMFF::Box.get_box(io, self)
15
+ end
16
+ end
17
+
18
+ def children
19
+ @children || []
20
+ end
21
+
22
+ def add_child(child)
23
+ @children ||= []
24
+ @children << child
25
+ end
26
+
27
+ # Find a box which has a specific type from this children.
28
+ def find(boxtype)
29
+ (@children || []).each do |child|
30
+ case boxtype
31
+ when String
32
+ return child if child.type == boxtype
33
+ when Class
34
+ return child if child.kind_of?(boxtype)
35
+ end
36
+ end
37
+ nil
38
+ end
39
+
40
+ # Find boxes which have a specific type from this children.
41
+ def find_all(boxtype)
42
+ found_boxes = []
43
+ (@children || []).each do |child|
44
+ case boxtype
45
+ when String
46
+ found_boxes << child if child.type == boxtype
47
+ when Class
48
+ found_boxes << child if child.kind_of?(boxtype)
49
+ end
50
+ end
51
+ found_boxes
52
+ end
53
+
54
+ # Find boxes which have a specific type from this descendants.
55
+ def select_descendants(boxtype)
56
+ selected_boxes = []
57
+ (@children || []).each do |child|
58
+ case boxtype
59
+ when String
60
+ selected_boxes << child if child.type == boxtype
61
+ when Class
62
+ selected_boxes << child if child.kind_of?(boxtype)
63
+ end
64
+ if child.container?
65
+ selected_boxes.concat(child.select_descendants(boxtype))
66
+ end
67
+ end
68
+ selected_boxes
69
+ end
70
+ 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::Copyright < BMFF::Box::Full
5
+ attr_accessor :language, :notice
6
+ register_box "cprt"
7
+
8
+ def parse_data
9
+ super
10
+ @language = io.get_iso639_2_language
11
+ @notice = io.get_null_terminated_string unless eob?
12
+ end
13
+ 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::DataEntryUrl < BMFF::Box::Full
5
+ attr_accessor :location
6
+ register_box "url "
7
+
8
+ def parse_data
9
+ super
10
+ @location = io.get_null_terminated_string(remaining_size) unless eob?
11
+ end
12
+ 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::DataEntryUrn < BMFF::Box::Full
5
+ attr_accessor :name, :location
6
+ register_box "urn "
7
+
8
+ def parse_data
9
+ super
10
+ @name = io.get_null_terminated_string(remaining_size) unless eob?
11
+ @location = io.get_null_terminated_string(remaining_size) unless eob?
12
+ end
13
+ 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::DataInformation < BMFF::Box::Base
5
+ register_box "dinf"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::DataReference < BMFF::Box::Full
5
+ attr_accessor :entry_count
6
+ register_box "dref"
7
+ include(BMFF::Box::Container)
8
+
9
+ def parse_data
10
+ super
11
+ @entry_count = io.get_uint32
12
+ parse_children
13
+ end
14
+ 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::DegradationPriority < BMFF::Box::Full
5
+ attr_accessor :priority
6
+ register_box "stdp"
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
+ @priority = []
14
+ sample_count.times do
15
+ @priority << io.get_uint16
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::Edit < BMFF::Box::Base
5
+ register_box "edts"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ 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::EditList < BMFF::Box::Full
5
+ attr_accessor :entry_count, :segment_duration, :media_time, :media_rate_integer, :media_rate_fraction
6
+ register_box "elst"
7
+
8
+ def parse_data
9
+ super
10
+ @entry_count = io.get_uint32
11
+ @segment_duration = []
12
+ @media_time = []
13
+ @media_rate_integer = []
14
+ @media_rate_fraction = []
15
+ @entry_count.times do
16
+ if version == 1
17
+ @segment_duration << io.get_uint64
18
+ @media_time << io.get_int64
19
+ else
20
+ @segment_duration << io.get_uint32
21
+ @media_time << io.get_int32
22
+ end
23
+ @media_rate_integer << io.get_int16
24
+ @media_rate_fraction << io.get_int16
25
+ end
26
+ end
27
+ 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::FileType < BMFF::Box::Base
5
+ attr_accessor :major_brand, :minor_version, :compatible_brands
6
+ register_box "ftyp"
7
+
8
+ def parse_data
9
+ super
10
+ @major_brand = io.get_ascii(4)
11
+ @minor_version = io.get_uint32
12
+ @compatible_brands = []
13
+ until eob?
14
+ @compatible_brands << io.get_ascii(4)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::FreeSpace < BMFF::Box::Base
5
+ register_box "free", "skip"
6
+ end
@@ -0,0 +1,11 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::Full < BMFF::Box::Base
5
+ attr_accessor :version, :flags
6
+ def parse_data
7
+ super
8
+ @version = io.get_uint8
9
+ @flags = io.get_uint24
10
+ end
11
+ 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::Handler < BMFF::Box::Full
5
+ attr_accessor :pre_defined, :handler_type, :reserved1, :name
6
+ register_box "hdlr"
7
+
8
+ def parse_data
9
+ super
10
+ @pre_defined = io.get_uint32
11
+ @handler_type = io.get_ascii(4)
12
+ @reserved1 = [io.get_uint32, io.get_uint32, io.get_uint32]
13
+ @name = io.get_null_terminated_string(remaining_size) unless eob?
14
+ end
15
+ 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::HintMediaHeader < BMFF::Box::Full
5
+ attr_accessor :max_pdu_size, :avg_pdu_size, :maxbitrate, :avgbitrate, :reserved1
6
+ register_box "hmhd"
7
+
8
+ def parse_data
9
+ super
10
+ @max_pdu_size = io.get_uint16
11
+ @avg_pdu_size = io.get_uint16
12
+ @maxbitrate = io.get_uint32
13
+ @avgbitrate = io.get_uint32
14
+ @reserved1 = io.get_uint32
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::HintSampleEntry < BMFF::Box::SampleEntry
5
+ attr_accessor :data
6
+
7
+ def parse_data
8
+ super
9
+ @data = []
10
+ until eob?
11
+ @data << io.get_uint8
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::LevelAssignment < BMFF::Box::Full
5
+ attr_accessor :level_count, :levels
6
+ register_box "leva"
7
+
8
+ class Level
9
+ attr_accessor :track_id, :padding_flag, :assignment_type,
10
+ :grouping_type, :grouping_type_parameter, :sub_track_id
11
+ end
12
+
13
+ def parse_data
14
+ super
15
+ @level_count = io.get_uint8
16
+ @levels = []
17
+ @level_count.times do
18
+ level = Level.new
19
+ level.track_id = io.get_uint32
20
+ tmp = io.get_uint8
21
+ level.padding_flag = (tmp >> 7)
22
+ level.assignment_type = (tmp & 0x7F)
23
+ case level.assignment_type
24
+ when 0
25
+ level.grouping_type = io.get_uint32
26
+ when 1
27
+ level.grouping_type = io.get_uint32
28
+ level.grouping_type_parameter = io.get_uint32
29
+ when 4
30
+ level.sub_track_id = io.get_uint32
31
+ end
32
+ @levels << level
33
+ end
34
+ end
35
+ 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::Map
5
+ class << self
6
+ def register_box(type, klass)
7
+ @@map ||= {}
8
+ @@map[type] = klass
9
+ end
10
+
11
+ def get_box_class(type)
12
+ return @@map[type]
13
+ end
14
+ end
15
+ 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::Media < BMFF::Box::Base
5
+ register_box "mdia"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::MediaData < BMFF::Box::Base
5
+ register_box "mdat"
6
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::MediaHeader < BMFF::Box::Full
5
+ attr_accessor :creation_time, :modification_time, :timescale, :duration,
6
+ :language, :pre_defined
7
+ register_box "mdhd"
8
+
9
+ def parse_data
10
+ super
11
+ if version == 1
12
+ @creation_time = io.get_uint64
13
+ @modification_time = io.get_uint64
14
+ @timescale = io.get_uint32
15
+ @duration = io.get_uint64
16
+ else
17
+ @creation_time = io.get_uint32
18
+ @modification_time = io.get_uint32
19
+ @timescale = io.get_uint32
20
+ @duration = io.get_uint32
21
+ end
22
+ @language = io.get_iso639_2_language
23
+ @pre_defined = io.get_uint16
24
+ end
25
+ 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::MediaInformation < BMFF::Box::Base
5
+ register_box "minf"
6
+ include(BMFF::Box::Container)
7
+
8
+ def parse_data
9
+ super
10
+ parse_children
11
+ end
12
+ 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::MetaDataSampleEntry < BMFF::Box::SampleEntry
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::Movie < BMFF::Box::Base
5
+ register_box "moov"
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::MovieExtends < BMFF::Box::Base
5
+ register_box "mvex"
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::MovieExtendsHeader < BMFF::Box::Full
5
+ attr_accessor :fragment_duration
6
+ register_box "mehd"
7
+
8
+ def parse_data
9
+ super
10
+ if version == 1
11
+ @fragment_duration = io.get_uint64
12
+ else
13
+ @fragment_duration = io.get_uint32
14
+ end
15
+ end
16
+ 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::MovieFragment < BMFF::Box::Base
5
+ register_box "moof"
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::MovieFragmentHeader < BMFF::Box::Full
5
+ attr_accessor :sequence_number
6
+ register_box "mfhd"
7
+
8
+ def parse_data
9
+ super
10
+ @sequence_number = io.get_uint32
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::MovieFragmentRandomAccess < BMFF::Box::Base
5
+ register_box "mfra"
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::MovieFragmentRandomAccessOffset < BMFF::Box::Full
5
+ attr_accessor :mfra_size
6
+ register_box "mfro"
7
+
8
+ def parse_data
9
+ super
10
+ @mfra_size = 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::MovieHeader < BMFF::Box::Full
5
+ attr_accessor :creation_time, :modification_time, :timescale, :duration,
6
+ :rate, :volume, :reserved1, :reserved2, :matrix, :pre_defined, :next_track_id
7
+ register_box "mvhd"
8
+
9
+ def parse_data
10
+ super
11
+ if version == 1
12
+ @creation_time = io.get_uint64
13
+ @modification_time = io.get_uint64
14
+ @timescale = io.get_uint32
15
+ @duration = io.get_uint64
16
+ else
17
+ @creation_time = io.get_uint32
18
+ @modification_time = io.get_uint32
19
+ @timescale = io.get_uint32
20
+ @duration = io.get_uint32
21
+ end
22
+ @rate = io.get_int32
23
+ @volume = io.get_int16
24
+ @reserved1 = io.get_byte(2)
25
+ @reserved2 = [io.get_uint32, io.get_uint32]
26
+ @matrix = []
27
+ 9.times do
28
+ @matrix << io.get_int32
29
+ end
30
+ @pre_defined = []
31
+ 6.times do
32
+ @pre_defined << io.get_byte(4)
33
+ end
34
+ @next_track_id = io.get_uint32
35
+ end
36
+ end
@@ -0,0 +1,6 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ class BMFF::Box::NullMediaHeader < BMFF::Box::Full
5
+ register_box "nmhd"
6
+ 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::PaddingBits < BMFF::Box::Full
5
+ attr_accessor :sample_count, :reserved1, :pad1, :reserved2, :pad2
6
+ register_box "padb"
7
+
8
+ def parse_data
9
+ super
10
+ @sample_count = io.get_uint32
11
+ @reserved1 = []
12
+ @pad1 = []
13
+ @reserved2 = []
14
+ @pad2 = []
15
+ ((@sample_count + 1) / 2).times do
16
+ tmp = io.get_uint8
17
+ @reserved1 << ((tmp & 0x80) > 0)
18
+ @pad1 << ((tmp >> 4) & 0x07)
19
+ @reserved2 << ((tmp & 0x08) > 0)
20
+ @pad2 << (tmp & 0x07)
21
+ end
22
+ end
23
+ 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::PixelAspectRatio < BMFF::Box::Base
5
+ attr_accessor :h_spacing, :v_spacing
6
+ register_box "pasp"
7
+
8
+ def parse_data
9
+ super
10
+ @h_spacing = io.get_uint32
11
+ @v_spacing = io.get_uint32
12
+ end
13
+ 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::ProgressiveDownloadInfo < BMFF::Box::Full
5
+ attr_accessor :rate, :initial_delay
6
+ register_box "pdin"
7
+
8
+ def parse_data
9
+ super
10
+ @rate = []
11
+ @initial_delay = []
12
+ until eob?
13
+ @rate << io.get_uint32
14
+ @initial_delay << io.get_uint32
15
+ end
16
+ end
17
+ end