Введение
Идентификатор типа файла
FourCC (четырехсимвольный код) — это последовательность из четырех байтов (обычно ASCII), используемая для уникальной идентификации форматов данных. Он возник в системе метаданных OSType или ResType, использовавшейся в классической Mac OS, и был принят для формата обмена файлами Amiga/Electronic Arts и его производных. Позже эта идея была повторно использована для идентификации типов сжатых данных в QuickTime и DirectShow.
История
В 1984 году была выпущена самая ранняя версия операционной системы Macintosh – System 1. Она использовала одноуровневую файловую систему Macintosh с полями метаданных, включающими типы файлов, информацию о создателе (приложении) и вилки для хранения дополнительных ресурсов. Эту информацию можно было изменять, не изменяя сами данные, чтобы обеспечить их различную интерпретацию. Одинаковые коды использовались во всей системе в качестве тегов типов для всех видов данных. В 1985 году компания Electronic Arts представила метаформат Interchange File Format (IFF) – семейство форматов файлов, изначально разработанное для использования на Amiga. Эти файлы состояли из последовательности "блоков", которые могли содержать произвольные данные, каждый блок предварялся четырехбайтовым идентификатором. В спецификации IFF прямо указано, что истоки идеи FourCC восходят к Apple. Этот IFF был принят рядом разработчиков, включая Apple для файлов AIFF и Microsoft для файлов RIFF (которые послужили основой для форматов файлов AVI и WAV). В Apple многие из этих кодов называли OSTypes. Разработчики Microsoft и Windows называют свои четырехбайтовые идентификаторы FourCC или Four Character Codes. Microsoft также использовала коды FourCC для идентификации форматов данных, применяемых в DirectX, в частности в DirectShow и DirectX Graphics.
В системах Apple
С Mac OS X Panther сигнатуры OSType являются одним из нескольких источников, которые можно использовать для определения Uniform Type Identifier, и больше не служат основной подписью типа данных. Mac OS X (macOS) отдает предпочтение более привычному способу обозначения типов файлов – через расширения имен файлов. В момент внесения этих изменений они вызвали множество споров среди опытных пользователей, которые полагали, что Apple возвращается к более примитивному методу, при котором метаданные ошибочно размещаются в имени файла. Коды типов файловой системы не предназначены для непосредственного изменения пользователями, хотя их можно просматривать и изменять с помощью специализированного программного обеспечения, в частности, утилит командной строки macOS GetFileInfo и SetFile, которые устанавливаются вместе с инструментами разработчика в каталог /Developer/Tools, или утилиты ResEdit, доступной для старых компьютеров Mac.
Технические детали
Байтовая последовательность обычно ограничена печатаемыми символами ASCII, при этом пробельные символы зарезервированы для дополнения более коротких последовательностей. Чувствительность к регистру сохраняется, в отличие от расширений файлов. FourCC иногда кодируются в шестнадцатеричном формате (например, "0x31637661" для 'avc1') и иногда – в удобочитаемом формате (например, "mp4a"). Однако некоторые FourCC содержат непечатаемые символы и не могут быть прочитаны человеком без специального форматирования для отображения; например, 10-битное видео Y'CbCr 4:2:2 может иметь FourCC ('Y', '3', 10, 10), которое ffmpeg отображает как rawvideo (Y3[10] [10] / 0x0A0A3359), yuv422p10le. Четырехбайтовые идентификаторы полезны, поскольку они могут состоять из четырех удобочитаемых символов, обладающих мнемоническими свойствами, и при этом помещаться в четырехбайтовое пространство памяти, обычно выделяемое для целых чисел в 32-битных системах (хотя проблемы с порядком байтов могут снизить их читаемость). Таким образом, эти коды могут эффективно использоваться в программном коде в качестве целых чисел, а также предоставлять подсказки при анализе бинарных потоков данных.
Поддержка компилятора
FourCC записывается в формате big endian относительно базовой последовательности символов ASCII, чтобы при чтении как строки байты располагались в правильном порядке. Многие C-компиляторы, включая GCC, определяют поведение многосимвольных литералов как выравнивание вправо к младшему значащему байту, в результате чего в ASCII получается 0x31323334. Это общепринятый способ записи кодов FourCC, используемых программистами Mac OS для OSType. (Классическая Mac OS была исключительно big endian.) На little-endian машинах для получения правильного результата требуется выполнить операцию смены порядка байтов (byte swap) для значения. Рассматривая пример avc1, приведенный выше: хотя литерал уже преобразуется в целочисленное значение, little-endian машина поменяла бы порядок байтов и сохранила значение как. Чтобы получить правильную последовательность байтов, используется значение, для которого уже была выполнена смена порядка байтов.