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

RIFF
MIMEタイプapplication/x-riff
マジック
ナンバー
RIFF
開発者マイクロソフトIBM
初版1991年8月 (33年前) (1991-08)
種別汎用メタファイル形式
派生元Interchange File Format

概要

編集

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

編集

チャンク FourCCASCII 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専用のソフトはそうではなかった。これは、多数のメディアファイルを一括処理する場合に問題を生じ、例えば一括でファイル形式の変換をする際に(ユーザーが気づく前に)メタデータが失われてしまうといった事態が発生する。

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

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

編集

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

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

歴史

編集

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

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

脚注

編集
  1. ^ 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閲覧.
  2. ^ a b c "Chunk FourCC: 32 bits ASCII four-character code used for chunk identification." WebP Container Specification より引用。2024-11-12閲覧.
  3. ^ 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閲覧.
  4. ^ 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閲覧.
  5. ^ "Header ... 'RIFF': 32 bits The ASCII characters 'R', 'I', 'F', 'F'." WebP Container Specification より引用。2024-11-12閲覧.

関連項目

編集

外部リンク

編集