@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.
- package/README.md +13 -13
- package/dist/ait.d.ts +10 -10
- package/dist/ait.js +12 -12
- package/dist/aribtext-gaiji.d.ts +5 -5
- package/dist/aribtext-gaiji.js +7 -7
- package/dist/aribtext.d.ts +11 -11
- package/dist/aribtext.js +34 -34
- package/dist/b24-tables.d.ts +9 -9
- package/dist/b24-tables.js +59 -59
- package/dist/b24caption.d.ts +12 -12
- package/dist/b24caption.js +23 -23
- package/dist/bml-protocol.d.ts +4 -4
- package/dist/bml-protocol.js +2 -2
- package/dist/bml.d.ts +12 -12
- package/dist/bml.js +24 -24
- package/dist/bytes.d.ts +4 -4
- package/dist/bytes.js +4 -4
- package/dist/caption-text.d.ts +19 -19
- package/dist/caption-text.js +1 -1
- package/dist/drcs-smooth.d.ts +6 -6
- package/dist/drcs-smooth.js +5 -5
- package/dist/dsmcc.d.ts +11 -11
- package/dist/dsmcc.js +12 -12
- package/dist/eit.d.ts +38 -38
- package/dist/eit.js +68 -54
- package/dist/language.d.ts +2 -2
- package/dist/language.js +2 -2
- package/dist/multipart.d.ts +4 -4
- package/dist/multipart.js +6 -6
- package/dist/pes.d.ts +13 -13
- package/dist/pes.js +12 -12
- package/dist/psi.d.ts +22 -22
- package/dist/psi.js +25 -25
- package/dist/service-filter.d.ts +14 -14
- package/dist/service-filter.js +18 -18
- package/dist/synth-av.d.ts +7 -7
- package/dist/synth-av.js +15 -15
- package/dist/synth-caption.d.ts +6 -6
- package/dist/synth-caption.js +9 -9
- package/dist/synth.d.ts +16 -16
- package/dist/synth.js +28 -28
- package/package.json +1 -1
package/dist/bml.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* データ放送 (ARIB STD-B24 の BML) をデコードする。**1局に絞った TS
|
|
2
|
+
* データ放送 (ARIB STD-B24 の BML) をデコードする。**1 局に絞った TS を渡すと、
|
|
3
3
|
* 組み立て終わったファイルが出てくる。**
|
|
4
4
|
*
|
|
5
5
|
* TS → PAT → PMT → データ符号化方式記述子 (0xFD) の付いた ES
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* **運び方は衛星のロゴと同じ DSM-CC** で、denpa はそれを既に持っている
|
|
11
11
|
* ([dsmcc.ts](dsmcc.ts) / [logo-dsmcc.ts](https://github.com/danything/denpa/blob/main/src/lib/ts/logo-dsmcc.ts))。
|
|
12
|
-
* [web-bml](https://github.com/otya128/web-bml) の `decode_ts.ts`
|
|
12
|
+
* [web-bml](https://github.com/otya128/web-bml) の `decode_ts.ts` は使わない。要るのは
|
|
13
13
|
* その一部だけで、残り (EIT/SDT/NIT・字幕の PES) は自前で読んでおり
|
|
14
14
|
* ([eit.ts](eit.ts) / [psi.ts](psi.ts) / [b24caption.ts](b24caption.ts))、`@chinachu/aribts` も抱えずに済む。
|
|
15
15
|
*
|
|
@@ -25,10 +25,10 @@ import { parseTimeTable, PID_TIME } from "./eit.js";
|
|
|
25
25
|
import { parseMediaType, readEntity } from "./multipart.js";
|
|
26
26
|
import { descriptors, packetPid, PacketStream, pmtStreams, PmtTracker, SectionAssembler, } from "./psi.js";
|
|
27
27
|
const DESC_STREAM_IDENTIFIER = 0x52;
|
|
28
|
-
/** データ符号化方式記述子 (STD-B10 第2部 6.2.20) */
|
|
28
|
+
/** データ符号化方式記述子 (STD-B10 第 2 部 6.2.20) */
|
|
29
29
|
const DESC_DATA_COMPONENT = 0xfd;
|
|
30
30
|
/**
|
|
31
|
-
* BML が載っている符号化方式 (STD-B10 第2部 付録J 表J-1)。
|
|
31
|
+
* BML が載っている符号化方式 (STD-B10 第 2 部 付録 J 表 J-1)。
|
|
32
32
|
* 0x0C/0x0D が地上波、0x07 が BS、0x0B が CS
|
|
33
33
|
*/
|
|
34
34
|
const BXML_COMPONENT_IDS = new Set([0x07, 0x0b, 0x0c, 0x0d]);
|
|
@@ -37,32 +37,32 @@ const COMPRESSION_ZLIB = 0;
|
|
|
37
37
|
/**
|
|
38
38
|
* データ符号化方式記述子の後半を読む。
|
|
39
39
|
*
|
|
40
|
-
* 地上波は TR-B14 第二分冊 2.1.4 表2-3、BS/CS は TR-B15 第一分冊 5.1.5 表5-4。
|
|
40
|
+
* 地上波は TR-B14 第二分冊 2.1.4 表 2-3、BS/CS は TR-B15 第一分冊 5.1.5 表 5-4。
|
|
41
41
|
*
|
|
42
|
-
* **`data_component_id` は16ビット** (aribts は8ビットで読んでいる)。
|
|
42
|
+
* **`data_component_id` は 16 ビット** (aribts は 8 ビットで読んでいる)。
|
|
43
43
|
*/
|
|
44
44
|
export function parseBxmlInfo(data) {
|
|
45
45
|
let at = 0;
|
|
46
46
|
// 00 のみ運用 (データカルーセル伝送方式およびイベントメッセージ伝送方式)
|
|
47
47
|
const transmissionFormat = (data[at] >> 6) & 0b11;
|
|
48
|
-
// component_tag=0x40 のとき必ず1。startup.xml が最初に起動される
|
|
48
|
+
// component_tag=0x40 のとき必ず 1。startup.xml が最初に起動される
|
|
49
49
|
const entryPointFlag = ((data[at] >> 5) & 1) === 1;
|
|
50
50
|
const info = { transmissionFormat, entryPointFlag };
|
|
51
51
|
if (entryPointFlag) {
|
|
52
52
|
const autoStartFlag = ((data[at] >> 4) & 1) === 1;
|
|
53
53
|
/*
|
|
54
54
|
* 画面の大きさ。運用されるのは 0011 (960x540)、0100 (640x480 16:9)、
|
|
55
|
-
* 0101 (640x480 4:3) の3つ
|
|
55
|
+
* 0101 (640x480 4:3) の 3 つ
|
|
56
56
|
*/
|
|
57
57
|
const documentResolution = data[at] & 0x0f;
|
|
58
58
|
at++;
|
|
59
59
|
const useXML = ((data[at] >> 7) & 1) === 1;
|
|
60
60
|
const defaultVersionFlag = ((data[at] >> 6) & 1) === 1;
|
|
61
|
-
// BS/CS では 0 のとき単独視聴不可。地上波は常に1
|
|
61
|
+
// BS/CS では 0 のとき単独視聴不可。地上波は常に 1
|
|
62
62
|
const independentFlag = ((data[at] >> 5) & 1) === 1;
|
|
63
63
|
const styleForTVFlag = ((data[at] >> 4) & 1) === 1;
|
|
64
64
|
at++;
|
|
65
|
-
// 既定は BS の 1.0。地上波は3、CS は2が入ってくる
|
|
65
|
+
// 既定は BS の 1.0。地上波は 3、CS は 2 が入ってくる
|
|
66
66
|
info.entryPointInfo = {
|
|
67
67
|
autoStartFlag,
|
|
68
68
|
documentResolution,
|
|
@@ -107,7 +107,7 @@ export function parseBxmlInfo(data) {
|
|
|
107
107
|
return info;
|
|
108
108
|
}
|
|
109
109
|
/**
|
|
110
|
-
* PMT から ES を並べる。**部品タグ (component_tag) を持たない ES
|
|
110
|
+
* PMT から ES を並べる。**部品タグ (component_tag) を持たない ES は数に入れない。**
|
|
111
111
|
* データ放送は「何番の部品か」でしか物を指せないので、番号の無いものは指しようがない。
|
|
112
112
|
*/
|
|
113
113
|
function parsePmt(section) {
|
|
@@ -137,7 +137,7 @@ function parsePmt(section) {
|
|
|
137
137
|
}
|
|
138
138
|
return components;
|
|
139
139
|
}
|
|
140
|
-
/** `at` の下位1ビットと続く4バイトで 33 ビット (STC・NPT) */
|
|
140
|
+
/** `at` の下位 1 ビットと続く 4 バイトで 33 ビット (STC・NPT) */
|
|
141
141
|
const u33 = (data, at) => (data[at] & 1) * 0x100000000 + u32(data, at + 1);
|
|
142
142
|
/** ストリーム記述子 (table_id 0x3D)。NPT と イベントメッセージが載っている */
|
|
143
143
|
function parseEsEvents(section) {
|
|
@@ -188,8 +188,8 @@ function parseEsEvents(section) {
|
|
|
188
188
|
*/
|
|
189
189
|
const GIVE_UP_ROUNDS = 4;
|
|
190
190
|
/**
|
|
191
|
-
* 1つの `BmlDecoder` で同時に組み立てるモジュールの大きさの合計の上限 (64MiB)。
|
|
192
|
-
* 1つずつは `MAX_MODULE_SIZE` に収まっても、たくさん並べた DII や ES でメモリを使い切らせられる。
|
|
191
|
+
* 1 つの `BmlDecoder` で同時に組み立てるモジュールの大きさの合計の上限 (64MiB)。
|
|
192
|
+
* 1 つずつは `MAX_MODULE_SIZE` に収まっても、たくさん並べた DII や ES でメモリを使い切らせられる。
|
|
193
193
|
* 実際のカルーセルは全部で数 MB に収まる
|
|
194
194
|
*/
|
|
195
195
|
const MAX_CAROUSEL_SIZE = 64 * 1024 * 1024;
|
|
@@ -198,15 +198,15 @@ function doneMark(component, version) {
|
|
|
198
198
|
return `${version}:${component.dataEventId}`;
|
|
199
199
|
}
|
|
200
200
|
/**
|
|
201
|
-
* 1局に絞った TS
|
|
201
|
+
* 1 局に絞った TS を渡すと、データ放送の通知が出てくる。
|
|
202
202
|
*
|
|
203
|
-
* **1つの選局に1つ。**
|
|
203
|
+
* **1 つの選局に 1 つ。** 局を変えたら作り直す。カルーセルは局ごとに別物で、
|
|
204
204
|
* 組み立て中のものを持ち越すと混ざる。
|
|
205
205
|
*/
|
|
206
206
|
export class BmlDecoder {
|
|
207
207
|
send;
|
|
208
208
|
packets = new PacketStream();
|
|
209
|
-
/** **1
|
|
209
|
+
/** **1 局に絞ったあとを渡す前提。** 入っているサービスは 1 つなので、最初の局の PMT を追う */
|
|
210
210
|
pmt = new PmtTracker();
|
|
211
211
|
// TDT は CRC を持たない。DSM-CC と同じ理由で 'syntax' で受ける
|
|
212
212
|
time = new SectionAssembler(PID_TIME, "syntax");
|
|
@@ -217,24 +217,24 @@ export class BmlDecoder {
|
|
|
217
217
|
constructor(send) {
|
|
218
218
|
this.send = send;
|
|
219
219
|
}
|
|
220
|
-
/** 1局に絞った TS
|
|
220
|
+
/** 1 局に絞った TS を渡す */
|
|
221
221
|
feed(chunk) {
|
|
222
222
|
for (const packet of this.packets.feed(chunk))
|
|
223
223
|
this.feedPacket(packet);
|
|
224
224
|
}
|
|
225
225
|
/**
|
|
226
|
-
* 切り分け済みのパケットを1つ。ライブは同じ TS を時計や Hybridcast とも
|
|
227
|
-
* 分け合うので、切り分けは1回で済ませて配る (denpa の `server/live.ts` の `tap`)。
|
|
226
|
+
* 切り分け済みのパケットを 1 つ。ライブは同じ TS を時計や Hybridcast とも
|
|
227
|
+
* 分け合うので、切り分けは 1 回で済ませて配る (denpa の `server/live.ts` の `tap`)。
|
|
228
228
|
*
|
|
229
229
|
* **PID で行き先を引く。** 組み立て役を全部に回していた頃は、データ放送と
|
|
230
230
|
* 関係ない映像のパケットのたびにカルーセルの数だけ呼んでいた。
|
|
231
231
|
*
|
|
232
232
|
* `packet` は呼び手の塊の上の窓 (`psi.ts` の `PacketStream`)。**返ったあとまで
|
|
233
|
-
*
|
|
233
|
+
* 持つなら写すこと。** 塊の入れ物は使い回される
|
|
234
234
|
*/
|
|
235
235
|
feedPacket(packet) {
|
|
236
236
|
const pid = packetPid(packet);
|
|
237
|
-
// 同じ PID を2役が名乗ることもあるので、else でつながない
|
|
237
|
+
// 同じ PID を 2 役が名乗ることもあるので、else でつながない
|
|
238
238
|
for (const section of this.pmt.feed(packet, pid))
|
|
239
239
|
this.onPmt(section);
|
|
240
240
|
if (pid === PID_TIME)
|
|
@@ -251,7 +251,7 @@ export class BmlDecoder {
|
|
|
251
251
|
if (components.length === 0)
|
|
252
252
|
return;
|
|
253
253
|
/*
|
|
254
|
-
*
|
|
254
|
+
* 放送は同じ表を何度も送る。**変わったときだけ配る。** 受け側は
|
|
255
255
|
* PMT が来るたびに画面を組み直すので、そのまま通すと出っ放しになる
|
|
256
256
|
*/
|
|
257
257
|
const shape = JSON.stringify(components);
|
|
@@ -455,7 +455,7 @@ export class BmlDecoder {
|
|
|
455
455
|
/**
|
|
456
456
|
* 揃ったモジュールをファイルに分ける。
|
|
457
457
|
*
|
|
458
|
-
* **多くは `multipart/mixed`** で、1つのモジュールに BML と画像がまとめて
|
|
458
|
+
* **多くは `multipart/mixed`** で、1 つのモジュールに BML と画像がまとめて
|
|
459
459
|
* 入っている。Type 記述子が無いときも中身は multipart なので、同じ扱いにする。
|
|
460
460
|
*/
|
|
461
461
|
export function moduleFiles(data, contentType) {
|
package/dist/bytes.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* バイト列の細かい道具。**中身の意味は持たない。** 繋ぐ・読むのはここで済ませる (別名で書き直さない)
|
|
3
3
|
*/
|
|
4
|
-
/** バイト列を新しい1本に繋ぐ (いつも写す。`Blob` などへ渡せる `ArrayBuffer` の上に作る) */
|
|
4
|
+
/** バイト列を新しい 1 本に繋ぐ (いつも写す。`Blob` などへ渡せる `ArrayBuffer` の上に作る) */
|
|
5
5
|
export declare function concatBytes(parts: readonly Uint8Array[]): Uint8Array<ArrayBuffer>;
|
|
6
6
|
/**
|
|
7
|
-
* バイト列を1本に繋ぐ。
|
|
7
|
+
* バイト列を 1 本に繋ぐ。
|
|
8
8
|
*
|
|
9
|
-
* **1本しかないときは写しません。** 分割された記述子を繋ぎ直すところ
|
|
9
|
+
* **1 本しかないときは写しません。** 分割された記述子を繋ぎ直すところ
|
|
10
10
|
* ([eit.ts](eit.ts)) では、繋ぐ必要のないほうが多数です
|
|
11
11
|
*/
|
|
12
12
|
export declare function joinBytes(parts: readonly Uint8Array[]): Uint8Array;
|
|
@@ -16,5 +16,5 @@ export declare function u16(data: Uint8Array, at: number): number;
|
|
|
16
16
|
export declare function u24(data: Uint8Array, at: number): number;
|
|
17
17
|
/** 大きい桁が先の 32 ビット (符号なし) */
|
|
18
18
|
export declare function u32(data: Uint8Array, at: number): number;
|
|
19
|
-
/** `length` バイトをそのまま1字ずつの文字列に (MP4 の箱の種別・PNG の塊の名前・言語の符号) */
|
|
19
|
+
/** `length` バイトをそのまま 1 字ずつの文字列に (MP4 の箱の種別・PNG の塊の名前・言語の符号) */
|
|
20
20
|
export declare function ascii(data: Uint8Array, at: number, length: number): string;
|
package/dist/bytes.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* バイト列の細かい道具。**中身の意味は持たない。** 繋ぐ・読むのはここで済ませる (別名で書き直さない)
|
|
3
3
|
*/
|
|
4
|
-
/** バイト列を新しい1本に繋ぐ (いつも写す。`Blob` などへ渡せる `ArrayBuffer` の上に作る) */
|
|
4
|
+
/** バイト列を新しい 1 本に繋ぐ (いつも写す。`Blob` などへ渡せる `ArrayBuffer` の上に作る) */
|
|
5
5
|
export function concatBytes(parts) {
|
|
6
6
|
let total = 0;
|
|
7
7
|
for (const part of parts)
|
|
@@ -15,9 +15,9 @@ export function concatBytes(parts) {
|
|
|
15
15
|
return out;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* バイト列を1本に繋ぐ。
|
|
18
|
+
* バイト列を 1 本に繋ぐ。
|
|
19
19
|
*
|
|
20
|
-
* **1本しかないときは写しません。** 分割された記述子を繋ぎ直すところ
|
|
20
|
+
* **1 本しかないときは写しません。** 分割された記述子を繋ぎ直すところ
|
|
21
21
|
* ([eit.ts](eit.ts)) では、繋ぐ必要のないほうが多数です
|
|
22
22
|
*/
|
|
23
23
|
export function joinBytes(parts) {
|
|
@@ -39,7 +39,7 @@ export function u32(data, at) {
|
|
|
39
39
|
data[at + 3]) >>>
|
|
40
40
|
0);
|
|
41
41
|
}
|
|
42
|
-
/** `length` バイトをそのまま1字ずつの文字列に (MP4 の箱の種別・PNG の塊の名前・言語の符号) */
|
|
42
|
+
/** `length` バイトをそのまま 1 字ずつの文字列に (MP4 の箱の種別・PNG の塊の名前・言語の符号) */
|
|
43
43
|
export function ascii(data, at, length) {
|
|
44
44
|
return String.fromCharCode(...data.subarray(at, at + length));
|
|
45
45
|
}
|
package/dist/caption-text.d.ts
CHANGED
|
@@ -12,12 +12,12 @@ export declare const CAPTION_TEXT_VERSION = 1;
|
|
|
12
12
|
export declare const STROKE_WIDTH = 1.5;
|
|
13
13
|
/** 点滅 (FLC) の間 (ms)。出ている時間と消えている時間 */
|
|
14
14
|
export declare const FLASH_MS = 500;
|
|
15
|
-
/** 字幕1枚。**前の1枚を丸ごと置き換える** (`runs` が空なら消す) */
|
|
15
|
+
/** 字幕 1 枚。**前の 1 枚を丸ごと置き換える** (`runs` が空なら消す) */
|
|
16
16
|
export interface CaptionPage {
|
|
17
17
|
v: typeof CAPTION_TEXT_VERSION;
|
|
18
18
|
/** 字幕の面の大きさ [幅, 高さ] */
|
|
19
19
|
plane: [number, number];
|
|
20
|
-
/** 出しておく長さ (ms)。null なら次の1枚まで */
|
|
20
|
+
/** 出しておく長さ (ms)。null なら次の 1 枚まで */
|
|
21
21
|
duration: number | null;
|
|
22
22
|
/** 字の並び。描く順 */
|
|
23
23
|
runs: CaptionRun[];
|
|
@@ -25,14 +25,14 @@ export interface CaptionPage {
|
|
|
25
25
|
drcs?: Record<string, CaptionDrcs>;
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
* 同じ見た目で横に並ぶ字。`text` の1字 (コードポイント) ごとに、幅 `w` の区画を
|
|
29
|
-
* `x` から右へ1つずつ使う。
|
|
28
|
+
* 同じ見た目で横に並ぶ字。`text` の 1 字 (コードポイント) ごとに、幅 `w` の区画を
|
|
29
|
+
* `x` から右へ 1 つずつ使う。
|
|
30
30
|
*/
|
|
31
31
|
export interface CaptionRun {
|
|
32
|
-
/** 1字目の区画の左上 */
|
|
32
|
+
/** 1 字目の区画の左上 */
|
|
33
33
|
x: number;
|
|
34
34
|
y: number;
|
|
35
|
-
/** 区画1つの幅・高さ。背景 (`bg`) はこの広さを塗る */
|
|
35
|
+
/** 区画 1 つの幅・高さ。背景 (`bg`) はこの広さを塗る */
|
|
36
36
|
w: number;
|
|
37
37
|
h: number;
|
|
38
38
|
/** 区画の左上から、字の枠の左上まで */
|
|
@@ -47,8 +47,8 @@ export interface CaptionRun {
|
|
|
47
47
|
scaleX: number;
|
|
48
48
|
text: string;
|
|
49
49
|
/**
|
|
50
|
-
* `text` 全体で1つの区画 (JIS X 0213 の か゚・æ̀・˩˥ のように、2つのコードポイントで1字のもの)。
|
|
51
|
-
* この run は1字だけで、`text` をまとめて描く (フォントが1字に組む)
|
|
50
|
+
* `text` 全体で 1 つの区画 (JIS X 0213 の か゚・æ̀・˩˥ のように、2 つのコードポイントで 1 字のもの)。
|
|
51
|
+
* この run は 1 字だけで、`text` をまとめて描く (フォントが 1 字に組む)
|
|
52
52
|
*/
|
|
53
53
|
joined?: true;
|
|
54
54
|
/** 置き換えられなかった外字。`text` は「〓」で、この画像を字の枠いっぱいに描く */
|
|
@@ -69,7 +69,7 @@ export interface CaptionRun {
|
|
|
69
69
|
/** ルビらしい小さな字 (libaribcaption と同じ見分け方) */
|
|
70
70
|
ruby?: true;
|
|
71
71
|
}
|
|
72
|
-
/** 外字の画像。`data` は base64 で、左上から1画素 `bits` ビットずつ (上の桁から) 詰めたもの */
|
|
72
|
+
/** 外字の画像。`data` は base64 で、左上から 1 画素 `bits` ビットずつ (上の桁から) 詰めたもの */
|
|
73
73
|
export interface CaptionDrcs {
|
|
74
74
|
w: number;
|
|
75
75
|
h: number;
|
|
@@ -85,35 +85,35 @@ export interface CaptionDrcs {
|
|
|
85
85
|
}
|
|
86
86
|
/** 空白として字を描かない (背景だけ塗る) 字。libaribcaption の IsSpaceCharacter と同じ */
|
|
87
87
|
export declare function isSpace(code: number): boolean;
|
|
88
|
-
/** 録画1本ぶんの字幕 (`GET /api/recordings/<id>/captions.json`)。`at` は動画の頭からの秒 */
|
|
88
|
+
/** 録画 1 本ぶんの字幕 (`GET /api/recordings/<id>/captions.json`)。`at` は動画の頭からの秒 */
|
|
89
89
|
export interface CaptionPages {
|
|
90
90
|
v: typeof CAPTION_TEXT_VERSION;
|
|
91
|
-
/** 第1言語 */
|
|
91
|
+
/** 第 1 言語 */
|
|
92
92
|
pages: {
|
|
93
93
|
at: number;
|
|
94
94
|
page: CaptionPage;
|
|
95
95
|
}[];
|
|
96
|
-
/** 第1言語の名前。字幕管理データが読めなければ省く */
|
|
96
|
+
/** 第 1 言語の名前。字幕管理データが読めなければ省く */
|
|
97
97
|
language?: CaptionLanguage;
|
|
98
|
-
/** 第2言語から後ろ。**載っているときだけ** (たいていの番組は第1言語だけ) */
|
|
98
|
+
/** 第 2 言語から後ろ。**載っているときだけ** (たいていの番組は第 1 言語だけ) */
|
|
99
99
|
others?: CaptionLanguagePages[];
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
102
|
-
* 字幕の言語1つ。**ARIB の字幕は1本の中に最大8言語を持てる** (データグループの番号 1〜8。
|
|
103
|
-
* 何番がどの言語かは字幕管理データに ISO 639 の3文字で書いてある)。日本の放送はほぼ日本語だけで、
|
|
102
|
+
* 字幕の言語 1 つ。**ARIB の字幕は 1 本の中に最大 8 言語を持てる** (データグループの番号 1〜8。
|
|
103
|
+
* 何番がどの言語かは字幕管理データに ISO 639 の 3 文字で書いてある)。日本の放送はほぼ日本語だけで、
|
|
104
104
|
* 英語の字幕が付く番組がたまにある
|
|
105
105
|
*/
|
|
106
106
|
export interface CaptionLanguage {
|
|
107
107
|
/** 第何言語か (1〜8。データグループの番号) */
|
|
108
108
|
index: number;
|
|
109
|
-
/** ISO 639-2 の3文字 (`jpn` / `eng`)。読めなければ空 */
|
|
109
|
+
/** ISO 639-2 の 3 文字 (`jpn` / `eng`)。読めなければ空 */
|
|
110
110
|
code: string;
|
|
111
111
|
/** 読める名前 (日本語・英語)。知らない符号はそのまま */
|
|
112
112
|
label: string;
|
|
113
113
|
}
|
|
114
114
|
/**
|
|
115
|
-
* 録画の字幕のうち、第2言語から後ろ (`CaptionPages.others`)。**第1言語は今までどおり `pages
|
|
116
|
-
* バージョン (`v`) を上げずに足したので、知らない受け側は第1言語だけを描く
|
|
115
|
+
* 録画の字幕のうち、第 2 言語から後ろ (`CaptionPages.others`)。**第 1 言語は今までどおり `pages`。**
|
|
116
|
+
* バージョン (`v`) を上げずに足したので、知らない受け側は第 1 言語だけを描く
|
|
117
117
|
*/
|
|
118
118
|
export interface CaptionLanguagePages extends CaptionLanguage {
|
|
119
119
|
pages: {
|
|
@@ -123,5 +123,5 @@ export interface CaptionLanguagePages extends CaptionLanguage {
|
|
|
123
123
|
}
|
|
124
124
|
/** 第何言語かと ISO 639 の符号から、画面に出す名前を付ける */
|
|
125
125
|
export declare function captionLanguage(index: number, code: string): CaptionLanguage;
|
|
126
|
-
/** `?language=` を読む (1〜8)。省いた・読めないときは第1言語 */
|
|
126
|
+
/** `?language=` を読む (1〜8)。省いた・読めないときは第 1 言語 */
|
|
127
127
|
export declare function parseCaptionLanguage(value: string | null): number;
|
package/dist/caption-text.js
CHANGED
|
@@ -32,7 +32,7 @@ export function captionLanguage(index, code) {
|
|
|
32
32
|
label: LANGUAGE[code] ?? (code === "" ? `字幕 ${index}` : code),
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
/** `?language=` を読む (1〜8)。省いた・読めないときは第1言語 */
|
|
35
|
+
/** `?language=` を読む (1〜8)。省いた・読めないときは第 1 言語 */
|
|
36
36
|
export function parseCaptionLanguage(value) {
|
|
37
37
|
const number = Number(value);
|
|
38
38
|
return Number.isInteger(number) && number >= 1 && number <= 8 ? number : 1;
|
package/dist/drcs-smooth.d.ts
CHANGED
|
@@ -6,26 +6,26 @@
|
|
|
6
6
|
* なめらかに引き伸ばしても階段がぼやけて残る (スピーカー 🔊 の外字など)。
|
|
7
7
|
*
|
|
8
8
|
* 以前は libaribcaption の描き手にパッチを当てて同じことをしていた (#554)。描くのを受け側に移したとき (#571〜#586)
|
|
9
|
-
* にその直しが落ちたので、**サーバで1回だけ** やって、濃淡の画像 (`bits: 4`・`depth: 16`) で送る。受け側は
|
|
9
|
+
* にその直しが落ちたので、**サーバで 1 回だけ** やって、濃淡の画像 (`bits: 4`・`depth: 16`) で送る。受け側は
|
|
10
10
|
* もともと `bits` 1・2・4・8 を読み、濃さを字の色の不透明度に掛けて引き伸ばすので変えなくてよい。
|
|
11
11
|
*
|
|
12
12
|
* 1. **水増しを畳む** (`collapseDoubled`)。放送はよく 18x18 の字を縦横 2 倍の 36x36 で送ってくる。
|
|
13
13
|
* 同じ並びが 2 つずつ続く行・列を 1 つにする (失うものは無い)。そうしないと次の段で階段を階段と見られない
|
|
14
14
|
* 2. **Scale2x (EPX) で斜めを丸める** (`scale2x`)。斜めの階段を細かくする。縦横の線はまっすぐのまま残るが、
|
|
15
|
-
* 塗りの出っ張った角は元の1点ぶんほど丸まる (EPX の性質。#554 のパッチも同じで、フォントの字に近い見た目になる)
|
|
15
|
+
* 塗りの出っ張った角は元の 1 点ぶんほど丸まる (EPX の性質。#554 のパッチも同じで、フォントの字に近い見た目になる)
|
|
16
16
|
* 3. **縮めて濃淡にする** (`boxDown`・`pack4`)。細かくした画像を 4x4 ずつ平均し、縁に中間の濃さを付ける。
|
|
17
17
|
* 縦横の線は元の画素の境目に落ちるので、ぼけずにくっきり残る
|
|
18
18
|
*
|
|
19
19
|
* **置き換え表の MD5 は元の画像から取る** (b24caption.ts)。ここで作った画像は送るためだけのもの。
|
|
20
20
|
*/
|
|
21
21
|
import type { CaptionDrcs } from "./caption-text.js";
|
|
22
|
-
/** 濃さ 0〜255 の画像 (左上から1画素1バイト) */
|
|
22
|
+
/** 濃さ 0〜255 の画像 (左上から 1 画素 1 バイト) */
|
|
23
23
|
export interface Grey {
|
|
24
24
|
width: number;
|
|
25
25
|
height: number;
|
|
26
26
|
pixels: Uint8Array;
|
|
27
27
|
}
|
|
28
|
-
/** 放送の詰め方 (左上から1画素 `bits` ビット、上の桁から) を開いて、濃さ 0〜255 にする */
|
|
28
|
+
/** 放送の詰め方 (左上から 1 画素 `bits` ビット、上の桁から) を開いて、濃さ 0〜255 にする */
|
|
29
29
|
export declare function decodeGrey(width: number, height: number, depth: number, bits: number, data: Uint8Array): Grey;
|
|
30
30
|
/**
|
|
31
31
|
* 縦横に水増しされた画像を畳む。偶数の幅で、どの行も (0,1) (2,3)… の列が同じなら列を半分に、
|
|
@@ -46,7 +46,7 @@ export declare function boxDown(src: Grey, n: number): Grey;
|
|
|
46
46
|
*/
|
|
47
47
|
export declare function smoothDrcs(width: number, height: number, depth: number, bits: number, data: Uint8Array): CaptionDrcs;
|
|
48
48
|
/**
|
|
49
|
-
* 濃さを 16 階調にして1画素4ビットで詰める (左の画素が上の桁)。4x4 の平均は白黒の画像からだと 17 階調しか
|
|
50
|
-
* 出ないので、8 ビットで送っても見た目は変わらず倍の大きさになるだけ (外字の画像は字幕の1枚ごとに付く)
|
|
49
|
+
* 濃さを 16 階調にして 1 画素 4 ビットで詰める (左の画素が上の桁)。4x4 の平均は白黒の画像からだと 17 階調しか
|
|
50
|
+
* 出ないので、8 ビットで送っても見た目は変わらず倍の大きさになるだけ (外字の画像は字幕の 1 枚ごとに付く)
|
|
51
51
|
*/
|
|
52
52
|
export declare function pack4(g: Grey): Uint8Array;
|
package/dist/drcs-smooth.js
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
* なめらかに引き伸ばしても階段がぼやけて残る (スピーカー 🔊 の外字など)。
|
|
7
7
|
*
|
|
8
8
|
* 以前は libaribcaption の描き手にパッチを当てて同じことをしていた (#554)。描くのを受け側に移したとき (#571〜#586)
|
|
9
|
-
* にその直しが落ちたので、**サーバで1回だけ** やって、濃淡の画像 (`bits: 4`・`depth: 16`) で送る。受け側は
|
|
9
|
+
* にその直しが落ちたので、**サーバで 1 回だけ** やって、濃淡の画像 (`bits: 4`・`depth: 16`) で送る。受け側は
|
|
10
10
|
* もともと `bits` 1・2・4・8 を読み、濃さを字の色の不透明度に掛けて引き伸ばすので変えなくてよい。
|
|
11
11
|
*
|
|
12
12
|
* 1. **水増しを畳む** (`collapseDoubled`)。放送はよく 18x18 の字を縦横 2 倍の 36x36 で送ってくる。
|
|
13
13
|
* 同じ並びが 2 つずつ続く行・列を 1 つにする (失うものは無い)。そうしないと次の段で階段を階段と見られない
|
|
14
14
|
* 2. **Scale2x (EPX) で斜めを丸める** (`scale2x`)。斜めの階段を細かくする。縦横の線はまっすぐのまま残るが、
|
|
15
|
-
* 塗りの出っ張った角は元の1点ぶんほど丸まる (EPX の性質。#554 のパッチも同じで、フォントの字に近い見た目になる)
|
|
15
|
+
* 塗りの出っ張った角は元の 1 点ぶんほど丸まる (EPX の性質。#554 のパッチも同じで、フォントの字に近い見た目になる)
|
|
16
16
|
* 3. **縮めて濃淡にする** (`boxDown`・`pack4`)。細かくした画像を 4x4 ずつ平均し、縁に中間の濃さを付ける。
|
|
17
17
|
* 縦横の線は元の画素の境目に落ちるので、ぼけずにくっきり残る
|
|
18
18
|
*
|
|
@@ -25,7 +25,7 @@ const TARGET = 64;
|
|
|
25
25
|
const MAX = 256;
|
|
26
26
|
/** 最後に平均する一辺。Scale2x をこのぶん余計にかけておく (4 なら 2 回) */
|
|
27
27
|
const BOX = 4;
|
|
28
|
-
/** 放送の詰め方 (左上から1画素 `bits` ビット、上の桁から) を開いて、濃さ 0〜255 にする */
|
|
28
|
+
/** 放送の詰め方 (左上から 1 画素 `bits` ビット、上の桁から) を開いて、濃さ 0〜255 にする */
|
|
29
29
|
export function decodeGrey(width, height, depth, bits, data) {
|
|
30
30
|
const pixels = new Uint8Array(width * height);
|
|
31
31
|
const mask = (1 << bits) - 1;
|
|
@@ -152,8 +152,8 @@ export function smoothDrcs(width, height, depth, bits, data) {
|
|
|
152
152
|
};
|
|
153
153
|
}
|
|
154
154
|
/**
|
|
155
|
-
* 濃さを 16 階調にして1画素4ビットで詰める (左の画素が上の桁)。4x4 の平均は白黒の画像からだと 17 階調しか
|
|
156
|
-
* 出ないので、8 ビットで送っても見た目は変わらず倍の大きさになるだけ (外字の画像は字幕の1枚ごとに付く)
|
|
155
|
+
* 濃さを 16 階調にして 1 画素 4 ビットで詰める (左の画素が上の桁)。4x4 の平均は白黒の画像からだと 17 階調しか
|
|
156
|
+
* 出ないので、8 ビットで送っても見た目は変わらず倍の大きさになるだけ (外字の画像は字幕の 1 枚ごとに付く)
|
|
157
157
|
*/
|
|
158
158
|
export function pack4(g) {
|
|
159
159
|
const out = new Uint8Array(Math.ceil(g.pixels.length / 2));
|
package/dist/dsmcc.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* データカルーセル (DSM-CC) をデコードする。**放送が同じものを何度も回してくる**中から、
|
|
3
|
-
* ブロックを集めて1つのモジュールに組み立て直すところまで。
|
|
3
|
+
* ブロックを集めて 1 つのモジュールに組み立て直すところまで。
|
|
4
4
|
*
|
|
5
|
-
* 使う側が2つある。**中身の読み方だけが違って、運び方は同じ**なので、ここに寄せる。
|
|
5
|
+
* 使う側が 2 つある。**中身の読み方だけが違って、運び方は同じ**なので、ここに寄せる。
|
|
6
6
|
*
|
|
7
7
|
* - [logo-dsmcc.ts](https://github.com/danything/denpa/blob/main/src/lib/ts/logo-dsmcc.ts) … 衛星の局ロゴ (ARIB STD-B21)
|
|
8
8
|
* - [bml.ts](bml.ts) … データ放送 (ARIB STD-B24 / TR-B14・TR-B15)
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
* 3. 全ブロック揃うとモジュールになる
|
|
15
15
|
*
|
|
16
16
|
* セクションを取り出すのは [psi.ts](psi.ts) の `SectionAssembler`。**`'syntax'` を
|
|
17
|
-
*
|
|
18
|
-
* 末尾4バイトが CRC ではなく Checksum なので、いつも確かめると全部捨ててしまう。
|
|
17
|
+
* 渡すこと。** DSM-CC は `section_syntax_indicator` が立たないことがあり、そのときは
|
|
18
|
+
* 末尾 4 バイトが CRC ではなく Checksum なので、いつも確かめると全部捨ててしまう。
|
|
19
19
|
*/
|
|
20
20
|
export declare const TABLE_DII = 59;
|
|
21
21
|
/** ストリーム記述子。NPT と イベントメッセージが載る (データ放送だけが使う) */
|
|
22
22
|
export declare const TABLE_STREAM_DESCRIPTOR = 61;
|
|
23
23
|
/**
|
|
24
|
-
* 同じカルーセルの中の「回」。**downloadId の上位4ビットに入っている**
|
|
25
|
-
* (下位28ビットは常に1で運用される)。
|
|
24
|
+
* 同じカルーセルの中の「回」。**downloadId の上位 4 ビットに入っている**
|
|
25
|
+
* (下位 28 ビットは常に 1 で運用される)。
|
|
26
26
|
*
|
|
27
27
|
* 番組が変わるとここが変わるので、**前の番組のモジュールを捨てる合図**になる。
|
|
28
28
|
*/
|
|
@@ -67,12 +67,12 @@ export interface Ddb {
|
|
|
67
67
|
* adaptationLength ぶん飛ばした先に本体が入っている。
|
|
68
68
|
*/
|
|
69
69
|
export declare function parseDii(section: Uint8Array): Dii | null;
|
|
70
|
-
/** DDB (Download Data Block)。モジュールを割ったブロックが1つ入っている */
|
|
70
|
+
/** DDB (Download Data Block)。モジュールを割ったブロックが 1 つ入っている */
|
|
71
71
|
export declare function parseDdb(section: Uint8Array): Ddb | null;
|
|
72
72
|
/**
|
|
73
73
|
* 組み立てるモジュールの大きさの上限 (16MiB)。**これより大きいと言う DII は信じない。**
|
|
74
74
|
*
|
|
75
|
-
* `moduleSize` は32ビットで、そのまま信じると DII 1つで 4GB を確保させられる。
|
|
75
|
+
* `moduleSize` は 32 ビットで、そのまま信じると DII 1 つで 4GB を確保させられる。
|
|
76
76
|
* 実際のデータ放送のモジュールは数 KB〜数百 KB、衛星のロゴも全局ぶんで数百 KB なので、
|
|
77
77
|
* 十分に余裕を見た値。zlib で伸ばしたあとの大きさにも同じ上限を使う ([bml.ts](bml.ts) の `inflate`)
|
|
78
78
|
*/
|
|
@@ -92,18 +92,18 @@ export declare class ModuleBuilder {
|
|
|
92
92
|
private readonly moduleSize;
|
|
93
93
|
private readonly blockSize;
|
|
94
94
|
private buffer;
|
|
95
|
-
/** 受け取ったブロック番号 (1ブロック1ビット)。最初のブロックが来てから確保する */
|
|
95
|
+
/** 受け取ったブロック番号 (1 ブロック 1 ビット)。最初のブロックが来てから確保する */
|
|
96
96
|
private received;
|
|
97
97
|
private count;
|
|
98
98
|
private readonly total;
|
|
99
99
|
constructor(moduleVersion: number, moduleSize: number, blockSize: number);
|
|
100
100
|
/** 組み立てた中身。まだ届いていないところは 0。**揃ってから読むこと** (読むとモジュールの大きさぶんを確保する) */
|
|
101
101
|
get data(): Uint8Array;
|
|
102
|
-
/** 受け取ったブロックの数 (同じブロックを2度受けても1つ) */
|
|
102
|
+
/** 受け取ったブロックの数 (同じブロックを 2 度受けても 1 つ) */
|
|
103
103
|
get blocks(): number;
|
|
104
104
|
/** 揃ったか。**大きさ 0 のモジュールは初めから揃っている** (運ぶブロックが無いので DDB を待たない) */
|
|
105
105
|
get complete(): boolean;
|
|
106
|
-
/** ブロックを1つ置く。**揃ったら true** */
|
|
106
|
+
/** ブロックを 1 つ置く。**揃ったら true** */
|
|
107
107
|
add(blockNumber: number, block: Uint8Array): boolean;
|
|
108
108
|
/** 入れ物を広げる。何度も写し直さないよう倍々で、モジュールの大きさまで */
|
|
109
109
|
private grow;
|
package/dist/dsmcc.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* データカルーセル (DSM-CC) をデコードする。**放送が同じものを何度も回してくる**中から、
|
|
3
|
-
* ブロックを集めて1つのモジュールに組み立て直すところまで。
|
|
3
|
+
* ブロックを集めて 1 つのモジュールに組み立て直すところまで。
|
|
4
4
|
*
|
|
5
|
-
* 使う側が2つある。**中身の読み方だけが違って、運び方は同じ**なので、ここに寄せる。
|
|
5
|
+
* 使う側が 2 つある。**中身の読み方だけが違って、運び方は同じ**なので、ここに寄せる。
|
|
6
6
|
*
|
|
7
7
|
* - [logo-dsmcc.ts](https://github.com/danything/denpa/blob/main/src/lib/ts/logo-dsmcc.ts) … 衛星の局ロゴ (ARIB STD-B21)
|
|
8
8
|
* - [bml.ts](bml.ts) … データ放送 (ARIB STD-B24 / TR-B14・TR-B15)
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* 3. 全ブロック揃うとモジュールになる
|
|
15
15
|
*
|
|
16
16
|
* セクションを取り出すのは [psi.ts](psi.ts) の `SectionAssembler`。**`'syntax'` を
|
|
17
|
-
*
|
|
18
|
-
* 末尾4バイトが CRC ではなく Checksum なので、いつも確かめると全部捨ててしまう。
|
|
17
|
+
* 渡すこと。** DSM-CC は `section_syntax_indicator` が立たないことがあり、そのときは
|
|
18
|
+
* 末尾 4 バイトが CRC ではなく Checksum なので、いつも確かめると全部捨ててしまう。
|
|
19
19
|
*/
|
|
20
20
|
import { u16, u32 } from "./bytes.js";
|
|
21
21
|
import { descriptors } from "./psi.js";
|
|
@@ -30,8 +30,8 @@ const MODULE_DESC_COMPRESSION = 0xc2;
|
|
|
30
30
|
/** DII が blockSize を持っていないときの既定 (ARIB TR-B15) */
|
|
31
31
|
const DEFAULT_BLOCK_SIZE = 4066;
|
|
32
32
|
/**
|
|
33
|
-
* 同じカルーセルの中の「回」。**downloadId の上位4ビットに入っている**
|
|
34
|
-
* (下位28ビットは常に1で運用される)。
|
|
33
|
+
* 同じカルーセルの中の「回」。**downloadId の上位 4 ビットに入っている**
|
|
34
|
+
* (下位 28 ビットは常に 1 で運用される)。
|
|
35
35
|
*
|
|
36
36
|
* 番組が変わるとここが変わるので、**前の番組のモジュールを捨てる合図**になる。
|
|
37
37
|
*/
|
|
@@ -93,7 +93,7 @@ export function parseDii(section) {
|
|
|
93
93
|
else if (tag === MODULE_DESC_TYPE)
|
|
94
94
|
contentType = new TextDecoder("ascii").decode(descriptor);
|
|
95
95
|
else if (tag === MODULE_DESC_COMPRESSION && descriptor.length >= 5) {
|
|
96
|
-
// 先頭1バイトは符号付き。運用されるのは 0 (zlib) だけ
|
|
96
|
+
// 先頭 1 バイトは符号付き。運用されるのは 0 (zlib) だけ
|
|
97
97
|
compression = {
|
|
98
98
|
type: (descriptor[0] << 24) >> 24,
|
|
99
99
|
originalSize: u32(descriptor, 1),
|
|
@@ -124,7 +124,7 @@ export function parseDii(section) {
|
|
|
124
124
|
}
|
|
125
125
|
return { downloadId, transactionId, blockSize, modules, returnToEntry };
|
|
126
126
|
}
|
|
127
|
-
/** DDB (Download Data Block)。モジュールを割ったブロックが1つ入っている */
|
|
127
|
+
/** DDB (Download Data Block)。モジュールを割ったブロックが 1 つ入っている */
|
|
128
128
|
export function parseDdb(section) {
|
|
129
129
|
if (section[0] !== TABLE_DDB)
|
|
130
130
|
return null;
|
|
@@ -155,7 +155,7 @@ export function parseDdb(section) {
|
|
|
155
155
|
/**
|
|
156
156
|
* 組み立てるモジュールの大きさの上限 (16MiB)。**これより大きいと言う DII は信じない。**
|
|
157
157
|
*
|
|
158
|
-
* `moduleSize` は32ビットで、そのまま信じると DII 1つで 4GB を確保させられる。
|
|
158
|
+
* `moduleSize` は 32 ビットで、そのまま信じると DII 1 つで 4GB を確保させられる。
|
|
159
159
|
* 実際のデータ放送のモジュールは数 KB〜数百 KB、衛星のロゴも全局ぶんで数百 KB なので、
|
|
160
160
|
* 十分に余裕を見た値。zlib で伸ばしたあとの大きさにも同じ上限を使う ([bml.ts](bml.ts) の `inflate`)
|
|
161
161
|
*/
|
|
@@ -175,7 +175,7 @@ export class ModuleBuilder {
|
|
|
175
175
|
moduleSize;
|
|
176
176
|
blockSize;
|
|
177
177
|
buffer = new Uint8Array(0);
|
|
178
|
-
/** 受け取ったブロック番号 (1ブロック1ビット)。最初のブロックが来てから確保する */
|
|
178
|
+
/** 受け取ったブロック番号 (1 ブロック 1 ビット)。最初のブロックが来てから確保する */
|
|
179
179
|
received = null;
|
|
180
180
|
count = 0;
|
|
181
181
|
total;
|
|
@@ -192,7 +192,7 @@ export class ModuleBuilder {
|
|
|
192
192
|
this.grow(this.moduleSize);
|
|
193
193
|
return this.buffer;
|
|
194
194
|
}
|
|
195
|
-
/** 受け取ったブロックの数 (同じブロックを2度受けても1つ) */
|
|
195
|
+
/** 受け取ったブロックの数 (同じブロックを 2 度受けても 1 つ) */
|
|
196
196
|
get blocks() {
|
|
197
197
|
return this.count;
|
|
198
198
|
}
|
|
@@ -200,7 +200,7 @@ export class ModuleBuilder {
|
|
|
200
200
|
get complete() {
|
|
201
201
|
return this.count >= this.total;
|
|
202
202
|
}
|
|
203
|
-
/** ブロックを1つ置く。**揃ったら true** */
|
|
203
|
+
/** ブロックを 1 つ置く。**揃ったら true** */
|
|
204
204
|
add(blockNumber, block) {
|
|
205
205
|
if (this.moduleSize > MAX_MODULE_SIZE)
|
|
206
206
|
return false;
|