Oggページ

Oggページは Ogg ビットストリームに含まれるデータのサイズ可変なユニットである。

概要 
複数のコーデックを単一のファイルまたはストリームにまとめる(mux)のがマルチメディアコンテナフォーマットの目的の一つである。

Oggフォーマットを作った Christopher Montgomery が持つ視点は、「muxed codec dataはコーデックによって使用されるデータのユニットから分離された抽象的なレイヤーであるべきで、それはデコードの際に必要となるバッファの量を制限するためだ」というものである。彼の意見はXiph.org Foundationで働く他の開発者にも支持されており、このことは AVI,QuickTime,MPEGのような他のフォーマットと比べて技術的な長所であるとのこと。

各 Oggページはデータのタイムオフセットを持っていて、 これによりストリーミング時の効果的なシークが可能になり時間的な正確性が得られる。その他のフォーマットでは対照的に、シーク情報を得るためにストリームのバイト位置をシークするか、もしくはTOCを信頼する方法を使う。

構造 
すべての Oggページは4バイトのmagic「OggS（4F 67 67 53）」で始まる。同期を見失った場合、デコーダはデコード再開のため、次に出現するOggSを探すことができる。この文字列の次にはOgg version 0を示すnull byteが続く。 2004年の時点ではOggの公式バージョンはこれのみであり、より新しいバージョンの計画はない。

次のバイトではtype flagsを指定する。
 1
    データは最後のページから続けられる 
 2
    ストリームの最初のページである 
 4
    ストリームの最後のページである 

これらの値は addition または OR によって結合される。

次の 8バイト（または 64ビット）は absolute granule position と呼ばれ、そのページからデコードされるデータの時間オフセットを指定している。この数が意味するものはビデオコーデックにより異なるが、しばしば動画データのサンプルやフレームを参照する。Theoraのように、このフィールドをキーフレームと中間フレーム(interframes)に分離して使っているコーデックもある。

次の4バイトはこのページが属するstream serial numberであり、その次の4バイトはストリーム内のpage sequence numberである。

次の（23バイト目から始まる）4バイトはページのCRCチェックサムである。このフィールドの値は変化するため、このフィールドをゼロとしてチェックの結果が算出される。

27バイト目は0～255の値を取り、含まれているセグメント数を指定する。これは次に続くセグメントテーブルのサイズでもあり、単位はバイトである。セグメントテーブルの各バイトはセグメントの長さを示す。各セグメントは長さにおいて 255バイトまでの長さを取り得、ページによって結束される。

 segment ＜ 255 の場合
    パケットの終りを示し、次のセグメントは新しいパケットを始める。
 パケットが255の倍数で終わった場合
    0バイトの長さのセグメント内で終わるだろう 
 そのページの最後のセグメントが 255バイトの場合
    最後のパケットは次のページに続く

外部リンク 
 Ogg Page Structure

Xiph.Org
音声ファイルフォーマット
コーデック