AVIFファイルフォーマットのメモ
AVIFとは
画像フォーマットの一種。同画質のJPEGやWebPよりファイルサイズが小さいらしい。
AVIFはAV1(ビデオコーデック)で圧縮した画像をHEIFコンテナに保存する。
画像ファイルというより、1フレームの動画ファイルに近い。
他にビデオコーデックを使った画像フォーマットとして、同じくHEIFコンテナを使うHEICやWebPなどがある。(ちなみに、HEIFはISOBMFF準基のフォーマット)
引用しているコードは以下のリポジトリから。
単純なAVIFファイルの構造理解を目的とし、マイナー機能や詳細情報は省く。
Box
ファイル構造を見る前にBoxについて軽く説明。
ISOBMFFはBoxという最小単位で構成される。
BoxはBoxSize
(4byte)とBoxType
(4byte)からなるHeader
とData
部がある。
AVIFのBoxは大きく分けて5つある。
- ftyp
- meta
- moov
- mini
- mdat
ISOBMFF Boxをパースしてくれるサイトを使うと理解しやすいです。
ftyp(File Type Box)
ファイル形式を表すBox。ファイルの先頭に配置する必要がある。
major_brand
はファイル形式の識別子に使われるブランド名。
AVIFはここにavif(61 76 69 66)
が入る。
minor_version
はmajor_brand
のマイナーバージョンを表す4バイト整数。
compatible_brands
は互換性があるブランドを列挙できる。miaf(6D 69 61 66)
が必須。
ftypチェックコード
meta(Meta Box)
avif
ブランドがある場合は必須。画像のメタデータが入っているボックス。
以下の7つの子要素を含むことができる。
Meta Boxのパースコード
hdlr(Handler Reference Box)
メタデータのタイプを表す。HEIFはhandler
がpict
で固定。
iloc(Item Location Box)
アイテムのデータ位置を表す。
pitm(Primary Item Box)
プライマリアイテムを表す。
idat(Item Data Box)
データサイズの小さいアイテムデータを格納できる。
iprp(Item Properties Box)
アイテムに紐づくプロパティを表す。子要素としてipco
とipma
を持つ。
プロパティはipco
で定義し、ipma
で紐づける。
プロパティはdescriptive
とtransformative
の二種類あり、descriptive
は通常のメタデータ(画像サイズやビット深度など)を、transformative
はアイテムを変形させるプロパティ(回転や矩形クリッピングなど)を提供する。
ipco(Item Property Container Box)
HEIF、AVIF独自のプロパティに加え、MIAFのプロパティも定義できる。
プロパティのパースコード
よく見るプロパティ
- ispe(Image Spatial Extents) - 画像アイテムの幅と高さ
- pixi(Pixel Information) - 画像アイテムのビット深度
- av1C(AV1 Item Configuration) - AV1の構成情報
ipma(Item Property Association Box)
essential
はプロパティが必須かのフラグ。
iinf(Item Information Box)
アイテムのタイプ情報を表す。
AVIFの場合、子要素のinfe
(Item Info Entry Box)のitem_type
がav01
になる。
iref(Item Reference Box)
アイテム間の参照を表す。
moov(Movie Box)
avis
ブランドがある場合は必須。アニメーションAVIF用のメタデータが入っている。
アニメーションAVIFについては割愛。
mini(Minimized Image Box)
mif3
ブランドがある場合は必須。ファイルサイズを削減する用途で使われれる。
2024年6月時点では実験的機能。
This is based on the m64572 "Condensed image item" MPEG proposal for HEIF.
mdat(Media Data Box)
実際の画像データが含まれているボックスです。
ボックスデータ部のiloc
で定義された位置にOBU(Open Bitstream Unit)が配置されています。
参考リンク