Введение

Smacker video — это формат видеофайла (с расширением SMK), разработанный Epic Games Tools и в основном используемый для полноэкранного видео в видеоиграх. Smacker использует адаптивную 8-битную RGB-палитру. Формат RAD для видео с большей глубиной цвета — Bink Video. Формат Smacker определяет формат контейнера, формат сжатия видео и формат сжатия аудио. С момента выпуска в 1994 году Smacker был использован более чем в 2300 играх. Формат был реконструирован и реализован в libavcodec. Некоммерческий проект libsmacker на SourceForge выпустил декодер с открытым исходным кодом в 2013 году.

Формат файла (контейнер)

Smacker определяет собственный формат контейнера. Файл Smacker может содержать видеодорожку и до семи аудиодорожек. Каждая аудиодорожка может иметь один канал (моно) или два канала (стерео) с битовой глубиной 8 или 16 бит. Аудио может быть несжатым PCM, сжатым в формате Smacker Audio или, в более новых версиях Smacker, сжатым в формате Bink Audio.

Видео

Видео Smacker поддерживает 256 цветов, но не поддерживает прозрачность. Являясь палитровым форматом, который по своей сути ограничен не более чем 256 цветами в каждом кадре, видео Smacker всё же может содержать больше цветов в общей сложности благодаря "ротации палитры", при которой палитра обновляется для каждого кадра. Обычно это приводит к тому, что SMK-файлы выглядят лучше, если исходное видео содержит более 256 цветов. Степень сжатия зависит от содержимого. Кодирование видео, состоящего из неподвижных или почти неподвижных кадров, после первого кадра практически бесплатно. Кадры со случайными цветами могут увеличивать размер в более чем два раза. В видео Smacker кадр разбивается на блоки 4x4 в порядке построчной развертки. Каждый блок может быть закодирован одним из шести режимов кодирования: пропуск, заливка, моно и три полных режима. Информация о каждом режиме может передаваться для нескольких блоков с использованием схемы кодирования длин серий. В режиме пропуска текущий блок копируется из предыдущего кадра с условным обновлением. В режиме заливки текущий блок заполняется одним цветом. В монорежиме палитра локально сокращается с 256 до двух цветов. Оба цвета записываются в битовый поток, и один бит на пиксель используется для указания, какой из двух цветов должен быть присвоен пикселю. Монорежим можно интерпретировать как векторное квантование, где трёхмерный вектор с компонентами красного, зелёного и синего квантуется с использованием адаптивного кодового словаря с двумя элементами. Существует три полных режима: один был определён в версии 2 формата Smacker, а два других были добавлены в версии 4. В оригинальном полном режиме передаётся 16 цветов, по одному для каждого пикселя, что эквивалентно несжатому PCM. Два полных режима, добавленные в версии 4, используют 4 и 8 цветов в блоке соответственно. В режиме 4 цветов блок 4x4 разбивается на четыре блока 2x2, каждый из которых заполняется однородным цветом. В режиме 8 цветов блок 4x4 разбивается на восемь блоков 1x2, каждый из которых заполняется однородным цветом. Дополнительное сжатие достигается за счёт энтропийного кодирования с использованием кодирования Хаффмана различных элементов битового потока, полученных в результате описанного процесса. Существует четыре отдельные таблицы Хаффмана, каждая из которых содержит 16-битные записи: одна для выбора режима, длины серий и цвета заливки в режиме заливки, одна для цветовых индексов в монорежиме, одна для растрового изображения в монорежиме и одна для всех данных в полном режиме. Каждая таблица адаптивна и передаётся один раз в заголовке файла. Таблицы Хаффмана в заголовке также сжаты: 16-битные значения в листьях дерева кодирования разделяются на старший и младший байты. Каждый байт сжимается с использованием таблицы Хаффмана, которая также содержится в заголовке.

Аудио

Smacker audio — один из аудиоформатов, который может использоваться в контейнере Smacker. Для сжатия используется дифференциальная импульсно-кодовая модуляция (DPCM). Разница между двумя последовательными отсчетами сжимается с использованием кодирования Хаффмана. Таблицы Хаффмана адаптируются один раз для каждого аудиокадра.