m2ts_parser 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,131 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # ARIB-STD-B10 第2部 (v4_9), 5.2項に従うテーブルの定義
4
+
5
+ module M2TSParser
6
+ class Table < BinaryParser::TemplateBase
7
+ include Appendix::CRC32Decoder
8
+ end
9
+
10
+ # 5.2.1 プログラムアソシエーションテーブル (PAT) (Program Association Table)
11
+ # * ISO/IEC 13818-1(22), 2.4.4項
12
+
13
+ # 5.2.2 限定受信テーブル (CAT) (Conditional Access Table)
14
+ # * ISO/IEC 13818-1(22), 2.4.4項
15
+
16
+ # 5.2.3 プログラムマップテーブル (PMT) (Program Map)
17
+ # * ISO/IEC 13818-1(22), 2.4.4項
18
+
19
+ # 5.2.4 ネットワーク情報テーブル (NIT) (Network Information Table)
20
+
21
+ # 5.2.5 ブーケアソシエーションテーブル (BAT) (Bouquet Association Table)
22
+ class BouquetAssociationSection < Table
23
+ Def do
24
+ data :table_id, UInt, 8
25
+ data :section_syntax_indicator, UInt, 1
26
+ data :reserved_future_use1, UInt, 1
27
+ data :reserved1, UInt, 2
28
+ data :section_length, UInt, 12
29
+ data :bouquet_id, UInt, 16
30
+ data :reserved2, UInt, 2
31
+ data :version_number, UInt, 5
32
+ data :current_next_indicator, UInt, 1
33
+ data :section_number, UInt, 8
34
+ data :last_section_number, UInt, 8
35
+ data :reserved_future_use2, UInt, 4
36
+ data :bouquet_descriptors_length, UInt, 12
37
+
38
+ SPEND var(:bouquet_descriptors_length) * 8, :descriptors, Descriptor
39
+
40
+ data :reserved_future_user3, UInt, 4
41
+ data :transport_stream_loop_length, UInt, 12
42
+
43
+ SPEND var(:transport_stream_loop_length) * 8, :transport_stream_loop do
44
+ data :transport_stream_id, UInt, 16
45
+ data :original_network_id, UInt, 16
46
+ data :reserved_future_use4, UInt, 4
47
+ data :transport_descriptors_length, UInt, 12
48
+ SPEND var(:transport_descriptors_length) * 8, :descriptors, Descriptor
49
+ end
50
+
51
+ data :crc_32, UInt, 32
52
+ end
53
+ end
54
+
55
+ # 5.2.6 サービス記述テーブル (SDT) (Service Description Table)
56
+
57
+ # 5.2.7 イベント情報テーブル (EIT) (Event Information Table)
58
+ class EventInformationSection < Table
59
+ Def do
60
+ data :table_id, UInt, 8
61
+ data :section_syntax_indicator, UInt, 1
62
+ data :reserved_future_use, UInt, 1
63
+ data :reserved1, UInt, 2
64
+ data :section_length, UInt, 12
65
+ data :service_id, UInt, 16
66
+ data :reserved2, UInt, 2
67
+ data :version_number, UInt, 5
68
+ data :current_next_indicator, UInt, 1
69
+ data :section_number, UInt, 8
70
+ data :last_section_number, UInt, 8
71
+ data :transport_stream_id, UInt, 16
72
+ data :original_network_id, UInt, 16
73
+ data :segment_last_section_number, UInt, 8
74
+ data :last_table_id, UInt, 8
75
+
76
+ SPEND var(:section_length) * 8 - 88 - 32, :events do
77
+ data :event_id, UInt, 16
78
+ data :start_time, Appendix::AribTime, 40
79
+ data :duration, Appendix::AribDuration, 24
80
+ data :running_status, UInt, 3
81
+ data :free_ca_mode, UInt, 1
82
+ data :descriptors_loop_length, UInt, 12
83
+ SPEND var(:descriptors_loop_length) * 8, :descriptors, Descriptor
84
+ end
85
+
86
+ data :crc_32, UInt, 32
87
+ end
88
+ end
89
+
90
+ # 未定義テーブル
91
+ class UndefinedSection < Table
92
+ Def do
93
+ data :table_id, UInt, 8
94
+ data :section_syntax_indicator, UInt, 1
95
+ data :reserved_future_use, UInt, 1
96
+ data :reserved1, UInt, 2
97
+ data :section_length, UInt, 12
98
+ data :rest, UInt, rest
99
+ end
100
+ end
101
+
102
+ class TableSelector < BinaryParser::TemplateBase
103
+ class AbstractSection < BinaryParser::TemplateBase
104
+ # ARIB STD-B10 第2部 表5-2 「テーブルID の割当および送出の基準」による定義
105
+ def self.TableMapping(table_id)
106
+ case table_id
107
+ when 0x4e, 0x4f, 0x50..0x5f, 0x60..0x6f
108
+ EventInformationSection
109
+ else
110
+ UndefinedSection
111
+ end
112
+ end
113
+
114
+ def self.new(binary, parent_scope=nil)
115
+ table_id = binary.sub(:byte_length => 1).to_i
116
+ return TableMapping(table_id).new(binary)
117
+ end
118
+ end
119
+
120
+ # ISO13818-1 Table 2-24 – Program specific information pointer
121
+ # > The beginning of a section is indicated by a pointer_field in the Transport Stream
122
+ # > packet payload. The syntax of this field is specified in Table 2-24.
123
+ # * from page 41
124
+ Def do
125
+ data :pointer_field, UInt, 8
126
+ data :padding, UInt, var(:pointer_field) * 8
127
+ data :section, AbstractSection, rest
128
+ end
129
+ end
130
+ end
131
+
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ require '../m2ts_parser.rb'
3
+
4
+ module M2TSParser
5
+ File.open('16ch20sec.ts', 'rb') do |f|
6
+ stream = MPEGTransportStream.new(f).filter{|packet| packet.pid == 0x12}
7
+ while stream.rest?
8
+ packets = stream.get_sequence{|packet| packet.payload_unit_start_indicator == 1 }
9
+ valid = packets.each_cons(2).all?{|a, b| (a.continuity_counter + 1) % 16 == b.continuity_counter }
10
+
11
+ if valid
12
+ data = packets.map{|p| p.data_bytes.to_s}.inject{|acc, p| acc + p}
13
+ if data && data.length > 0
14
+ eit = TableSelector.new(data).section
15
+ eit.show(true)
16
+ p eit.check_crc32
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module M2TSParser
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,23 @@
1
+ module M2TSParser
2
+ DEF_FILES =
3
+ [
4
+ 'common.rb',
5
+ 'descriptor.rb',
6
+ 'mpeg_transport_stream.rb',
7
+ 'table.rb',
8
+ ]
9
+
10
+ LIB_ROOT = File.expand_path(File.dirname(__FILE__))
11
+
12
+ # switching for development
13
+ if File::exist?(LIB_ROOT + '/../../ruby-binary-parser/lib/binary_parser.rb')
14
+ require LIB_ROOT + '/../../ruby-binary-parser/lib/binary_parser.rb'
15
+ else
16
+ require 'binary_parser'
17
+ end
18
+
19
+ require LIB_ROOT + '/m2ts_parser/version'
20
+ Dir::glob(LIB_ROOT + '/m2ts_parser/appendix/*.rb').each{|f| require f}
21
+ DEF_FILES.each{|file_name| require LIB_ROOT + '/m2ts_parser/' + file_name}
22
+ Dir::glob(LIB_ROOT + '/m2ts_parser/application/*.rb').each{|f| require f}
23
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ # -*- mode: ruby -*-
3
+
4
+ lib = File.expand_path('../lib', __FILE__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require 'm2ts_parser/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "m2ts_parser"
10
+ spec.version = M2TSParser::VERSION
11
+ spec.authors = ["sawaken"]
12
+ spec.email = ["sasasawada@gmail.com"]
13
+ spec.summary = %q{An elegant MPEG2-TS file Parser.}
14
+ spec.homepage = ""
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+
25
+ spec.add_dependency "binary_parser", ">= 1.2.1"
26
+ spec.add_dependency "tsparser", ">= 0.0.0"
27
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: m2ts_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - sawaken
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: binary_parser
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.2.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.2.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: tsparser
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.0
69
+ description:
70
+ email:
71
+ - sasasawada@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - lib/m2ts_parser.rb
82
+ - lib/m2ts_parser/appendix/arib_duration.rb
83
+ - lib/m2ts_parser/appendix/arib_string.rb
84
+ - lib/m2ts_parser/appendix/arib_time.rb
85
+ - lib/m2ts_parser/appendix/ca_system_id.rb
86
+ - lib/m2ts_parser/appendix/content_nibble.rb
87
+ - lib/m2ts_parser/appendix/crc32.rb
88
+ - lib/m2ts_parser/application/epg_parse.rb
89
+ - lib/m2ts_parser/application/out.txt
90
+ - lib/m2ts_parser/common.rb
91
+ - lib/m2ts_parser/descriptor.rb
92
+ - lib/m2ts_parser/mpeg_transport_stream.rb
93
+ - lib/m2ts_parser/table.rb
94
+ - lib/m2ts_parser/test.rb
95
+ - lib/m2ts_parser/version.rb
96
+ - m2ts_parser.gemspec
97
+ homepage: ''
98
+ licenses:
99
+ - MIT
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.2.2
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: An elegant MPEG2-TS file Parser.
121
+ test_files: []