bmff 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +25 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +183 -0
- data/Rakefile +9 -0
- data/bmff.gemspec +25 -0
- data/lib/bmff/binary_accessor.rb +186 -0
- data/lib/bmff/box/audio_sample_entry.rb +16 -0
- data/lib/bmff/box/base.rb +66 -0
- data/lib/bmff/box/bit_rate.rb +14 -0
- data/lib/bmff/box/chunk_large_offset.rb +16 -0
- data/lib/bmff/box/chunk_offset.rb +16 -0
- data/lib/bmff/box/clean_aperture.rb +20 -0
- data/lib/bmff/box/colour_information.rb +27 -0
- data/lib/bmff/box/compact_sample_size.rb +32 -0
- data/lib/bmff/box/composition_offset.rb +25 -0
- data/lib/bmff/box/composition_to_decode.rb +17 -0
- data/lib/bmff/box/container.rb +70 -0
- data/lib/bmff/box/copyright.rb +13 -0
- data/lib/bmff/box/data_entry_url.rb +12 -0
- data/lib/bmff/box/data_entry_urn.rb +13 -0
- data/lib/bmff/box/data_information.rb +12 -0
- data/lib/bmff/box/data_reference.rb +14 -0
- data/lib/bmff/box/degradation_priority.rb +19 -0
- data/lib/bmff/box/edit.rb +12 -0
- data/lib/bmff/box/edit_list.rb +27 -0
- data/lib/bmff/box/file_type.rb +17 -0
- data/lib/bmff/box/free_space.rb +6 -0
- data/lib/bmff/box/full.rb +11 -0
- data/lib/bmff/box/handler.rb +15 -0
- data/lib/bmff/box/hint_media_header.rb +16 -0
- data/lib/bmff/box/hint_sample_entry.rb +14 -0
- data/lib/bmff/box/level_assignment.rb +35 -0
- data/lib/bmff/box/map.rb +15 -0
- data/lib/bmff/box/media.rb +12 -0
- data/lib/bmff/box/media_data.rb +6 -0
- data/lib/bmff/box/media_header.rb +25 -0
- data/lib/bmff/box/media_information.rb +12 -0
- data/lib/bmff/box/meta_data_sample_entry.rb +5 -0
- data/lib/bmff/box/movie.rb +12 -0
- data/lib/bmff/box/movie_extends.rb +12 -0
- data/lib/bmff/box/movie_extends_header.rb +16 -0
- data/lib/bmff/box/movie_fragment.rb +12 -0
- data/lib/bmff/box/movie_fragment_header.rb +12 -0
- data/lib/bmff/box/movie_fragment_random_access.rb +12 -0
- data/lib/bmff/box/movie_fragment_random_access_offset.rb +12 -0
- data/lib/bmff/box/movie_header.rb +36 -0
- data/lib/bmff/box/null_media_header.rb +6 -0
- data/lib/bmff/box/padding_bits.rb +23 -0
- data/lib/bmff/box/pixel_aspect_ratio.rb +13 -0
- data/lib/bmff/box/progressive_download_info.rb +17 -0
- data/lib/bmff/box/sample_auxiliary_information_offsets.rb +24 -0
- data/lib/bmff/box/sample_auxiliary_information_sizes.rb +23 -0
- data/lib/bmff/box/sample_dependency_type.rb +26 -0
- data/lib/bmff/box/sample_description.rb +27 -0
- data/lib/bmff/box/sample_entry.rb +15 -0
- data/lib/bmff/box/sample_size.rb +19 -0
- data/lib/bmff/box/sample_table.rb +12 -0
- data/lib/bmff/box/sample_to_chunk.rb +20 -0
- data/lib/bmff/box/shadow_sync_sample.rb +18 -0
- data/lib/bmff/box/sound_media_header.rb +13 -0
- data/lib/bmff/box/sub_sample_information.rb +41 -0
- data/lib/bmff/box/sync_sample.rb +16 -0
- data/lib/bmff/box/text_meta_data_sample_entry.rb +18 -0
- data/lib/bmff/box/time_to_sample.rb +18 -0
- data/lib/bmff/box/track.rb +12 -0
- data/lib/bmff/box/track_extends.rb +17 -0
- data/lib/bmff/box/track_fragment.rb +12 -0
- data/lib/bmff/box/track_fragment_base_media_decode_time.rb +16 -0
- data/lib/bmff/box/track_fragment_header.rb +18 -0
- data/lib/bmff/box/track_fragment_random_access.rb +54 -0
- data/lib/bmff/box/track_group.rb +12 -0
- data/lib/bmff/box/track_group_type.rb +12 -0
- data/lib/bmff/box/track_header.rb +36 -0
- data/lib/bmff/box/track_reference.rb +12 -0
- data/lib/bmff/box/track_reference_type.rb +15 -0
- data/lib/bmff/box/track_run.rb +31 -0
- data/lib/bmff/box/track_selection.rb +16 -0
- data/lib/bmff/box/unknown.rb +5 -0
- data/lib/bmff/box/uri.rb +12 -0
- data/lib/bmff/box/uri_init.rb +15 -0
- data/lib/bmff/box/uri_meta_sample_entry.rb +24 -0
- data/lib/bmff/box/user_data.rb +12 -0
- data/lib/bmff/box/video_media_header.rb +13 -0
- data/lib/bmff/box/visual_sample_entry.rb +37 -0
- data/lib/bmff/box/xml_meta_data_sample_entry.rb +19 -0
- data/lib/bmff/box.rb +115 -0
- data/lib/bmff/file_container.rb +20 -0
- data/lib/bmff/version.rb +3 -0
- data/lib/bmff.rb +7 -0
- data/test/bmff/box/test_audio_sample_entry.rb +46 -0
- data/test/bmff/box/test_base.rb +37 -0
- data/test/bmff/box/test_bit_rate.rb +30 -0
- data/test/bmff/box/test_chunk_large_offset.rb +35 -0
- data/test/bmff/box/test_chunk_offset.rb +35 -0
- data/test/bmff/box/test_clean_aperture.rb +40 -0
- data/test/bmff/box/test_colour_information.rb +73 -0
- data/test/bmff/box/test_compact_sample_size.rb +99 -0
- data/test/bmff/box/test_composition_offset.rb +64 -0
- data/test/bmff/box/test_composition_to_decode.rb +38 -0
- data/test/bmff/box/test_copyright.rb +55 -0
- data/test/bmff/box/test_data_entry_url.rb +30 -0
- data/test/bmff/box/test_data_entry_urn.rb +32 -0
- data/test/bmff/box/test_data_information.rb +26 -0
- data/test/bmff/box/test_data_reference.rb +58 -0
- data/test/bmff/box/test_degradation_priority.rb +62 -0
- data/test/bmff/box/test_edit.rb +26 -0
- data/test/bmff/box/test_edit_list.rb +72 -0
- data/test/bmff/box/test_file_type.rb +30 -0
- data/test/bmff/box/test_free_space.rb +42 -0
- data/test/bmff/box/test_handler.rb +67 -0
- data/test/bmff/box/test_hint_media_header.rb +38 -0
- data/test/bmff/box/test_hint_sample_entry.rb +38 -0
- data/test/bmff/box/test_level_assignment.rb +50 -0
- data/test/bmff/box/test_media.rb +26 -0
- data/test/bmff/box/test_media_data.rb +25 -0
- data/test/bmff/box/test_media_header.rb +72 -0
- data/test/bmff/box/test_media_information.rb +26 -0
- data/test/bmff/box/test_movie.rb +26 -0
- data/test/bmff/box/test_movie_extends.rb +26 -0
- data/test/bmff/box/test_movie_extends_header.rb +52 -0
- data/test/bmff/box/test_movie_fragment.rb +26 -0
- data/test/bmff/box/test_movie_fragment_header.rb +30 -0
- data/test/bmff/box/test_movie_fragment_random_access.rb +26 -0
- data/test/bmff/box/test_movie_fragment_random_access_offset.rb +30 -0
- data/test/bmff/box/test_movie_header.rb +110 -0
- data/test/bmff/box/test_null_media_header.rb +28 -0
- data/test/bmff/box/test_padding_bits.rb +38 -0
- data/test/bmff/box/test_pixel_aspect_ratio.rb +28 -0
- data/test/bmff/box/test_progressive_download_info.rb +36 -0
- data/test/bmff/box/test_sample_auxiliary_information_offsets.rb +94 -0
- data/test/bmff/box/test_sample_auxiliary_information_sizes.rb +70 -0
- data/test/bmff/box/test_sample_dependency_type.rb +70 -0
- data/test/bmff/box/test_sample_description.rb +355 -0
- data/test/bmff/box/test_sample_size.rb +61 -0
- data/test/bmff/box/test_sample_table.rb +26 -0
- data/test/bmff/box/test_sample_to_chunk.rb +39 -0
- data/test/bmff/box/test_shadow_sync_sample.rb +36 -0
- data/test/bmff/box/test_sound_media_header.rb +32 -0
- data/test/bmff/box/test_sub_sample_information.rb +90 -0
- data/test/bmff/box/test_sync_sample.rb +34 -0
- data/test/bmff/box/test_text_meta_data_sample_entry.rb +49 -0
- data/test/bmff/box/test_time_to_sample.rb +36 -0
- data/test/bmff/box/test_track.rb +26 -0
- data/test/bmff/box/test_track_extends.rb +38 -0
- data/test/bmff/box/test_track_fragment.rb +26 -0
- data/test/bmff/box/test_track_fragment_base_media_decode_time.rb +52 -0
- data/test/bmff/box/test_track_fragment_header.rb +200 -0
- data/test/bmff/box/test_track_fragment_random_access.rb +96 -0
- data/test/bmff/box/test_track_group.rb +26 -0
- data/test/bmff/box/test_track_group_type.rb +30 -0
- data/test/bmff/box/test_track_header.rb +118 -0
- data/test/bmff/box/test_track_reference.rb +26 -0
- data/test/bmff/box/test_track_reference_type.rb +100 -0
- data/test/bmff/box/test_track_run.rb +282 -0
- data/test/bmff/box/test_track_selection.rb +33 -0
- data/test/bmff/box/test_uri.rb +30 -0
- data/test/bmff/box/test_uri_init.rb +32 -0
- data/test/bmff/box/test_uri_meta_sample_entry.rb +74 -0
- data/test/bmff/box/test_user_data.rb +26 -0
- data/test/bmff/box/test_video_media_header.rb +34 -0
- data/test/bmff/box/test_visual_sample_entry.rb +95 -0
- data/test/bmff/box/test_xml_meta_data_sample_entry.rb +51 -0
- data/test/bmff/test_binary_accessor.rb +805 -0
- data/test/bmff/test_file_container.rb +58 -0
- data/test/minitest_helper.rb +7 -0
- 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,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,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,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
|
data/lib/bmff/box/map.rb
ADDED
@@ -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,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,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::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,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
|