ariblib 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +13 -13
- data/.rspec +2 -2
- data/.travis.yml +4 -4
- data/Gemfile +6 -6
- data/LICENSE +21 -21
- data/README.md +45 -45
- data/Rakefile +6 -6
- data/ariblib.gemspec +33 -33
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/lib/ariblib.rb +14 -14
- data/lib/ariblib/BitStream.rb +67 -67
- data/lib/ariblib/Descriptor.rb +303 -303
- data/lib/ariblib/EventInformationTable.rb +184 -184
- data/lib/ariblib/ProgramSpecificInformation.rb +318 -318
- data/lib/ariblib/String.rb +325 -325
- data/lib/ariblib/TransportStreamFile.rb +283 -283
- data/lib/ariblib/version.rb +3 -3
- metadata +3 -3
data/lib/ariblib/Descriptor.rb
CHANGED
@@ -1,303 +1,303 @@
|
|
1
|
-
#! ruby
|
2
|
-
# -*- encoding: utf-8 -*-
|
3
|
-
|
4
|
-
module Ariblib
|
5
|
-
#記述子
|
6
|
-
class Descriptor
|
7
|
-
def initialize(h,bs,tag,length)
|
8
|
-
parse(h,bs,tag,length)
|
9
|
-
end
|
10
|
-
def parse(h,bs,tag,descriptor_length)
|
11
|
-
h[:tag] << tag
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class ShortEventDescriptor < Descriptor
|
16
|
-
def parse(h,bs,tag,descriptor_length)
|
17
|
-
|
18
|
-
iso_639_language_code =bs.get3 #24 bslbf
|
19
|
-
event_name_length =bs.getc #8 uimsbf
|
20
|
-
event_name_char =Ariblib::String.new(bs,event_name_length).to_utf8
|
21
|
-
text_length =bs.getc #8 uimsbf
|
22
|
-
text_char =Ariblib::String.new(bs,text_length).to_utf8
|
23
|
-
h[:title]=event_name_char
|
24
|
-
h[:desc ]=text_char
|
25
|
-
end
|
26
|
-
end
|
27
|
-
class ExtendedEventDescriptor < Descriptor
|
28
|
-
def parse(h,bs,tag,descriptor_length)
|
29
|
-
descriptor_number =bs.read 4 #uimsbf
|
30
|
-
last_descriptor_number =bs.read 4 #uimsbf
|
31
|
-
iso_639_language_code =bs.get3 #24 bslbf
|
32
|
-
length_of_items =bs.getc #8 uimsbf
|
33
|
-
len=bs.pos+length_of_items*8
|
34
|
-
while bs.pos < len
|
35
|
-
item_description_length =bs.getc #8 uimsbf
|
36
|
-
item_description_char =Ariblib::String.new(bs,item_description_length).to_utf8
|
37
|
-
item_length =bs.getc #8 uimsbf
|
38
|
-
item_char =bs.str(item_length)
|
39
|
-
if item_description_length==0
|
40
|
-
(h[:verbose_pair].last)[1] += item_char
|
41
|
-
else
|
42
|
-
h[:verbose_pair] << [item_description_char,item_char]
|
43
|
-
end
|
44
|
-
#item_char =Ariblib::String.new(bs,item_length).to_utf8
|
45
|
-
#h[item_description_char]||=[]
|
46
|
-
#h[item_description_char] << item_char
|
47
|
-
#verbose << [item_description_char,item_char]
|
48
|
-
end
|
49
|
-
text_length =bs.getc #8 uimsbf
|
50
|
-
text_char =bs.str(text_length)
|
51
|
-
h[:verbose] += text_char
|
52
|
-
end
|
53
|
-
end
|
54
|
-
class ContentDescriptor < Descriptor
|
55
|
-
def parse(h,bs,tag,descriptor_length)
|
56
|
-
content_nibble_level_1=bs.read 4
|
57
|
-
content_nibble_level_2=bs.read 4
|
58
|
-
bs.pos+=descriptor_length-1
|
59
|
-
h[:content]=[content_nibble_level_1,content_nibble_level_2]
|
60
|
-
end
|
61
|
-
end
|
62
|
-
class ServiceDescriptor < Descriptor
|
63
|
-
def parse(h,bs,tag,descriptor_length)
|
64
|
-
service_type =bs.read 8 #uimsbf
|
65
|
-
service_provider_name_length =bs.read 8 #uimsbf
|
66
|
-
service_provider_name =Ariblib::String.new(bs,service_provider_name_length).to_utf8#bs.str(service_provider_name_length)
|
67
|
-
service_name_length =bs.read 8 #uimsbf
|
68
|
-
service_name =Ariblib::String.new(bs,service_name_length).to_utf8#bs.str(service_name_length)
|
69
|
-
h[:service_type]=service_type
|
70
|
-
h[:service_provider_name]=service_provider_name
|
71
|
-
h[:service_name]=service_name
|
72
|
-
end
|
73
|
-
end
|
74
|
-
class DataContentDescriptor < Descriptor
|
75
|
-
def parse(h,bs,tag,descriptor_length)
|
76
|
-
data_component_id = bs.read 16 #uimsbf
|
77
|
-
entry_component = bs.getc #8 uimsbf
|
78
|
-
selector_length = bs.getc #8 uimsbf
|
79
|
-
selector_byte = bs.str(selector_length)
|
80
|
-
num_of_component_ref = bs.getc #8 uimsbf
|
81
|
-
component_ref = bs.str(num_of_component_ref)
|
82
|
-
|
83
|
-
iso_639_language_code = bs.read 24 #bslbf
|
84
|
-
text_length = bs.getc #8 uimsbf
|
85
|
-
text_char = Ariblib::String.new(bs,text_length).to_utf8
|
86
|
-
h[:data_component]=text_char
|
87
|
-
end
|
88
|
-
end
|
89
|
-
class AudioComponentDescriptor < Descriptor
|
90
|
-
def parse(h,bs,tag,descriptor_length)
|
91
|
-
text_length = descriptor_length - 9#8 uimsbf
|
92
|
-
reserved_future_use = bs.read 4 #bslbf
|
93
|
-
stream_content = bs.read 4 #uimsbf
|
94
|
-
component_type = bs.getc #8 uimsbf
|
95
|
-
component_tag = bs.getc #8 uimsbf
|
96
|
-
stream_type = bs.getc #8 uimsbf
|
97
|
-
simulcast_group_tag = bs.getc #8 bslbf
|
98
|
-
es_multi_lingual_flag = bs.read 1 #bslbf
|
99
|
-
main_component_flag = bs.read 1 #bslbf
|
100
|
-
quality_indicator = bs.read 2 #bslbf
|
101
|
-
sampling_rate = bs.read 3 #uimsbf
|
102
|
-
reserved_future_use = bs.read 1 #bslbf
|
103
|
-
iso_639_language_code = bs.read 24 #bslbf
|
104
|
-
if (es_multi_lingual_flag == 1)
|
105
|
-
iso_639_language_code_2 = bs.read 24 #bslbf
|
106
|
-
text_length-= 3
|
107
|
-
end
|
108
|
-
text_char = Ariblib::String.new(bs,text_length).to_utf8
|
109
|
-
h[:audio_component]=text_char
|
110
|
-
end
|
111
|
-
end
|
112
|
-
class ComponentDescriptor < Descriptor
|
113
|
-
def parse(h,bs,tag,descriptor_length)
|
114
|
-
text_length = descriptor_length - 6#8 uimsbf
|
115
|
-
reserved_future_use = bs.read 4 #bslbf
|
116
|
-
stream_content = bs.read 4 #uimsbf
|
117
|
-
component_type = bs.getc #8 uimsbf
|
118
|
-
component_tag = bs.getc #8 uimsbf
|
119
|
-
iso_639_language_code = bs.read 24 #bslbf
|
120
|
-
text_char = Ariblib::String.new(bs,text_length).to_utf8
|
121
|
-
h[:component]=text_char
|
122
|
-
end
|
123
|
-
end
|
124
|
-
class EventGroupDescriptor < Descriptor
|
125
|
-
def parse(h,bs,tag,descriptor_length)
|
126
|
-
list=[]
|
127
|
-
#event_group_descriptor (){
|
128
|
-
group_type = bs.read 4 #uimsbf
|
129
|
-
event_count = bs.read 4 #uimsbf
|
130
|
-
event_count.times do
|
131
|
-
service_id = bs.read 16 #uimsbf
|
132
|
-
event_id = bs.read 16 #uimsbf
|
133
|
-
list <<[service_id,event_id]
|
134
|
-
end
|
135
|
-
if(group_type == 4 || group_type ==5)
|
136
|
-
len=(descriptor_length-1-event_count*4)/8
|
137
|
-
len.times do
|
138
|
-
original_network_id = bs.read 16 #uimsbf
|
139
|
-
transport_stream_id = bs.read 16 #uimsbf
|
140
|
-
service_id = bs.read 16 #uimsbf
|
141
|
-
event_id = bs.read 16 #uimsbf
|
142
|
-
end
|
143
|
-
else
|
144
|
-
len=(descriptor_length-1-event_count*4)
|
145
|
-
private_data_byte = bs.str len #uimsbf
|
146
|
-
end
|
147
|
-
h[:event_group]=[group_type,list]
|
148
|
-
end
|
149
|
-
end
|
150
|
-
class LogoTransmissionDescriptor < Descriptor
|
151
|
-
def parse(h,bs,tag,descriptor_length)
|
152
|
-
#h[:tag] << :digital_copy_control
|
153
|
-
logo_transmission_type = bs.read 8 #uimsbf
|
154
|
-
if(logo_transmission_type == 0x01)
|
155
|
-
reserved_future_use = bs.read 7 #bslbf
|
156
|
-
logo_id = bs.read 9 #uimsbf
|
157
|
-
reserved_future_use = bs.read 4 #bslbf
|
158
|
-
logo_version = bs.read 12 #uimsbf
|
159
|
-
download_data_id = bs.read 16 #uimsbf
|
160
|
-
h[:logo]=[logo_id,logo_version,download_data_id]
|
161
|
-
elsif(logo_transmission_type == 0x02)
|
162
|
-
reserved_future_use = bs.read 7 #bslbf
|
163
|
-
logo_id = bs.read 9 #uimsbf
|
164
|
-
h[:logo]=[logo_id]
|
165
|
-
elsif(logo_transmission_type == 0x03)
|
166
|
-
len=(descriptor_length-1)
|
167
|
-
logo_char = Ariblib::String.new(bs,len).to_utf8 #uimsbf
|
168
|
-
h[:logo_char]=logo_char
|
169
|
-
else
|
170
|
-
len=(descriptor_length-1)
|
171
|
-
reserved_future_use = bs.str len #bslbf
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
class ServiceGroupDescriptor < Descriptor
|
176
|
-
def parse(h,bs,tag,descriptor_length)
|
177
|
-
h[:tag] << :service_groupe
|
178
|
-
end
|
179
|
-
end
|
180
|
-
class DigitalCopyControlDescriptor < Descriptor
|
181
|
-
def parse(h,bs,tag,descriptor_length)
|
182
|
-
h[:tag] << :digital_copy_control
|
183
|
-
end
|
184
|
-
end
|
185
|
-
class NetworkNameDescriptor < Descriptor
|
186
|
-
def parse(h,bs,tag,descriptor_length)
|
187
|
-
network_name = Ariblib::String.new(bs,descriptor_length).to_utf8 #uimsbf
|
188
|
-
h[:network_name] = network_name
|
189
|
-
end
|
190
|
-
end
|
191
|
-
class TSInformationDescriptor < Descriptor
|
192
|
-
def parse(h,bs,tag,descriptor_length)
|
193
|
-
ret=[]
|
194
|
-
start_pos=bs.pos
|
195
|
-
remote_control_key_id = bs.read 8 #uimsbf
|
196
|
-
length_of_ts_name = bs.read 6 #uimsbf
|
197
|
-
transmission_type_count = bs.read 2 #uimsbf
|
198
|
-
ts_name_char = Ariblib::String.new(bs,length_of_ts_name).to_utf8 #uimsbf
|
199
|
-
transmission_type_count.times do
|
200
|
-
transmission_type_info = bs.read 8 #bslbf
|
201
|
-
num_of_service = bs.read 8 #uimsbf
|
202
|
-
num_of_service.times do
|
203
|
-
service_id = bs.read 16 #uimsbf
|
204
|
-
ret << service_id
|
205
|
-
end
|
206
|
-
end
|
207
|
-
len=descriptor_length-(bs.pos-start_pos)/8
|
208
|
-
#for (l = 0;l< N;l++) {
|
209
|
-
#reserved_future_use 8 bslbf
|
210
|
-
#}
|
211
|
-
h[:TS_remote_key]=remote_control_key_id
|
212
|
-
h[:TS_name]=ts_name_char
|
213
|
-
h[:TS_service]=ret
|
214
|
-
end
|
215
|
-
end
|
216
|
-
class TerrestrialDeliverySystemDescriptor < Descriptor
|
217
|
-
def parse(h,bs,tag,descriptor_length)
|
218
|
-
ret=[]
|
219
|
-
area_code = bs.read 12 #bslbf
|
220
|
-
guard_interval = bs.read 2 #bslbf
|
221
|
-
transmission_mode = bs.read 2 #bslbf
|
222
|
-
len=descriptor_length-2
|
223
|
-
(len/2).times do
|
224
|
-
frequency = bs.read 16 #uimsbf
|
225
|
-
ret << frequency
|
226
|
-
end
|
227
|
-
h[:TDS]=[area_code,transmission_mode,ret]
|
228
|
-
end
|
229
|
-
end
|
230
|
-
class PartialReceptionDescriptor < Descriptor
|
231
|
-
def parse(h,bs,tag,descriptor_length)
|
232
|
-
ret=[]
|
233
|
-
(descriptor_length/2).times do
|
234
|
-
service_id = bs.read 16 #uimsbf
|
235
|
-
ret << service_id
|
236
|
-
end
|
237
|
-
h[:PartialReception]=ret
|
238
|
-
end
|
239
|
-
end
|
240
|
-
class SystemManagementDescriptor < Descriptor
|
241
|
-
def parse(h,bs,tag,descriptor_length)
|
242
|
-
h[:tag] << :system_management
|
243
|
-
#system_management_id 16 uimsbf
|
244
|
-
#for (i=0;i <N;i++){
|
245
|
-
# additional_identification_info 8 uimsbf 不要
|
246
|
-
#}
|
247
|
-
end
|
248
|
-
end
|
249
|
-
class ServiceListDescriptor < Descriptor
|
250
|
-
def parse(h,bs,tag,descriptor_length)
|
251
|
-
ret=[]
|
252
|
-
(descriptor_length/3).times do
|
253
|
-
service_id = bs.read 16 #uimsbf
|
254
|
-
service_type = bs.read 8 #uimsbf
|
255
|
-
ret << [service_id,service_type]
|
256
|
-
end
|
257
|
-
h[:service_list]=ret
|
258
|
-
end
|
259
|
-
end
|
260
|
-
DescriptorTag={
|
261
|
-
0x4D => ShortEventDescriptor, #-----o---o n 0x4D 短形式イベント記述子*2
|
262
|
-
0x4E => ExtendedEventDescriptor, #-----o---o r 0x4E 拡張形式イベント記述子
|
263
|
-
0x54 => ContentDescriptor, #-----o---- r 0x54 コンテント記述子
|
264
|
-
80 => ComponentDescriptor, #-o---o---- r 0x50 コンポーネント記述子
|
265
|
-
196 => AudioComponentDescriptor, #-----o---- r 0xC4 音声コンポーネント記述子
|
266
|
-
0xC7 => DataContentDescriptor, #-----o---- r 0xC7 データコンテンツ記述子
|
267
|
-
214 => EventGroupDescriptor, #-----o---- r 0xD6 イベントグループ記述子
|
268
|
-
#for SDT(地上波)
|
269
|
-
0x48 => ServiceDescriptor, #----o----- n 0x48 サービス記述子*2
|
270
|
-
207 => LogoTransmissionDescriptor,#----o----- r 0xCF ロゴ伝送記述子
|
271
|
-
#for NIT(地上波)
|
272
|
-
0x40 => NetworkNameDescriptor, #--o------- n 0x40* ネットワーク名記述子*2
|
273
|
-
0x41 => ServiceListDescriptor, #--oo---o-- n 0x41* サービスリスト記述子*1
|
274
|
-
0xFA => TerrestrialDeliverySystemDescriptor,#--o------- n 0xFA* 地上分配システム記述子*1
|
275
|
-
0xFE => SystemManagementDescriptor, #-oo------- n 0xFE* システム管理記述子*1
|
276
|
-
224 => ServiceGroupDescriptor, #--o------- r 0xE0 サービスグループ記述子
|
277
|
-
0xCD => TSInformationDescriptor, #--o------- r 0xCD* TS 情報記述子
|
278
|
-
0xFB => PartialReceptionDescriptor, #--o------- j 0xFB* 部分受信記述子*1(ワンセグ)
|
279
|
-
}
|
280
|
-
DescriptorTag.default=Descriptor
|
281
|
-
DescriptorTag.freeze
|
282
|
-
end
|
283
|
-
|
284
|
-
__END__
|
285
|
-
SDT ->
|
286
|
-
->CommonDataTable ->
|
287
|
-
->EIT ->
|
288
|
-
|
289
|
-
NIT -> tpid,onid,*:service_list :TS_name || *:network_name
|
290
|
-
|
291
|
-
|
292
|
-
NIT(事業者情報)
|
293
|
-
id,(tpid,onid),ts_name,remote_key
|
294
|
-
|
295
|
-
SDT(サービス情報)
|
296
|
-
id,(tpid,onid,sid),service_type,service_name,logo_id,logo_name
|
297
|
-
|
298
|
-
EIT(番組情報)
|
299
|
-
id,(tpid,onid,sid,eid),start,fin,title,desc,colspan
|
300
|
-
|
301
|
-
CDT(ロゴ情報)
|
302
|
-
id (logo_id),logo0,1,2,3,4,5
|
303
|
-
|
1
|
+
#! ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
|
4
|
+
module Ariblib
|
5
|
+
#記述子
|
6
|
+
class Descriptor
|
7
|
+
def initialize(h,bs,tag,length)
|
8
|
+
parse(h,bs,tag,length)
|
9
|
+
end
|
10
|
+
def parse(h,bs,tag,descriptor_length)
|
11
|
+
h[:tag] << tag
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class ShortEventDescriptor < Descriptor
|
16
|
+
def parse(h,bs,tag,descriptor_length)
|
17
|
+
|
18
|
+
iso_639_language_code =bs.get3 #24 bslbf
|
19
|
+
event_name_length =bs.getc #8 uimsbf
|
20
|
+
event_name_char =Ariblib::String.new(bs,event_name_length).to_utf8
|
21
|
+
text_length =bs.getc #8 uimsbf
|
22
|
+
text_char =Ariblib::String.new(bs,text_length).to_utf8
|
23
|
+
h[:title]=event_name_char
|
24
|
+
h[:desc ]=text_char
|
25
|
+
end
|
26
|
+
end
|
27
|
+
class ExtendedEventDescriptor < Descriptor
|
28
|
+
def parse(h,bs,tag,descriptor_length)
|
29
|
+
descriptor_number =bs.read 4 #uimsbf
|
30
|
+
last_descriptor_number =bs.read 4 #uimsbf
|
31
|
+
iso_639_language_code =bs.get3 #24 bslbf
|
32
|
+
length_of_items =bs.getc #8 uimsbf
|
33
|
+
len=bs.pos+length_of_items*8
|
34
|
+
while bs.pos < len
|
35
|
+
item_description_length =bs.getc #8 uimsbf
|
36
|
+
item_description_char =Ariblib::String.new(bs,item_description_length).to_utf8
|
37
|
+
item_length =bs.getc #8 uimsbf
|
38
|
+
item_char =bs.str(item_length)
|
39
|
+
if item_description_length==0
|
40
|
+
(h[:verbose_pair].last)[1] += item_char
|
41
|
+
else
|
42
|
+
h[:verbose_pair] << [item_description_char,item_char]
|
43
|
+
end
|
44
|
+
#item_char =Ariblib::String.new(bs,item_length).to_utf8
|
45
|
+
#h[item_description_char]||=[]
|
46
|
+
#h[item_description_char] << item_char
|
47
|
+
#verbose << [item_description_char,item_char]
|
48
|
+
end
|
49
|
+
text_length =bs.getc #8 uimsbf
|
50
|
+
text_char =bs.str(text_length)
|
51
|
+
h[:verbose] += text_char
|
52
|
+
end
|
53
|
+
end
|
54
|
+
class ContentDescriptor < Descriptor
|
55
|
+
def parse(h,bs,tag,descriptor_length)
|
56
|
+
content_nibble_level_1=bs.read 4
|
57
|
+
content_nibble_level_2=bs.read 4
|
58
|
+
bs.pos+=descriptor_length-1
|
59
|
+
h[:content]=[content_nibble_level_1,content_nibble_level_2]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
class ServiceDescriptor < Descriptor
|
63
|
+
def parse(h,bs,tag,descriptor_length)
|
64
|
+
service_type =bs.read 8 #uimsbf
|
65
|
+
service_provider_name_length =bs.read 8 #uimsbf
|
66
|
+
service_provider_name =Ariblib::String.new(bs,service_provider_name_length).to_utf8#bs.str(service_provider_name_length)
|
67
|
+
service_name_length =bs.read 8 #uimsbf
|
68
|
+
service_name =Ariblib::String.new(bs,service_name_length).to_utf8#bs.str(service_name_length)
|
69
|
+
h[:service_type]=service_type
|
70
|
+
h[:service_provider_name]=service_provider_name
|
71
|
+
h[:service_name]=service_name
|
72
|
+
end
|
73
|
+
end
|
74
|
+
class DataContentDescriptor < Descriptor
|
75
|
+
def parse(h,bs,tag,descriptor_length)
|
76
|
+
data_component_id = bs.read 16 #uimsbf
|
77
|
+
entry_component = bs.getc #8 uimsbf
|
78
|
+
selector_length = bs.getc #8 uimsbf
|
79
|
+
selector_byte = bs.str(selector_length)
|
80
|
+
num_of_component_ref = bs.getc #8 uimsbf
|
81
|
+
component_ref = bs.str(num_of_component_ref)
|
82
|
+
|
83
|
+
iso_639_language_code = bs.read 24 #bslbf
|
84
|
+
text_length = bs.getc #8 uimsbf
|
85
|
+
text_char = Ariblib::String.new(bs,text_length).to_utf8
|
86
|
+
h[:data_component]=text_char
|
87
|
+
end
|
88
|
+
end
|
89
|
+
class AudioComponentDescriptor < Descriptor
|
90
|
+
def parse(h,bs,tag,descriptor_length)
|
91
|
+
text_length = descriptor_length - 9#8 uimsbf
|
92
|
+
reserved_future_use = bs.read 4 #bslbf
|
93
|
+
stream_content = bs.read 4 #uimsbf
|
94
|
+
component_type = bs.getc #8 uimsbf
|
95
|
+
component_tag = bs.getc #8 uimsbf
|
96
|
+
stream_type = bs.getc #8 uimsbf
|
97
|
+
simulcast_group_tag = bs.getc #8 bslbf
|
98
|
+
es_multi_lingual_flag = bs.read 1 #bslbf
|
99
|
+
main_component_flag = bs.read 1 #bslbf
|
100
|
+
quality_indicator = bs.read 2 #bslbf
|
101
|
+
sampling_rate = bs.read 3 #uimsbf
|
102
|
+
reserved_future_use = bs.read 1 #bslbf
|
103
|
+
iso_639_language_code = bs.read 24 #bslbf
|
104
|
+
if (es_multi_lingual_flag == 1)
|
105
|
+
iso_639_language_code_2 = bs.read 24 #bslbf
|
106
|
+
text_length-= 3
|
107
|
+
end
|
108
|
+
text_char = Ariblib::String.new(bs,text_length).to_utf8
|
109
|
+
h[:audio_component]=text_char
|
110
|
+
end
|
111
|
+
end
|
112
|
+
class ComponentDescriptor < Descriptor
|
113
|
+
def parse(h,bs,tag,descriptor_length)
|
114
|
+
text_length = descriptor_length - 6#8 uimsbf
|
115
|
+
reserved_future_use = bs.read 4 #bslbf
|
116
|
+
stream_content = bs.read 4 #uimsbf
|
117
|
+
component_type = bs.getc #8 uimsbf
|
118
|
+
component_tag = bs.getc #8 uimsbf
|
119
|
+
iso_639_language_code = bs.read 24 #bslbf
|
120
|
+
text_char = Ariblib::String.new(bs,text_length).to_utf8
|
121
|
+
h[:component]=text_char
|
122
|
+
end
|
123
|
+
end
|
124
|
+
class EventGroupDescriptor < Descriptor
|
125
|
+
def parse(h,bs,tag,descriptor_length)
|
126
|
+
list=[]
|
127
|
+
#event_group_descriptor (){
|
128
|
+
group_type = bs.read 4 #uimsbf
|
129
|
+
event_count = bs.read 4 #uimsbf
|
130
|
+
event_count.times do
|
131
|
+
service_id = bs.read 16 #uimsbf
|
132
|
+
event_id = bs.read 16 #uimsbf
|
133
|
+
list <<[service_id,event_id]
|
134
|
+
end
|
135
|
+
if(group_type == 4 || group_type ==5)
|
136
|
+
len=(descriptor_length-1-event_count*4)/8
|
137
|
+
len.times do
|
138
|
+
original_network_id = bs.read 16 #uimsbf
|
139
|
+
transport_stream_id = bs.read 16 #uimsbf
|
140
|
+
service_id = bs.read 16 #uimsbf
|
141
|
+
event_id = bs.read 16 #uimsbf
|
142
|
+
end
|
143
|
+
else
|
144
|
+
len=(descriptor_length-1-event_count*4)
|
145
|
+
private_data_byte = bs.str len #uimsbf
|
146
|
+
end
|
147
|
+
h[:event_group]=[group_type,list]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
class LogoTransmissionDescriptor < Descriptor
|
151
|
+
def parse(h,bs,tag,descriptor_length)
|
152
|
+
#h[:tag] << :digital_copy_control
|
153
|
+
logo_transmission_type = bs.read 8 #uimsbf
|
154
|
+
if(logo_transmission_type == 0x01)
|
155
|
+
reserved_future_use = bs.read 7 #bslbf
|
156
|
+
logo_id = bs.read 9 #uimsbf
|
157
|
+
reserved_future_use = bs.read 4 #bslbf
|
158
|
+
logo_version = bs.read 12 #uimsbf
|
159
|
+
download_data_id = bs.read 16 #uimsbf
|
160
|
+
h[:logo]=[logo_id,logo_version,download_data_id]
|
161
|
+
elsif(logo_transmission_type == 0x02)
|
162
|
+
reserved_future_use = bs.read 7 #bslbf
|
163
|
+
logo_id = bs.read 9 #uimsbf
|
164
|
+
h[:logo]=[logo_id]
|
165
|
+
elsif(logo_transmission_type == 0x03)
|
166
|
+
len=(descriptor_length-1)
|
167
|
+
logo_char = Ariblib::String.new(bs,len).to_utf8 #uimsbf
|
168
|
+
h[:logo_char]=logo_char
|
169
|
+
else
|
170
|
+
len=(descriptor_length-1)
|
171
|
+
reserved_future_use = bs.str len #bslbf
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
class ServiceGroupDescriptor < Descriptor
|
176
|
+
def parse(h,bs,tag,descriptor_length)
|
177
|
+
h[:tag] << :service_groupe
|
178
|
+
end
|
179
|
+
end
|
180
|
+
class DigitalCopyControlDescriptor < Descriptor
|
181
|
+
def parse(h,bs,tag,descriptor_length)
|
182
|
+
h[:tag] << :digital_copy_control
|
183
|
+
end
|
184
|
+
end
|
185
|
+
class NetworkNameDescriptor < Descriptor
|
186
|
+
def parse(h,bs,tag,descriptor_length)
|
187
|
+
network_name = Ariblib::String.new(bs,descriptor_length).to_utf8 #uimsbf
|
188
|
+
h[:network_name] = network_name
|
189
|
+
end
|
190
|
+
end
|
191
|
+
class TSInformationDescriptor < Descriptor
|
192
|
+
def parse(h,bs,tag,descriptor_length)
|
193
|
+
ret=[]
|
194
|
+
start_pos=bs.pos
|
195
|
+
remote_control_key_id = bs.read 8 #uimsbf
|
196
|
+
length_of_ts_name = bs.read 6 #uimsbf
|
197
|
+
transmission_type_count = bs.read 2 #uimsbf
|
198
|
+
ts_name_char = Ariblib::String.new(bs,length_of_ts_name).to_utf8 #uimsbf
|
199
|
+
transmission_type_count.times do
|
200
|
+
transmission_type_info = bs.read 8 #bslbf
|
201
|
+
num_of_service = bs.read 8 #uimsbf
|
202
|
+
num_of_service.times do
|
203
|
+
service_id = bs.read 16 #uimsbf
|
204
|
+
ret << service_id
|
205
|
+
end
|
206
|
+
end
|
207
|
+
len=descriptor_length-(bs.pos-start_pos)/8
|
208
|
+
#for (l = 0;l< N;l++) {
|
209
|
+
#reserved_future_use 8 bslbf
|
210
|
+
#}
|
211
|
+
h[:TS_remote_key]=remote_control_key_id
|
212
|
+
h[:TS_name]=ts_name_char
|
213
|
+
h[:TS_service]=ret
|
214
|
+
end
|
215
|
+
end
|
216
|
+
class TerrestrialDeliverySystemDescriptor < Descriptor
|
217
|
+
def parse(h,bs,tag,descriptor_length)
|
218
|
+
ret=[]
|
219
|
+
area_code = bs.read 12 #bslbf
|
220
|
+
guard_interval = bs.read 2 #bslbf
|
221
|
+
transmission_mode = bs.read 2 #bslbf
|
222
|
+
len=descriptor_length-2
|
223
|
+
(len/2).times do
|
224
|
+
frequency = bs.read 16 #uimsbf
|
225
|
+
ret << frequency
|
226
|
+
end
|
227
|
+
h[:TDS]=[area_code,transmission_mode,ret]
|
228
|
+
end
|
229
|
+
end
|
230
|
+
class PartialReceptionDescriptor < Descriptor
|
231
|
+
def parse(h,bs,tag,descriptor_length)
|
232
|
+
ret=[]
|
233
|
+
(descriptor_length/2).times do
|
234
|
+
service_id = bs.read 16 #uimsbf
|
235
|
+
ret << service_id
|
236
|
+
end
|
237
|
+
h[:PartialReception]=ret
|
238
|
+
end
|
239
|
+
end
|
240
|
+
class SystemManagementDescriptor < Descriptor
|
241
|
+
def parse(h,bs,tag,descriptor_length)
|
242
|
+
h[:tag] << :system_management
|
243
|
+
#system_management_id 16 uimsbf
|
244
|
+
#for (i=0;i <N;i++){
|
245
|
+
# additional_identification_info 8 uimsbf 不要
|
246
|
+
#}
|
247
|
+
end
|
248
|
+
end
|
249
|
+
class ServiceListDescriptor < Descriptor
|
250
|
+
def parse(h,bs,tag,descriptor_length)
|
251
|
+
ret=[]
|
252
|
+
(descriptor_length/3).times do
|
253
|
+
service_id = bs.read 16 #uimsbf
|
254
|
+
service_type = bs.read 8 #uimsbf
|
255
|
+
ret << [service_id,service_type]
|
256
|
+
end
|
257
|
+
h[:service_list]=ret
|
258
|
+
end
|
259
|
+
end
|
260
|
+
DescriptorTag={
|
261
|
+
0x4D => ShortEventDescriptor, #-----o---o n 0x4D 短形式イベント記述子*2
|
262
|
+
0x4E => ExtendedEventDescriptor, #-----o---o r 0x4E 拡張形式イベント記述子
|
263
|
+
0x54 => ContentDescriptor, #-----o---- r 0x54 コンテント記述子
|
264
|
+
80 => ComponentDescriptor, #-o---o---- r 0x50 コンポーネント記述子
|
265
|
+
196 => AudioComponentDescriptor, #-----o---- r 0xC4 音声コンポーネント記述子
|
266
|
+
0xC7 => DataContentDescriptor, #-----o---- r 0xC7 データコンテンツ記述子
|
267
|
+
214 => EventGroupDescriptor, #-----o---- r 0xD6 イベントグループ記述子
|
268
|
+
#for SDT(地上波)
|
269
|
+
0x48 => ServiceDescriptor, #----o----- n 0x48 サービス記述子*2
|
270
|
+
207 => LogoTransmissionDescriptor,#----o----- r 0xCF ロゴ伝送記述子
|
271
|
+
#for NIT(地上波)
|
272
|
+
0x40 => NetworkNameDescriptor, #--o------- n 0x40* ネットワーク名記述子*2
|
273
|
+
0x41 => ServiceListDescriptor, #--oo---o-- n 0x41* サービスリスト記述子*1
|
274
|
+
0xFA => TerrestrialDeliverySystemDescriptor,#--o------- n 0xFA* 地上分配システム記述子*1
|
275
|
+
0xFE => SystemManagementDescriptor, #-oo------- n 0xFE* システム管理記述子*1
|
276
|
+
224 => ServiceGroupDescriptor, #--o------- r 0xE0 サービスグループ記述子
|
277
|
+
0xCD => TSInformationDescriptor, #--o------- r 0xCD* TS 情報記述子
|
278
|
+
0xFB => PartialReceptionDescriptor, #--o------- j 0xFB* 部分受信記述子*1(ワンセグ)
|
279
|
+
}
|
280
|
+
DescriptorTag.default=Descriptor
|
281
|
+
DescriptorTag.freeze
|
282
|
+
end
|
283
|
+
|
284
|
+
__END__
|
285
|
+
SDT ->
|
286
|
+
->CommonDataTable ->
|
287
|
+
->EIT ->
|
288
|
+
|
289
|
+
NIT -> tpid,onid,*:service_list :TS_name || *:network_name
|
290
|
+
|
291
|
+
|
292
|
+
NIT(事業者情報)
|
293
|
+
id,(tpid,onid),ts_name,remote_key
|
294
|
+
|
295
|
+
SDT(サービス情報)
|
296
|
+
id,(tpid,onid,sid),service_type,service_name,logo_id,logo_name
|
297
|
+
|
298
|
+
EIT(番組情報)
|
299
|
+
id,(tpid,onid,sid,eid),start,fin,title,desc,colspan
|
300
|
+
|
301
|
+
CDT(ロゴ情報)
|
302
|
+
id (logo_id),logo0,1,2,3,4,5
|
303
|
+
|