局ロゴ
放送波からしか手に入らないもの。 番組表に出す PNG と、CM検出のために録画から覚えるロゴの2つがあり、 集め方も置き場も別です。エージェントは中身を読まないので、PNG は denpa が開いているストリームを 共有して自分で読みます。
ロゴを使う CM 検出そのものは cm.md、共有の決まりは agent.md。
送られてくる PNG には色の表 (PLTE/tRNS) が入っていません。 ARIB (STD-B21) では 128色 +
半透明ぶんの表は決め打ちで送られず、受け取った側が入れ直して初めて画像になります。入れないと
「パレットの無いパレット PNG」で、ブラウザは何も描きません (実機では15局ぶん取得できているのに
番組表が空でした)。入れ直すのは src/lib/ts/logo-palette.ts で、Mirakurun も aribts の TsLogo.decode
で同じことをしています。取得し直すと局によっては何時間もかかるので、置いてあるファイルは
logo.reconcile が入れ直します。
開くのは物理チャンネル丸ごとです。局を選り分けると、どの局の PMT にも載っていない CDT は まるごと落ちます。実機での実測:
| 開き方 | 読んだ量 | CDT |
|---|---|---|
| BS サービス単位 | 3分 / 427 MB | 0 |
| BS チャンネル丸ごと | 100秒 × 4中継 | 0 |
| GR チャンネル丸ごと | 60秒 | 2 |
| GR サービス単位 | 60秒 | 0 |
普段はチューナーを使いません。 番組表集めが全チャンネルを定期的に開くので、その選局を共有
するだけで只で読めます (logo.ride。合図はエージェントの tuners。向こうの都合でいつ閉じるか
分からないので1回3分まで)。実機では BS の38局ぶんが一度の共有で揃いました。録画のストリームからは取得しません (衛星のカルーセルは数百KBあり、
録画のストリームに混ぜたくないため。同じチャンネルなら選局を共有するのでチューナーは増えない。
共有の決まり)。
すぐ欲しいときは画面の「ロゴをいますぐ集める」(logo.sweepNow) が自分で開きます。CDT は分単位で
待つものなので、地上波は1チャンネル6分 (数十秒〜3分では実機でほとんど当たらなかった)、衛星は
下記のとおり最大20分です。空きは種別まで見て数えます
(衛星用の空きは地上波の役に立たない)。
地上波は CDT、衛星はデータカルーセル
Section titled “地上波は CDT、衛星はデータカルーセル”地上波と衛星で伝送方式が違います。 地上波は CDT (PID 0x0029) に PNG の実体、SDT の
logo_transmission_descriptor に「どの局がどのロゴを使うか」を載せてくるので、両方揃って初めて
局に配ります。衛星は CDT に載せません (CDT だけだと BS 0/38・CS 0/54。Mirakurun もネットワーク4は
DSM-CC を読みに行きます。TSFilter.ts の _enableParseDSMCC)。
衛星はデータカルーセル (DSM-CC) から取得します (src/lib/ts/logo-dsmcc.ts)。PAT →
サービス929 (エンジニアリングサービス) の PMT → stream_identifier_descriptor
の component_tag が 0x79/0x7A の ES → DII (どのモジュールが何バイトか。名前が LOGO-05 /
CS_LOGO-05 のものがロゴ) → DDB (ブロックに割られた中身) と辿ります。組み上がった
モジュールにはどの局のロゴかが入っているので、地上波と違って SDT を待ちません。
ロゴが載っている中継は1つだけです。 実機の BS はネットワーク4に26の中継がありますが、
サービス929 があったのは BS15_0 (NHK BS と同じ中継) だけで、CS の12中継には1つも
ありません。どれかは開くまで分からないので、PAT を見た時点で外れなら切り上げます
(PAT は1秒に何度も流れるので、外れは1秒ほどで諦められる)。
当たり外れは logos/satellite-relays.json に書き留めて、1週間は開き直しません。
CS のロゴも、その BS の中継から流れてきます。 BS15_0 のエンジニアリングサービスには
LOGO-00〜LOGO-05 と CS_LOGO-00〜CS_LOGO-05 が並んで載っています
(component_tag 0x79 と 0x7A)。この中継を1つ開くだけで
ネットワーク4が211局・6が28局・7が83局ぶん (モジュール162個) 揃いました。
先に来る BS のぶんで満足して打ち切らないこと。 DII で合致するモジュールは全部組み立て (logo_id は
BS と CS で別々に振られるので鍵も分ける)、閉じるか・次にどの中継へ行くかは衛星の局が全部揃ったかで決めます
(logo.missingSatellites)。「取れない局」はカルーセルを1回読み切っても来なかった局だけで、局ごとに控えます (absent)。
衛星は14分に1回しか流れてこない
Section titled “衛星は14分に1回しか流れてこない”衛星のカルーセルは流しっぱなしではありません。 BS15_0 を15分読み続けると、13分間はロゴの
ES に1パケットも流れず、14分目にまとめて来ました (BS 2768・CS 8224 パケット)。6分では運任せ
だったので、衛星だけ最大20分開きます。待つのは当たりの1中継だけで、引ければ BS と CS の
全局ぶんが手に入ります。取得できたあと15秒何も来なければ、1回読み切ったとみなして切り上げます。
一度取れた局も1週間経ったら取り直します (局のマークが変わったときのため)。上書きするだけなので、 取れなければ今のものが残ります。古さは PNG の更新時刻で見ます (列は足さない)。地上波は64×36 でない局も 取り直し (最初に 48×24 が来ることがある)、大きいものを小さいもので上書きしません。
ロゴを保存しても services.updated_at は触りません。 あれは「最後に局を取り込んだ時刻」で、
番組表はいちばん新しいものと同じ時刻の局だけを出すため (CURRENT_SERVICES)、進めるとほかの局が番組表から消えます。
取得するときの決まり
Section titled “取得するときの決まり”優先度で譲ります。 ロゴはいちばん下 (1) なので、空きが無ければエージェントが断り、開いている 最中でも番組表のほうが強ければ取り上げられます (ロゴが無くても番組表は読めるが、逆は成り立たない)。 数の大小だけで並ぶので、「番組表を集めている間はロゴを取得しない」のような特別扱いは持っていません (並びは agent.md)。
取得するのはいま選局できる局だけです。スキャンし直して消えた局まで見に行くと、開いては諦める のを繰り返し、要る局に順番が回ってきません。
何局ぶん持っているかは設定の「受信」の「受信できるチャンネル」に出します (/settings/reception#channels。取得できていないのか出し方が悪いのかを見分けるため)。
表の「局ロゴ」の列に局ごとのロゴが出て (狭い画面では局名の前)、まだ取れていない局は点線の枠になります。押すと大きく見られます。
同じ画面の「ロゴをいますぐ集める」は、残りを空いているチューナーの数まで (最大2つ)、地上波も衛星も
1つの列で地上波を先に回します (中継ごとに局が違うので、数が捌けるのはこちら)。取得するものが
無ければボタンごと出しません。
- 前の「いますぐ」が回っていても押せます。 走っている取得を畳んでから始めます (只で読む共有は別勘定で触りません)
- 進み具合を画面へ流します (
logosイベント)。1チャンネルに数分かかるので、出さないと何も 起きていないように見えます。全部持っている・空きが無いときも、その場で断ります - 自分で開けた選局は共有しません。 こちらが開くとエージェントが
tunersを送るので、それを合図に 同じチャンネルをもう1本開いて二重に読んでしまうためです。番組表集めでも録画でも、他が開けた選局は共有します
番組表の見出しでは、取れなかったロゴを DOM から取り除きません (Svelte が持っているノードを消すと、描き直したときに並びが崩れる)。 ロゴが無い局も場所は空けておきます。局名の頭が列ごとにずれると、どれがどの局か追えません。
置き場とファイル
Section titled “置き場とファイル”services.has_logo は「番組表にロゴを出すか」にそのまま使うので、ファイルを正としてときどき
突き合わせます (logo.reconcile)。置き場ごと消えることは実際にあり (PVCの作り直しなど)、列だけ
立っていると壊れた画像が並ぶうえ、「もう持っている」とみなして取得しません (実機で32局中
29局がこの状態でした)。
これは CM検出のロゴとは別物です。 CM検出が要るのは画面のどこにロゴが出ているかで、 それは自分の録画から覚えるので、PNG が揃ってもそのままでは使えません (検出のしかた)。
CM検出用のロゴは、録ったものから覚える
Section titled “CM検出用のロゴは、録ったものから覚える”録ってエンコードするときに、その録画から覚えます (logo-own.ts)。在り処もそのとき
隅の範囲から割り出し (cm.md「在り処の割り出し」)、2本目からは
当てるついでに育てます。置き場は data/logos/cm/<局ID>/own-logo-<幅>x<高さ>.bin で、
覚えた画像は設定の「受信できるチャンネル」の表の「CMロゴ」の列に出ます。押すと大きく見られ、そこで「覚え直す」で捨てられます。
チューナーは使いません (覚え方の詳細は cm.md「ロゴの覚え方」)。