Resource Interchange File Format
Resource Interchange File Format(RIFF)は汎用コンテナフォーマットである。
| MIMEタイプ | application/x-riff |
|---|---|
| マジック ナンバー | RIFF |
| 開発者 | マイクロソフト、IBM |
| 初版 | 1991年8月 |
| 種別 | 汎用メタファイル形式 |
| 派生元 | Interchange File Format |
概要
編集RIFFは古典的でシンプルな汎用コンテナフォーマットである。識別子・サイズ・データからなる「チャンク」を基本単位とし、チャンクの木構造として様々なデータを収納できる。マルチバイトはリトルエンディアンで表現される(⇒#仕様)。
RIFFは汎用コンテナフォーマットであるため、RIFFから派生して識別子や木構造の制約を課した分野特化コンテナフォーマットが様々提案・実用化されている。WAVはその代表例である(⇒#派生コンテナフォーマット)。
Interchange File Format をベースとして1991年に考案された(⇒#歴史)。
仕様
編集RIFFファイルはチャンクの集合である。特殊なチャンクであるRIFFヘッダーの仕様により、RIFFファイルは「ヘッダー + チャンク列」という構造になる。このチャンク列は基本的に子チャンクを持たないが、LISTチャンクに限って子チャンク列を内包できる。マルチバイトはリトルエンディアンで表現される。
チャンク
編集RIFFヘッダー
編集RIFFヘッダー(英: RIFF Header)はRIFFコンテナ先頭に配置される特殊なチャンクである。
RIFFヘッダーは以下の制約をもつ:
- RIFFコンテナ先頭にただ1つ配置
- チャンク FourCC が
RIFF[5] - チャンクペイロードが「ファイルフォーマット名」+「チャンク列」かつ最大 232-10 バイト
- 最初の4バイト: チャンクFourCC形式で表現されたファイルフォーマット名
- それ以降: 任意個のチャンク
上記の制約により、RIFFヘッダーのチャンクサイズは「ファイルサイズ - 8(RIFF + チャンクサイズ属性)」になる。RIFFヘッダー仕様によりRIFFファイルは「冒頭にヘッダー、その後ろに任意個のチャンク」という構成になる。
LISTチャンク
編集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のファイルマネージャではビットマップのプレビューが表示できない。これに対処するにはアドオンユーティリティが必要である。
派生コンテナフォーマット
編集歴史
編集1991年、マイクロソフトとIBMが提案し、マイクロソフトのWindows 3.1のマルチメディアファイルのデフォルトフォーマットとして採用された。エレクトロニック・アーツが1985年に策定したInterchange File Format (IFF、「交換用ファイル形式」の意味) に基づいている。RIFFはIBM PCが使っているx86プロセッサに合わせて多バイト整数をリトルエンディアン形式で格納するのに対して、IFFはAmigaやMacintoshで使われていたため、68kプロセッサのビッグエンディアンを採用していた点が異なる。なお、Appleは1988年にIFFに基づいたビッグエンディアンのAIFFを策定している。
RF64
編集脚注
編集- 1 2 "The basic element of a RIFF file is a chunk. It consists of ... Chunk FourCC ... Chunk Size ... Chunk Payload" WebP Container Specification より引用。2024-11-12閲覧.
- 1 2 3 "Chunk FourCC: 32 bits ASCII four-character code used for chunk identification." WebP Container Specification より引用。2024-11-12閲覧.
- 1 2 3 "Chunk Size: 32 bits (uint32) The size of the chunk in bytes, not including this field, the chunk identifier, or padding." WebP Container Specification より引用。2024-11-12閲覧.
- 1 2 3 "Chunk Payload: Chunk Size bytes The data payload. If Chunk Size is odd, a single padding byte -- which MUST be 0 to conform with RIFF -- is added." WebP Container Specification より引用。2024-11-12閲覧.
- ↑ "Header ... 'RIFF': 32 bits The ASCII characters 'R', 'I', 'F', 'F'." WebP Container Specification より引用。2024-11-12閲覧.