Сейчас на форуме: Magister Yoda, site-pro, Rio (+6 невидимых) |
eXeL@B —› Крэки, обсуждения —› Помогите разобрать алгоритм усечённого блочного кодирования (block truncation coding, BTC) |
Посл.ответ | Сообщение |
|
Создано: 02 августа 2013 19:46 · Поправил: robot666 · Личное сообщение · #1 Доброго всем! Есть игра Harvester, я хочу разобраться с алгоритмом декодирования видео, вынуть видео, наложить русские титры и вставить назад. Ссылка на описание и алгоритм - Начал разбираться и не понял терминологию, которой описан алгоритм декодирования. Формат видео. Видео состоит из множества блоков видео+аудио. Все представленные числа находятся в формате маленького индейца (Little Endian). В заголовке FST файла идут 8*4 (32 байта, на картинке красные блоки) следующих данных (u32 - беззнаковое целое число, 32 bit, 4 байта; u16 - беззнаковое целое число, 16 бит, 2 байта): на примере 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 -- размер блока аудио Конец заголовка файла. Затем идут массивы байт количеством 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 байтные данные) И затем идет алгоритм декодирования: Initialize bit reader using Bitmap. (Bitmap из заголовка выше, похоже всю цепочку надо представить битовой строкой) Read one byte, fetch bits starting from the highest. (прочитать 1 байт, получить список бит с наивысшего?) Get bit. If bit is set - read the palette data (взять бит, если он установлен в 1, то читать данные палитры) For each 4x4 block of the image (left to right, top to bottom) (для каждого блока 4х4 (пикселей) изображения (слева-направо, сверху-вниз, ноль значит в левом-верхнем углу) Get Bit. If bit is set: (взять бит, если он в 1, то) Get Bit. If bit is set: (взять бит, если он в 1, то) Read Color0, Color1 8-bits values from Data (читать Цвет0, Цвет1 8-битные значения из DATA) Read BTCMap 16-bits value from Data (читать BTCMap 16 битное значение из DATA, битовая матрица 4х4) For each pixel of 4x4 block (left to right, top to bottom) (для каждого пикселя блока 4х4, каждый пиксель это бит) pixel = (BTCMap & 0x8000) ? Color1 : Color0 (сделать битовую операцию BTCMap (2байта) & 8000h, 8000h = 10000000 00000000, старший бит 16 бит числа в 1, результат сей битовой операции будет или 0, или 1. В зависимости от этого возвращается Цвет1 или Цвет0, понял. ) BTCMap <<= 1 (делается битовый сдвиг влево BTCMap на 1, то есть BTCMap=BTCMap*2) Else Draw block using next 4x4 bytes of Data (рисовать блок, используя следующие 4х4 байта данных, видимо используя палитру. На выходе получается RAW картинка наверное) ЗЫ1: Метод усечённого блочного кодирования (block truncation coding, BTC), первоначально разработанный для кодирования двухуровневых чёрно-белых изображений, может быть с успехом применён и для сжатия полутоновых изображений (как чёрно-белых полутоновых, так и цветных). Классический метод BTC чрезвычайно прост: изображение разбивается на непересекающиеся прямоугольные блоки, для каждого блока вычисляются среднее значение яркостей пикселов и дисперсия, затем пикселы блока делятся на две группы – надпороговые, яркость которых превышает вычисленное среднее, и подпороговые. Для того, чтобы можно было установить, к какой группе принадлежит кодируемый пиксел, передаётся (кодируется) бинарная матрица, кроме того, передаются вычисленные среднее и дисперсия, используемые для восстановления блока при декодировании. ЗЫ2: Судя по вики ( BTCMap - битовая карта 4х4, 16 бит закодированы в 2х байтах, представляют собой в итоге 4х4 байта матрицу. |
|
Создано: 02 августа 2013 20:28 · Личное сообщение · #2 |
|
Создано: 02 августа 2013 20:44 · Поправил: robot666 · Личное сообщение · #3 reversecode Мне абсолютно непонятны следующие строки 1. Initialize bit reader using Bitmap. ( что за бит ридер, используя Битмап?) 2. For each 4x4 block of the image (left to right, top to bottom) (Что за цикл такой 4х4 блок изображения, для бит, для пикселей?) 3. Get Bit (Какой бит? Из Битмап 2 старших бита?) 4. For each pixel of 4x4 block (left to right, top to bottom) (То же самое что в п.2, опять какой-то блок, толи битовый, толи байтовый) 5. Draw block using next 4x4 bytes of Data (А тут уже 4х4 байта из Дата, причем нарисовать, то есть получается из 320х200 если разбить на блоки 4х4 получается 80х50 блоков, в которых 4х4 блоки, ох) У меня в голове схема из-за этого странного псевдоязыка не строится. Как формируется цикл декодирования? Куча вопросов, которые не складываются в единую картину мира ((((( |
|
Создано: 02 августа 2013 20:48 · Поправил: reversecode · Личное сообщение · #4 так я не получил ответа на свой "наводящий" вопрос - вас в гугле забанили ?? | Сообщение посчитали полезным: Abraham |
|
Создано: 02 августа 2013 20:55 · Личное сообщение · #5 |
|
Создано: 02 августа 2013 20:57 · Поправил: reversecode · Личное сообщение · #6 |
|
Создано: 02 августа 2013 21:02 · Поправил: robot666 · Личное сообщение · #7 reversecode Я оочень далек от классического программирования как по образованию, так и по работе, для меня это god damned hobby, но тут я закопался и завис ( IDA с поиском константы 8000 пока ни к чему не привела. Недельное изучение в dosbox debugger ни к чему пока не привели. Предложите пожалуйста продолжение или иной вариант: 1. Ловлю чтение файла, int 21h, ah=3fh 2. Нахожу байт-поиском в IDA куда же я попал 3. Курю годы до просветления.. ЗЫ: походу сюда я старую версию запулил текста, ща гляну ( не, последняя правка, застрял на циклах. Пролистал книгу Методы сжатия данных. - М: Диалог-МИФИ, - 2003, 384 с., про BTC там нет ничего ( |
|
Создано: 02 августа 2013 21:15 · Поправил: reversecode · Личное сообщение · #8 вы не то ловите, графика выводтся через vesa vbe а не через dos программа собрана на watcom, стаб там впереди кажется прицеплен, и зза этого прога как мне кажется вообще неправильно в ида грузится так что отцепляйте цепляйте .. играйтесь что бы правильно загрузилась вконце exe, вроде даже какая то мнини дебаг инфа, которую может даже поймет ИДА, но я знаю как минимум один отладчик что ее понимает, это wd(watcom debugger) в комплекте ваткома кажется была утилита которая отцепляет стаб отрезать надо до 0000041533: 4D 5A очень похоже на реальное начало файла а до этого это расширитель памяти итд он не нужен, и изза этого ида не так дизассемблирует, а вы ищите не те данные, точнее не в том месте |
|
Создано: 02 августа 2013 21:40 · Поправил: robot666 · Личное сообщение · #9 reversecode стаб я отцепил, мне помогли (sb.exe /U somegame.exe Теперь файл somegame.le можно открывать в IDA, утилита dos extender 32 забыл как точнее они зовутся, замена dos4gw) , открыл 32 битный код идой, в коде байт-поиском находил места, куда я попадал в досбокс дебагере. Смотрел байты текущих инструкций в дебагере, вбивал поиск в Иде и находил блоки. Оказалось несложно. Отладчик всё никак не решусь начать копать через softice dos под vmware, мне айс нравился, но последний раз я его трогал 10 лет назад и я ничего не помню ( То есть плясать от чтения файла видео - плохой вариант? Тогда подскажи как выводилась графика в vesa режиме? Там вроде плавающее окно в 64кб было и нужно было поток данных для вывода графики писать по какому-то адресу, а палитру совать в порт, афаир, 3f8h. Или у меня уже каша в голове от дос-ада. |
|
Создано: 02 августа 2013 21:45 · Личное сообщение · #10 |
|
Создано: 02 августа 2013 21:49 · Поправил: robot666 · Личное сообщение · #11 |
|
Создано: 02 августа 2013 21:57 · Поправил: reversecode · Личное сообщение · #12 |
|
Создано: 02 августа 2013 22:05 · Личное сообщение · #13 |
|
Создано: 02 августа 2013 22:06 · Поправил: reversecode · Личное сообщение · #14 |
|
Создано: 02 августа 2013 22:10 · Поправил: robot666 · Личное сообщение · #15 reversecode Я про стабы то узнал месяц назад, а мне тут фулл стаб, престаб. Проще было на китайском написать)) Короче не хватило предметных знаний. В игре есть 2 плохих момента: 1. В текстовых файлах есть субтитры для видео, но в видео титров нет. 2. Некоторые видеоролики начинают проигрываться, показывает пару кадров и пропуск. Причем если уменьшить количество циклов досбокс до 5000-8000, то ролики проигрываются нормально, но игра становится медленной до неиграбельности. Вот ломаем голову что же делать. |
|
Создано: 03 августа 2013 00:25 · Поправил: reversecode · Личное сообщение · #16 этот файл игры с необрезаными дебаг символами но ида их не видет, иначе бы все функции имели название, их должен увидеть только ваткомоский дебагер, ну либо сами разберите формат этих отладочных симполов и прикрутите в ида, тогда вообще станет все понятно по названиям функций как вариант можете попробовать поганять ваткомоским дизасмом может он дебаг инфу увидет и ее можно будет выдрать |
|
Создано: 03 августа 2013 03:51 · Личное сообщение · #17 |
|
Создано: 03 августа 2013 04:31 · Поправил: reversecode · Личное сообщение · #18 wdump не знал... но парсер на пять строк написал... сгодится на будущее harvest.idc в иде применить и всего то |
|
Создано: 03 августа 2013 09:28 · Поправил: robot666 · Личное сообщение · #19 reversecode проставил соответствие адресам функции имена из ватком лога? класс. Применил, стало еще красивее. Есть какие-нибудь идеи, почему воспроизведение видео зависит от циклов-тактов в досбокс и почему при больших значениях некоторые видео показывают всего пару кадров? В режиме LOG пошагово всё видео воспроизводит нормально, а в режиме авто с циклами ~40000 начинает чудить. Если циклы уменьшить до 5000, то видео показывает нормально, но играть становится невозможно. На vogons'е гениально посоветовали постоянно переключать циклы. Буду в отладчике смотреть функцию decompress_fst, на нее все ссылаются. Сперва идет play_fvi с указанием файла fst, а внутри Code:
Я тут подумал. Вот можно разобрать видео, но когда собирать его назад придется, то произойдет снова понижение качества, в оригинале итак грустно, а будет еще грустнее. ( |
|
Создано: 05 августа 2013 04:31 · Личное сообщение · #20 |
|
Создано: 05 августа 2013 09:47 · Поправил: robot666 · Личное сообщение · #21 Три дня смотрел функцию Decompress_fst, не вижу места почему некоторые видео пропускает игра. Пытаюсь найти информацию, как происходит синхронизация того что выполняется и что показывается. В функции разжатия нет ни таймеров, ни часов. В начале блока декодирования есть 2 ожидания хода луча VSYNC. Есть одно непонятное мне место: Code:
По идее тут сравнивается нажата ли левая/правая кнопка мыши или клавиша и переход на VIDEO_EXIT. НО, в IDA навожу на movsx eax, W?raw_key$nys, смотрю в HEX, последовательность 0F BF 05 60 59 0D 00, иду в WinHex на это же место и вижу уже 0F BF 05 60 59 02 00. Вопрос, почему предпоследний байт кода отличается? 02 и 0D. wtf? Убирал переходы, игра вообще валится с ошибками, возможно это и не то, что я думаю? Интересное наблюдение: Взял на тестирование момент повторного разговора с Хэнком, показывает 1 или пара кадров видео ковбоя, стреляющего в индейца и пропуск. Это видео RANGSHOT.FST, подменил его другим видео, то же самое, пара кадров из другого видео. Никак не пойму, почему игра одни видео играет, а другие нет. Например, начальные 3 видео проигрываются всегда нормально. Подменил RANGSHOT.FST на VIRGLOGO.FST, играющий в начале, воспроизвелось нормально. Если VIRGLOGO.FST подменить на RANGSHOT.FST, то при старте игры видео показывает нормально. Загадка. |
|
Создано: 05 августа 2013 10:07 · Личное сообщение · #22 |
|
Создано: 05 августа 2013 10:18 · Поправил: robot666 · Личное сообщение · #23 |
|
Создано: 05 августа 2013 10:37 · Личное сообщение · #24 считаю вашу затею с локализациями русификациями игры вообще напрасной, игра писана под дос, если и имеет смысл, то доставать исходники и переписывать ее под виндовс манияки которые захотят в нее поиграть, поставят дос или поставят какойто вирутал ПК, и поиграют зачем ломать логику задуманую автором и чего то там перекодировать ... |
|
Создано: 05 августа 2013 10:48 · Поправил: robot666 · Личное сообщение · #25 Игра прекрасно играется под dosbox, весь текст уже переведен и вставлен. Под vmware и virtualpc2007 не работает. Единственный момент который всё портит - это пропуски видео. У меня чето руки кривые чтоли, HEX VIEW-A в IDA и Winhex не могу состыковать, не то вижу. Делаю NOP на условных переходах, а IDA мне пишет, что там int3 и retf, игра естественно валится. Всё, победил, спасибо товарищу reversecode за наводку. Видимо игра не успевала сбросить/опросить буфер мышки и клик мышкой пролезал в воспроизведение видео, прерывая его. Оставил из условных переходов реакцию на клавиатуру, а два условных перехода от мышки занопил, и видео стало показывать нормально и пропустить можно. |
|
Создано: 06 августа 2013 21:38 · Поправил: robot666 · Личное сообщение · #26 |
|
Создано: 06 августа 2013 21:44 · Личное сообщение · #27 |
eXeL@B —› Крэки, обсуждения —› Помогите разобрать алгоритм усечённого блочного кодирования (block truncation coding, BTC) |