Closed9

AVIFファイルフォーマットのメモ

ルアルア

AVIFとは

画像フォーマットの一種。同画質のJPEGやWebPよりファイルサイズが小さいらしい。
https://ja.wikipedia.org/wiki/AVIF

AVIFはAV1(ビデオコーデック)で圧縮した画像をHEIFコンテナに保存する。
画像ファイルというより、1フレームの動画ファイルに近い。

他にビデオコーデックを使った画像フォーマットとして、同じくHEIFコンテナを使うHEICやWebPなどがある。(ちなみに、HEIFはISOBMFF準基のフォーマット)

ルアルア

Box

ファイル構造を見る前にBoxについて軽く説明。

ISOBMFFはBoxという最小単位で構成される。
BoxはBoxSize(4byte)とBoxType(4byte)からなるHeaderData部がある。

https://github.com/AOMediaCodec/libavif/blob/f95d7f474d8d84bb12a5a10b3876c7ac2b99f69a/src/stream.c#L248-L255

AVIFのBoxは大きく分けて5つある。

  • ftyp
  • meta
  • moov
  • mini
  • mdat

ISOBMFF Boxをパースしてくれるサイトを使うと理解しやすいです。
https://gpac.github.io/mp4box.js/test/filereader.html

ルアルア

ftyp(File Type Box)

ファイル形式を表すBox。ファイルの先頭に配置する必要がある。

major_brandはファイル形式の識別子に使われるブランド名。
AVIFはここにavif(61 76 69 66)が入る。

minor_versionmajor_brandのマイナーバージョンを表す4バイト整数。
compatible_brandsは互換性があるブランドを列挙できる。miaf(6D 69 61 66)が必須。

ftypチェックコード
https://github.com/AOMediaCodec/libavif/blob/f95d7f474d8d84bb12a5a10b3876c7ac2b99f69a/src/read.c#L4120-L4127
https://github.com/AOMediaCodec/libavif/blob/f95d7f474d8d84bb12a5a10b3876c7ac2b99f69a/src/read.c#L4105-L4118

ルアルア

meta(Meta Box)

avifブランドがある場合は必須。画像のメタデータが入っているボックス。
以下の7つの子要素を含むことができる。
Meta Boxのパースコード

hdlr(Handler Reference Box)

メタデータのタイプを表す。HEIFはhandlerpictで固定。

iloc(Item Location Box)

アイテムのデータ位置を表す。

pitm(Primary Item Box)

プライマリアイテムを表す。

idat(Item Data Box)

データサイズの小さいアイテムデータを格納できる。

iprp(Item Properties Box)

アイテムに紐づくプロパティを表す。子要素としてipcoipmaを持つ。
プロパティはipcoで定義し、ipmaで紐づける。

プロパティはdescriptivetransformativeの二種類あり、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_typeav01になる。

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)が配置されています。

このスクラップは6ヶ月前にクローズされました