@danything/arib 2.1.0 → 2.3.0
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 +39 -2
- package/dist/bits.d.ts +25 -0
- package/dist/bits.js +66 -0
- package/dist/drcs-smooth.d.ts +1 -1
- package/dist/drcs-smooth.js +1 -1
- package/dist/eit.d.ts +14 -2
- package/dist/eit.js +46 -31
- package/dist/mh-eit.d.ts +43 -0
- package/dist/mh-eit.js +275 -0
- package/dist/mmt-media.d.ts +170 -0
- package/dist/mmt-media.js +539 -0
- package/dist/mmt-service-filter.d.ts +44 -0
- package/dist/mmt-service-filter.js +166 -0
- package/dist/mmt-si.d.ts +183 -0
- package/dist/mmt-si.js +456 -0
- package/dist/mmtp.d.ts +84 -0
- package/dist/mmtp.js +232 -0
- package/dist/psi.d.ts +4 -2
- package/dist/psi.js +3 -3
- package/dist/service-filter.js +7 -6
- package/dist/synth-mmt-av.d.ts +83 -0
- package/dist/synth-mmt-av.js +336 -0
- package/dist/synth-mmt.d.ts +176 -0
- package/dist/synth-mmt.js +476 -0
- package/dist/synth.d.ts +5 -1
- package/dist/synth.js +4 -4
- package/dist/tlv-ip.d.ts +44 -0
- package/dist/tlv-ip.js +118 -0
- package/dist/tlv.d.ts +43 -0
- package/dist/tlv.js +119 -0
- package/dist/ttml.d.ts +25 -0
- package/dist/ttml.js +455 -0
- package/package.json +5 -3
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* チャンネル丸ごとの TLV のバイト列から、1 つの局のぶんだけを抜き出す。TS の `service-filter.ts` に当たり、
|
|
3
|
+
* 出力も TLV のバイト列のまま (TLV のパケットを 1 バイトも変えずに、残すものだけを並べる)。
|
|
4
|
+
*
|
|
5
|
+
* 局を見分けるのは MPT (MMT_package_id が service_id)。MPT は IP の並び (`tlv-ip.ts` の `flow`) の中を
|
|
6
|
+
* 運ばれ、MMTP の packet_id はその並びの中でだけ決まっているので、残すかどうかは並びと packet_id の組で決める。
|
|
7
|
+
*
|
|
8
|
+
* - 残す … TLV-SI (TLV-NIT など)、IP のヘッダーを圧縮していない IP (NTP)、その局の MPT が載った並びの信号
|
|
9
|
+
* (PLT・MPT・番組表・ECM)、その局の MPT が挙げるアセット (映像・音声・字幕) の MPU
|
|
10
|
+
* - 落とす … 詰め物、ほかの局の MPT とそのアセット、PLT がほかの局だけを挙げている並び
|
|
11
|
+
*
|
|
12
|
+
* 実機のケーブルの BS4K は、1 つの TLV のストリームに局が 1 つ (IP の並びも 1 つ) だったので、たいていは
|
|
13
|
+
* 詰め物のほかは全部残る。AMT (局ごとの IP の宛先) は 0.8 秒の間に来なかったので使わない。
|
|
14
|
+
* MPT は 0.1 秒おきに来ていた
|
|
15
|
+
*/
|
|
16
|
+
import { concatBytes } from "./bytes.js";
|
|
17
|
+
import { parseMpt, parsePlt, TABLE_MPT, TABLE_PLT, } from "./mmt-si.js";
|
|
18
|
+
import { MESSAGE_PA, messageTables, parseMessage, parseMmtp, PAYLOAD_SIGNALING, SignalingAssembler, } from "./mmtp.js";
|
|
19
|
+
import { TlvIpReader } from "./tlv-ip.js";
|
|
20
|
+
import { TLV_COMPRESSED_IP, TLV_NULL, TlvStream } from "./tlv.js";
|
|
21
|
+
/**
|
|
22
|
+
* MPT を読むまで取っておく TLV のパケットの数の上限。**選局したての先頭を捨てない** (`ServiceFilter` と同じ)。
|
|
23
|
+
* MPT は 0.1 秒おきに来るので、38 Mbps でもふつうは 400 個ほどで足りる
|
|
24
|
+
*/
|
|
25
|
+
const HOLD_MOST = 8192;
|
|
26
|
+
/**
|
|
27
|
+
* 1 つの局に絞る。
|
|
28
|
+
*
|
|
29
|
+
* その局の MPT を読むまでは、MPU (映像・音声) を出さずに取っておき、読んだら MPT の後ろに出す
|
|
30
|
+
* (並びは届いた順のまま)。信号は待たずに出す
|
|
31
|
+
*/
|
|
32
|
+
export class MmtServiceFilter {
|
|
33
|
+
serviceId;
|
|
34
|
+
tlv = new TlvStream();
|
|
35
|
+
ip = new TlvIpReader();
|
|
36
|
+
signaling = new SignalingAssembler();
|
|
37
|
+
flows = new Map();
|
|
38
|
+
held = [];
|
|
39
|
+
mptNow = null;
|
|
40
|
+
/** @param serviceId 残す局 (MPT の MMT_package_id) */
|
|
41
|
+
constructor(serviceId) {
|
|
42
|
+
this.serviceId = serviceId;
|
|
43
|
+
}
|
|
44
|
+
/** その局の MPT を読めたか。読めるまで映像と音声は 1 バイトも出ない (届いたものは取っておく) */
|
|
45
|
+
get ready() {
|
|
46
|
+
return this.mptNow !== null;
|
|
47
|
+
}
|
|
48
|
+
/** 最後に読んだ、その局の MPT。読むまでは null */
|
|
49
|
+
get mpt() {
|
|
50
|
+
return this.mptNow;
|
|
51
|
+
}
|
|
52
|
+
/** 任意の長さの TLV のバイト列を渡すと、残すぶんを返す */
|
|
53
|
+
filter(chunk) {
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const packet of this.tlv.feed(chunk)) {
|
|
56
|
+
if (packet.type === TLV_NULL)
|
|
57
|
+
continue;
|
|
58
|
+
// MMTP は圧縮した IP で来る。TLV-SI と、圧縮していない IP (NTP) はそのまま残す
|
|
59
|
+
if (packet.type !== TLV_COMPRESSED_IP) {
|
|
60
|
+
out.push(packet.bytes);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const datagram = this.ip.read(packet);
|
|
64
|
+
const mmtp = datagram === null ? null : parseMmtp(datagram.payload);
|
|
65
|
+
if (datagram === null || mmtp === null)
|
|
66
|
+
continue;
|
|
67
|
+
const flow = this.flow(datagram.flow);
|
|
68
|
+
const packetId = mmtp.packetId;
|
|
69
|
+
// ほかの局だけの並びでも信号は読み続ける (後の PLT がこの局を挙げたら出し始める)。出すかは読んだあとで決める
|
|
70
|
+
if (mmtp.payloadType === PAYLOAD_SIGNALING) {
|
|
71
|
+
const before = flow.own;
|
|
72
|
+
for (const raw of this.signaling.feed(datagram.flow, mmtp))
|
|
73
|
+
this.readSignaling(flow, raw);
|
|
74
|
+
if (flow.foreign || flow.foreignMpt.has(packetId))
|
|
75
|
+
continue;
|
|
76
|
+
out.push(packet.bytes);
|
|
77
|
+
// MPT を読んだ (読み直した)。取っておいたもののうち、この局のぶんを出す
|
|
78
|
+
if (flow.own !== null && flow.own !== before)
|
|
79
|
+
this.release(out);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (flow.foreign)
|
|
83
|
+
continue;
|
|
84
|
+
if (flow.own === null)
|
|
85
|
+
this.hold(datagram.flow, packetId, packet.bytes);
|
|
86
|
+
else if (flow.own.has(packetId))
|
|
87
|
+
out.push(packet.bytes);
|
|
88
|
+
}
|
|
89
|
+
return concatBytes(out);
|
|
90
|
+
}
|
|
91
|
+
flow(key) {
|
|
92
|
+
let flow = this.flows.get(key);
|
|
93
|
+
if (flow === undefined) {
|
|
94
|
+
flow = { foreignMpt: new Set(), foreign: false, own: null };
|
|
95
|
+
this.flows.set(key, flow);
|
|
96
|
+
}
|
|
97
|
+
return flow;
|
|
98
|
+
}
|
|
99
|
+
readSignaling(flow, raw) {
|
|
100
|
+
const message = parseMessage(raw);
|
|
101
|
+
if (message === null || message.messageId !== MESSAGE_PA)
|
|
102
|
+
return;
|
|
103
|
+
for (const table of messageTables(message)) {
|
|
104
|
+
if (table[0] === TABLE_PLT) {
|
|
105
|
+
const plt = parsePlt(table);
|
|
106
|
+
if (plt === null)
|
|
107
|
+
continue;
|
|
108
|
+
flow.foreignMpt.clear();
|
|
109
|
+
let mine = false;
|
|
110
|
+
for (const { packageId, location } of plt.packages) {
|
|
111
|
+
if (packageId === this.serviceId)
|
|
112
|
+
mine = true;
|
|
113
|
+
else if (location.type === 0 && location.packetId !== null)
|
|
114
|
+
flow.foreignMpt.add(location.packetId);
|
|
115
|
+
}
|
|
116
|
+
flow.foreign = !mine && plt.packages.length > 0;
|
|
117
|
+
}
|
|
118
|
+
else if (table[0] === TABLE_MPT) {
|
|
119
|
+
// 持ち続けるのでコピーする (表は届いたチャンクの一部を指す。`TlvStream`)
|
|
120
|
+
const mpt = parseMpt(table.slice());
|
|
121
|
+
if (mpt === null || mpt.packageId !== this.serviceId)
|
|
122
|
+
continue;
|
|
123
|
+
this.mptNow = mpt;
|
|
124
|
+
flow.own = ownPacketIds(mpt);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** MPT を読む前のパケットを取っておく。**コピーする** (パケットは届いたチャンクの一部を指す。`TlvStream`) */
|
|
129
|
+
hold(flow, packetId, bytes) {
|
|
130
|
+
this.held.push({ flow, packetId, bytes: bytes.slice() });
|
|
131
|
+
// 溢れたら古い半分を捨てる (`ServiceFilter` と同じ)
|
|
132
|
+
if (this.held.length > HOLD_MOST)
|
|
133
|
+
this.held = this.held.slice(this.held.length - HOLD_MOST / 2);
|
|
134
|
+
}
|
|
135
|
+
release(out) {
|
|
136
|
+
const rest = [];
|
|
137
|
+
for (const held of this.held) {
|
|
138
|
+
const flow = this.flows.get(held.flow);
|
|
139
|
+
// ほかの局だけの並びと分かったものは捨てる。まだ分からない並びのものは取っておく
|
|
140
|
+
if (flow === undefined || flow.foreign)
|
|
141
|
+
continue;
|
|
142
|
+
if (flow.own === null)
|
|
143
|
+
rest.push(held);
|
|
144
|
+
else if (flow.own.has(held.packetId))
|
|
145
|
+
out.push(held.bytes);
|
|
146
|
+
}
|
|
147
|
+
this.held = rest;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** MPT が挙げる、同じ IP の並びの packet_id (アセットと ECM) */
|
|
151
|
+
function ownPacketIds(mpt) {
|
|
152
|
+
const ids = new Set();
|
|
153
|
+
const add = (location) => {
|
|
154
|
+
if (location.type === 0 && location.packetId !== null)
|
|
155
|
+
ids.add(location.packetId);
|
|
156
|
+
};
|
|
157
|
+
for (const access of mpt.access)
|
|
158
|
+
add(access.location);
|
|
159
|
+
for (const asset of mpt.assets) {
|
|
160
|
+
for (const location of asset.locations)
|
|
161
|
+
add(location);
|
|
162
|
+
for (const access of asset.access)
|
|
163
|
+
add(access.location);
|
|
164
|
+
}
|
|
165
|
+
return ids;
|
|
166
|
+
}
|
package/dist/mmt-si.d.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 4K の放送 (MMT/TLV) の信号の表を読む (ARIB STD-B60、TLV-SI は ARIB STD-B32 第 3 部)。
|
|
3
|
+
* TS の `psi.ts` に当たる。
|
|
4
|
+
*
|
|
5
|
+
* 表は 2 か所から来る。
|
|
6
|
+
*
|
|
7
|
+
* - TLV-SI (TLV の種類 0xFE) … TLV-NIT。TS の NIT と同じ形式のセクションで、記述子も TS と同じ (タグ 1 バイト)
|
|
8
|
+
* - MMTP の信号メッセージ (`mmtp.ts`) … PA メッセージの PLT・MPT と、M2 セクションメッセージの MH-SDT・MH-EIT・MH-TOT・ECM。
|
|
9
|
+
* 記述子のタグは 2 バイトで、**タグが 0xF000 未満なら長さは 1 バイト、0xF000 以上なら 2 バイト**
|
|
10
|
+
*
|
|
11
|
+
* 局名や番組名の文字は UTF-8 (TS の ARIB の 8 単位符号ではない)。
|
|
12
|
+
* 実機のケーブルの BS4K では、PLT・MPT・MH-SDT[other]・MH-EIT・TLV-NIT を読めた。どれもスクランブルされていない。
|
|
13
|
+
*/
|
|
14
|
+
import { type FoundService, type Service } from "./psi.js";
|
|
15
|
+
export declare const TABLE_MPT = 32;
|
|
16
|
+
export declare const TABLE_PLT = 128;
|
|
17
|
+
/** 局名・番組名の文字 (UTF-8)。壊れた並びは U+FFFD になる */
|
|
18
|
+
export declare function mmtText(data: Uint8Array): string;
|
|
19
|
+
/** MMT の記述子の並びを (タグ, 中身) に切り分ける。タグが 0xF000 以上なら長さは 2 バイト */
|
|
20
|
+
export declare function mmtDescriptors(data: Uint8Array): Generator<[number, Uint8Array]>;
|
|
21
|
+
/** TLV-SI の中身を、セクションに切り分ける。詰め物 (0xFF) から先は無い。壊れたセクションは落とす */
|
|
22
|
+
export declare function tlvSiSections(payload: Uint8Array): Uint8Array[];
|
|
23
|
+
/**
|
|
24
|
+
* MMT のパケットの在りか (MMT_general_location_info)。
|
|
25
|
+
* 0 は同じ IP の並びの packet_id、1 と 2 はほかの IPv4・IPv6 の並びの packet_id、5 は URL
|
|
26
|
+
*/
|
|
27
|
+
export interface MmtLocation {
|
|
28
|
+
type: number;
|
|
29
|
+
/** 0・1・2 のとき */
|
|
30
|
+
packetId: number | null;
|
|
31
|
+
/** 1・2 のときの宛先 */
|
|
32
|
+
destination: string | null;
|
|
33
|
+
destinationPort: number | null;
|
|
34
|
+
}
|
|
35
|
+
export interface PltPackage {
|
|
36
|
+
/** MMT_package_id。放送では service_id と同じ値 */
|
|
37
|
+
packageId: number;
|
|
38
|
+
/** その package の MPT の在りか */
|
|
39
|
+
location: MmtLocation;
|
|
40
|
+
}
|
|
41
|
+
export interface Plt {
|
|
42
|
+
version: number;
|
|
43
|
+
packages: PltPackage[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* PLT (package list table)。**どの package の MPT がどの packet_id で来るか**を持つ。
|
|
47
|
+
* IP で運ぶもの (IP_delivery) の並びは読まない
|
|
48
|
+
*/
|
|
49
|
+
export declare function parsePlt(table: Uint8Array): Plt | null;
|
|
50
|
+
/** スクランブルの方式と、ECM の在りか (アクセス制御記述子) */
|
|
51
|
+
export interface AccessControl {
|
|
52
|
+
/** CA_system_id。B-CAS と同じ 0x0005 でも、4K の放送の ECM は B-CAS のカードでは読めない */
|
|
53
|
+
caSystemId: number;
|
|
54
|
+
location: MmtLocation;
|
|
55
|
+
}
|
|
56
|
+
export interface MptAsset {
|
|
57
|
+
/** asset_type。映像 `hev1`、音声 `mp4a`、字幕 `stpp` など */
|
|
58
|
+
type: string;
|
|
59
|
+
assetId: Uint8Array;
|
|
60
|
+
locations: MmtLocation[];
|
|
61
|
+
/** MH-ストリーム識別記述子の component_tag。無ければ null */
|
|
62
|
+
componentTag: number | null;
|
|
63
|
+
/** そのアセットにだけ掛かるアクセス制御記述子 */
|
|
64
|
+
access: AccessControl[];
|
|
65
|
+
/** アセットの記述子の並び (`mmtDescriptors` で読む) */
|
|
66
|
+
descriptors: Uint8Array;
|
|
67
|
+
}
|
|
68
|
+
export interface Mpt {
|
|
69
|
+
version: number;
|
|
70
|
+
/** MMT_package_id。放送では service_id と同じ値 */
|
|
71
|
+
packageId: number;
|
|
72
|
+
/** package 全体に掛かるアクセス制御記述子 */
|
|
73
|
+
access: AccessControl[];
|
|
74
|
+
/** package 全体の記述子の並び */
|
|
75
|
+
descriptors: Uint8Array;
|
|
76
|
+
assets: MptAsset[];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* MPT (MMT package table)。**局の中身の一覧**で、TS の PMT に当たる。
|
|
80
|
+
* アセット (映像・音声・字幕) ごとに、型と packet_id と記述子を持つ。読めない在りかの種類が来たら、
|
|
81
|
+
* そこまでに読めたアセットを返す
|
|
82
|
+
*/
|
|
83
|
+
export declare function parseMpt(table: Uint8Array): Mpt | null;
|
|
84
|
+
export interface MhService extends Service {
|
|
85
|
+
/** 事業者名 (MH-サービス記述子) */
|
|
86
|
+
providerName: string;
|
|
87
|
+
/**
|
|
88
|
+
* free_CA_mode が 0 か。**復号が要るかの判断には使えない。** 実機の BS4K は 0 なのに、映像と音声は
|
|
89
|
+
* スクランブルされていた。スクランブルされているかは MPT のアクセス制御記述子と、MMTP の印で見る
|
|
90
|
+
*/
|
|
91
|
+
isFree: boolean;
|
|
92
|
+
eitSchedule: boolean;
|
|
93
|
+
eitPresentFollowing: boolean;
|
|
94
|
+
}
|
|
95
|
+
export interface MhSdt {
|
|
96
|
+
/** MH-SDT[other] (ほかの TLV のストリームのもの) なら true */
|
|
97
|
+
other: boolean;
|
|
98
|
+
tlvStreamId: number;
|
|
99
|
+
originalNetworkId: number;
|
|
100
|
+
version: number;
|
|
101
|
+
sectionNumber: number;
|
|
102
|
+
lastSectionNumber: number;
|
|
103
|
+
services: MhService[];
|
|
104
|
+
}
|
|
105
|
+
/** MH-SDT。局名と種類。TS の SDT と同じ並びで、記述子と文字が MMT のもの */
|
|
106
|
+
export declare function parseMhSdt(section: Uint8Array): MhSdt | null;
|
|
107
|
+
/** TLV-NIT の TLV のストリームの 1 件 */
|
|
108
|
+
export interface TlvNetworkStream {
|
|
109
|
+
tlvStreamId: number;
|
|
110
|
+
originalNetworkId: number;
|
|
111
|
+
/** サービスリスト記述子の局 (service_id と種類) */
|
|
112
|
+
services: {
|
|
113
|
+
serviceId: number;
|
|
114
|
+
serviceType: number;
|
|
115
|
+
}[];
|
|
116
|
+
/** 記述子の並び (TS と同じタグ 1 バイトのもの。`psi.descriptors` で読む) */
|
|
117
|
+
descriptors: Uint8Array;
|
|
118
|
+
}
|
|
119
|
+
export interface TlvNetwork {
|
|
120
|
+
/** TLV-NIT[other] なら true */
|
|
121
|
+
other: boolean;
|
|
122
|
+
networkId: number;
|
|
123
|
+
version: number;
|
|
124
|
+
sectionNumber: number;
|
|
125
|
+
lastSectionNumber: number;
|
|
126
|
+
/** ネットワーク名 (UTF-8)。「高度BSデジタル放送」 */
|
|
127
|
+
name: string;
|
|
128
|
+
streams: TlvNetworkStream[];
|
|
129
|
+
}
|
|
130
|
+
/** TLV-NIT。TS の NIT と同じ並びで、TS の代わりに TLV のストリームが並ぶ */
|
|
131
|
+
export declare function parseTlvNit(section: Uint8Array): TlvNetwork | null;
|
|
132
|
+
/** MH-TOT から放送の現在時刻 (epoch ms) を読む。TS の TOT と同じく、table_id のあとに MJD + BCD の 5 バイト */
|
|
133
|
+
export declare function parseMhTot(section: Uint8Array): number | null;
|
|
134
|
+
/** 信号の表 1 つと、どこから来たか */
|
|
135
|
+
export interface MmtTable {
|
|
136
|
+
/** IP の並び (`tlv-ip.ts` の `flow`)。TLV-SI なら null */
|
|
137
|
+
flow: string | null;
|
|
138
|
+
/** 運んだ MMTP の packet_id。TLV-SI なら null */
|
|
139
|
+
packetId: number | null;
|
|
140
|
+
/** 表の先頭 (table_id) から。M2 セクションと TLV-SI は CRC32 を確かめてある */
|
|
141
|
+
table: Uint8Array;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* TLV のバイト列から、信号の表を全部取り出す。番組表 (`mh-eit.ts`) や局の一覧を読むところの入口で、
|
|
145
|
+
* TS で `PacketStream` と `SectionAssembler` を並べるのに当たる。
|
|
146
|
+
*
|
|
147
|
+
* MPU (映像・音声) の MMTP は、ヘッダーだけ読んで読み飛ばす
|
|
148
|
+
*/
|
|
149
|
+
export declare class MmtTableStream {
|
|
150
|
+
private readonly tlv;
|
|
151
|
+
private readonly ip;
|
|
152
|
+
private readonly signaling;
|
|
153
|
+
feed(chunk: Uint8Array): Generator<MmtTable>;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 流れてくる TLV を読んで、局の一覧を作る。**TS の `ServiceReader` に当たる** (チャンネルスキャンで使う)。
|
|
157
|
+
*
|
|
158
|
+
* TLV-NIT[actual] と MH-SDT[actual] が両方来たら揃ったとみなす。局は MH-SDT[actual] のもので、
|
|
159
|
+
* 局の元の放送は MH-SDT の original_network_id (ケーブルで受けた BS4K なら 0x000B)、TSID の代わりに tlv_stream_id を入れる。
|
|
160
|
+
* TLV にはリモコン番号が無い (TLV-NIT に見当たらない) ので null。
|
|
161
|
+
*
|
|
162
|
+
* 局ごとの CA_system_id は、PLT から package (= service_id) の MPT を引き、そのアクセス制御記述子から読む (`caSystemIdsOf`)。
|
|
163
|
+
* free_CA_mode は使わない。実機の BS4K は 0 なのに、映像と音声はスクランブルされていた
|
|
164
|
+
*/
|
|
165
|
+
export declare class TlvServiceReader {
|
|
166
|
+
private readonly tables;
|
|
167
|
+
private plt;
|
|
168
|
+
/** package_id (= service_id) → MPT */
|
|
169
|
+
private readonly mpts;
|
|
170
|
+
network: TlvNetwork | null;
|
|
171
|
+
transport: MhSdt | null;
|
|
172
|
+
get complete(): boolean;
|
|
173
|
+
/** PLT が来て、そこにある package の MPT が全部 1 回は来たか。スキャンで、局ごとの CA_system_id が分かるまで少し長く読むのに使う */
|
|
174
|
+
get mptsKnown(): boolean;
|
|
175
|
+
/** 任意の長さのバイト列を渡す。揃ったら true */
|
|
176
|
+
feed(chunk: Uint8Array): boolean;
|
|
177
|
+
/** 録画の対象になる種類の局だけ (`psi.SERVICE_TYPES`)。揃うまでは空 */
|
|
178
|
+
services(): FoundService[];
|
|
179
|
+
/** その局の MPT のアクセス制御記述子 (package 全体とアセットのもの)。MPT が来なかった局は空 */
|
|
180
|
+
accessOf(serviceId: number): AccessControl[];
|
|
181
|
+
/** その局の CA_system_id (重なりなし・小さい順)。アクセス制御記述子が無い・MPT が来なかった局は空 */
|
|
182
|
+
caSystemIdsOf(serviceId: number): number[];
|
|
183
|
+
}
|