@jack7277

Разобрать алгоритм усечённого блочного кодирования (block truncation coding, BTC)?

Доброго всем!

Есть игра Harvester, я хочу разобраться с алгоритмом декодирования видео, вынуть видео, наложить русские титры и вставить назад.

Ссылка на описание и алгоритм — --> FutureVision_FST < — Метод усечённого блочного кодирования (block truncation coding, BTC), первоначально разработанный для кодирования двухуровневых чёрно-белых изображений, может быть с успехом применён и для сжатия полутоновых изображений (как чёрно-белых полутоновых, так и цветных).

Классический метод BTC чрезвычайно прост: изображение разбивается на непересекающиеся прямоугольные блоки, для каждого блока вычисляются среднее значение яркостей пикселов и дисперсия, затем пикселы блока делятся на две группы – надпороговые, яркость которых превышает вычисленное среднее, и подпороговые. Для того, чтобы можно было установить, к какой группе принадлежит кодируемый пиксел, передаётся (кодируется) бинарная матрица, кроме того, передаются вычисленные среднее и дисперсия, используемые для восстановления блока при декодировании.


Начал разбираться и не понял терминологию псевоязыка, которой описан алгоритм декодирования.


Формат видео.

Видео состоит из множества блоков видео+аудио.

Все представленные числа находятся в формате маленького индейца (Little Endian).

В заголовке FST файла идут 8*4 (32 байта, на картинке красные блоки) следующих данных:

на примере ALARM.FST


Начало заголовка файла:

u32 — Signature — сигнатура файла — «2TSF»

u32 — Width — ширина кадра (число 320 пикс)

u32 — Height — высота кадра (число 200 пикс)

u32 — Ticks — frame rate in ticks? (под вопросом, частота кадров в тиках, во многих файлах одинаковое число 276480)

u32 — Frames — число кадров-блоков видео+аудио. (40)

u32 — Rate — частота кадров в секунду (15 к/с)

u32 — SoundRate — частота звука (22050 Гц)

u32 — SoundBits — разрядность звука (16 бит)


Следом идут блоки в количестве, указанном в Frames (40 зеленых блоков на картинке, 4+2 байта, 40*6 байт):

u32 VideoSize — размер блока видео

u16 AudioSize — размер блока аудио

Конец заголовка файла.


Иллюстрация заголовка
alarm_fst.png


Затем идут массивы байт количеством Frames:

u8 VideoData[VideoSize] — блок данных видео, размером VideoSize

u8 AudioData[AudioSize] — блок данных аудио, размером AudioSize


Каждый блок VideoData имеет следующий формат:

u16 — BitmapSize — size of the following bitmap, in bits (размер следующего растра/изображения, в битах, непонятно)

u8 Bitmap[BitmapSize/8+1] — flag bits (битовые флаги), массив, битовый поток? Непонятно.

RGB Palette[256] — optional. 6-bits DAC values. (RGB и 256, то есть идут группы из 3х цветов R G B и групп 256, как раз палитра 768 байт)

u8 Data[] — to the end of frame (до конца кадра 1 байтные данные)


И затем идет алгоритм декодирования:
8e5411b8d46c2620d830205ce619d13b.png


В алгоритме непонятен цикл декодирования, а точнее откуда берется очередной «GET BIT». Либо это непрерывный поток бит u8 Bitmap, или берется побайтно и берется оттуда биты7 и бит6?


ЗЫ:

Судя по вики (--> Block_Truncation_Coding <--), битовые 0 и 1в BTCMap — это как раз Цвет0 и Цвет1.

BTCMap — битовая карта 4х4, 16 бит закодированы в 2х байтах, представляют собой в итоге 4х4 байта матрицу.
  • Вопрос задан
  • 3759 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
У меня что-то такое нарисовалось: gist.github.com/jcmvbkbc/6181029
Я там забил на обработку ошибок, использование палитры и на звук. Иногда при распаковке оно пытается прочесть чуть больше данных, чем записано в кадре.
непонятен цикл декодирования, а точнее откуда берется очередной «GET BIT»

— непрерывный поток бит из bitmap: байт 0, бит 7; байт 0, бит 6; ...; байт 1, бит 7;…
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы