@danything/arib 1.2.0 → 1.2.2

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.
@@ -1,16 +1,16 @@
1
1
  /**
2
- * 物理チャンネル丸ごとの TS から、1つの局のぶんだけを抜き出す。
2
+ * 物理チャンネル丸ごとの TS から、1 つの局のぶんだけを抜き出す。
3
3
  *
4
4
  * エージェントは**中身を読まずに素の TS を流す**ので
5
5
  * ([agent.md](https://github.com/danything/denpa/blob/main/docs/agent.md))、選り分けるのは denpa の仕事。
6
6
  *
7
- * **これをやらないと1つの録画に複数の番組が入る。** 実機の TOKYO MX は
8
- * 1本の TS に MX1 と MX2 を載せていて、丸ごと保存すると ffprobe が2つの
7
+ * **これをやらないと 1 つの録画に複数の番組が入る。** 実機の TOKYO MX は
8
+ * 1 本の TS に MX1 と MX2 を載せていて、丸ごと保存すると ffprobe が 2 つの
9
9
  * プログラムを返す (これで CM 検出の fps を読み違えたことがある)。
10
10
  *
11
- * 残すもの:
11
+ * 残すものは次のとおり。
12
12
  *
13
- * - **PAT** … その局1つだけに**書き直して**出す。丸ごと通すと ffmpeg には
13
+ * - **PAT** … その局 1 つだけに**書き直して**出す。丸ごと通すと ffmpeg には
14
14
  * 相変わらず複数のプログラムが見える
15
15
  * - **PMT と、そこに載っている ES** … 映像・音声・字幕。ECM も (掛かったまま
16
16
  * 録れたものを後から復号するのに要る)
@@ -25,7 +25,7 @@ const PID_NULL = 0x1fff;
25
25
  /**
26
26
  * 局に関係なく残す PID。**どれも数十バイト/秒**で、落として得るものが無い。
27
27
  *
28
- * CDT (ロゴ) はここに入れない。録画に要らないうえ、衛星では数百KBのカルーセルが
28
+ * CDT (ロゴ) はここに入れない。録画に要らないうえ、衛星では数百 KB のカルーセルが
29
29
  * 流れてくる。ロゴを取得するのは録画の外でやる (denpa の logo.ts)
30
30
  */
31
31
  const KEEP = new Set([
@@ -43,7 +43,7 @@ const DESC_CA = 0x09;
43
43
  * BS の中継丸ごと (52Mbit/s) でも 7,000 個ほど。来ない (局を読み違えた) ときに抱え込み続けないよう、超えたら古いほうから捨てる
44
44
  */
45
45
  const HOLD_MOST = 8192;
46
- /** 1つの局に絞った PAT を組み立てる */
46
+ /** 1 つの局に絞った PAT を組み立てる */
47
47
  function buildPat(transportStreamId, version, serviceId, pmtPid) {
48
48
  const body = [
49
49
  TABLE_PAT,
@@ -66,7 +66,7 @@ function buildPat(transportStreamId, version, serviceId, pmtPid) {
66
66
  ];
67
67
  return withCrc(body);
68
68
  }
69
- /** セクション1本を TS パケット1つに詰める。PAT は小さいので必ず収まる */
69
+ /** セクション 1 本を TS パケット 1 つに詰める。PAT は小さいので必ず収まる */
70
70
  function packet(pid, section, counter) {
71
71
  const out = new Uint8Array(PACKET).fill(0xff);
72
72
  out[0] = SYNC;
@@ -83,7 +83,7 @@ function packet(pid, section, counter) {
83
83
  */
84
84
  const MEDIA_STREAMS = new Set([0x02, 0x1b, 0x24, 0x03, 0x04, 0x0f, 0x11, 0x06]);
85
85
  /**
86
- * 局1つぶんに絞る。
86
+ * 局 1 つぶんに絞る。
87
87
  *
88
88
  * PAT と PMT を読むまでは**何も出さない**。どの PID がその局のものか決まらないためで、
89
89
  * どちらも 100ms ごとに流れてくるので待つのは一瞬。**待つ間に届いたものは取っておき**、PMT を読んだら
@@ -109,17 +109,17 @@ export class ServiceFilter {
109
109
  constructor(serviceId) {
110
110
  this.serviceId = serviceId;
111
111
  }
112
- /** その局の PMT を読めたか。読めるまで映像は1バイトも出ない (届いたものは取っておく) */
112
+ /** その局の PMT を読めたか。読めるまで映像は 1 バイトも出ない (届いたものは取っておく) */
113
113
  get ready() {
114
114
  return this.own.size > 0;
115
115
  }
116
116
  /**
117
117
  * **いま流れているものがコピー禁止か** (最後に読んだ PMT のデジタルコピー制御記述子)。
118
- * 番組全体 (1つめのループ) と ES ごと (2つめのループ) のどちらかが禁止なら禁止。
118
+ * 番組全体 (1 つめのループ) と ES ごと (2 つめのループ) のどちらかが禁止なら禁止。
119
119
  * PMT を読むまでは false。
120
120
  *
121
121
  * 録画はこれを見て、禁止のあいだは保存しない (denpa の `recorder.ts`)。番組表が古い・無いときの備え。
122
- * 絞り方には効かせない — ライブは保存しないので、禁止の番組もそのまま観られる
122
+ * 絞り方には効かせない。ライブは保存しないので、禁止の番組もそのまま観られる
123
123
  */
124
124
  get copyNever() {
125
125
  return this.copyNeverNow;
@@ -129,7 +129,7 @@ export class ServiceFilter {
129
129
  *
130
130
  * これが変わったら ffmpeg を作り直す (`StreamsWatch`)。ffmpeg は起きたときの並びのまま
131
131
  * 音声・字幕を選んでいるので、番組が替わって音声の本数や字幕の PID が変わると追従しない。
132
- * データ放送などのセクション (0x0D など) は入れない — 番組ごとに増減しても ffmpeg には関係ない
132
+ * データ放送などのセクション (0x0D など) は入れない。番組ごとに増減しても ffmpeg には関係ない
133
133
  */
134
134
  get streams() {
135
135
  return this.streamsNow;
@@ -138,7 +138,7 @@ export class ServiceFilter {
138
138
  * **中継の番号 (transport_stream_id)。** PAT を読むまでは null。
139
139
  *
140
140
  * 絞るのに要るわけではありません。**データ放送が受信機に訊いてくる**ので
141
- * 覚えておきます — テレ朝の TVerリンクは `browser.getProgramID(4)` で
141
+ * 覚えておきます。テレ朝の TVer リンクは `browser.getProgramID(4)` で
142
142
  * これを取り、TVer のサーバへそのまま送る。`null` のまま渡すと文字の
143
143
  * "null" が飛んで、あちらが断り、画面には `DT-RE` とだけ出ます
144
144
  * ([server/live.ts](https://github.com/danything/denpa/blob/main/src/lib/server/live.ts) の `programInfo`)
@@ -147,7 +147,7 @@ export class ServiceFilter {
147
147
  return this.tsid;
148
148
  }
149
149
  /**
150
- * 任意の長さのバイト列を食わせて、残すぶんを返す。
150
+ * 任意の長さのバイト列を渡すと、残すぶんを返す。
151
151
  *
152
152
  * 落とした PID の連続性カウンタは飛ぶが、**残す PID は元のまま**なので
153
153
  * 読む側から見て抜けは無い。自分で作るのは PAT だけで、そこは自前で数える。
@@ -185,7 +185,7 @@ export class ServiceFilter {
185
185
  /** PMT を読む前のパケットを取っておく。**写す** (パケットは届いた塊の上の窓。`PacketStream`) */
186
186
  hold(ts) {
187
187
  this.held.push(ts.slice());
188
- // 溢れたら古い半分を捨てる (1つずつ捨てると、来ないあいだずっと詰め直すことになる)
188
+ // 溢れたら古い半分を捨てる (1 つずつ捨てると、来ないあいだずっと詰め直すことになる)
189
189
  if (this.held.length > HOLD_MOST)
190
190
  this.held = this.held.slice(this.held.length - HOLD_MOST / 2);
191
191
  }
@@ -246,10 +246,10 @@ export class ServiceFilter {
246
246
  }
247
247
  /**
248
248
  * **映像・音声・字幕の並びが変わったか** (`ServiceFilter.streams`) を見る。最初に読んだ並びを覚え、変わったら
249
- * 1回だけ true を返して新しい並びを覚え直す。
249
+ * 1 回だけ true を返して新しい並びを覚え直す。
250
250
  *
251
251
  * 並びを決め打ちで起こした ffmpeg (`-map`) は、番組が替わって音声の本数や字幕の PID が変わっても追従しない。
252
- * 変わったら起こし直す — ライブと追っかけのエンコード (denpa の `server/live.ts` の `Session.pump`)、MPEG-2 をそのまま
252
+ * 変わったら起こし直す。使うのはライブと追っかけのエンコード (denpa の `server/live.ts` の `Session.pump`)、MPEG-2 をそのまま
253
253
  * 流す経路の字幕 (`Session.runRaw`・`recordingCaptions`)
254
254
  */
255
255
  export class StreamsWatch {
@@ -9,17 +9,17 @@
9
9
  * - 映像 … 256x144 の**I フレームだけ**。マクロブロックごとに色 (DC) だけを置き、
10
10
  * AC は持たない (EOB だけ)。コマごとに縞が流れるので、**映像が進んでいるか**を
11
11
  * 画素で見分けられる。インタレの印も立て、輝度は上下のフィールドで別の時刻の映像にする (フィールド DCT)
12
- * - 音声 … 48kHz ステレオの AAC-LC の**無音**を ADTS で。1コマ 7 バイト
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
- /** 29.97 コマ/秒の1コマ (90kHz)。放送と同じ */
17
+ /** 29.97 コマ/秒の 1 コマ (90kHz)。放送と同じ */
18
18
  export declare const FRAME_TICKS = 3003;
19
- /** AAC の1コマ (1024 標本 @48kHz を 90kHz で) */
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,10 +27,10 @@ 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
- * 中身は CPE が1つ: 両耳とも `max_sfb = 0` (係数を1つも持たない) で、あとは END。
33
- * 55 ビットなので7バイトに収まる (14496-3 の raw_data_block)
32
+ * 中身は CPE が 1 つ: 両耳とも `max_sfb = 0` (係数を 1 つも持たない) で、あとは END。
33
+ * 55 ビットなので 7 バイトに収まる (14496-3 の raw_data_block)
34
34
  */
35
35
  export declare function silentAac(): Uint8Array;
36
36
  /**
package/dist/synth-av.js CHANGED
@@ -9,7 +9,7 @@
9
9
  * - 映像 … 256x144 の**I フレームだけ**。マクロブロックごとに色 (DC) だけを置き、
10
10
  * AC は持たない (EOB だけ)。コマごとに縞が流れるので、**映像が進んでいるか**を
11
11
  * 画素で見分けられる。インタレの印も立て、輝度は上下のフィールドで別の時刻の映像にする (フィールド DCT)
12
- * - 音声 … 48kHz ステレオの AAC-LC の**無音**を ADTS で。1コマ 7 バイト
12
+ * - 音声 … 48kHz ステレオの AAC-LC の**無音**を ADTS で。1 コマ 7 バイト
13
13
  *
14
14
  * 規格は ISO/IEC 13818-2 (映像) と 13818-7 / 14496-3 (AAC)。表の出どころは
15
15
  * 各関数の頭に書いてある。
@@ -17,9 +17,9 @@
17
17
  import { concatBytes } from "./bytes.js";
18
18
  import { PACKET, SYNC } from "./psi.js";
19
19
  import { putPcr } from "./synth.js";
20
- /** 29.97 コマ/秒の1コマ (90kHz)。放送と同じ */
20
+ /** 29.97 コマ/秒の 1 コマ (90kHz)。放送と同じ */
21
21
  export const FRAME_TICKS = 3003;
22
- /** AAC の1コマ (1024 標本 @48kHz を 90kHz で) */
22
+ /** AAC の 1 コマ (1024 標本 @48kHz を 90kHz で) */
23
23
  export const AUDIO_TICKS = 1920;
24
24
  /** 映像の大きさ。**16 の倍数** (マクロブロックで割り切る) */
25
25
  const WIDTH = 256;
@@ -75,7 +75,7 @@ const DC_CHROMA = [
75
75
  [0b1111110, 7],
76
76
  [0b11111110, 8],
77
77
  ];
78
- /** 1ブロック。**DC の差分だけ書いて、すぐ EOB** (表 B-14 の '10') */
78
+ /** 1 ブロック。**DC の差分だけ書いて、すぐ EOB** (表 B-14 の '10') */
79
79
  function block(bits, diff, table) {
80
80
  const size = diff === 0 ? 0 : Math.floor(Math.log2(Math.abs(diff))) + 1;
81
81
  const [code, length] = table[size];
@@ -86,9 +86,9 @@ function block(bits, diff, table) {
86
86
  bits.put(0b10, 2);
87
87
  }
88
88
  /**
89
- * n コマ目の色 (Y, Cb, Cr)。**列と時刻で縞を流す** — 進んでいれば画素が変わる。
89
+ * n コマ目の色 (Y, Cb, Cr)。**列と時刻で縞を流す。** 進んでいれば画素が変わる。
90
90
  * 輝度は**フィールドごとの時刻で**流す (下のフィールドは上の 1/59.94 秒後の位置)。フィールドごとに
91
- * 出せているか (bob) と、出す間合いを画素で見分けられる。1フィールドで 16 進み、30 コマ (60 フィールド)
91
+ * 出せているか (bob) と、出す間合いを画素で見分けられる。1 フィールドで 16 進み、30 コマ (60 フィールド)
92
92
  * でちょうど一周するので、偽の放送が 30 コマを繰り返しても段差が出ない
93
93
  */
94
94
  function colorAt(col, row, n, field) {
@@ -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 に使う
@@ -141,7 +141,7 @@ export function mpeg2Frame(n, color = colorAt) {
141
141
  bits.put(0, 1); // broken_link
142
142
  // picture_header (6.2.3)
143
143
  bits.startCode(0x00);
144
- bits.put(0, 10); // temporal_reference (GOP ごとに1枚なので 0)
144
+ bits.put(0, 10); // temporal_reference (GOP ごとに 1 枚なので 0)
145
145
  bits.put(1, 3); // picture_coding_type = I
146
146
  bits.put(0xffff, 16); // vbv_delay
147
147
  bits.put(0, 1); // extra_bit_picture
@@ -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
@@ -170,7 +170,7 @@ export function mpeg2Frame(n, color = colorAt) {
170
170
  for (let col = 0; col < mbWidth; col++) {
171
171
  bits.put(1, 1); // macroblock_address_increment = 1
172
172
  bits.put(1, 1); // macroblock_type = intra
173
- bits.put(1, 1); // dct_type = 1 (フィールド DCT: 輝度の上2ブロックが上のフィールド、下2つが下)
173
+ bits.put(1, 1); // dct_type = 1 (フィールド DCT: 輝度の上 2 ブロックが上のフィールド、下 2 つが下)
174
174
  const [top, cb, cr] = color(col, row, n, 0);
175
175
  const [bottom] = color(col, row, n, 1);
176
176
  for (let i = 0; i < 4; i++) {
@@ -187,10 +187,10 @@ 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
- * 中身は CPE が1つ: 両耳とも `max_sfb = 0` (係数を1つも持たない) で、あとは END。
193
- * 55 ビットなので7バイトに収まる (14496-3 の raw_data_block)
192
+ * 中身は CPE が 1 つ: 両耳とも `max_sfb = 0` (係数を 1 つも持たない) で、あとは END。
193
+ * 55 ビットなので 7 バイトに収まる (14496-3 の raw_data_block)
194
194
  */
195
195
  export function silentAac() {
196
196
  const body = new Bits();
@@ -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;
@@ -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;
@@ -6,11 +6,11 @@
6
6
  */
7
7
  import { encodeAribText } from "./synth.js";
8
8
  export { encodeAribText };
9
- /** データユニット。0x20 本文・0x30 1バイト DRCS・0x31 2バイト DRCS */
9
+ /** データユニット。0x20 本文・0x30 1 バイト DRCS・0x31 2 バイト DRCS */
10
10
  export declare function unit(parameter: number, data: number[]): number[];
11
11
  /**
12
- * 字幕管理データ。言語は `languages` (ISO 639 の3文字。既定は日本語1つ)・書式は `format` (SWF+1。既定 8 = 960x540 横書き)。
13
- * 言語の順に第1言語・第2言語…になる (言語タグ 0, 1, …)
12
+ * 字幕管理データ。言語は `languages` (ISO 639 の 3 文字。既定は日本語 1 つ)・書式は `format` (SWF+1。既定 8 = 960x540 横書き)。
13
+ * 言語の順に第 1 言語・第 2 言語…になる (言語タグ 0, 1, …)
14
14
  */
15
15
  export declare function management(options?: {
16
16
  format?: number;
@@ -21,16 +21,16 @@ export declare function management(options?: {
21
21
  }): Uint8Array;
22
22
  /** 字幕文。`units` はデータユニットを並べたもの。本文だけなら `text(...)` を使う。`language` は第何言語か (1〜8) */
23
23
  export declare function statement(units: number[], language?: number): Uint8Array;
24
- /** 本文1つだけの字幕文 (`language` は第何言語か) */
24
+ /** 本文 1 つだけの字幕文 (`language` は第何言語か) */
25
25
  export declare function text(body: number[], language?: number): Uint8Array;
26
26
  /**
27
- * 1バイト DRCS (DRCS-1 の面) の定義。`rows` は '#' を点にした図 (白黒)
27
+ * 1 バイト DRCS (DRCS-1 の面) の定義。`rows` は '#' を点にした図 (白黒)
28
28
  *
29
29
  * @param code 符号 (0x21〜0x7E)。呼び出すときは `ESC ( 0x20 0x41` で G0 に載せて、この符号を書く
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 本・コマごとに塊 1 つ)。
34
34
  * 中身は字幕の PES の中身 (`text(...)` など) をそのまま入れる
35
35
  *
36
36
  * @param frames [時刻 (ミリ秒。65535 まで), 中身] の並び
@@ -17,7 +17,7 @@ function crc16(data) {
17
17
  return crc;
18
18
  }
19
19
  const u24 = (n) => [(n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff];
20
- /** データユニット。0x20 本文・0x30 1バイト DRCS・0x31 2バイト DRCS */
20
+ /** データユニット。0x20 本文・0x30 1 バイト DRCS・0x31 2 バイト DRCS */
21
21
  export function unit(parameter, data) {
22
22
  return [0x1f, parameter, ...u24(data.length), ...data];
23
23
  }
@@ -37,8 +37,8 @@ function dataGroup(id, group, body) {
37
37
  return Uint8Array.from([0x80, 0xff, 0xf0, ...head, crc >> 8, crc & 0xff]);
38
38
  }
39
39
  /**
40
- * 字幕管理データ。言語は `languages` (ISO 639 の3文字。既定は日本語1つ)・書式は `format` (SWF+1。既定 8 = 960x540 横書き)。
41
- * 言語の順に第1言語・第2言語…になる (言語タグ 0, 1, …)
40
+ * 字幕管理データ。言語は `languages` (ISO 639 の 3 文字。既定は日本語 1 つ)・書式は `format` (SWF+1。既定 8 = 960x540 横書き)。
41
+ * 言語の順に第 1 言語・第 2 言語…になる (言語タグ 0, 1, …)
42
42
  */
43
43
  export function management(options = {}) {
44
44
  const { format = 8, formats = [], group = 0, units = [], languages = ["jpn"], } = options;
@@ -48,7 +48,7 @@ export function management(options = {}) {
48
48
  ...languages.flatMap((code, tag) => [
49
49
  (tag << 5) | 0x10, // 言語タグ / DMF 0000 (予約ビット 1)
50
50
  ...[...code].map((c) => c.charCodeAt(0)),
51
- ((formats[tag] ?? format) << 4) | 0x00, // 書式 (言語ごと。`formats` で替えられる) / TCS 0 (8単位符号) / ロールアップ無し
51
+ ((formats[tag] ?? format) << 4) | 0x00, // 書式 (言語ごと。`formats` で替えられる) / TCS 0 (8 単位符号) / ロールアップ無し
52
52
  ]),
53
53
  ...u24(units.length),
54
54
  ...units,
@@ -59,12 +59,12 @@ export function management(options = {}) {
59
59
  export function statement(units, language = 1) {
60
60
  return dataGroup(language, 0, [0x3f, ...u24(units.length), ...units]);
61
61
  }
62
- /** 本文1つだけの字幕文 (`language` は第何言語か) */
62
+ /** 本文 1 つだけの字幕文 (`language` は第何言語か) */
63
63
  export function text(body, language = 1) {
64
64
  return statement(unit(0x20, body), language);
65
65
  }
66
66
  /**
67
- * 1バイト DRCS (DRCS-1 の面) の定義。`rows` は '#' を点にした図 (白黒)
67
+ * 1 バイト DRCS (DRCS-1 の面) の定義。`rows` は '#' を点にした図 (白黒)
68
68
  *
69
69
  * @param code 符号 (0x21〜0x7E)。呼び出すときは `ESC ( 0x20 0x41` で G0 に載せて、この符号を書く
70
70
  */
@@ -87,20 +87,20 @@ export function drcsUnit(code, rows) {
87
87
  0x41, // DRCS-1 の面 (上位) と
88
88
  code, // 符号
89
89
  1, // 字体の数
90
- 0x00, // 字体番号 0 / 方式 0000 (2階調)
90
+ 0x00, // 字体番号 0 / 方式 0000 (2 階調)
91
91
  0, // 階調 - 2
92
92
  width,
93
93
  height,
94
94
  ...bytes,
95
95
  ]);
96
96
  }
97
- /** EBML の要素1つ。大きさは8バイトで書く (読む側はどの長さでも読める) */
97
+ /** EBML の要素 1 つ。大きさは 8 バイトで書く (読む側はどの長さでも読める) */
98
98
  function element(id, body) {
99
99
  const size = body.length;
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 本・コマごとに塊 1 つ)。
104
104
  * 中身は字幕の PES の中身 (`text(...)` など) をそのまま入れる
105
105
  *
106
106
  * @param frames [時刻 (ミリ秒。65535 まで), 中身] の並び
package/dist/synth.d.ts CHANGED
@@ -15,7 +15,7 @@ export interface SectionPart {
15
15
  /** PCR の基準部 (90kHz) を適応フィールドに書く (旗は呼ぶ側)。拡張部 (27MHz の端数) は読む側が見ていないので 0 */
16
16
  export declare function putPcr(packet: Uint8Array, pcr: number): void;
17
17
  /**
18
- * 文字列を ARIB STD-B24 の8単位符号にする。
18
+ * 文字列を ARIB STD-B24 の 8 単位符号にする。
19
19
  *
20
20
  * 初期状態 (G0=漢字) から始めて、ASCII のところだけ英数集合へ切り替える。
21
21
  * 本物の放送はもっと凝った切り替え方をするが、**読む側が同じ経路を通れば足りる**。
@@ -51,8 +51,8 @@ export interface SynthEvent {
51
51
  /** 4 = 放送中。EIT[p/f] で「いま」を表すのに使う */
52
52
  runningStatus?: number;
53
53
  /**
54
- * デジタルコピー制御記述子の digital_recording_control_data (2ビット)。
55
- * 3 がコピー禁止、2 が1世代のみ。省くと記述子を載せない ({@link copyControlDescriptor})
54
+ * デジタルコピー制御記述子の digital_recording_control_data (2 ビット)。
55
+ * 3 がコピー禁止、2 が 1 世代のみ。省くと記述子を載せない ({@link copyControlDescriptor})
56
56
  */
57
57
  copyControl?: number;
58
58
  /** シリーズ。省くと記述子を載せない ({@link seriesDescriptor}) */
@@ -69,10 +69,10 @@ export interface SynthSeries {
69
69
  }
70
70
  /**
71
71
  * デジタルコピー制御記述子 (0xC1)。EIT の番組と PMT に載る。
72
- * 中身は1バイトだけ: 記録制御 (2) 最大ビットレートの有無 (1) 部品ごとの制御の有無 (1) 出力の制御 (4)
72
+ * 中身は 1 バイトだけ: 記録制御 (2) 最大ビットレートの有無 (1) 部品ごとの制御の有無 (1) 出力の制御 (4)
73
73
  */
74
74
  export declare function copyControlDescriptor(control: number): number[];
75
- /** 音声1本ぶん。**放送が付けた名前まで持てる** (解説放送の見分けに要る) */
75
+ /** 音声 1 本ぶん。**放送が付けた名前まで持てる** (解説放送の見分けに要る) */
76
76
  interface SynthAudio {
77
77
  /** audio_component_descriptor の component_type (3 = ステレオ) */
78
78
  type: number;
@@ -115,16 +115,16 @@ export declare function satelliteDeliveryDescriptor(frequency: number, symbolRat
115
115
  export declare function terrestrialDeliveryDescriptor(areaCode: number, frequencies: number[]): number[];
116
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
- /** PCR を1つ運ぶだけのパケット */
120
+ /** PCR を 1 つ運ぶだけのパケット */
121
121
  export declare function pcrPacket(pid: number, seconds: number, counter?: number): Uint8Array;
122
- /** 放送の実時刻 (TDT) を1パケットに。BML の `getCurrentDateTime` が見る */
122
+ /** 放送の実時刻 (TDT) を 1 パケットに。データ放送の時刻 (`BmlDecoder` の `currentTime`) はこれから作る */
123
123
  export declare function tdtPacket(unixMs: number): Uint8Array;
124
- /** PAT。サービスID → PMT の PID */
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;
@@ -135,7 +135,7 @@ export declare function pmtSection(serviceId: number, esPid: number, componentTa
135
135
  * [service-filter.ts](service-filter.ts) を試すのに要る
136
136
  */
137
137
  export declare function programMap(serviceId: number, pcrPid: number,
138
- /** `[種別, PID]`。**3つ目は記述子**の並び (字幕の部品タグなど) */
138
+ /** `[種別, PID]`。**3 つ目は記述子**の並び (字幕の部品タグなど) */
139
139
  streams: ([number, number] | [number, number, number[]])[], ecmPid?: number,
140
140
  /** 番組ぜんたいに掛かる記述子 (program_info) に足すもの。コピー制御 ({@link copyControlDescriptor}) など */
141
141
  extra?: number[]): Uint8Array;
@@ -153,7 +153,7 @@ export declare function bxmlDescriptor(options?: {
153
153
  * 字幕の ES (stream_type 0x06) に付ける記述子。**字幕の目印。**
154
154
  *
155
155
  * 部品タグ (stream_identifier_descriptor。ふつうの字幕は 0x30〜0x37) と、データ符号化方式記述子の
156
- * data_component_id 0x0008 (字幕)。続く1バイトの DMF・時刻制御モードは denpa も ffmpeg も見ない
156
+ * data_component_id 0x0008 (字幕)。続く 1 バイトの DMF・時刻制御モードは denpa も ffmpeg も見ない
157
157
  */
158
158
  export declare function captionDescriptors(componentTag?: number): number[];
159
159
  export interface DiiModuleSpec {
@@ -174,13 +174,13 @@ export interface DiiModuleSpec {
174
174
  * DII。「このモジュールは何バイトで、名前は何か」を伝える。
175
175
  *
176
176
  * **複数のモジュールを載せられる。** 本物の BS はここに `LOGO-05` と
177
- * `CS_LOGO-05` を並べて流していて (実機の `BS15:16625` で確認)、1つしか
177
+ * `CS_LOGO-05` を並べて流していて (実機の `BS15:16625` で確認)、1 つしか
178
178
  * 載せられない作りでは CS を取りこぼす経路を試せない。
179
179
  */
180
180
  export declare function diiSection(downloadId: number, blockSize: number, modules: DiiModuleSpec | DiiModuleSpec[],
181
181
  /** カルーセルのバージョン。**同じ番号で送り直しても組み立て直されない** */
182
182
  transactionId?: number): Uint8Array;
183
- /** DDB。モジュールを割ったブロックを1つ運ぶ */
183
+ /** DDB。モジュールを割ったブロックを 1 つ運ぶ */
184
184
  export declare function ddbSection(downloadId: number, moduleId: number, moduleVersion: number, blockNumber: number, block: Uint8Array): Uint8Array;
185
185
  /** ロゴデータモジュール (ARIB STD-B21)。カルーセルで運ばれる中身 */
186
186
  export declare function logoModule(logoType: number, logos: {
@@ -196,12 +196,12 @@ export declare const BML_TS: {
196
196
  readonly downloadId: 4026531841;
197
197
  readonly componentTag: 64;
198
198
  };
199
- /** BML の ES が1本だけ載った PMT (`BML_TS` の割り振り) */
199
+ /** BML の ES が 1 本だけ載った PMT (`BML_TS` の割り振り) */
200
200
  export declare function bmlPmt(): Uint8Array;
201
201
  /** PAT と PMT。データ放送のストリームの頭 */
202
202
  export declare function bmlHead(): Uint8Array[];
203
203
  /**
204
- * モジュール1つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
204
+ * モジュール 1 つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
205
205
  * 本物と同じく、頭に Content-Type、境界で区切って各ファイルに Content-Location
206
206
  */
207
207
  export declare function multipartModule(files: [location: string, type: string, body: string][]): Uint8Array;