Описание форматов анимационных файлов
FLI, FLC, CELВерсия 2.0
©
Анисимов С.Ю. 1998-03-08Блок тип 16 – несжатое изображение (FLI_COPY)
Блок тип 13 – заполнение экрана нулевым цветом (BLACK)
Блок тип 15 – сжатие RLE ( BYTE_RUN )
Блок тип 12 – блок дельта – сжатия по байтам ( DELTA_FLI )
Блок тип 7 – блок сжатия по словам (DELTA_FLC)
Блок тип 4 - настройки палитры (COLOR_256)
Анимационные файлы FLI, FLC и CEL используются Autodesk Animator Pro. Они позволяют проигрывать на экране компьютера подобие кинофильмов. В них не содержится звука и обеспечивается передача всего 256 цветов. Но их простота и быстрота проигрывания сделали данный формат популярным среди разработчиков игр и художников-аниматоров. Файлы FLI использовались первоначально в Animator. Файлы FLC затем стали использоваться в Animator Pro.
Формат файла фильмов ( flic ) разработал Jim Kent. В марте 1993 года в журнале “The Doctor Dobb's Journal” он поведал миру о своем изобретении [1].
Все данные в этих файлах группируются во фреймы. Фрейм - это один кадр фильма.
Фреймы состоят из так называемых кусков ( chunk ), но для удобства мы будем называть их блоками. Блоки файла и содержат в себе всю информацию необходимую для проигрывания фильма. В начале блока указывается его размер и его тип, также как и вначале каждого фрейма, поэтому если тип фрейма или блока неизвестен, то данный блок или фрейм можно просто пропустить.
В основе дельта-сжатия, применяемого в файлах фильмов лежит идея сохранять отличия одного изображения от другого. Это позволяет проигрывать файлы даже на медленных видеоадаптерах, так как надо выводить только часть изображения, а не все.
Сами данные сжимаются по схеме RLE ( кодирование длин серий ). Причем первый фрейм содержит изображение целиком, и относительно него и строятся отличия других фреймов. Последний фрейм фильма кольцевой и служит для плавного циклического проигрывания фильма.
Порядок байт в слове тот, что используется в процессорах фирмы Intel. Если вам необходимо проигрывать фильм на другой платформе, где порядок байт в слове другой, наверно лучшим решением было бы использование конвертора для смены порядка байт в слове.
В данной статье будут описаны типы фреймов и блоков, которые использовались в оригинальном формате файла фильма.
На рисунке 1 представлена обобщенная схема формата файла фильма.
Заголовок файла имеет длину 128 байт, вот его описание в виде таблицы.
Смещение от начала, байт |
Размер, байт |
Название |
Описание |
0 |
4 |
Size |
Размер файла, в байтах. |
4 |
2 |
Type |
Идентификатор файла. Всегда 0xAF11 для FLI и 0xAF12 для FLC и для CEL. |
6 |
2 |
Frames |
Число фреймов, максимум 4000. Не включая кольцевой фрейм. |
8 |
2 |
Width |
Ширина экрана для воспроизведения |
10 |
2 |
Height |
Высота экрана для воспроизведения |
12 |
2 |
Depth |
Бит на пиксель ( всегда 8, для CEL равняется 0 ). |
14 |
2 |
Flags |
Флажки, всегда равны 3. Если первый бит, не установлен, то нет кольцевого фрейма. |
16 |
4 |
Speed |
Задержка между фреймами. Для FLI в единицах 1/70 секунды, для FLC в единицах 1/1000 секунды. |
20 |
2 |
Reserv |
Резерв, всегда 0. |
Далее только для FLC |
|||
22 |
4 |
created |
Дата создания файла в формате MsDOS. |
26 |
4 |
Creator |
Серийный номер программы Animator Pro, создавшей файл. |
30 |
4 |
Updated |
Дата последнего изменения файла |
34 |
4 |
Updater |
Серийный номер программы, изменившей файл |
38 |
2 |
Aspectx |
Коэффициент пропорциональности по оси X. |
40 |
2 |
Aspecty |
Коэффициент пропорциональности по оси Y. |
42 |
38 |
Reserved |
Резерв, всегда 0 |
80 |
4 |
Oframe1 |
Смещение от начала файла на первый фрейм |
84 |
4 |
Oframe2 |
Смещение от начала файла на второй фрейм. Это значение можно использовать при циклическом проигрывании фильма. |
88 |
40 |
Reserved |
Резерв, всегда 0. |
После чтения заголовка проверьте идентификатор файла. Для FLI и FLC разные единицы задержки между кадрами. Для FLI задержка исчислялась относительно частоты вывода на экран монитора. Для FLC задержка исчисляется в единицах 1/1000 секунды.
Для FLI максимальный размер экрана 320x200. Для FLC максимальный размер экрана 1280x1024.
Формат файла CEL и его содержание соответствуют формату файла FLC, но depth равняется 0. На самом деле depth равняется 8.
Первый фрейм обычно сжимают, используя побайтное кодирование. Последующие фреймы содержат отличия от предыдущих фреймов. Иногда первый фрейм и/или последующие фреймы не сжимаются. Имеется один дополнительный фрейм в конце FLI, который содержит различие между первым и последним фреймом. Это позволяет плавно проигрывать файл по кругу, без паузы между первым и последним фреймом.
Все файлы фильма содержат данный кольцевой фрейм, даже файлы с одним фреймом.После заголовка идет префиксный блок, который содержит дополнительную информацию для работы Animator Pro, непосредственно в анимации он не участвует и его можно пропустить.
Затем идут фреймы. Каждый фрейм ( в том числе и префиксный блок ) имеет заголовок длиной 16 байт, вот его описание в виде таблицы.
Смещение от начала, Байт |
Размер, байт |
Название |
Описание |
0 |
4 |
Size |
Размер фрейма, включая и этот заголовок, в байтах . |
4 |
2 |
Type |
Тип фрейма |
6 |
2 |
Chunks |
Число блоков в данном фрейме. Максимум 4000 блоков. |
8 |
8 |
Reserv |
Резерв, всегда 0. |
Всего два типа фрейма. Для префиксного блока тип равен 0xF100, для фреймов, в которых содержатся данные по анимации равен 0xF1FA. Возможны другие типы фреймов, которые влияют на анимацию, но здесь они не описаны.
После заголовка фрейма идут его блоки. Вначале идет настройка цвета, если цвета поменялись. Затем изменения на экране, если пиксели экрана поменялись. Если фрейм идентичен предыдущему, то он будет без кусков вообще и необходимо только сделать задержку.
Блок фрейма имеет свой заголовок размером 6 байт, за которым идут данные.
Смещение от начала, Байт |
Размер, Байт |
Название |
Описание |
0 |
4 |
Size |
Размер блока, включая этот заголовок, в байтах. |
4 |
2 |
Type |
Тип блока. |
Размер блока для FLI ни когда не превышает 64007 байта. Но для FLC файла это неверно. Размер фрейма для FLC может быть вычислен по такой формуле:
Размер_фрейма = Ширина_экрана * Высота_экрана + 782 байта
Вот все фирменные типы блоков:
Значение |
Имя |
Описание |
4 |
COLOR_256 |
Настройка палитры, значения цветов от 0 до 255 ( только FLC ). |
7 |
DELTA_FLC |
Блок дельта-сжатия по словам ( только FLC ). |
11 |
COLOR_64 |
Настройка палитры, значения цветов от 0 до 64 ( только FLI ). |
12 |
DELTA_FLI |
Блок дельта-сжатия по байтам ( только FLI ). |
13 |
BLACK |
Заполнение всего экрана нулевым цветом. |
15 |
BYTE_RUN |
Побайтное сжатие кодированием длин серий |
16 |
FLI_COPY |
Не сжатое изображение |
18 |
PSTAMP |
Небольшое изображение для предварительного просмотра, содержится только в первом фрейме и первом блоке его, можно пропускать. |
Ниже подробно описан каждый тип блока.
Блок типа 16 – несжатое изображение (FLI_COPY)
Содержит несжатые данные, которые задают изображение от левого верхнего до правого нижнего угла. Данный блок создается тогда, когда метод сжатия дает больше данных, чем несжатое изображение. Довольно редкое явление.
Блок тип 13 – заполнение экрана нулевым цветом (BLACK)
Не содержит никаких данных, кроме заголовка. Просто заполняется экран нулевым цветом.
RLE ( BYTE_RUN )
Данный блок содержит все изображение кадра целиком. В основном применяется в первом фрейме или внутри блока изображения для предварительного просмотра.
Начинается с первой строки вывода анимации на экран, затем идут подряд все строки для вывода на экран. Число строк равняется высоте экрана для воспроизведения. Первый байт в строке содержит число пакетов в строке. Этот байт можно игнорировать, так как это пережиток от первой версии Animator. Возможно, что количество пакетов в строке будет больше, чем 255. Ширина вывода на экран используется для обнаружения конца строки и перехода на следующую строку. Формат пакета:
Смещение, байт |
Размер, байт |
Название |
Описание |
0 |
1 |
Size_count |
Число байт для копирования и тип копирования данных ( либо повтор одного байта, либо копирование строки байт ) |
1 |
?? |
Data |
Данные |
Если size_count больше нуля, то данные состоят из одного байта, который необходимо size_count раз вывести на экран. Если size_count меньше нуля, то необходимо вычислить абсолютное значение size_count. И столько байт должны быть скопированы на экран из data. Таким образом, число байт для копирования не может быть больше, чем 128. Данный блок имеет размер не больше, чем 64000 байт ( только для FLI ). Для FLC размер данного блока не больше, чем ширина экрана, умноженная на высоту экрана.
Блок тип 12 – блок дельта – сжатия по байтам ( DELTA_FLI )
Наиболее часто встречающийся блок во FLI - файлах. Содержит различия между этим кадром и предыдущим. Такие блоки использовались только в первой версии Animator. Но, тем не менее, этот тип блока все еще может появляться и в FLC – файлах, если файл был первоначально создан Animator, но не все кадры были отредактированы Animator Pro.
Первое слово ( 16 бит ) в этом блоке указывает на начальную строку экрана для изменения. Второе слово ( 16 бит ) – число строк для изменения в данном блоке. Каждая строка кодируется отдельно. Первый байт в строке - число пакетов в этой строке. Если строка не
изменилась относительно последнего фрейма, то этот байт нуль. Этот байт - положительное число, так как данный блок используется только для FLI – файлов.Формат одиночного пакета:
Смещение, Байт |
Размер, Байт |
Название |
Описание |
0 |
1 |
Skip_count |
Пропуск столбцов |
1 |
1 |
Size_count |
Число байт для копирования и тип копирования |
2 |
?? |
Data |
Данные |
Пропуск столбцов пикселей обозначает, сколько столбцов пикселей необходимо пропустить относительно текущего пикселя. Если необходимо пропустить больше, чем 255 пикселей, то они будут разбиты на два пакета. Число байтов для вывода знаковое. При этом отрицательные и положительные значения имеют обратный смысл по сравнению с типом блока 15. Это сделано для эффективности. Если данный байт больше нуля, то далее следуют байты для копирования на экран. Если данный байт меньше нуля, то следующий байт должен быть повторен абсолютное значение от size_count раз.
Блок тип 7 – блок дельта - сжатия по словам (DELTA_FLC)
Наиболее часто встречающийся блок в FLC – файлах. Используется только в Animator Pro. Содержит различия между последовательными фреймами. В отличии от блока DELTA_FLI это сжатие по словам. Данные организованы в строки, в каждой строке пакеты. Первое слово ( 16 бит ) - число сжатых строк, т.е. сколько строк будет выводиться на экран. Затем - данные для каждой строки отдельно, всегда начинающиеся с первой строки. Каждая строка сжимается индивидуально.
Каждая строка может начинаться с некоторого количества дополнительных слов, для того чтобы пропустить не изменяемые строки и установить последний байт в строке для фильмов, у которых ширина экрана нечетная. Число пропущенных строк не включается в общее число сжатых строк. Последнее слово из этих дополнительных слов положительно и содержит число пакетов в строке. Старшие два бита этих слов используются, чтобы определить назначение слова.
Бит 15 |
Бит 14 |
Назначение |
0 |
0 |
Т.е. слово больше нуля. Тогда слово содержит число пакетов в строке. Число пакетов может быть нуль, тогда только последний пиксель в строке изменяется. |
1 |
0 |
Младший байт содержит последний байт строки (только для нечетной ширины экрана). Число пакетов в строке всегда следует за этим словом. |
1 |
1 |
Слово содержит число строк для пропуска. Число пропущенных строк равняется абсолютному значению данного слова. За этим словом могут быть еще слова для пропуска строк или слова для вывода последнего байта строки и число пакетов в строке. |
Формат пакета для строки:
Смещение, Байт |
Размер, Байт |
Название |
Описание |
0 |
1 |
Skip_count |
Пропуск столбцов |
1 |
1 |
Size_count |
Число байт для копирования и тип копирования |
2 |
?? |
Data |
Данные |
Пропуск столбцов пикселей обозначает, сколько столбцов пикселей необходимо пропустить относительно текущего пикселя. Если необходимо пропустить больше, чем 255 пикселей, то они будут разбиты на два пакета. Число байтов для копирования знаковое. При этом отрицательные и положительные значения имеют обратный смысл по сравнению с типом блока 15. Это сделано для эффективности. Если данный байт больше нуля, то следующие size_count слов ( т.е. size_count*2 байтов ) копируются на экран. Если size_count меньше нуля, то следующее за size_count слово ( т.е. два последовательных байта, необязательно одинаковых ) копируется на экран. Количество повторений этого слова равно абсолютному числу size_count.
Блок тип 4 - настройки палитры (COLOR_256)
Данный блок позволяет настраивать палитру. Данные в этом блоке организованы в пакеты. Данный блок применяется только в FLC – файлах.
Первое слово после заголовка - число пакетов в этом блоке. Далее следуют пакеты. Первый байт пакета - сколько цветов палитры пропустить, не изменяя. Следующий байт - сколько цветов палитры надо изменить. Если данное число равно 0, то необходимо изменить все 256 цветов. Затем идут значения красной, зеленой и синей компоненты цвета - триады RGB ( всего 3 байта ). Это значения цветов для настройки палитры. Значения цветов изменяются от 0 до 255.
Вот пример в котором будут изменены 2, 7, 8 и 9 цвета:
2 ; два пакета
2,1,r,g,b ; пропустить 2 цвета, и изменить 1 цвет
4,3,r,g,b,r,g,b,r,g,b ; пропустить еще 4 цвета, и изменить 3 цвета
Блок тип 11 - настройки палитры (COLOR_64)
Данный блок позволяет настраивать палитру. Данные в этом блоке организованы в пакеты. Данный блок применяется только в FLI – файлах.
Первое слово после заголовка - число пакетов в этом блоке. Далее следуют пакеты. Первый байт пакета - сколько цветов палитры пропустить, не изменяя. Следующий байт - сколько цветов палитры надо изменить. Если данное число равно 0, то необходимо изменить все 256 цветов. Затем идут значения красной, зеленой и синей компоненты цвета - триады RGB ( всего 3 байта ). Это значения цветов для настройки палитры. Значения цветов изменяются от 0 до 63.
Вот пример в котором будут изменены 2, 7, 8 и 9 цвета:
2 ; два пакета
2,1,r,g,b ; пропустить 2 цвета, и изменить 1 цвет
4,3,r,g,b,r,g,b,r,g,b ; пропустить еще 4 цвета, и изменить 3 цвета
Блок тип 18 – миниатюрное изображение (PSTAMP)
Данный блок можно пропустить. Дополнительную информацию по данному блоку можно получить на [2]. Так как данный блок никакоем образом не влияет на воспроизведение фильма, я опускаю описание его.
Большим недостатком данных форматов фильмов является отсутствие звукового сопровождения. Но данный недостаток просто устранить в конкретной реализации, введя при проигрывании фильма звуковое сопровождение.
Также большим недостатком является отсутствие опорных кадров, но этот недостаток также просто устранить, создав утилиту для размещения в файле опорных кадров и указателей на эти кадры.
Другим недостатком является отсутствие поддержки полноцветных изображений. Но перевод в 8 битную палитру полноцветных изображений считается одним из способов субдискретизации с потерей качества. Поэтому это скорее плюс, чем минус.
Большим достоинством данного формата считается распространенность Animator Pro, простота создания в нем анимационных файлов и подробные описания его формата.
1. FAQ от конференции по компьютерной анимации:
ftp://ftp.uu.net/usenet/control/comp/comp.graphics.animation.Z
2. The Graphics File Format Page:
http://www.dcs.ed.ac.uk/~mxr/gfx/
Перевод и дополнения Анисимова С.Ю. 1997/01 и 1998/03.
Кировская обл. г. Кирово-Чепецк. Россия.