Le Resource Interchange File Format (RIFF) définit un modèle générique de format de fichier à destination des contenus multimédia[1]. Ainsi, il ne s'agit pas d'un format de fichier en soi[2], mais plutôt d'une méthode d'organisation des données sur laquelle reposent plusieurs formats[3] comme le WAVE et l'AVI.
Le RIFF a été défini conjointement par Microsoft et IBM en 1991. Il hérite en grande partie du format IFF de l'Electronic Arts (1985)[4].
Histoire
Le RIFF a été introduit en 1991 par Microsoft et IBM comme modèle pour les formats de fichiers multimédia, à destination d'OS/2 et Windows 3.1[5]. Le standard est d’ailleurs publié conjointement avec les premiers formats de fichier issus du RIFF, tel le format WAVE.
Le RIFF reprend le modèle de structure en chunks de l'Interchange File Format publié en 1985 par Electronic Arts, tout en laissant de côté la majorité des autres éléments du standard IFF.
Chunk
L'unité de construction de base d'un fichier RIFF est le chunk. Un chunk est un bloc de données composé des champs suivant :
ckid : chunk-identifier, 4 octets représentant l'identifiant FourCC du chunk, soit une séquence de 1 à 4 caractères ASCII alphanumériques (sans espaces) alignés à gauche, séquence complétée à droite par zéro ou plusieurs caractères « espace » (code ASCII 0x20), pour former un groupe d'exactement quatre caractères[6]. Par exemple, le ckidfmt␣(le glyphe « ␣ » représente une espace) sera représenté par la suite des quatre caractères : 'f', 'm', 't', '␣' (le glyphe « ␣ » représentant une espace).
cksz : chunk-size, entier 32 bits non signé représentant la taille des données contenues dans le champ data du chunk[7].
data : Les données utiles (payload), contenues dans ce chunk. Dans le cas où les données sont de taille impaire — c'est-à-dire où le champ cksz contient une valeur impaire —, un octet nul est ajouté à la fin du champ de façon à conserver l'alignement dans le fichier[8].
Structure du RIFF
Un fichier RIFF est exclusivement composé de chunks.
Un fichier RIFF commence (à l'octet 0) par le chunk d'identifiant RIFF. Celui-ci accueillera dans son champ data tous les chunks du fichier. Par conséquent, le champ cksz du chunkRIFF équivaut à la taille du fichier moins 8 octets.
Le champ data du chunkRIFF commence par un identifiant FourCC appelé formType. Celui-ci indique le type de fichier. Par exemple, dans le cas d'un fichier WAVE, l'identifiant sera l'étiquette FourCC WAVE (c'est-à-dire composée des 4 octets ASCII 'W', 'A', 'V', 'E').
À noter que le chunkRIFF est le seul, avec le chunkLIST, à pouvoir prendre comme données d'autres chunks.
Concernant l'ordonnancement des octets, le format RIFF représente les données en mode petit-boutisme (little-endian). Cependant, le format RIFF définit aussi le RIFX, comme étant son pendant gros-boutiste (big-endian).
↑(en) Microsoft & IBM, « Multimedia Programming Interface and Data Specifications 1.0 » [PDF], (consulté le ) : « The Resource Interchange File Format (RIFF), a tagged file structure, is a general specification upon which many file formats can be defined », p. 8
↑(en) Microsoft & IBM, « Multimedia Programming Interface and Data Specifications 1.0 » [PDF], (consulté le ) : « This document describes the programming interfaces and data specifications for multimedia that are common to both OS/2 and Windows environments. », p. 2
↑(en) Microsoft & IBM, « Multimedia Programming Interface and Data Specifications 1.0 » [PDF], (consulté le ) : « A FOURCC is represented as a sequence of one to four ASCII alphanumeric characters, padded on the right with blank characters (ASCII character value 32) as required, with no embedded blanks. », p. 11
↑(en) Microsoft & IBM, « Multimedia Programming Interface and Data Specifications 1.0 » [PDF], (consulté le ) : « A 32-bit unsigned value identifying the size of ckData. This size value does not include the size of the ckID or ckSize fields or the pad byte at the end of ckData. », p. 11
↑(en) Microsoft & IBM, « Multimedia Programming Interface and Data Specifications 1.0 » [PDF], (consulté le ) : « Binary data of fixed or variable size. The start of ckData is word-aligned with respect to the start of the RIFF file. If the chunk size is an odd number of bytes, a pad byte with value zero is written after ckData. Word aligning improves access speed (for chunks resident in memory) and maintains compatibility with EA IFF. The ckSize value does not include the pad byte. », p. 11