@danything/arib 0.1.0 → 1.0.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/LICENSE +39 -0
- package/README.md +12 -8
- package/dist/ait.d.ts +1 -1
- package/dist/ait.js +4 -1
- package/dist/aribtext.d.ts +8 -5
- package/dist/aribtext.js +60 -26
- package/dist/b24-tables.d.ts +22 -4
- package/dist/b24-tables.js +97 -6
- package/dist/b24caption.d.ts +5 -1
- package/dist/b24caption.js +42 -13
- package/dist/bml-protocol.d.ts +3 -2
- package/dist/bml-protocol.js +2 -1
- package/dist/bml.d.ts +4 -4
- package/dist/bml.js +30 -9
- package/dist/caption-text.d.ts +8 -3
- package/dist/caption-text.js +3 -3
- package/dist/drcs-smooth.d.ts +1 -1
- package/dist/drcs-smooth.js +2 -1
- package/dist/dsmcc.d.ts +23 -5
- package/dist/dsmcc.js +50 -10
- package/dist/eit.d.ts +42 -9
- package/dist/eit.js +44 -14
- package/dist/multipart.d.ts +1 -1
- package/dist/multipart.js +1 -1
- package/dist/pes.d.ts +3 -3
- package/dist/pes.js +24 -11
- package/dist/psi.d.ts +4 -4
- package/dist/psi.js +5 -5
- package/dist/service-filter.d.ts +16 -5
- package/dist/service-filter.js +38 -6
- package/dist/synth-av.d.ts +3 -3
- package/dist/synth-av.js +3 -3
- package/dist/synth-caption.d.ts +1 -1
- package/dist/synth-caption.js +1 -1
- package/dist/synth.d.ts +21 -3
- package/dist/synth.js +39 -6
- 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
|
-
*
|
|
4
|
+
* denpa のライブを変換せずに送る経路 (docs/stream.md#放送そのままmpeg-2を送る) は、ブラウザが MPEG-2 をデコードして映像を出す
|
|
5
5
|
* ところまでが仕事で、そこを試すには**本当にデコードできる放送**が要る。偽エージェントの
|
|
6
6
|
* 放送は中身を 0xFF で埋めていて、デコードするものが無い。E2E のイメージには本物の ffmpeg も
|
|
7
7
|
* 入っていない (数十分かかる組み立てを避けている) ので、ここで小さく作る。
|
|
@@ -100,7 +100,7 @@ function colorAt(col, row, n, field) {
|
|
|
100
100
|
* (放送は GOP ごとに書く。試験ではその手間を省く)。
|
|
101
101
|
*
|
|
102
102
|
* @param n 何枚目か。色と time_code に使う
|
|
103
|
-
* @param color マクロブロック (16x16) ごとの色。既定は流れる縞 (
|
|
103
|
+
* @param color マクロブロック (16x16) ごとの色。既定は流れる縞 (スクリーンショットを撮るときはカラーバー。denpa の `tests/fake/docs.ts`)
|
|
104
104
|
*/
|
|
105
105
|
export function mpeg2Frame(n, color = colorAt) {
|
|
106
106
|
const bits = new Bits();
|
|
@@ -241,7 +241,7 @@ function stamp(pts) {
|
|
|
241
241
|
/**
|
|
242
242
|
* PES にする。映像は長さ 0 (「次の頭まで」。放送もそう書く)、音声は長さを書く
|
|
243
243
|
*
|
|
244
|
-
* @param streamId 0xE0 (映像) / 0xC0 (音声)
|
|
244
|
+
* @param streamId 0xE0 (映像) / 0xC0 (音声) / 0xBD (字幕。`synth-caption.ts`)
|
|
245
245
|
*/
|
|
246
246
|
export function pes(streamId, pts, data) {
|
|
247
247
|
const header = [0x80, 0x80, 5, ...stamp(pts)];
|
package/dist/synth-caption.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* **放送の字幕 (ARIB STD-B24) を組み立てる** (試験用)。読む側は [b24caption.ts](
|
|
2
|
+
* **放送の字幕 (ARIB STD-B24) を組み立てる** (試験用)。読む側は [b24caption.ts](b24caption.ts)。
|
|
3
3
|
*
|
|
4
4
|
* 出来るのは字幕の PES の中身 (データ識別 0x80 から) で、ffmpeg が `-c:s copy` で
|
|
5
5
|
* Matroska に入れたコマと同じ形式。TS に載せるなら `synth-av.ts` の `pes(0xbd, …)` で包む。
|
package/dist/synth-caption.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* **放送の字幕 (ARIB STD-B24) を組み立てる** (試験用)。読む側は [b24caption.ts](
|
|
2
|
+
* **放送の字幕 (ARIB STD-B24) を組み立てる** (試験用)。読む側は [b24caption.ts](b24caption.ts)。
|
|
3
3
|
*
|
|
4
4
|
* 出来るのは字幕の PES の中身 (データ識別 0x80 から) で、ffmpeg が `-c:s copy` で
|
|
5
5
|
* Matroska に入れたコマと同じ形式。TS に載せるなら `synth-av.ts` の `pes(0xbd, …)` で包む。
|
package/dist/synth.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* TS のセクションを組み立てる。
|
|
3
3
|
*
|
|
4
4
|
* 実チューナーが無いので、解析のテストにも偽エージェントにも「それらしい TS」が要る。
|
|
5
|
-
* 読む側 (psi.ts・eit.ts・dsmcc.ts・
|
|
5
|
+
* 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、ここだけが仕様の写し。
|
|
6
6
|
*/
|
|
7
7
|
import { withCrc } from "./psi.js";
|
|
8
8
|
export { withCrc };
|
|
@@ -45,6 +45,17 @@ export interface SynthEvent {
|
|
|
45
45
|
* 3 がコピー禁止、2 が1世代のみ。省くと記述子を載せない ({@link copyControlDescriptor})
|
|
46
46
|
*/
|
|
47
47
|
copyControl?: number;
|
|
48
|
+
/** シリーズ。省くと記述子を載せない ({@link seriesDescriptor}) */
|
|
49
|
+
series?: SynthSeries;
|
|
50
|
+
}
|
|
51
|
+
/** series_descriptor の中身。省いた数は 0 (話数なら「分からない」) */
|
|
52
|
+
export interface SynthSeries {
|
|
53
|
+
seriesId: number;
|
|
54
|
+
repeatLabel?: number;
|
|
55
|
+
programPattern?: number;
|
|
56
|
+
episode?: number;
|
|
57
|
+
lastEpisode?: number;
|
|
58
|
+
name?: string;
|
|
48
59
|
}
|
|
49
60
|
/**
|
|
50
61
|
* デジタルコピー制御記述子 (0xC1)。EIT の番組と PMT に載る。
|
|
@@ -96,7 +107,7 @@ export declare function pmtSection(serviceId: number, esPid: number, componentTa
|
|
|
96
107
|
* ふつうの PMT。映像・音声のような ES を並べる。
|
|
97
108
|
*
|
|
98
109
|
* ロゴ用の `pmtSection` と違って中身を選べる。局を選り分ける
|
|
99
|
-
* [service-filter.ts](
|
|
110
|
+
* [service-filter.ts](service-filter.ts) を試すのに要る
|
|
100
111
|
*/
|
|
101
112
|
export declare function programMap(serviceId: number, pcrPid: number,
|
|
102
113
|
/** `[種別, PID]`。**3つ目は記述子**の並び (字幕の部品タグなど) */
|
|
@@ -113,6 +124,13 @@ export declare function bxmlDescriptor(options?: {
|
|
|
113
124
|
dataComponentId?: number;
|
|
114
125
|
entryPoint?: boolean;
|
|
115
126
|
}): number[];
|
|
127
|
+
/**
|
|
128
|
+
* 字幕の ES (stream_type 0x06) に付ける記述子。**字幕の目印。**
|
|
129
|
+
*
|
|
130
|
+
* 部品タグ (stream_identifier_descriptor。ふつうの字幕は 0x30〜0x37) と、データ符号化方式記述子の
|
|
131
|
+
* data_component_id 0x0008 (字幕)。続く1バイトの DMF・時刻制御モードは denpa も ffmpeg も見ない
|
|
132
|
+
*/
|
|
133
|
+
export declare function captionDescriptors(componentTag?: number): number[];
|
|
116
134
|
export interface DiiModuleSpec {
|
|
117
135
|
moduleId: number;
|
|
118
136
|
moduleSize: number;
|
|
@@ -135,7 +153,7 @@ export interface DiiModuleSpec {
|
|
|
135
153
|
* 載せられない作りでは CS を取りこぼす経路を試せない。
|
|
136
154
|
*/
|
|
137
155
|
export declare function diiSection(downloadId: number, blockSize: number, modules: DiiModuleSpec | DiiModuleSpec[],
|
|
138
|
-
/**
|
|
156
|
+
/** カルーセルのバージョン。**同じ番号で送り直しても組み立て直されない** */
|
|
139
157
|
transactionId?: number): Uint8Array;
|
|
140
158
|
/** DDB。モジュールを割ったブロックを1つ運ぶ */
|
|
141
159
|
export declare function ddbSection(downloadId: number, moduleId: number, moduleVersion: number, blockNumber: number, block: Uint8Array): Uint8Array;
|
package/dist/synth.js
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
* TS のセクションを組み立てる。
|
|
3
3
|
*
|
|
4
4
|
* 実チューナーが無いので、解析のテストにも偽エージェントにも「それらしい TS」が要る。
|
|
5
|
-
* 読む側 (psi.ts・eit.ts・dsmcc.ts・
|
|
5
|
+
* 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、ここだけが仕様の写し。
|
|
6
6
|
*/
|
|
7
7
|
import { joinBytes } from "./bytes.js";
|
|
8
8
|
import { PACKET, SYNC, withCrc } from "./psi.js";
|
|
9
|
-
// 組み立てる道具と一緒にここから取るテストがある (logo.test.ts) ので、そのまま出しておく
|
|
9
|
+
// 組み立てる道具と一緒にここから取るテストがある (denpa の logo.test.ts) ので、そのまま出しておく
|
|
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` が埋める)。バージョン 0・節 0/0 */
|
|
14
14
|
function head(tableId, extension) {
|
|
15
15
|
return [tableId, 0x00, 0x00, ...be(extension), 0xc1, 0x00, 0x00];
|
|
16
16
|
}
|
|
@@ -130,6 +130,28 @@ function bcdDuration(ms) {
|
|
|
130
130
|
bcd(total % 60),
|
|
131
131
|
];
|
|
132
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* シリーズ記述子 (0xD5。ARIB STD-B10 第2部)。
|
|
135
|
+
*
|
|
136
|
+
* series_id(16) / repeat_label(4) program_pattern(3) expire_date_valid_flag(1) /
|
|
137
|
+
* expire_date(16) / episode_number(12) last_episode_number(12) / series_name_char。
|
|
138
|
+
* 有効期限は載せない (flag 0、日付は全ビット1)
|
|
139
|
+
*/
|
|
140
|
+
function seriesDescriptor(series) {
|
|
141
|
+
const episode = series.episode ?? 0;
|
|
142
|
+
const last = series.lastEpisode ?? 0;
|
|
143
|
+
const body = [
|
|
144
|
+
...be(series.seriesId),
|
|
145
|
+
((series.repeatLabel ?? 0) << 4) | ((series.programPattern ?? 0) << 1),
|
|
146
|
+
0xff,
|
|
147
|
+
0xff,
|
|
148
|
+
(episode >> 4) & 0xff,
|
|
149
|
+
((episode & 0x0f) << 4) | ((last >> 8) & 0x0f),
|
|
150
|
+
last & 0xff,
|
|
151
|
+
...encodeSiText(series.name ?? ""),
|
|
152
|
+
];
|
|
153
|
+
return [0xd5, body.length, ...body];
|
|
154
|
+
}
|
|
133
155
|
/**
|
|
134
156
|
* デジタルコピー制御記述子 (0xC1)。EIT の番組と PMT に載る。
|
|
135
157
|
* 中身は1バイトだけ: 記録制御 (2) 最大ビットレートの有無 (1) 部品ごとの制御の有無 (1) 出力の制御 (4)
|
|
@@ -155,6 +177,8 @@ function eventDescriptors(event) {
|
|
|
155
177
|
out.push(...event.rawDescriptors);
|
|
156
178
|
if (event.copyControl !== undefined)
|
|
157
179
|
out.push(...copyControlDescriptor(event.copyControl));
|
|
180
|
+
if (event.series !== undefined)
|
|
181
|
+
out.push(...seriesDescriptor(event.series));
|
|
158
182
|
if (event.genres !== undefined && event.genres.length > 0) {
|
|
159
183
|
const body = event.genres.flatMap(([lv1, lv2]) => [(lv1 << 4) | lv2, 0xff]);
|
|
160
184
|
out.push(0x54, body.length, ...body);
|
|
@@ -295,7 +319,7 @@ export function pmtSection(serviceId, esPid, componentTag) {
|
|
|
295
319
|
* ふつうの PMT。映像・音声のような ES を並べる。
|
|
296
320
|
*
|
|
297
321
|
* ロゴ用の `pmtSection` と違って中身を選べる。局を選り分ける
|
|
298
|
-
* [service-filter.ts](
|
|
322
|
+
* [service-filter.ts](service-filter.ts) を試すのに要る
|
|
299
323
|
*/
|
|
300
324
|
export function programMap(serviceId, pcrPid,
|
|
301
325
|
/** `[種別, PID]`。**3つ目は記述子**の並び (字幕の部品タグなど) */
|
|
@@ -337,6 +361,15 @@ export function bxmlDescriptor(options = {}) {
|
|
|
337
361
|
];
|
|
338
362
|
return [0xfd, body.length, ...body];
|
|
339
363
|
}
|
|
364
|
+
/**
|
|
365
|
+
* 字幕の ES (stream_type 0x06) に付ける記述子。**字幕の目印。**
|
|
366
|
+
*
|
|
367
|
+
* 部品タグ (stream_identifier_descriptor。ふつうの字幕は 0x30〜0x37) と、データ符号化方式記述子の
|
|
368
|
+
* data_component_id 0x0008 (字幕)。続く1バイトの DMF・時刻制御モードは denpa も ffmpeg も見ない
|
|
369
|
+
*/
|
|
370
|
+
export function captionDescriptors(componentTag = 0x30) {
|
|
371
|
+
return [0x52, 0x01, componentTag, 0xfd, 0x03, 0x00, 0x08, 0x3d];
|
|
372
|
+
}
|
|
340
373
|
/** DSM-CC のセクションで包む */
|
|
341
374
|
function dsmccSection(tableId, message) {
|
|
342
375
|
return withCrc([...head(tableId, 0), ...message]);
|
|
@@ -349,7 +382,7 @@ function dsmccSection(tableId, message) {
|
|
|
349
382
|
* 載せられない作りでは CS を取りこぼす経路を試せない。
|
|
350
383
|
*/
|
|
351
384
|
export function diiSection(downloadId, blockSize, modules,
|
|
352
|
-
/**
|
|
385
|
+
/** カルーセルのバージョン。**同じ番号で送り直しても組み立て直されない** */
|
|
353
386
|
transactionId = 1) {
|
|
354
387
|
const list = Array.isArray(modules) ? modules : [modules];
|
|
355
388
|
const entries = list.flatMap((module) => {
|
|
@@ -428,7 +461,7 @@ export function logoModule(logoType, logos) {
|
|
|
428
461
|
}
|
|
429
462
|
/*
|
|
430
463
|
* --- データ放送のテストで使う定番の割り振り ---
|
|
431
|
-
* bml / data-timeline / recorded-bml の3つのテストが、同じ表と同じ組み立てを
|
|
464
|
+
* denpa の bml / data-timeline / recorded-bml の3つのテストが、同じ表と同じ組み立てを
|
|
432
465
|
* それぞれに書いていた。番号そのものに意味は無く、揃っていることに意味がある。
|
|
433
466
|
*/
|
|
434
467
|
export const BML_TS = {
|