@danything/arib 1.2.0 → 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/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 +31 -31
- package/dist/b24-tables.d.ts +2 -2
- package/dist/b24-tables.js +2 -2
- 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 +8 -8
- package/dist/synth-av.js +14 -14
- package/dist/synth-caption.d.ts +6 -6
- package/dist/synth-caption.js +7 -7
- package/dist/synth.d.ts +16 -16
- package/dist/synth.js +27 -27
- package/package.json +1 -1
package/dist/b24caption.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 放送の字幕 (ARIB STD-B24 の字幕文) をデコードして、**字の置き場所まで決める** ([caption-text.ts](caption-text.ts))。
|
|
3
3
|
*
|
|
4
|
-
* libaribcaption の「デコードする (decoder)
|
|
4
|
+
* libaribcaption の「デコードする (decoder)」側を写したもの。置き場所・大きさ・色・外字の置き換えまでは
|
|
5
5
|
* 同じ計算で、描く (renderer) 手前で止める。描くのは受け側 (ブラウザ・アプリ)。
|
|
6
6
|
*
|
|
7
|
-
* 写したのは日本の放送で要るところだけ: 8単位符号 (JIS)・Profile A (フルセグ)。言語は1つを選んで読む
|
|
8
|
-
* (既定は第1言語。`new B24CaptionDecoder(2)` で第2言語)。
|
|
7
|
+
* 写したのは日本の放送で要るところだけ: 8 単位符号 (JIS)・Profile A (フルセグ)。言語は 1 つを選んで読む
|
|
8
|
+
* (既定は第 1 言語。`new B24CaptionDecoder(2)` で第 2 言語)。
|
|
9
9
|
* ブラジルの Latin・UTF-8・ワンセグ (Profile C) は持たない。
|
|
10
10
|
*
|
|
11
11
|
* ## libaribcaption と違えたところ
|
|
12
12
|
*
|
|
13
13
|
* - **字幕管理データの「送り直し」の見分け。** あちらは群 (A/B) を `(id & 0xF0) >> 8` で
|
|
14
|
-
* 取っていて常に 0 になり、最初の1回しか読まない。ここは群を正しく見る
|
|
14
|
+
* 取っていて常に 0 になり、最初の 1 回しか読まない。ここは群を正しく見る
|
|
15
15
|
* (番組が変わって群が替わったときに書式を読み直す)
|
|
16
16
|
* - **点滅 (FLC) を読み取る。** あちらは読み捨てている
|
|
17
|
-
* - **JIS X 0213 を最後まで読む。** JIS互換漢字2面 (0x3A) を2面の表で、1面 (0x39) の 85〜94区を
|
|
18
|
-
* 第3水準の漢字で引く。か゚ のような2つのコードポイントの字も出す (あちらは空き)
|
|
17
|
+
* - **JIS X 0213 を最後まで読む。** JIS 互換漢字 2 面 (0x3A) を 2 面の表で、1 面 (0x39) の 85〜94 区を
|
|
18
|
+
* 第 3 水準の漢字で引く。か゚ のような 2 つのコードポイントの字も出す (あちらは空き)
|
|
19
19
|
* - **表で空いている点 (U+FFFD) はゲタ (〓) にする。** 「�」は Denpa Font に無く、端末の字の
|
|
20
20
|
* 「?」の印で出る。定義されていない外字と同じ扱い
|
|
21
21
|
*
|
|
@@ -36,9 +36,9 @@ const MOSAIC = { set: "mosaic", bytes: 1 };
|
|
|
36
36
|
/**
|
|
37
37
|
* 終端バイト → 集合 (G の指示)。プロポーショナルは同じ表で引く (libaribcaption と同じ)。
|
|
38
38
|
*
|
|
39
|
-
* JIS X 0213 の1面 (0x39) は 1〜84区を漢字集合 (0x42) と同じ表で引き (漢字集合でも JIS X 0213 にだけある字を出す)、
|
|
40
|
-
* 85〜94区は JIS X 0213 の漢字 (`PLANE1_HIGH`)。漢字集合と追加記号 (0x3B) の 85区から先は追加記号。
|
|
41
|
-
* 2面 (0x3A) は別の表 (`PLANE2`)。libaribcaption は 1面・2面とも漢字集合の表で引いていた
|
|
39
|
+
* JIS X 0213 の 1 面 (0x39) は 1〜84 区を漢字集合 (0x42) と同じ表で引き (漢字集合でも JIS X 0213 にだけある字を出す)、
|
|
40
|
+
* 85〜94 区は JIS X 0213 の漢字 (`PLANE1_HIGH`)。漢字集合と追加記号 (0x3B) の 85 区から先は追加記号。
|
|
41
|
+
* 2 面 (0x3A) は別の表 (`PLANE2`)。libaribcaption は 1 面・2 面とも漢字集合の表で引いていた
|
|
42
42
|
*/
|
|
43
43
|
const G_SETS = new Map([
|
|
44
44
|
[0x42, KANJI],
|
|
@@ -57,7 +57,7 @@ const G_SETS = new Map([
|
|
|
57
57
|
[0x3a, { set: "plane2", bytes: 2 }],
|
|
58
58
|
[0x3b, { set: "additional", bytes: 2 }],
|
|
59
59
|
]);
|
|
60
|
-
/** 終端バイト → DRCS の面 (0x40 は2バイトの面 0)。0x70 はマクロ */
|
|
60
|
+
/** 終端バイト → DRCS の面 (0x40 は 2 バイトの面 0)。0x70 はマクロ */
|
|
61
61
|
function drcsSet(final) {
|
|
62
62
|
if (final === 0x70)
|
|
63
63
|
return MACRO;
|
|
@@ -121,10 +121,10 @@ const T = {
|
|
|
121
121
|
kanjiHalf: points(KANJI_SYMBOLS_HALF),
|
|
122
122
|
additional: points(ADDITIONAL),
|
|
123
123
|
plane1High: points(PLANE1_HIGH),
|
|
124
|
-
/** 2面の区 (0 から) → 94 字 */
|
|
124
|
+
/** 2 面の区 (0 から) → 94 字 */
|
|
125
125
|
plane2: new Map(PLANE2.map(([ku, row]) => [ku - 1, points(row)])),
|
|
126
126
|
};
|
|
127
|
-
/** 1区画に2つのコードポイントを描く字 (区×94+点 → 字)。JIS X 0213 の か゚ など */
|
|
127
|
+
/** 1 区画に 2 つのコードポイントを描く字 (区×94+点 → 字)。JIS X 0213 の か゚ など */
|
|
128
128
|
const sequences = new Map(KANJI_SEQUENCES);
|
|
129
129
|
/** 色。CLUT の組 (0〜7) と番号 (0〜15) */
|
|
130
130
|
function clut(palette, index) {
|
|
@@ -142,7 +142,7 @@ function isHalfwidth(code) {
|
|
|
142
142
|
}
|
|
143
143
|
/**
|
|
144
144
|
* 送る画像 (なめらかにした濃淡。drcs-smooth.ts) を元の画像の MD5 ごとに覚えておく。放送は字幕文のたびに
|
|
145
|
-
* 同じ外字を定義し直してくるので、定義ごとではなくここで1回だけ作る
|
|
145
|
+
* 同じ外字を定義し直してくるので、定義ごとではなくここで 1 回だけ作る
|
|
146
146
|
*/
|
|
147
147
|
const smoothed = new Map();
|
|
148
148
|
const SMOOTHED_MAX = 256;
|
|
@@ -162,11 +162,11 @@ function sendable(drcs) {
|
|
|
162
162
|
return sent;
|
|
163
163
|
}
|
|
164
164
|
/**
|
|
165
|
-
* 字幕のストリーム1本ぶんのデコーダ。**状態を持つ** (書式・位置・色・外字は字幕文を跨いで続く) ので、
|
|
166
|
-
* ストリームごとに1
|
|
165
|
+
* 字幕のストリーム 1 本ぶんのデコーダ。**状態を持つ** (書式・位置・色・外字は字幕文を跨いで続く) ので、
|
|
166
|
+
* ストリームごとに 1 つ作って、届いた順に渡す。
|
|
167
167
|
*
|
|
168
|
-
* **読むのは1つの言語だけ** (`language`。1〜8)。言語ごとに書式も位置も別に続くので、2つの言語を出し分けるなら
|
|
169
|
-
* 言語ごとに1
|
|
168
|
+
* **読むのは 1 つの言語だけ** (`language`。1〜8)。言語ごとに書式も位置も別に続くので、2 つの言語を出し分けるなら
|
|
169
|
+
* 言語ごとに 1 つ作って、同じコマを両方に渡す (denpa の `server/captions.ts` の `CaptionText`)
|
|
170
170
|
*/
|
|
171
171
|
export class B24CaptionDecoder {
|
|
172
172
|
language;
|
|
@@ -214,9 +214,9 @@ export class B24CaptionDecoder {
|
|
|
214
214
|
this.resetState();
|
|
215
215
|
}
|
|
216
216
|
/**
|
|
217
|
-
* 字幕の PES の中身を1
|
|
217
|
+
* 字幕の PES の中身を 1 つ渡す。
|
|
218
218
|
*
|
|
219
|
-
* @returns 出す1枚。出すものが無ければ (字幕管理データ・送り直し・待ちだけの字幕文) null
|
|
219
|
+
* @returns 出す 1 枚。出すものが無ければ (字幕管理データ・送り直し・待ちだけの字幕文) null
|
|
220
220
|
*/
|
|
221
221
|
decode(data) {
|
|
222
222
|
const begin = groupAt(data);
|
|
@@ -559,7 +559,7 @@ export class B24CaptionDecoder {
|
|
|
559
559
|
this.gx[byte - 0x28] = set;
|
|
560
560
|
return 2;
|
|
561
561
|
}
|
|
562
|
-
// 知らない ESC は、ESC 1バイトだけ読んだことにする (libaribcaption と同じ)
|
|
562
|
+
// 知らない ESC は、ESC 1 バイトだけ読んだことにする (libaribcaption と同じ)
|
|
563
563
|
return 0;
|
|
564
564
|
}
|
|
565
565
|
c1(data, at) {
|
|
@@ -915,13 +915,13 @@ export class B24CaptionDecoder {
|
|
|
915
915
|
}
|
|
916
916
|
}
|
|
917
917
|
/**
|
|
918
|
-
* デコードした1枚を、送る形式にする。**同じ見た目で続いている字を1つの並びに束ねる。**
|
|
918
|
+
* デコードした 1 枚を、送る形式にする。**同じ見た目で続いている字を 1 つの並びに束ねる。**
|
|
919
919
|
*
|
|
920
920
|
* libaribcaption の描き手 (region_renderer) が字ごとに計算している置き場所を、ここで
|
|
921
921
|
* 面の単位のまま済ませておく。区画は `floor((字の幅 + 字間) × 倍率)`、字の枠は区画の中で
|
|
922
922
|
* 字間の半分だけ右下へずらしたところ。
|
|
923
923
|
*
|
|
924
|
-
* @returns 出すものが無い (待ちだけの字幕文) なら null。CS だけなら「消す」1枚
|
|
924
|
+
* @returns 出すものが無い (待ちだけの字幕文) なら null。CS だけなら「消す」1 枚
|
|
925
925
|
*/
|
|
926
926
|
function toPage(caption, plane) {
|
|
927
927
|
if (caption.chars.length === 0 && !caption.clear)
|
|
@@ -974,7 +974,7 @@ function toPage(caption, plane) {
|
|
|
974
974
|
run.flash = true;
|
|
975
975
|
if (char.ruby)
|
|
976
976
|
run.ruby = true;
|
|
977
|
-
// 見た目が同じで、すぐ右に続いていれば束ねる。外字の画像と、2つのコードポイントの字は1字ずつ
|
|
977
|
+
// 見た目が同じで、すぐ右に続いていれば束ねる。外字の画像と、2 つのコードポイントの字は 1 字ずつ
|
|
978
978
|
const { x: _x, y: _y, text: _t, ...looks } = run;
|
|
979
979
|
const key = JSON.stringify(looks);
|
|
980
980
|
if (last !== null &&
|
package/dist/bml-protocol.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* データ放送の通知の形式。**デコードする側 ([bml.ts](bml.ts)) と描く側の取り決め。**
|
|
3
3
|
*
|
|
4
|
-
* もとは web-bml の `server/ws_api.ts`
|
|
5
|
-
* 録画の隣に置いた `.bml.jsonl` はこの形式の JSON を1行ずつ持っているので、
|
|
4
|
+
* もとは web-bml の `server/ws_api.ts` の型を借りていた。形式はそのまま写してある。
|
|
5
|
+
* 録画の隣に置いた `.bml.jsonl` はこの形式の JSON を 1 行ずつ持っているので、
|
|
6
6
|
* **形式を変えると前に録ったものが読めなくなる**。足すのはよいが、名前や意味は変えない。
|
|
7
7
|
* web-bml は MIT で、著作権表示と許諾の文は [LICENSE](../LICENSE) に置いてある。
|
|
8
8
|
*
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* ストリーム記述子のイベント・番組の名乗り・放送の時刻)。web-bml が自前の
|
|
11
11
|
* TS 解析のために持っていた PCR・PES・BIT・映像の URL は作らないので持たない。
|
|
12
12
|
*/
|
|
13
|
-
/** PMT の ES 1本。**部品タグ (`componentId`) を持つものだけ**並ぶ (bml.ts の `parsePmt`) */
|
|
13
|
+
/** PMT の ES 1 本。**部品タグ (`componentId`) を持つものだけ**並ぶ (bml.ts の `parsePmt`) */
|
|
14
14
|
export interface ComponentPMT {
|
|
15
15
|
pid: number;
|
|
16
16
|
componentId: number;
|
|
@@ -60,7 +60,7 @@ export interface MediaTypeParameter {
|
|
|
60
60
|
originalAttribute: string;
|
|
61
61
|
value: string;
|
|
62
62
|
}
|
|
63
|
-
/** モジュールの中のファイル1つ。中身は base64 (JSON で運ぶため) */
|
|
63
|
+
/** モジュールの中のファイル 1 つ。中身は base64 (JSON で運ぶため) */
|
|
64
64
|
export interface ModuleFile {
|
|
65
65
|
contentLocation: string | null;
|
|
66
66
|
contentType: MediaType;
|
package/dist/bml-protocol.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* データ放送の通知の形式。**デコードする側 ([bml.ts](bml.ts)) と描く側の取り決め。**
|
|
3
3
|
*
|
|
4
|
-
* もとは web-bml の `server/ws_api.ts`
|
|
5
|
-
* 録画の隣に置いた `.bml.jsonl` はこの形式の JSON を1行ずつ持っているので、
|
|
4
|
+
* もとは web-bml の `server/ws_api.ts` の型を借りていた。形式はそのまま写してある。
|
|
5
|
+
* 録画の隣に置いた `.bml.jsonl` はこの形式の JSON を 1 行ずつ持っているので、
|
|
6
6
|
* **形式を変えると前に録ったものが読めなくなる**。足すのはよいが、名前や意味は変えない。
|
|
7
7
|
* web-bml は MIT で、著作権表示と許諾の文は [LICENSE](../LICENSE) に置いてある。
|
|
8
8
|
*
|
package/dist/bml.d.ts
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
|
*
|
|
@@ -21,21 +21,21 @@ import type { AdditionalAribBXMLInfo, ModuleFile, ResponseMessage } from "./bml-
|
|
|
21
21
|
/**
|
|
22
22
|
* データ符号化方式記述子の後半を読む。
|
|
23
23
|
*
|
|
24
|
-
* 地上波は TR-B14 第二分冊 2.1.4 表2-3、BS/CS は TR-B15 第一分冊 5.1.5 表5-4。
|
|
24
|
+
* 地上波は TR-B14 第二分冊 2.1.4 表 2-3、BS/CS は TR-B15 第一分冊 5.1.5 表 5-4。
|
|
25
25
|
*
|
|
26
|
-
* **`data_component_id` は16ビット** (aribts は8ビットで読んでいる)。
|
|
26
|
+
* **`data_component_id` は 16 ビット** (aribts は 8 ビットで読んでいる)。
|
|
27
27
|
*/
|
|
28
28
|
export declare function parseBxmlInfo(data: Uint8Array): AdditionalAribBXMLInfo;
|
|
29
29
|
/**
|
|
30
|
-
* 1局に絞った TS
|
|
30
|
+
* 1 局に絞った TS を渡すと、データ放送の通知が出てくる。
|
|
31
31
|
*
|
|
32
|
-
* **1つの選局に1つ。**
|
|
32
|
+
* **1 つの選局に 1 つ。** 局を変えたら作り直す。カルーセルは局ごとに別物で、
|
|
33
33
|
* 組み立て中のものを持ち越すと混ざる。
|
|
34
34
|
*/
|
|
35
35
|
export declare class BmlDecoder {
|
|
36
36
|
private readonly send;
|
|
37
37
|
private readonly packets;
|
|
38
|
-
/** **1
|
|
38
|
+
/** **1 局に絞ったあとを渡す前提。** 入っているサービスは 1 つなので、最初の局の PMT を追う */
|
|
39
39
|
private readonly pmt;
|
|
40
40
|
private readonly time;
|
|
41
41
|
/** カルーセルが流れている ES。PID ごと */
|
|
@@ -43,17 +43,17 @@ export declare class BmlDecoder {
|
|
|
43
43
|
/** 最後に配った PMT。**変わったときだけ配る** */
|
|
44
44
|
private sent;
|
|
45
45
|
constructor(send: (message: ResponseMessage) => void);
|
|
46
|
-
/** 1局に絞った TS
|
|
46
|
+
/** 1 局に絞った TS を渡す */
|
|
47
47
|
feed(chunk: Uint8Array): void;
|
|
48
48
|
/**
|
|
49
|
-
* 切り分け済みのパケットを1つ。ライブは同じ TS を時計や Hybridcast とも
|
|
50
|
-
* 分け合うので、切り分けは1回で済ませて配る (denpa の `server/live.ts` の `tap`)。
|
|
49
|
+
* 切り分け済みのパケットを 1 つ。ライブは同じ TS を時計や Hybridcast とも
|
|
50
|
+
* 分け合うので、切り分けは 1 回で済ませて配る (denpa の `server/live.ts` の `tap`)。
|
|
51
51
|
*
|
|
52
52
|
* **PID で行き先を引く。** 組み立て役を全部に回していた頃は、データ放送と
|
|
53
53
|
* 関係ない映像のパケットのたびにカルーセルの数だけ呼んでいた。
|
|
54
54
|
*
|
|
55
55
|
* `packet` は呼び手の塊の上の窓 (`psi.ts` の `PacketStream`)。**返ったあとまで
|
|
56
|
-
*
|
|
56
|
+
* 持つなら写すこと。** 塊の入れ物は使い回される
|
|
57
57
|
*/
|
|
58
58
|
feedPacket(packet: Uint8Array): void;
|
|
59
59
|
private onPmt;
|
|
@@ -77,7 +77,7 @@ export declare class BmlDecoder {
|
|
|
77
77
|
/**
|
|
78
78
|
* 揃ったモジュールをファイルに分ける。
|
|
79
79
|
*
|
|
80
|
-
* **多くは `multipart/mixed`** で、1つのモジュールに BML と画像がまとめて
|
|
80
|
+
* **多くは `multipart/mixed`** で、1 つのモジュールに BML と画像がまとめて
|
|
81
81
|
* 入っている。Type 記述子が無いときも中身は multipart なので、同じ扱いにする。
|
|
82
82
|
*/
|
|
83
83
|
export declare function moduleFiles(data: Uint8Array, contentType: string | null): ModuleFile[];
|
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;
|