@danything/arib 1.0.2 → 1.2.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.
package/dist/psi.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * TS の土台 (パケットの切り出し・セクションの組み立て・PAT/PMT) と、局の一覧。
3
3
  * 局の一覧はチャンネルスキャンで「この物理チャンネルに何が入っているか」を知るために使い、
4
- * 読むのは NIT と SDT の2つ。
4
+ * 読むのは NIT と SDT の 2 つ。
5
5
  *
6
- * - NIT (PID 0x0010) … ネットワークID と、地上波ならリモコン番号
7
- * - SDT (PID 0x0011) … その TS に入っているサービスのIDと種別
6
+ * - NIT (PID 0x0010) … ネットワーク ID と、地上波ならリモコン番号。衛星はネットワークの全部の TS
7
+ * (TSID・周波数・サービスの一覧) が載っている (`NitReader`)
8
+ * - SDT (PID 0x0011) … その TS に入っているサービスの ID と種別。衛星はほかの TS のぶん
9
+ * (SDT[other]) も流れている (`SdtReader`)
8
10
  *
9
11
  * 局名も SDT から読む。ARIB の文字符号は独自だが、番組表を自分で集めるなら
10
12
  * どのみち要るので [aribtext.ts](aribtext.ts) に寄せてある。
@@ -15,16 +17,26 @@ export declare const SYNC = 71;
15
17
  export declare function packetPid(packet: Uint8Array): number;
16
18
  /** PAT。どの PID に PMT があるかを持つ。**入口はいつもここ** */
17
19
  export declare const PID_PAT = 0;
20
+ export declare const PID_NIT = 16;
18
21
  export declare const PID_SDT = 17;
19
22
  export declare const TABLE_PAT = 0;
20
23
  export declare const TABLE_PMT = 2;
24
+ export declare const TABLE_NIT_ACTUAL = 64;
25
+ export declare const TABLE_NIT_OTHER = 65;
21
26
  export declare const TABLE_SDT_ACTUAL = 66;
27
+ export declare const TABLE_SDT_OTHER = 70;
28
+ /**
29
+ * スキャンで残すサービス種別。Mirakurun のスキャンが通しているものと同じで、
30
+ * ラジオ (0x02) とデータ (0xc0) も入る。映像の無いものを番組表に並べないのは
31
+ * 取り込むほう (denpa の epg.ts の DIGITAL_TV)
32
+ */
33
+ export declare const SERVICE_TYPES: Set<number>;
22
34
  /**
23
35
  * セクション本体に CRC32 を付けて仕上げる。`section_length` も実長に直す。
24
36
  *
25
- * **書く側が2つある。** PAT を書き直して流す `service-filter.ts` と、
37
+ * **書く側が 2 つある。** PAT を書き直して流す `service-filter.ts` と、
26
38
  * 偽の放送を組み立てる `synth.ts`。長さの直し方を間違えると読む側が黙って
27
- * 捨てるだけなので、1箇所に置く。
39
+ * 捨てるだけなので、1 箇所に置く。
28
40
  */
29
41
  export declare function withCrc(body: number[]): Uint8Array;
