@danything/arib 1.3.0 → 2.0.0

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.
@@ -5,8 +5,8 @@
5
5
  * ([agent.md](https://github.com/danything/denpa/blob/main/docs/agent.md))、選り分けるのは denpa の仕事。
6
6
  *
7
7
  * **これをやらないと 1 つの録画に複数の番組が入る。** 実機の TOKYO MX は
8
- * 1 本の TS に MX1 と MX2 を載せていて、丸ごと保存すると ffprobe が 2 つの
9
- * プログラムを返す (これで CM 検出の fps を読み違えたことがある)。
8
+ * 1 本の TS に MX1 と MX2 が入っていて、丸ごと保存すると ffprobe が 2 つの
9
+ * プログラムを返す。
10
10
  *
11
11
  * 残すものは次のとおり。
12
12
  *
@@ -37,7 +37,7 @@ const KEEP = new Set([
37
37
  ]);
38
38
  const DESC_CA = 0x09;
39
39
  /**
40
- * PMT を読むまで取っておくパケットの数の上限。**選局したての頭を捨てない** (`ServiceFilter.filter`)。
40
+ * PMT を読むまで取っておくパケットの数の上限。**選局したての先頭を捨てない** (`ServiceFilter.filter`)。
41
41
  *
42
42
  * PAT と PMT はそれぞれ 100ms ごとに来るので、待つのはふつう 0.2 秒まで。地上波 (17Mbit/s) なら 2,300 個、
43
43
  * BS の中継丸ごと (52Mbit/s) でも 7,000 個ほど。来ない (局を読み違えた) ときに抱え込み続けないよう、超えたら古いほうから捨てる
@@ -104,7 +104,7 @@ export class ServiceFilter {
104
104
  tsid = null;
105
105
  copyNeverNow = false;
106
106
  streamsNow = null;
107
- /** PMT を読む前に届いた、局の分からないパケット (写したもの)。届いた順 */
107
+ /** PMT を読む前に届いた、局の分からないパケット (コピーしたもの)。届いた順 */
108
108
  held = [];
109
109
  constructor(serviceId) {
110
110
  this.serviceId = serviceId;
@@ -137,10 +137,10 @@ export class ServiceFilter {
137
137
  /**
138
138
  * **中継の番号 (transport_stream_id)。** PAT を読むまでは null。
139
139
  *
140
- * 絞るのに要るわけではありません。**データ放送が受信機に訊いてくる**ので
141
- * 覚えておきます。テレ朝の TVer リンクは `browser.getProgramID(4)` で
142
- * これを取り、TVer のサーバへそのまま送る。`null` のまま渡すと文字の
143
- * "null" が飛んで、あちらが断り、画面には `DT-RE` とだけ出ます
140
+ * 絞るのに要るわけではない。**データ放送が受信機に訊いてくる**ので
141
+ * 覚えておく。テレ朝の TVer リンクは `browser.getProgramID(4)` で
142
+ * これを取り、TVer のサーバへそのまま送る。`null` のまま渡すと文字列の
143
+ * "null" が送られて、あちらが断り、画面には `DT-RE` とだけ出る
144
144
  * ([server/live.ts](https://github.com/danything/denpa/blob/main/src/lib/server/live.ts) の `programInfo`)
145
145
  */
146
146
  get transportStreamId() {
@@ -182,7 +182,7 @@ export class ServiceFilter {
182
182
  }
183
183
  return concatBytes(out);
184
184
  }
185
- /** PMT を読む前のパケットを取っておく。**写す** (パケットは届いた塊の上の窓。`PacketStream`) */
185
+ /** PMT を読む前のパケットを取っておく。**コピーする** (パケットは届いたチャンクの一部を指す。`PacketStream`) */
186
186
  hold(ts) {
187
187
  this.held.push(ts.slice());
188
188
  // 溢れたら古い半分を捨てる (1 つずつ捨てると、来ないあいだずっと詰め直すことになる)
@@ -254,7 +254,7 @@ export class ServiceFilter {
254
254
  */
255
255
  export class StreamsWatch {
256
256
  seen = null;
257
- /** `filter` に塊を通したあとに呼ぶ */
257
+ /** `filter` にチャンクを通したあとに呼ぶ */
258
258
  changed(filter) {
259
259
  const now = filter.streams;
260
260
  if (now === null)
@@ -12,14 +12,14 @@
12
12
  * - 音声 … 48kHz ステレオの AAC-LC の**無音**を ADTS で。1 コマ 7 バイト
13
13
  *
14
14
  * 規格は ISO/IEC 13818-2 (映像) と 13818-7 / 14496-3 (AAC)。表の出どころは
15
- * 各関数の頭に書いてある。
15
+ * 各関数の冒頭に書いてある。
16
16
  */
17
17
  /** 29.97 コマ/秒の 1 コマ (90kHz)。放送と同じ */
18
18
  export declare const FRAME_TICKS = 3003;
19
19
  /** AAC の 1 コマ (1024 標本 @48kHz を 90kHz で) */
20
20
  export declare const AUDIO_TICKS = 1920;
21
21
  /**
22
- * I フレームを 1 枚。**毎枚、系列ヘッダから書く。** どこから受け取っても頭からデコードできる
22
+ * I フレームを 1 枚。**毎枚、系列ヘッダから書く。** どこから受け取っても先頭からデコードできる
23
23
  * (放送は GOP ごとに書く。試験ではその手間を省く)。
24
24
  *
25
25
  * @param n 何枚目か。色と time_code に使う
@@ -27,21 +27,21 @@ export declare const AUDIO_TICKS = 1920;
27
27
  */
28
28
  export declare function mpeg2Frame(n: number, color?: (col: number, row: number, n: number, field: 0 | 1) => [number, number, number]): Uint8Array;
29
29
  /**
30
- * AAC-LC の無音を 1 コマ、ADTS の頭付きで。48kHz・ステレオ (channel_configuration 2)。
30
+ * AAC-LC の無音を 1 コマ、ADTS のヘッダ付きで。48kHz・ステレオ (channel_configuration 2)。
31
31
  *
32
32
  * 中身は CPE が 1 つ: 両耳とも `max_sfb = 0` (係数を 1 つも持たない) で、あとは END。
33
33
  * 55 ビットなので 7 バイトに収まる (14496-3 の raw_data_block)
34
34
  */
35
35
  export declare function silentAac(): Uint8Array;
36
36
  /**
37
- * PES にする。映像は長さ 0 (「次の頭まで」。放送もそう書く)、音声は長さを書く
37
+ * PES にする。映像は長さ 0 (「次の PES の先頭まで」。放送もそう書く)、音声は長さを書く
38
38
  *
39
39
  * @param streamId 0xE0 (映像) / 0xC0 (音声) / 0xBD (字幕。`synth-caption.ts`)
40
40
  */
41
41
  export declare function pes(streamId: number, pts: number, data: Uint8Array): Uint8Array;
42
42
  /**
43
43
  * PES を TS パケットに割る。**最後のパケットは適応フィールドで詰める** (中身を 0xFF で
44
- * 埋めると PES の続きに見える)。頭のパケットに PCR を載せることもできる
44
+ * 埋めると PES の続きに見える)。最初のパケットに PCR を載せることもできる
45
45
  *
46
46
  * @param counter 連続性カウンタの続き。返り値の `counter` を次に渡す
47
47
  */
package/dist/synth-av.js CHANGED
@@ -12,7 +12,7 @@
12
12
  * - 音声 … 48kHz ステレオの AAC-LC の**無音**を ADTS で。1 コマ 7 バイト
13
13
  *
14
14
  * 規格は ISO/IEC 13818-2 (映像) と 13818-7 / 14496-3 (AAC)。表の出どころは
15
- * 各関数の頭に書いてある。
15
+ * 各関数の冒頭に書いてある。
16
16
  */
17
17
  import { concatBytes } from "./bytes.js";
18
18
  import { PACKET, SYNC } from "./psi.js";
@@ -96,7 +96,7 @@ function colorAt(col, row, n, field) {
96
96
  return [y, 96 + ((row * 16) % 64), 160 - ((col * 4) % 64)];
97
97
  }
98
98
  /**
99
- * I フレームを 1 枚。**毎枚、系列ヘッダから書く。** どこから受け取っても頭からデコードできる
99
+ * I フレームを 1 枚。**毎枚、系列ヘッダから書く。** どこから受け取っても先頭からデコードできる
100
100
  * (放送は GOP ごとに書く。試験ではその手間を省く)。
101
101
  *
102
102
  * @param n 何枚目か。色と time_code に使う
@@ -162,7 +162,7 @@ export function mpeg2Frame(n, color = colorAt) {
162
162
  bits.put(0, 1); // progressive_frame = 0
163
163
  bits.put(0, 1); // composite_display_flag
164
164
  for (let row = 0; row < mbHeight; row++) {
165
- // 1 行を 1 スライスに。予測は行の頭で 128 に戻る (7.2.1)
165
+ // 1 行を 1 スライスに。予測は行の先頭で 128 に戻る (7.2.1)
166
166
  bits.startCode(row + 1);
167
167
  bits.put(8, 5); // quantiser_scale_code (DC だけなので効かない)
168
168
  bits.put(0, 1); // extra_bit_slice
@@ -187,7 +187,7 @@ export function mpeg2Frame(n, color = colorAt) {
187
187
  return bits.bytes();
188
188
  }
189
189
  /**
190
- * AAC-LC の無音を 1 コマ、ADTS の頭付きで。48kHz・ステレオ (channel_configuration 2)。
190
+ * AAC-LC の無音を 1 コマ、ADTS のヘッダ付きで。48kHz・ステレオ (channel_configuration 2)。
191
191
  *
192
192
  * 中身は CPE が 1 つ: 両耳とも `max_sfb = 0` (係数を 1 つも持たない) で、あとは END。
193
193
  * 55 ビットなので 7 バイトに収まる (14496-3 の raw_data_block)
@@ -224,7 +224,7 @@ export function silentAac() {
224
224
  head.put(0, 2); // number_of_raw_data_blocks - 1
225
225
  return Uint8Array.from([...head.bytes(), ...payload]);
226
226
  }
227
- /** PTS/DTS の 5 バイト (2.4.3.7)。頭の 4 ビットは '0010' (PTS だけ) */
227
+ /** PTS/DTS の 5 バイト (2.4.3.7)。先頭の 4 ビットは '0010' (PTS だけ) */
228
228
  function stamp(pts) {
229
229
  const value = pts % 2 ** 33;
230
230
  const high = Math.floor(value / 2 ** 30) & 0x07;
@@ -239,7 +239,7 @@ function stamp(pts) {
239
239
  ];
240
240
  }
241
241
  /**
242
- * PES にする。映像は長さ 0 (「次の頭まで」。放送もそう書く)、音声は長さを書く
242
+ * PES にする。映像は長さ 0 (「次の PES の先頭まで」。放送もそう書く)、音声は長さを書く
243
243
  *
244
244
  * @param streamId 0xE0 (映像) / 0xC0 (音声) / 0xBD (字幕。`synth-caption.ts`)
245
245
  */
@@ -259,7 +259,7 @@ export function pes(streamId, pts, data) {
259
259
  }
260
260
  /**
261
261
  * PES を TS パケットに割る。**最後のパケットは適応フィールドで詰める** (中身を 0xFF で
262
- * 埋めると PES の続きに見える)。頭のパケットに PCR を載せることもできる
262
+ * 埋めると PES の続きに見える)。最初のパケットに PCR を載せることもできる
263
263
  *
264
264
  * @param counter 連続性カウンタの続き。返り値の `counter` を次に渡す
265
265
  */
@@ -271,7 +271,7 @@ export function packetizePes(pid, data, counter, pcr = null) {
271
271
  const withPcr = at === 0 && pcr !== null;
272
272
  const rest = data.length - at;
273
273
  /*
274
- * 適応フィールドの長さ。PCR を載せるなら旗 1 バイト + 6 バイト。**中身が
274
+ * 適応フィールドの長さ。PCR を載せるならフラグ 1 バイト + 6 バイト。**中身が
275
275
  * 足りないときもここを伸ばして詰める** (中身を 0xFF で埋めると PES の続きに見える)
276
276
  */
277
277
  const least = withPcr ? 7 : 0;
@@ -30,7 +30,7 @@ export declare function text(body: number[], language?: number): Uint8Array;
30
30
  */
31
31
  export declare function drcsUnit(code: number, rows: string[]): number[];
32
32
  /**
33
- * ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1 本・コマごとに塊 1 つ)。
33
+ * ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1 本・コマごとに SimpleBlock 1 つ)。
34
34
  * 中身は字幕の PES の中身 (`text(...)` など) をそのまま入れる
35
35
  *
36
36
  * @param frames [時刻 (ミリ秒。65535 まで), 中身] の並び
@@ -100,7 +100,7 @@ function element(id, body) {
100
100
  return [...id, 0x01, 0, 0, 0, (size >>> 24) & 0xff, ...u24(size), ...body];
101
101
  }
102
102
  /**
103
- * ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1 本・コマごとに塊 1 つ)。
103
+ * ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1 本・コマごとに SimpleBlock 1 つ)。
104
104
  * 中身は字幕の PES の中身 (`text(...)` など) をそのまま入れる
105
105
  *
106
106
  * @param frames [時刻 (ミリ秒。65535 まで), 中身] の並び
package/dist/synth.d.ts CHANGED
@@ -2,17 +2,17 @@
2
2
  * TS のセクションを組み立てる。
3
3
  *
4
4
  * 実チューナーが無いので、解析のテストにも偽エージェントにも「それらしい TS」が要る。
5
- * 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、ここだけが仕様の写し。
5
+ * 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、仕様を書き写しているのはここだけ。
6
6
  */
7
7
  import { withCrc } from "./psi.js";
8
8
  export { withCrc };
9
- /** 表のバージョンと、何本に分けたうちのどれか。指定しなければバージョン 0・節 0/0 */
9
+ /** 表のバージョンと、何本に分けたうちのどれか。指定しなければバージョン 0・セクション 0/0 */
10
10
  export interface SectionPart {
11
11
  version?: number;
12
12
  sectionNumber?: number;
13
13
  lastSectionNumber?: number;
14
14
  }
15
- /** PCR の基準部 (90kHz) を適応フィールドに書く (旗は呼ぶ側)。拡張部 (27MHz の端数) は読む側が見ていないので 0 */
15
+ /** PCR の基準部 (90kHz) を適応フィールドに書く (フラグは呼ぶ側が立てる)。拡張部 (27MHz の端数) は読む側が見ていないので 0 */
16
16
  export declare function putPcr(packet: Uint8Array, pcr: number): void;
17
17
  /**
18
18
  * 文字列を ARIB STD-B24 の 8 単位符号にする。
@@ -113,9 +113,9 @@ options?: SectionPart & {
113
113
  export declare function satelliteDeliveryDescriptor(frequency: number, symbolRate?: number): number[];
114
114
  /** 地上の分配の記述子 (0xFA)。周波数は Hz で渡す (1/7 MHz 単位に丸める) */
115
115
  export declare function terrestrialDeliveryDescriptor(areaCode: number, frequencies: number[]): number[];
116
- /** セクションを TS パケットに詰める。頭のパケットには pointer_field が付く */
116
+ /** セクションを TS パケットに詰める。最初のパケットには pointer_field が付く */
117
117
  export declare function packetize(pid: number, section: Uint8Array, counter?: number): Uint8Array;
118
- /** 部品を 1 本のバイト列に繋ぐ。組んだパケットを流し込むときの糊 */
118
+ /** 部品を 1 本のバイト列に繋ぐ。組んだパケットを流し込むときに使う */
119
119
  export declare function stream(...parts: Uint8Array[]): Uint8Array;
120
120
  /** PCR を 1 つ運ぶだけのパケット */
121
121
  export declare function pcrPacket(pid: number, seconds: number, counter?: number): Uint8Array;
@@ -124,7 +124,7 @@ export declare function tdtPacket(unixMs: number): Uint8Array;
124
124
  /** PAT。サービス ID → PMT の PID */
125
125
  export declare function patSection(programs: [number, number][], transportStreamId?: number): Uint8Array;
126
126
  /**
127
- * PMT。ロゴのカルーセルが乗る ES を 1 つだけ持たせる。
127
+ * PMT。ロゴのカルーセルを運ぶ ES を 1 つだけ持たせる。
128
128
  * 目印は stream_identifier_descriptor (0x52) の component_tag
129
129
  */
130
130
  export declare function pmtSection(serviceId: number, esPid: number, componentTag: number): Uint8Array;
@@ -198,11 +198,11 @@ export declare const BML_TS: {
198
198
  };
199
199
  /** BML の ES が 1 本だけ載った PMT (`BML_TS` の割り振り) */
200
200
  export declare function bmlPmt(): Uint8Array;
201
- /** PAT と PMT。データ放送のストリームの頭 */
201
+ /** PAT と PMT。データ放送のストリームの先頭 */
202
202
  export declare function bmlHead(): Uint8Array[];
203
203
  /**
204
204
  * モジュール 1 つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
205
- * 本物と同じく、頭に Content-Type、境界で区切って各ファイルに Content-Location
205
+ * 本物と同じく、先頭に Content-Type、境界で区切って各ファイルに Content-Location
206
206
  */
207
207
  export declare function multipartModule(files: [location: string, type: string, body: string][]): Uint8Array;
208
208
  /** PMT の ES に付ける application_signalling_descriptor (0x6F)。**AIT の在り処の印** */
@@ -213,7 +213,7 @@ export interface SynthHybridcastApp {
213
213
  /** `CONTROL` の値。既定は autostart */
214
214
  controlCode?: number;
215
215
  name?: string;
216
- /** URL の頭。**通信路で運ぶもの** (protocol_id = 3) として入れる */
216
+ /** URL の先頭部分。**通信路で運ぶもの** (protocol_id = 3) として入れる */
217
217
  base?: string;
218
218
  /** その先のパス */
219
219
  path?: string;
@@ -221,6 +221,6 @@ export interface SynthHybridcastApp {
221
221
  /**
222
222
  * AIT (table_id 0x74)。**Hybridcast のアプリのアドレス (URL) が載っている表。**
223
223
  *
224
- * 中身そのものは電波に乗っていないので、ここに入るのは URL と名前だけ
224
+ * アプリそのものは放送では送られていないので、ここに入るのは URL と名前だけ
225
225
  */
226
226
  export declare function aitSection(applications: SynthHybridcastApp[], applicationType?: number): Uint8Array;
package/dist/synth.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * TS のセクションを組み立てる。
3
3
  *
4
4
  * 実チューナーが無いので、解析のテストにも偽エージェントにも「それらしい TS」が要る。
5
- * 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、ここだけが仕様の写し。
5
+ * 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、仕様を書き写しているのはここだけ。
6
6
  */
7
7
  import { joinBytes } from "./bytes.js";
8
8
  import { PACKET, SYNC, withCrc } from "./psi.js";
@@ -10,7 +10,7 @@ import { PACKET, SYNC, withCrc } from "./psi.js";
10
10
  export { withCrc };
11
11
  const be = (value) => [(value >> 8) & 0xff, value & 0xff];
12
12
  const be32 = (value) => [...be(value >>> 16), ...be(value & 0xffff)];
13
- /** セクションの頭 8 バイト (長さは `withCrc` が埋める) */
13
+ /** セクションの先頭 8 バイト (長さは `withCrc` が埋める) */
14
14
  function head(tableId, extension, part = {}) {
15
15
  return [
16
16
  tableId,
@@ -22,7 +22,7 @@ function head(tableId, extension, part = {}) {
22
22
  part.lastSectionNumber ?? 0,
23
23
  ];
24
24
  }
25
- /** PCR の基準部 (90kHz) を適応フィールドに書く (旗は呼ぶ側)。拡張部 (27MHz の端数) は読む側が見ていないので 0 */
25
+ /** PCR の基準部 (90kHz) を適応フィールドに書く (フラグは呼ぶ側が立てる)。拡張部 (27MHz の端数) は読む側が見ていないので 0 */
26
26
  export function putPcr(packet, pcr) {
27
27
  const base = Math.round(pcr) % 2 ** 33;
28
28
  packet[6] = Math.floor(base / 2 ** 25) & 0xff;
@@ -96,7 +96,7 @@ function encodeSiText(text) {
96
96
  }
97
97
  /** 言語の符号 "jpn" (ISO 639-2) */
98
98
  const JPN = [0x6a, 0x70, 0x6e];
99
- /** 長さ 1 バイトを頭に付けた文字列。SI の記述子はどこもこの形式 */
99
+ /** 長さ 1 バイトを先頭に付けた文字列。SI の記述子はどこもこの形式 */
100
100
  const sized = (text) => {
101
101
  const body = encodeSiText(text);
102
102
  return [body.length, ...body];
@@ -305,7 +305,7 @@ export function terrestrialDeliveryDescriptor(areaCode, frequencies) {
305
305
  ];
306
306
  return [0xfa, body.length, ...body];
307
307
  }
308
- /** セクションを TS パケットに詰める。頭のパケットには pointer_field が付く */
308
+ /** セクションを TS パケットに詰める。最初のパケットには pointer_field が付く */
309
309
  export function packetize(pid, section, counter = 0) {
310
310
  const packets = [];
311
311
  let data = [0x00, ...section]; // pointer_field = 0
@@ -320,7 +320,7 @@ export function packetize(pid, section, counter = 0) {
320
320
  }
321
321
  return Uint8Array.from(packets);
322
322
  }
323
- /** 部品を 1 本のバイト列に繋ぐ。組んだパケットを流し込むときの糊 */
323
+ /** 部品を 1 本のバイト列に繋ぐ。組んだパケットを流し込むときに使う */
324
324
  export function stream(...parts) {
325
325
  return joinBytes(parts);
326
326
  }
@@ -350,7 +350,7 @@ export function patSection(programs, transportStreamId = 1) {
350
350
  return withCrc(body);
351
351
  }
352
352
  /**
353
- * PMT。ロゴのカルーセルが乗る ES を 1 つだけ持たせる。
353
+ * PMT。ロゴのカルーセルを運ぶ ES を 1 つだけ持たせる。
354
354
  * 目印は stream_identifier_descriptor (0x52) の component_tag
355
355
  */
356
356
  export function pmtSection(serviceId, esPid, componentTag) {
@@ -538,7 +538,7 @@ export function bmlPmt() {
538
538
  ],
539
539
  ]);
540
540
  }
541
- /** PAT と PMT。データ放送のストリームの頭 */
541
+ /** PAT と PMT。データ放送のストリームの先頭 */
542
542
  export function bmlHead() {
543
543
  return [
544
544
  packetize(0x0000, patSection([[BML_TS.service, BML_TS.pmtPid]])),
@@ -547,7 +547,7 @@ export function bmlHead() {
547
547
  }
548
548
  /**
549
549
  * モジュール 1 つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
550
- * 本物と同じく、頭に Content-Type、境界で区切って各ファイルに Content-Location
550
+ * 本物と同じく、先頭に Content-Type、境界で区切って各ファイルに Content-Location
551
551
  */
552
552
  export function multipartModule(files) {
553
553
  const boundary = "denpa";
@@ -565,7 +565,7 @@ export function aitSignallingDescriptor(applicationType = 0x0010, version = 1) {
565
565
  /**
566
566
  * AIT (table_id 0x74)。**Hybridcast のアプリのアドレス (URL) が載っている表。**
567
567
  *
568
- * 中身そのものは電波に乗っていないので、ここに入るのは URL と名前だけ
568
+ * アプリそのものは放送では送られていないので、ここに入るのは URL と名前だけ
569
569
  */
570
570
  export function aitSection(applications, applicationType = 0x0010) {
571
571
  const loop = [];
@@ -578,7 +578,7 @@ export function aitSection(applications, applicationType = 0x0010) {
578
578
  }
579
579
  if (app.base !== undefined) {
580
580
  const base = [...new TextEncoder().encode(app.base)];
581
- // transport_protocol_descriptor: protocol_id=3 (通信路)、label、URL の頭
581
+ // transport_protocol_descriptor: protocol_id=3 (通信路)、label、URL の先頭部分
582
582
  info.push(0x02, 5 + base.length, ...be(0x0003), 0x01, base.length, ...base, 0x00);
583
583
  }
584
584
  if (app.path !== undefined) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danything/arib",
3
- "version": "1.3.0",
3
+ "version": "2.0.0",
4
4
  "description": "日本のデジタル放送 (ARIB) の TS を読む: PSI・PES・EIT・ARIB の文字・字幕・データ放送",
5
5
  "license": "MIT",
6
6
  "repository": {