@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/synth-av.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* **本物の MPEG-2 映像と AAC 音声を、ffmpeg 無しで組み立てる** (試験用)。
|
|
3
3
|
*
|
|
4
|
-
* denpa のライブを変換せずに送る経路 (docs/stream.md#放送そのままmpeg-2を送る) は、ブラウザが MPEG-2 をデコードして映像を出す
|
|
4
|
+
* denpa のライブを変換せずに送る経路 (docs/stream.md#放送そのまま mpeg-2 を送る) は、ブラウザが MPEG-2 をデコードして映像を出す
|
|
5
5
|
* ところまでが仕事で、そこを試すには**本当にデコードできる放送**が要る。偽エージェントの
|
|
6
6
|
* 放送は中身を 0xFF で埋めていて、デコードするものが無い。E2E のイメージには本物の ffmpeg も
|
|
7
7
|
* 入っていない (数十分かかる組み立てを避けている) ので、ここで小さく作る。
|
|
@@ -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 に使う
|
|
@@ -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,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;
|
package/dist/synth-caption.d.ts
CHANGED
|
@@ -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 まで), 中身] の並び
|
package/dist/synth-caption.js
CHANGED
|
@@ -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;
|
|
@@ -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
|
*/
|
|
@@ -94,13 +94,13 @@ export function drcsUnit(code, rows) {
|
|
|
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 パケットに。BML の `getCurrentDateTime` が見る */
|
|
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;
|
package/dist/synth.js
CHANGED
|
@@ -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,
|
|
@@ -35,8 +35,8 @@ export function putPcr(packet, pcr) {
|
|
|
35
35
|
/**
|
|
36
36
|
* Unicode → JIS X 0208 の区点。**読む側の裏返し。**
|
|
37
37
|
*
|
|
38
|
-
* 表を抱え込まずに、EUC-JP のデコーダを1回だけ総当たりして作る
|
|
39
|
-
* (84区 × 94点 = 7896 文字)。テストと偽放送局からしか呼ばないので、
|
|
38
|
+
* 表を抱え込まずに、EUC-JP のデコーダを 1 回だけ総当たりして作る
|
|
39
|
+
* (84 区 × 94 点 = 7896 文字)。テストと偽放送局からしか呼ばないので、
|
|
40
40
|
* 最初に使うときまで作らない。
|
|
41
41
|
*/
|
|
42
42
|
let jis = null;
|
|
@@ -57,7 +57,7 @@ function jisTable() {
|
|
|
57
57
|
return jis;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
|
-
* 文字列を ARIB STD-B24 の8単位符号にする。
|
|
60
|
+
* 文字列を ARIB STD-B24 の 8 単位符号にする。
|
|
61
61
|
*
|
|
62
62
|
* 初期状態 (G0=漢字) から始めて、ASCII のところだけ英数集合へ切り替える。
|
|
63
63
|
* 本物の放送はもっと凝った切り替え方をするが、**読む側が同じ経路を通れば足りる**。
|
|
@@ -81,13 +81,13 @@ export function encodeAribText(text, half = false) {
|
|
|
81
81
|
out.push(0x1b, 0x24, 0x42, ...(half ? [0x8a] : []));
|
|
82
82
|
alnum = false;
|
|
83
83
|
const kuten = jisTable().get(char);
|
|
84
|
-
// 表に無い字は下駄で埋める (2区14点)。長さが変わらないので位置がずれない
|
|
84
|
+
// 表に無い字は下駄で埋める (2 区 14 点)。長さが変わらないので位置がずれない
|
|
85
85
|
out.push(...be(kuten ?? 0x222e));
|
|
86
86
|
}
|
|
87
87
|
return out;
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
|
-
* 番組名・局名 (SI) に書く形式。**ASCII は中型 (MSZ)
|
|
90
|
+
* 番組名・局名 (SI) に書く形式。**ASCII は中型 (MSZ) で挟んで半角で読ませる。** 標準の大きさの
|
|
91
91
|
* 英数はテレビが全角で描く (読む側 `aribtext.ts` も全角にする)。全角の英数 (「Venue」) は
|
|
92
92
|
* 漢字の集合の字として書くので、読めば書いたとおりの文字列に戻る
|
|
93
93
|
*/
|
|
@@ -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];
|
|
@@ -117,9 +117,9 @@ options = {}) {
|
|
|
117
117
|
}
|
|
118
118
|
return withCrc(body);
|
|
119
119
|
}
|
|
120
|
-
/** 2桁の10進を BCD の1バイトに */
|
|
120
|
+
/** 2 桁の 10 進を BCD の 1 バイトに */
|
|
121
121
|
const bcd = (value) => ((Math.floor(value / 10) << 4) | (value % 10)) & 0xff;
|
|
122
|
-
/** epoch ms → MJD + BCD の5バイト。放送の時刻は日本時間で書く */
|
|
122
|
+
/** epoch ms → MJD + BCD の 5 バイト。放送の時刻は日本時間で書く */
|
|
123
123
|
function mjdTime(at) {
|
|
124
124
|
const jst = Math.floor(at / 1000) + 9 * 3600;
|
|
125
125
|
const mjd = Math.floor(jst / 86400) + 40587;
|
|
@@ -131,7 +131,7 @@ function mjdTime(at) {
|
|
|
131
131
|
bcd(rest % 60),
|
|
132
132
|
];
|
|
133
133
|
}
|
|
134
|
-
/** ms → BCD 3バイトの尺 */
|
|
134
|
+
/** ms → BCD 3 バイトの尺 */
|
|
135
135
|
function bcdDuration(ms) {
|
|
136
136
|
const total = Math.floor(ms / 1000);
|
|
137
137
|
return [
|
|
@@ -141,11 +141,11 @@ function bcdDuration(ms) {
|
|
|
141
141
|
];
|
|
142
142
|
}
|
|
143
143
|
/**
|
|
144
|
-
* シリーズ記述子 (0xD5。ARIB STD-B10 第2部)。
|
|
144
|
+
* シリーズ記述子 (0xD5。ARIB STD-B10 第 2 部)。
|
|
145
145
|
*
|
|
146
146
|
* series_id(16) / repeat_label(4) program_pattern(3) expire_date_valid_flag(1) /
|
|
147
147
|
* expire_date(16) / episode_number(12) last_episode_number(12) / series_name_char。
|
|
148
|
-
* 有効期限は載せない (flag 0、日付は全ビット1)
|
|
148
|
+
* 有効期限は載せない (flag 0、日付は全ビット 1)
|
|
149
149
|
*/
|
|
150
150
|
function seriesDescriptor(series) {
|
|
151
151
|
const episode = series.episode ?? 0;
|
|
@@ -164,7 +164,7 @@ function seriesDescriptor(series) {
|
|
|
164
164
|
}
|
|
165
165
|
/**
|
|
166
166
|
* デジタルコピー制御記述子 (0xC1)。EIT の番組と PMT に載る。
|
|
167
|
-
* 中身は1バイトだけ: 記録制御 (2) 最大ビットレートの有無 (1) 部品ごとの制御の有無 (1) 出力の制御 (4)
|
|
167
|
+
* 中身は 1 バイトだけ: 記録制御 (2) 最大ビットレートの有無 (1) 部品ごとの制御の有無 (1) 出力の制御 (4)
|
|
168
168
|
*/
|
|
169
169
|
export function copyControlDescriptor(control) {
|
|
170
170
|
return [0xc1, 0x01, ((control & 0b11) << 6) | 0b0100];
|
|
@@ -203,7 +203,7 @@ function eventDescriptors(event) {
|
|
|
203
203
|
* simulcast_group_tag / フラグ / 言語 / **放送が付けた名前**。
|
|
204
204
|
*
|
|
205
205
|
* フラグは 多言語(1) 主音声(1) 品質(2) 標本化周波数(3) reserved(1)。
|
|
206
|
-
* 名前は、種別も言語も同じ音声が2本あるとき**唯一の見分け**になる
|
|
206
|
+
* 名前は、種別も言語も同じ音声が 2 本あるとき**唯一の見分け**になる
|
|
207
207
|
*/
|
|
208
208
|
const lang = [...(audio.lang ?? "jpn")].map((c) => c.charCodeAt(0));
|
|
209
209
|
const text = encodeSiText(audio.text ?? "");
|
|
@@ -320,11 +320,11 @@ 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
|
}
|
|
327
|
-
/** PCR を1つ運ぶだけのパケット */
|
|
327
|
+
/** PCR を 1 つ運ぶだけのパケット */
|
|
328
328
|
export function pcrPacket(pid, seconds, counter = 0) {
|
|
329
329
|
const packet = new Uint8Array(PACKET).fill(0xff);
|
|
330
330
|
packet[0] = SYNC;
|
|
@@ -337,11 +337,11 @@ export function pcrPacket(pid, seconds, counter = 0) {
|
|
|
337
337
|
putPcr(packet, seconds * 90_000);
|
|
338
338
|
return packet;
|
|
339
339
|
}
|
|
340
|
-
/** 放送の実時刻 (TDT) を1パケットに。BML の `getCurrentDateTime` が見る */
|
|
340
|
+
/** 放送の実時刻 (TDT) を 1 パケットに。BML の `getCurrentDateTime` が見る */
|
|
341
341
|
export function tdtPacket(unixMs) {
|
|
342
342
|
return packetize(0x0014, Uint8Array.from([0x70, 0x70, 0x05, ...mjdTime(unixMs)]));
|
|
343
343
|
}
|
|
344
|
-
/** PAT。サービスID → PMT の PID */
|
|
344
|
+
/** PAT。サービス ID → PMT の PID */
|
|
345
345
|
export function patSection(programs, transportStreamId = 1) {
|
|
346
346
|
const body = head(0x00, transportStreamId);
|
|
347
347
|
for (const [serviceId, pmtPid] of programs) {
|
|
@@ -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) {
|
|
@@ -377,7 +377,7 @@ export function pmtSection(serviceId, esPid, componentTag) {
|
|
|
377
377
|
* [service-filter.ts](service-filter.ts) を試すのに要る
|
|
378
378
|
*/
|
|
379
379
|
export function programMap(serviceId, pcrPid,
|
|
380
|
-
/** `[種別, PID]`。**3つ目は記述子**の並び (字幕の部品タグなど) */
|
|
380
|
+
/** `[種別, PID]`。**3 つ目は記述子**の並び (字幕の部品タグなど) */
|
|
381
381
|
streams, ecmPid,
|
|
382
382
|
/** 番組ぜんたいに掛かる記述子 (program_info) に足すもの。コピー制御 ({@link copyControlDescriptor}) など */
|
|
383
383
|
extra = []) {
|
|
@@ -409,7 +409,7 @@ export function bxmlDescriptor(options = {}) {
|
|
|
409
409
|
const { dataComponentId = 0x0c, entryPoint = true } = options;
|
|
410
410
|
const body = [
|
|
411
411
|
...be(dataComponentId),
|
|
412
|
-
// 伝送方式00 / 入口 / 自動起動 / 解像度0011 (960x540)
|
|
412
|
+
// 伝送方式 00 / 入口 / 自動起動 / 解像度 0011 (960x540)
|
|
413
413
|
...(entryPoint ? [0x33, 0x70] : [0x00, 0xff]),
|
|
414
414
|
0xf8, // dataEventId 0xF / event_section_flag
|
|
415
415
|
0xa0, // 即時取得あり / 蓄積不可 / 起動優先
|
|
@@ -420,7 +420,7 @@ export function bxmlDescriptor(options = {}) {
|
|
|
420
420
|
* 字幕の ES (stream_type 0x06) に付ける記述子。**字幕の目印。**
|
|
421
421
|
*
|
|
422
422
|
* 部品タグ (stream_identifier_descriptor。ふつうの字幕は 0x30〜0x37) と、データ符号化方式記述子の
|
|
423
|
-
* data_component_id 0x0008 (字幕)。続く1バイトの DMF・時刻制御モードは denpa も ffmpeg も見ない
|
|
423
|
+
* data_component_id 0x0008 (字幕)。続く 1 バイトの DMF・時刻制御モードは denpa も ffmpeg も見ない
|
|
424
424
|
*/
|
|
425
425
|
export function captionDescriptors(componentTag = 0x30) {
|
|
426
426
|
return [0x52, 0x01, componentTag, 0xfd, 0x03, 0x00, 0x08, 0x3d];
|
|
@@ -433,7 +433,7 @@ function dsmccSection(tableId, message) {
|
|
|
433
433
|
* DII。「このモジュールは何バイトで、名前は何か」を伝える。
|
|
434
434
|
*
|
|
435
435
|
* **複数のモジュールを載せられる。** 本物の BS はここに `LOGO-05` と
|
|
436
|
-
* `CS_LOGO-05` を並べて流していて (実機の `BS15:16625` で確認)、1つしか
|
|
436
|
+
* `CS_LOGO-05` を並べて流していて (実機の `BS15:16625` で確認)、1 つしか
|
|
437
437
|
* 載せられない作りでは CS を取りこぼす経路を試せない。
|
|
438
438
|
*/
|
|
439
439
|
export function diiSection(downloadId, blockSize, modules,
|
|
@@ -485,7 +485,7 @@ transactionId = 1) {
|
|
|
485
485
|
...rest,
|
|
486
486
|
]);
|
|
487
487
|
}
|
|
488
|
-
/** DDB。モジュールを割ったブロックを1つ運ぶ */
|
|
488
|
+
/** DDB。モジュールを割ったブロックを 1 つ運ぶ */
|
|
489
489
|
export function ddbSection(downloadId, moduleId, moduleVersion, blockNumber, block) {
|
|
490
490
|
return dsmccSection(0x3c, [
|
|
491
491
|
0x11,
|
|
@@ -516,7 +516,7 @@ export function logoModule(logoType, logos) {
|
|
|
516
516
|
}
|
|
517
517
|
/*
|
|
518
518
|
* --- データ放送のテストで使う定番の割り振り ---
|
|
519
|
-
* denpa の bml / data-timeline / recorded-bml の3つのテストが、同じ表と同じ組み立てを
|
|
519
|
+
* denpa の bml / data-timeline / recorded-bml の 3 つのテストが、同じ表と同じ組み立てを
|
|
520
520
|
* それぞれに書いていた。番号そのものに意味は無く、揃っていることに意味がある。
|
|
521
521
|
*/
|
|
522
522
|
export const BML_TS = {
|
|
@@ -527,7 +527,7 @@ export const BML_TS = {
|
|
|
527
527
|
downloadId: 0xf0000001,
|
|
528
528
|
componentTag: 0x40,
|
|
529
529
|
};
|
|
530
|
-
/** BML の ES が1本だけ載った PMT (`BML_TS` の割り振り) */
|
|
530
|
+
/** BML の ES が 1 本だけ載った PMT (`BML_TS` の割り振り) */
|
|
531
531
|
export function bmlPmt() {
|
|
532
532
|
return programMap(BML_TS.service, BML_TS.videoPid, [
|
|
533
533
|
[0x02, BML_TS.videoPid, [0x52, 0x01, 0x00]],
|
|
@@ -546,7 +546,7 @@ export function bmlHead() {
|
|
|
546
546
|
];
|
|
547
547
|
}
|
|
548
548
|
/**
|
|
549
|
-
* モジュール1つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
|
|
549
|
+
* モジュール 1 つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
|
|
550
550
|
* 本物と同じく、頭に Content-Type、境界で区切って各ファイルに Content-Location
|
|
551
551
|
*/
|
|
552
552
|
export function multipartModule(files) {
|