RIFF
RIFF (англ. Resource Interchange File Format) — один з форматів файлів-контейнерів для збереження потокових даних.
Найчастіше використовується для збереження потокових мультимедіа-даних (відео, аудіо, можливо текст).
Найвідоміші формати, які використовують RIFF як контейнер: AVI (відео), WAV (аудіо), RMI (MIDI-треки).
Формат RIFF використовує little-endian порядок байтів (молодший байт іде першим). Для машин з форматом даних big-endian існує формат RIFX, але через дуже слабку популярність машин з таким форматом даних, RIFX не прижився, і в сучасності RIFF використовується також і на машинах з big-endian порядком байтів.
RIFF формати файлів
RIFF формати забезпечують можливість зберігати велике різноманіття даних, таких як зображення, аудіо записи, відео, і інформацію необхідну для налаштування периферичних пристроїв. Тип даних, які записані у RIFF файлі визначається розширенням файлу. Приклади видів даних, які можуть бути записані у RIFF файлі:
- аудіо/відео дані (.AVI)
- аудіо дані (.WAV)
- дані растрових зображень (.RDI)
- MIDI інформація (.RMI)
- Палітра кольорів (.PAL)
- Мультимедійний фільм (.RMN)
- Анімований курсор (.ANI)
- Набір інших RIFF файлів (.BND)
На сьогодні, AVI формат єдиний з усіх типів RIFF файлів, який повністю реалізований з виконанням актуальної специфікації RIFF. Хоча WAV файли також мають повну реалізацію, розробники зазвичай використовують більш просту і давню специфікацію при записі файлів.
Структура RIFF файлу
RIFF це бінарний формат файлу, який містить декілька пов’язаних структур даних. Такі структури даних, з яких складається RIFF файл, називаються секціями. Секції не мають фіксованої позиції у файлі, тому ніякі фіксовані зміщення не можна використати для того, щоб визначити позицію полів. Секція, яка містить в собі такі дані як структуру даних, масив бінарних даних, чи іншу секцію, називається підсекцією. Кожна секція у RIFF файлі має відповідну базову структуру:
typedef struct _Chunk
{
DWORD ChunkId; /* Ідентифікатор секції */
DWORD ChunkSize; /* Розмір даних секції у байтах */
BYTE ChunkData[ChunkSize]; /* Дані секції */
} CHUNK;
- ChunkId складається з 4-ох ASCII символів, які є ідентифікатором даних, що містяться у секції. Наприклад, ідентифікатор RIFF використовується для позначення секції яка містить RIFF дані. Якщо ідентифікатор менше чотирьох символів він доповнюється символами пробілу справа (ASCII 32). RIFF файли записуються у little-endian порядку байт. Файли, які записуються за схемою big-endian мають ідентифікатор RIFX.
- ChunkSize – розмір даних записаних у полі ChunkData, не включаючи вирівнювання яке можуть мати дані. Розмір полей ChunkId і ChunkSize не включається в сумарний розмір даних.
- ChunkData містить дані з вирівнюванням по словам при записі RIFF файлу. Якщо дані мають не парний розмір в кінець даних дописують додатковий байт NULL.
Підсекції також мають таку саму структуру як і секції. Допустимі секції, які можуть містити підсекції це секція RIFF і секція яка містить список LIST. Інші секції можуть містити лише дані.