Resource Interchange File Format(RIFF)は汎用コンテナフォーマットである。

## 概要

RIFFは古典的でシンプルな汎用コンテナフォーマットである。識別子・サイズ・データからなる「チャンク」を基本単位とし、チャンクの木構造として様々なデータを収納できる。マルチバイトはリトルエンディアンで表現される(⇒#仕様)。

RIFFは汎用コンテナフォーマットであるため、RIFFから派生して識別子や木構造の制約を課した分野特化コンテナフォーマットが様々提案・実用化されている。WAVはその代表例である(⇒#派生コンテナフォーマット)。

Interchange File Format をベースとして1991年に考案された(⇒#歴史)。

## 仕様

RIFFファイルはチャンクの集合である。特殊なチャンクであるRIFFヘッダーの仕様により、RIFFファイルは「ヘッダー + チャンク列」という構造になる。このチャンク列は基本的に子チャンクを持たないが、LISTチャンクに限って子チャンク列を内包できる。マルチバイトはリトルエンディアンで表現される。

### チャンク

チャンク(英: Chunk)は RIFF の基本単位である。

チャンクはチャンク FourCC・チャンクサイズ・チャンクペイロードからなり、以下の構造をもつ:

#### チャンク FourCC

チャンク FourCC は ASCII 4文字で表されたチャンクの識別子・種別コードである。

チャンク FourCC は`RIFF`, `INFO`, `fmt` のような任意の4文字列であり、そのチャンクを識別・種別分けするために用いられる。このコードは(1バイト文字である)ASCII 4文字で表現されるため、計 32 ビットである。RIFF仕様で予約されたチャンク FourCC が存在し、これらコードをもつチャンクは特別な振る舞いをする。

#### チャンクサイズ

チャンクサイズ(英: Chunk Size)はチャンクの中身のバイト数である。

チャンクサイズは「チャンクペイロード - パディング = チャンク全長 - 4 (チャンク FourCC) - 4 (チャンクサイズ) - パディング」を指す。すなわち実質データのバイト数がチャンクサイズであり、uint32 で表現される。

#### チャンクペイロード

チャンクペイロード(英: Chunk Payload)はデータとパディングである。

データは任意長のバイトデータである。このデータ長がチャンクサイズに記録される。データ長が奇数の場合、偶数になるようゼロ埋めされる。

### RIFFヘッダー

RIFFヘッダー(英: RIFF Header)はRIFFコンテナ先頭に配置される特殊なチャンクである。

RIFFヘッダーは以下の制約をもつ:

- RIFFコンテナ先頭にただ1つ配置
- チャンク FourCC が `RIFF`
- チャンクペイロードが「ファイルフォーマット名」+「チャンク列」かつ最大 2-10 バイト
  - 最初の4バイト: チャンクFourCC形式で表現されたファイルフォーマット名
  - それ以降: 任意個のチャンク

上記の制約により、RIFFヘッダーのチャンクサイズは「ファイルサイズ - 8(`RIFF` + チャンクサイズ属性)」になる。RIFFヘッダー仕様によりRIFFファイルは「冒頭にヘッダー、その後ろに任意個のチャンク」という構成になる。

### LISTチャンク

LISTチャンク(英: LIST Chunk)は子チャンク列を格納する特殊なチャンクである。
LISTチャンクは以下の制約をもつ:

- チャンク FourCC が `LIST`
- チャンクペイロードが「子チャンクタイプ」+「子チャンク列」
  - 最初の4バイト: チャンクFourCC形式で表現された子チャンクタイプ
  - それ以降: 任意個のチャンク

## INFOチャンク

INFOチャンクはいくつかの問題を抱えるチャンク仕様である。

マイクロソフトのWindows 3.1の公式文書によると、ファイルの先頭にINFOチャンクを置くべきとしている。これにより、ファイル内容に関するメタデータに素早くアクセスでき、ファイルシステムやマルチメディアアプリケーションがファイルの先頭を参照して、作者情報、サムネイル、プレビュー、ファイル形式情報などを取り出せる。

Windows XPのファイル管理では、RIFF形式のファイルがあると自動的にINFOチャンクを読もうとする。また、ユーザーがファイルサイズや作成日などの属性情報に加えて、RIFFフィールド(作者、コピーライト日付)を指定することもできる。

## 問題

マイクロソフトは、あらゆるマルチメディアファイルにRIFFを使用するという方針の下、MIDIファイルにもRIFFを使った新たなファイル形式を策定した。これは、既存のStandard MIDI FileをRIFFラッパーで囲んだような形式で、`.rmi`(英: resource musical instrument に由来)という拡張子であった。このため、Windows上でMIDIファイルを新たな形式に変換してやる必要が生じた。

大きな動画ファイルでは、先頭にあるべきINFOチャンクを拡張・追加するということはファイル全体のずれを生じるため、ディスクI/Oが多数発生する。これを防ぐため、大きなファイルを作成するときにINFOチャンクにダミーデータを使ってパディングしておく必要がある。そうすることでINFOチャンクに新たな情報を追加してもファイル全体にずれが生じない。そのため、プログラマには正しいファイル形式の知識が必要だった。しかし、マイクロソフトのRIFFに関する文書は分散していて把握しきれないことも多く、一部のプログラマはファイルの最後尾にINFOチャンクを追加してもよいと思い込んでしまった。この対処法が広まった結果、非互換が生じ、正しいファイル形式しか認識しないソフトウェアによって最後尾のINFOチャンクが上書きされてしまうなどの問題が出てきた。

このような擬似RIFFファイルは特にMacintoshでよく見られた(Macintoshのプログラマがマイクロソフトの仕様を把握していないことが多かったためと言われている)。一般にMacintosh上のソフトウェアやクロスプラットフォームのソフトウェアの開発者はこの問題に気づいており、間違ったINFOチャンクも扱えるようにしていることが多かった。例えば、2004年ごろのアップルのWindows上でのQuickTimeプレイヤーソフトは間違ったINFOチャンクも扱えていたが、ソニーのWindows専用のソフトはそうではなかった。これは、多数のメディアファイルを一括処理する場合に問題を生じ、例えば一括でファイル形式の変換をする際に(ユーザーが気づく前に)メタデータが失われてしまうといった事態が発生する。

CorelDRAW10 は通常、RIFFファイル構造を使うが、INFOチャンクは最後尾に置かれる。そのため、デフォルトのWindowsのファイルマネージャではビットマップのプレビューが表示できない。これに対処するにはアドオンユーティリティが必要である。

## 派生コンテナフォーマット

RIFFは汎用コンテナフォーマットであるため、RIFFから派生して識別子や木構造の制約を課した分野特化コンテナフォーマットが様々提案・実用化されている。
マイクロソフトの実装は、RIFFメタ形式を基盤とした各種ファイル形式 (AVI, ANI, WAV) で知られている。

- WAV (Windowsオーディオ)
- AVI (Windows動画)
- RMI (Windows RIFF MIDIファイル)
- CDR (CorelDRAWベクターグラフィックスファイル)
- ANI (Windowsのアニメーション付きカーソル)
- WebP (Googleが開発した静止画ファイル形式)

## 歴史

1991年、マイクロソフトとIBMが提案し、マイクロソフトのWindows 3.1のマルチメディアファイルのデフォルトフォーマットとして採用された。エレクトロニック・アーツが1985年に策定したInterchange File Format (IFF、「交換用ファイル形式」の意味) に基づいている。RIFFはIBM PCが使っているx86プロセッサに合わせて多バイト整数をリトルエンディアン形式で格納するのに対して、IFFはAmigaやMacintoshで使われていたため、68kプロセッサのビッグエンディアンを採用していた点が異なる。なお、Appleは1988年にIFFに基づいたビッグエンディアンのAIFFを策定している。

### RF64

欧州放送連合が開発したRIFF仕様に基づいた多チャンネルファイル形式としてRF64がある。これはBWF互換であり、4ギガバイトを超えるファイルが構成可能である。