「RIFF 」はこの項目へ転送 されています。ポピュラー音楽の楽句については「リフ 」をご覧ください。
Resource Interchange File Format (RIFF )は汎用コンテナフォーマット である。
概要
RIFFは古典的でシンプルな汎用コンテナフォーマット である。識別子・サイズ・データからなる「チャンク」を基本単位とし、チャンクの木構造として様々なデータを収納できる。マルチバイトはリトルエンディアン で表現される(⇒#仕様 )。
RIFFは汎用コンテナフォーマットであるため、RIFFから派生して識別子や木構造の制約を課した分野特化コンテナフォーマットが様々提案・実用化されている。WAV はその代表例である(⇒#派生コンテナフォーマット )。
Interchange File Format をベースとして1991年 に考案された(⇒#歴史 )。
仕様
RIFFファイルはチャンク の集合である。特殊なチャンクであるRIFFヘッダー の仕様により、RIFFファイルは「ヘッダー + チャンク列」という構造になる。このチャンク列は基本的に子チャンクを持たないが、LISTチャンク に限って子チャンク列を内包できる。マルチバイトはリトルエンディアン で表現される。
チャンク
チャンク (英 : Chunk )は RIFF の基本単位である[ 1] 。
チャンクはチャンク FourCC ・チャンクサイズ ・チャンクペイロード からなり[ 1] 、以下の構造をもつ:
チャンク構造
オフセット(ビット)
0 – 15
0
チャンク FourCC
16
32
チャンクサイズ
48
64+
チャンクペイロード
チャンク FourCC
チャンク FourCC は ASCII 4文字で表されたチャンクの識別子・種別コードである[ 2] 。
チャンク FourCC はRIFF
, INFO
, fmt
のような任意の4文字列であり[ 2] 、そのチャンクを識別・種別分けするために用いられる。このコードは(1バイト文字である)ASCII 4文字で表現されるため、計 32 ビットである[ 2] 。RIFF仕様で予約されたチャンク FourCC が存在し、これらコードをもつチャンクは特別な振る舞いをする。
チャンクサイズ
チャンクサイズ (英 : Chunk Size )はチャンクの中身のバイト数である[ 3] 。
チャンクサイズは「チャンクペイロード - パディング = チャンク全長 - 4 (チャンク FourCC) - 4 (チャンクサイズ) - パディング」を指す[ 3] 。すなわち実質データのバイト数がチャンクサイズであり、uint32 で表現される[ 3] 。
チャンクペイロード
チャンクペイロード (英 : Chunk Payload )はデータとパディングである[ 4] 。
データは任意長のバイトデータである[ 4] 。このデータ長がチャンクサイズに記録される。データ長が奇数の場合、偶数になるようゼロ埋めされる[ 4] 。
RIFFヘッダー
RIFFヘッダー (英 : RIFF Header )はRIFFコンテナ先頭に配置される特殊なチャンク である。
RIFFヘッダーは以下の制約をもつ:
RIFFコンテナ先頭にただ1つ配置
チャンク FourCC が RIFF
[ 5]
チャンクペイロードが「ファイルフォーマット名」+「チャンク列」かつ最大 232 -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専用のソフトはそうではなかった。これは、多数のメディアファイルを一括処理する場合に問題を生じ、例えば一括でファイル形式の変換をする際に(ユーザーが気づく前に)メタデータが失われてしまうといった事態が発生する。
CorelDRAW 10 は通常、RIFFファイル構造を使うが、INFOチャンクは最後尾に置かれる。そのため、デフォルトのWindowsのファイルマネージャではビットマップのプレビューが表示できない。これに対処するにはアドオンユーティリティが必要である。
派生コンテナフォーマット
RIFFは汎用コンテナフォーマットであるため、RIFFから派生して識別子や木構造の制約を課した分野特化コンテナフォーマットが様々提案・実用化されている。
マイクロソフトの実装は、RIFFメタ形式を基盤とした各種ファイル形式 (AVI , ANI , WAV ) で知られている。
歴史
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ギガバイト を超えるファイルが構成可能である。
脚注
^ a b "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閲覧.
^ a b c "Chunk FourCC: 32 bits ASCII four-character code used for chunk identification." WebP Container Specification より引用。2024-11-12閲覧.
^ a b c "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閲覧.
^ a b c "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閲覧.
関連項目
外部リンク