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バイトの場合 最後のパケットは次のページに続く