30
42
  export interface Service {
@@ -48,26 +60,26 @@ export interface NetworkInfo {
48
60
  *
49
61
  * セクションは TS パケットをまたいで運ばれ、パケットの切れ目とは無関係な
50
62
  * 位置で終わる。payload_unit_start_indicator と pointer_field を見て
51
- * 頭を合わせ、section_length ぶん溜まったら1本として吐く。
63
+ * 頭を合わせ、section_length ぶん溜まったら 1 本として返す。
52
64
  */
53
65
  export declare class SectionAssembler {
54
66
  private readonly pid;
55
67
  private readonly crc;
56
68
  private buffer;
57
69
  /**
58
- * @param pid 読むPID
70
+ * @param pid 読む PID
59
71
  * @param crc CRC の見方。
60
- * `always` … 末尾4バイトを CRC32 とみなして必ず確かめる (PSI はこちら)
72
+ * `always` … 末尾 4 バイトを CRC32 とみなして必ず確かめる (PSI はこちら)
61
73
  * `syntax` … `section_syntax_indicator` が立っているときだけ確かめる。
62
74
  * DSM-CC は立っていないと末尾が CRC ではなく Checksum なので、
63
75
  * いつも確かめると**全部捨ててしまう**
64
76
  */
65
77
  constructor(pid: number, crc?: "always" | "syntax");
66
78
  /**
67
- * パケットを1つ食わせる。組み上がったセクションを返す。
79
+ * パケットを 1 つ渡す。組み上がったセクションを返す。
68
80
  *
69
81
  * 返りは**読むだけ**にすること。何も組み上がらないとき (ほとんどのパケット) は
70
- * 使い回しの空配列を返す — 関係ないパケットのたびに配列を作っていた
82
+ * 使い回しの空配列を返す (関係ないパケットのたびに配列を作っていた)
71
83
  */
72
84
  feed(packet: Uint8Array): readonly Uint8Array[];
73
85
  private append;
@@ -79,7 +91,7 @@ export declare function findSync(data: Uint8Array, from?: number, until?: number
79
91
  * 任意の長さで届くバイト列を 188 バイトのパケットに切り分ける。
80
92
  *
81
93
  * 頭が必ずパケットの先頭とは限らず、電波が弱いと途中で数バイト落ちる。
82
- * ずれたままだと**以降ずっと1パケットも読めなくなる**ので、頭が 0x47 でなければ
94
+ * ずれたままだと**以降ずっと 1 パケットも読めなくなる**ので、頭が 0x47 でなければ
83
95
  * 取り直す。普段は先頭が 0x47 なので、探しに行くのはずれたときだけ。
84
96
  *
85
97
  * **出すパケットは渡された塊の上の窓** (写しではない。写すと録画の処理の 1/3 を食う)。
@@ -92,8 +104,8 @@ export declare class PacketStream {
92
104
  feed(chunk: Uint8Array): Generator<Uint8Array>;
93
105
  }
94
106
  /**
95
- * PAT から1つの局の PMT を追う。`serviceId` を渡さなければ PAT の最初の局
96
- * (1局に絞った TS を食わせるところ)。PAT で PMT の PID が替われば組み立て直す
107
+ * PAT から 1 つの局の PMT を追う。`serviceId` を渡さなければ PAT の最初の局
108
+ * (1 局に絞った TS を渡すところ)。PAT で PMT の PID が替われば組み立て直す
97
109
  */
98
110
  export declare class PmtTracker {
99
111
  private readonly serviceId?;
@@ -102,7 +114,7 @@ export declare class PmtTracker {
102
114
  /** 追っている PMT の PID。PAT を読むまでは null。替わったかは呼ぶ前後で比べる */
103
115
  pid: number | null;
104
116
  constructor(serviceId?: number | undefined);
105
- /** パケットを1つ (`pid` はその PID)。組み上がった PMT のセクションを返す */
117
+ /** パケットを 1 つ (`pid` はその PID)。組み上がった PMT のセクションを返す */
106
118
  feed(packet: Uint8Array, pid: number): readonly Uint8Array[];
107
119
  }
108
120
  /** 記述子の並びを (tag, 中身) に切り分ける */
@@ -112,8 +124,8 @@ export declare const DESC_DIGITAL_COPY_CONTROL = 193;
112
124
  /**
113
125
  * デジタルコピー制御記述子の中身 (タグと長さを除いたもの) から、**コピー禁止か**を読む。
114
126
  *
115
- * 先頭2ビットの digital_recording_control_data が 11 なら禁止
116
- * (00 コピー可、01 事業者定義、10 1世代のみ)。禁止の番組は録らない
127
+ * 先頭 2 ビットの digital_recording_control_data が 11 なら禁止
128
+ * (00 コピー可、01 事業者定義、10 1 世代のみ)。禁止の番組は録らない
117
129
  * ([data.md](https://github.com/danything/denpa/blob/main/docs/data.md)「コピー禁止の番組は録らない」)
118
130
  */
119
131
  export declare function isCopyNever(data: Uint8Array): boolean;
@@ -130,26 +142,152 @@ export declare function pmtProgramInfo(section: Uint8Array): Uint8Array;
130
142
  * だけ**にして、選り分けは呼ぶ側に置いてあります。
131
143
  */
132
144
  export declare function pmtStreams(section: Uint8Array): Generator<[number, number, Uint8Array]>;
133
- /** PAT から `サービスID → PMT の PID`。サービス0 は NIT なので飛ばす */
145
+ /** PAT から `サービスID → PMT の PID`。サービス 0 は NIT なので飛ばす */
134
146
  export declare function parsePat(section: Uint8Array): Map<number, number>;
135
147
  /**
136
148
  * SDT のサービスの並びを (service_id, 記述子の並び) に切り分ける。
137
149
  *
138
- * **読む側が2つある。** 局名 (`parseSdt`) とロゴの対応 (denpa の `ts/logo.ts`) で、
139
- * 欲しい記述子が違うだけで歩き方は同じ。並びの読み方をここ1箇所に置く。
150
+ * **読む側が 2 つある。** 局名 (`parseSdt`) とロゴの対応 (denpa の `ts/logo.ts`) で、
151
+ * 欲しい記述子が違うだけで歩き方は同じ。並びの読み方をここ 1 箇所に置く。
140
152
  */
141
153
  export declare function sdtServices(section: Uint8Array): Generator<[number, Uint8Array]>;
142
154
  /** SDT からサービスの一覧を読む。自分の TS のものだけ */
143
155
  export declare function parseSdt(section: Uint8Array): TransportInfo | null;
144
- /** NIT からネットワークIDとリモコン番号、他の TS の顔ぶれを読む */
156
+ /**
157
+ * SDT[other] からサービスの一覧を読む。**ほかの TS のもの。**
158
+ *
159
+ * 衛星は、どの TS にもネットワークのほかの TS の局名を流している (番組表の EIT[other] と同じ考え)。
160
+ * 開いていない TS の局名をこれで知る。TS ごとに別のセクションで来るので、集めるのは `SdtReader`
161
+ */
162
+ export declare function parseSdtOther(section: Uint8Array): TransportInfo | null;
163
+ /** 衛星の分配の記述子 (0x43)。どの周波数で流れているか */
164
+ export interface SatelliteDelivery {
165
+ kind: "satellite";
166
+ /**
167
+ * 周波数 (kHz)。**放送の周波数そのもの** (BS-1 は 11727480)。
168
+ * チューナーに渡す中間周波数は、ここから LNB の局発の周波数 (BS・CS は 10678 MHz) を引いたもの
169
+ */
170
+ frequency: number;
171
+ /** 軌道位置 (0.1 度単位。東経 110 度は 1100) */
172
+ orbitalPosition: number;
173
+ /** 東経なら true */
174
+ east: boolean;
175
+ /** 偏波。0 水平・1 垂直・2 左旋・3 右旋 */
176
+ polarization: number;
177
+ /** 変調方式 (ARIB STD-B10 の値のまま) */
178
+ modulation: number;
179
+ /** シンボルレート (シンボル/秒) */
180
+ symbolRate: number;
181
+ /** 内符号 (ARIB STD-B10 の値のまま) */
182
+ fec: number;
183
+ }
184
+ /** 地上の分配の記述子 (0xFA)。地上波は自分の TS のぶんしか載らない */
185
+ export interface TerrestrialDelivery {
186
+ kind: "terrestrial";
187
+ /** 地域の識別 (ARIB STD-B10 の area_code) */
188
+ areaCode: number;
189
+ guardInterval: number;
190
+ transmissionMode: number;
191
+ /** 周波数 (Hz)。中継局ごとに並ぶことがある。放送は 1/7 MHz 単位で書く */
192
+ frequencies: number[];
193
+ }
194
+ export type Delivery = SatelliteDelivery | TerrestrialDelivery;
195
+ /** NIT の TS の 1 件。サービスの一覧に、どこで流れているかが付く */
196
+ export interface NetworkTransport extends TransportInfo {
197
+ delivery: Delivery | null;
198
+ }
199
+ /** NIT のセクション 1 つ。表は何本かのセクションに分かれて来るので、そろえるのは `NitReader` */
200
+ export interface NitSection {
201
+ /** NIT[other] (ほかのネットワークのもの) なら true */
202
+ other: boolean;
203
+ networkId: number;
204
+ version: number;
205
+ /** current_next_indicator。0 (これから使う表) のものは `NitReader` が読まない */
206
+ current: boolean;
207
+ sectionNumber: number;
208
+ lastSectionNumber: number;
209
+ remoteControlKeyId: number | null;
210
+ transportStreams: NetworkTransport[];
211
+ }
212
+ /** NIT のセクションを 1 つ読む。actual (0x40) と other (0x41) のどちらも */
213
+ export declare function parseNitSection(section: Uint8Array): NitSection | null;
214
+ /**
215
+ * NIT からネットワーク ID とリモコン番号、他の TS の顔ぶれを読む。**セクション 1 つぶん。**
216
+ * スキャンで「どのネットワークか」を知るにはこれで足りる。ネットワークの全部の TS が要るなら `NitReader`
217
+ */
145
218
  export declare function parseNit(section: Uint8Array): NetworkInfo | null;
219
+ /** そろった NIT。セクションをつないだもの */
220
+ export interface Network {
221
+ /** NIT[other] なら true */
222
+ other: boolean;
223
+ networkId: number;
224
+ version: number;
225
+ remoteControlKeyId: number | null;
226
+ transportStreams: NetworkTransport[];
227
+ }
228
+ /**
229
+ * NIT を**全部のセクション**そろえて読む。
230
+ *
231
+ * 衛星の NIT[actual] には、そのネットワークの全部の TS (TSID・周波数・サービスの一覧) が載っている。
232
+ * TS が多いと 1 セクション (1024 バイトまで) に収まらないので、ネットワークごとに (actual と other を
233
+ * 分けて) 集め、そろったものを返す。
234
+ *
235
+ * **version が変わっても、新しい表がそろうまでは前の表を返す。** 読む側が見るのは、いつも 1 つの
236
+ * version でそろった表。全部のセクションが 1 回りするまで (NIT は 10 秒に 1 回は流れるので、長くて 10 秒ほど) は何も返らない。
237
+ *
238
+ * 置き換えた 1 つ前の version のセクションが遅れて届いても読まない。読むと、そろったときに表が前に戻る。
239
+ *
240
+ * 1 つの中継を読む前提で作ってある。別の中継へ移るときは作り直す。`actual` は、最初にそろった自分のネットワークの表を返す
241
+ */
242
+ export declare class NitReader {
243
+ private readonly assembler;
244
+ private readonly packets;
245
+ private readonly pending;
246
+ private readonly done;
247
+ /** 置き換えた表の version (表ごと) */
248
+ private readonly replaced;
249
+ /** 任意の長さのバイト列を渡す。そろった表が増えたか変わったら true */
250
+ feed(chunk: Uint8Array): boolean;
251
+ private add;
252
+ /** 自分のネットワークの表 (NIT[actual])。まだそろっていなければ null */
253
+ get actual(): Network | null;
254
+ /** そろった表を全部。actual が先 */
255
+ networks(): Network[];
256
+ }
257
+ /** そろった SDT。TS 1 本ぶん */
258
+ export interface ServiceTable extends TransportInfo {
259
+ /** SDT[other] (ほかの TS のもの) なら true */
260
+ other: boolean;
261
+ version: number;
262
+ }
263
+ /**
264
+ * SDT を TS ごとに**全部のセクション**そろえて読む。自分の TS (actual) とほかの TS (other) の両方。
265
+ *
266
+ * 衛星はほかの TS の局名も流しているので、1 つの TS を開けばネットワークの局名がそろう
267
+ * (そろうかは放送しだい。来なかった TS は返らない)。version の扱いと、1 つの中継を読む前提は `NitReader` と同じ
268
+ */
269
+ export declare class SdtReader {
270
+ private readonly assembler;
271
+ private readonly packets;
272
+ private readonly pending;
273
+ private readonly done;
274
+ /** 置き換えた表の version (TS ごと) */
275
+ private readonly replaced;
276
+ /** 任意の長さのバイト列を渡す。そろった表が増えたか変わったら true */
277
+ feed(chunk: Uint8Array): boolean;
278
+ private add;
279
+ /** 自分の TS の表 (SDT[actual])。まだそろっていなければ null */
280
+ get actual(): ServiceTable | null;
281
+ /** そろった表を全部。actual が先、あとはネットワーク・TSID の順 */
282
+ tables(): ServiceTable[];
283
+ }
146
284
  export interface FoundService extends Service {
147
285
  networkId: number;
148
286
  transportStreamId: number;
149
287
  remoteControlKeyId: number | null;
150
288
  }
151
289
  /**
152
- * 流れてくる TS を食べて、NIT と SDT が揃うまで待つ。
290
+ * 流れてくる TS を読んで、NIT と SDT が揃うまで待つ。
153
291
  *
154
292
  * Mirakurun のスキャンと同じで、**両方**揃って初めてそのチャンネルを
155
293
  * 「受信できた」とみなす。SDT だけ取れても、どのネットワークのものか
@@ -162,7 +300,7 @@ export declare class ServiceReader {
162
300
  network: NetworkInfo | null;
163
301
  transport: TransportInfo | null;
164
302
  get complete(): boolean;
165
- /** 任意の長さのバイト列を食わせる。揃ったら true */
303
+ /** 任意の長さのバイト列を渡す。揃ったら true */
166
304
  feed(chunk: Uint8Array): boolean;
167
305
  /** 録るに値するサービスだけ。リモコン番号は NIT のものを配る */
168
306
  services(): FoundService[];