要約

  • RFC 3533 は OggS、ストリーム番号、ページ順序、セグメント表、CRC を使い、壊れた領域の後でも一枚の Ogg ページを見つけて検査できるようにした。
  • しかし一つのコーデック・パケットは複数ページにまたがり得る。後半のページが正しくても、前半、時間の意味、真正性、同期、再生は証明されない。

完全に正しいページほど危うい誤解を招くことがある。ヘッダーは読め、長さも合い、CRC も一致する。ところがそのページの最初のパケットは「前ページから継続」と記され、必要な前半は失われている。RFC 3533 が設計した検査は失敗していない。検査対象をメディア全体に拡張した人間の推論が失敗している。

RFC 3533 は 2003 年 5 月、Independent stream の Informational RFC として公開され、Ogg Encapsulation Format Version 0 を定義した。これはコーデックの仕様ではない。エンコーダーが論理ビットストリームをパケットに分け、Ogg がパケットをセグメントへ分割し、連続するセグメントをページへ収める。複数の論理ストリームがあれば、それぞれのページを一つの物理 Ogg ビットストリームへ多重化する。容器と内容解釈は別の責任である。

四バイトの capture pattern OggS はページ境界を探す目印になる。破損部の後で再同期するには有用だが、文字列を見つけただけでは候補にすぎない。解析器はヘッダーと segment table を読み、ページ長を確定し、CRC を計算する。32 ビット CRC の多項式は 0x04c11db7 である。Verified となった erratum 8825 は、CRC フィールドをゼロにしたヘッダーとページ内容の双方が計算対象だと明確にした。これはヘッダーだけの検査ではないが、暗号署名でもない。

lacing value はパケットとページが同じ境界を持たないことを示す。255 は同じパケットが次のセグメントへ続くことを表し、255 未満でパケットが終わる。0 は空パケットを表す場合も、長さが 255 の倍数であるパケットを閉じる場合もある。さらにヘッダーのフラグは、ページ先頭のパケットが前ページから続くかを示す。一つのパケットが複数ページを使うのは例外処理ではなく正規の構造である。

page sequence number は各論理ストリーム内で独立に増える。音声、映像、メタデータのページが物理ストリームで交互に現れても、どの論理ストリームでページを失ったか検出できる。ただし検出は復元ではない。飛び番号は失ったバイトを返さず、影響を受けたサンプルやフレームも決めない。連番であっても、アプリケーションが全ページを保存し、全パケットを再構成し、全フレームを出力した証拠にはならない。

bitstream serial number は多重化解除のための局所的な識別子である。RFC はランダムに作られ、内容やエンコーダーとは無関係だと明記する。作品、作者、機器、利用者、権利者、由来を識別する値ではない。データベースがこれを恒久的なコンテンツ ID として扱えば、規格にない意味を付与することになる。

BOS と EOS は論理ストリームの始点と終点を表す。BOS ページには media mapping が定めるコーデック識別情報が入り、データより前に追加ヘッダーが続くこともある。EOS ページは位置と終端フラグだけを持つ nil page でもよい。grouping は複数ストリームを同時に始めてページを交差させ、chaining は完全な物理ストリームを順に連結する。境界が見えることと、境界内の意図した内容がすべて存在することは別である。

granule position も汎用時刻ではない。RFC 3533 は Ogg に時間の概念はなく、単位を持たない増加位置だけを知ると説明する。音声 mapping はサンプル数、映像 mapping はフレーム数として意味づけられる。ページ上で一つもパケットが終了しない場合はマイナス一も使える。時間への変換は、コーデックと mapping を知る上位層の仕事である。

後年の Opus mapping はこの分離を実物で示す。RFC 7845 と、それを置き換えた RFC 9639 は、48 kHz の granule clock、pre-skip、末尾の trimming、seek の規則を定める。RFC 6716 は Opus コーデック自体を定める。これらは基礎 Ogg ヘッダーが自動的に持つ意味ではなく、特定のコーデックを容器へ載せる契約から生じる。

MIME type の履歴も限定された証拠である。RFC 3534 は application/ogg を登録し、RFC 5334 はそれを obsolete として用途を再定義し、audio/ogg と video/ogg を追加した。IANA の登録簿は名称を調整する。正しい type は処理プログラムの選択を助けるが、個別ファイルのページ連続性、対応コーデック、安全性、同期、再生成功を保証しない。

セキュリティも CRC から導けない。RFC 3533 は容器や内部ストリームに汎用暗号化や署名を提供しない。別の内容形式が保護を実装すれば Ogg はそれを運べるが、CRC 自体が真正性を得るわけではない。文書は manipulated bitstream、buffer overflow などを正しく扱うよう警告する。構文が通った後にも、長さ、メモリ、コーデック状態を巡る攻撃面は残る。

errata の状態も混同してはならない。6796 は例の「pages」を「segments」へ直し Verified。8825 は CRC がヘッダーと内容を覆うことを明確にし Verified。一方、CRC32 の反射など厳密なパラメーターが不足すると指摘する技術的 erratum 8824 は Reported のままである。未解決の懸念として記録することと、確定した改訂として扱うことは異なる。

監査可能な受領証は、バイト受信、capture pattern 検出、ページ境界確定、segment table 解析、CRC 検証、論理ストリームごとの連続性、完全パケット再構成、media mapping 選択、コーデック・ヘッダー受理、granule 変換、多重ストリーム同期、デコード、レンダリング、利用者が観測した結果までを分ける。RFC 3533 は早い段階を強くした。その強さを最終結果へ無断で転用しなかった点が重要である。

情報源