Обсуждение Утаптываем pc_eng.str на CD-R

Edison007

Ветеран
Модератор
"Мальчишки и девчонки! А также их родители! Веселые истории Послушать, не хотите ли?"
Или снова о старом... И так, короткое предисловие.
За последние пару лет появилось несколько новых идей, как можно улучшить сжатие данного файла, но до тестов руки до сих пор так и не дошли.
А так как ноябрь у меня, скорее всего, будет свободным, то хотелось бы этим заняться.
Собственно, в нескольких постах кратко собираюсь описать структуру файла и его содержимого (это скорее больше для себя чтобы вспомнить т.к планирую переписать софт для распаковки/восстановления, возможно, выложу тут),
собрать инфу из темы о некоторых нестандартных файлах, а также о новых идеях (но некоторые уже были описаны здесь).
 

Edison007

Ветеран
Модератор
Часть первая, коротко о структуре файла.
Основной заголовок (нам он в принципе не особо важен, но пусть).
Код:
Первые 16 байт всегда = "IOISNDSTREAM 0x09 0x00 0x00 0x00"
4 байта оффсет основной таблицы
4 байта кол-во файлов
4 байта размер заголовка
Основная таблица
Код:
8 байт индекс файла, т.е порядковый номер файла.
8 байт оффсет файла.
8 байт размер файла.
8 байт оффсет для таблицы с доп. инфой (о ней дальше).
4 байта размер доп. инфы. /* 20 bytes - OGG;  24 bytes - PCM;  28 bytes - ADPCM */
4 байта что-то неизвестное, но у меня отмечено, как  /* Identifier? */, возможно некий хэш по которому сортированы файлы. Проверить.
8 байт размер длины имени файла.
8 байт оффсет имени файла.
4 байта размер блока анимации внутри файла, если 0 анимации нет. /* real_size = value*1024 (val << 10) */  
4 байта размер блока аудиоданных.
8 байт всегда ноль, возможно резерв на будущее был.
Таблица с дополнительной информацией для аудио:
Код:
4 байта тип аудио. /* 2,17 - WAVE_FORMAT_PCM;   3 - WAVE_FORMAT_DVI_ADPCM;   4 - OGG Vorbis */
4 байта неизвестные данные, есть пометка /* Audio_File_Size div 2, for OGG = decode_PCM div 2 */. ХЗ че это и зачем, может потом повнимательнее посмотрю
4 байта кол-во каналов.
4 байта SampleRate.
4 байта BitsPerSample.  
4 байта BlockAlign. /* for ADPCM and PCM (Interleave/Block align) */
4 байта wPole. /* for ADPCM only */
Теперь о файлах, которые нужно рассмотреть внимательнее (это уже было в теме, но соберу всю инфу вместе):
1. Tosca, TomorrowNeverDies_Mix, TomorrowNeverDies_Mix_mono - в них содержится анимация, которая портит сжатие
P.S tosca к тому же 3 канальная - нужно разделять!

2. M06PartyBlues, M06PartyRock, M06PartySalsa внутри содержится два аудио файла, которые надо разделять (И вообще все файлы с типом 17, надо изучить внимательнее).

Возможно сделаю это на уровне распаковщика/инжектора, а возможно будет отдельными ехе, посмотрим...
 
Последнее редактирование:

Edison007

Ветеран
Модератор
Часть вторая - сжатие. Самая интересная группа pcm-данные с них и начнём.

OptimFrog.
1. Нужно перепробовать light-режимы - https://krinkels.org/threads/utaptyvaem-pc_eng-str-na-cd-r.3557/page-7#post-33840
2. Также были найдены данные, на которых опция --advanced-compression/--experimental портило сжатие.
2.1 А также --optimize best оказался не всегда лучшим, из чего следует, что нужно перегонять почти все сжатки заново.
Код:
set var=--encode --overwrite --mode ultranew-light --optimize normal
"ofr.exe" %var% --seek min --acm "118F1900.wav" --output "org_seek_min_acm.ofr"
"ofr.exe" %var% --seek min "118F1900.wav" --output "org_seek_min.ofr"
org_seek_min.ofr - 6,69 МБ (7 015 667 байт)
org_seek_min_acm.ofr - 6,70 МБ (7 027 685 байт)
3. Т.к собираюсь идти на рекорд, в итоговом сжатии нужно юзать raw режим, чтобы не хранить лишний заголовок wave файла (44 байта).
3.1 А также на файлах где будут лидировать не light-режимы использовать версию 4.900, т.к у неё сжатые файлы на 2 байта меньше. (ДВА БАЙТА, КАРЛ!)
4. Последнее, но самое интересное, наверное. Параметр seek - кол-во сэмплов в сжимаемом блоке. В оригинале эти значения следующие:
Код:
fast = 44100 * 10
normal = 44100 * 20
slow = 44100 * 40
min = 44100 * 120
Собственно, можно патчить ofr.exe меняя их в любую сторону (но при увеличении растет и потребляемая оперативная память), это может сказываться, как в лучшую, так и в худшую сторону. https://i.gyazo.com/7a29f2ad6e0d46d3e50bd2ed4957b5e8.png
Кто умеет в IDA - может сам найти и изменить, где это, кто нет может подождать от меня либо патчер, либо патченные екзешники, подумаю, как проще.

SAC
Уже в теме всё обсуждалось https://krinkels.org/threads/utaptyvaem-pc_eng-str-na-cd-r.3557/page-7#post-33926
Перепроверить сжатку с опцией оптимизации, и где будет выигрывать у фрог поиграться с частотой дискретизации, также в финальном варианте жать с опцией --striphdr, чтобы не хранить оригинальный заголовок.
По поводу SAC2, да, он может быть в некоторых случаях лучше первой версии, но он на порядок медленнее и даже я к такому еще не готов.

SREP-группы файлов. Пожалуй еще хуже, чем SAC2.
В данном случае влияет и порядок сортировки файлов, и параметры srep, и параметры аудио-компрессоров, пожалуй я пока точно не знаю, как их правильнее даже тестить, нужно многое учитывать.

Про ogg говорить особо нечего oggre да, пара финтов:
Сортировка и разделение на группы (нечто подобное: https://krinkels.org/threads/mt-framework-audio-de-cryptor.3970/#post-34843), но не факт что вообще будет профит.

С ima_adpcm и анимационной инфой всё еще грустнее попробовать некоторые универсальные компрессоры, да группу paq/cc.

Вот такие дела, на этом пока всё.
 

Edison007

Ветеран
Модератор
модифицированные офр екзешники
вариантами
по дефолту кол-во сэмплов:
fast = 44100 * 10
normal = 44100 * 20
slow = 44100 * 40
min = 44100 * 120

мод1
fast = 88200 * 40
normal = 88200 * 80
slow = 88200 * 120
min = 88200 * 160

мод2
fast = 352800 * 60
normal = 352800 * 80
slow = 352800 * 120
min = 352800 * 160
если коротко, может потом распишу в чем заключается идея
 

Вложения

Edison007

Ветеран
Модератор
Продолжим. Первое, удалось пропатчить ofr таким образом, что можно указывать любое числовое значение для seek. Но об этом подробнее как-нибудь потом... ;)

Второе, стал разбираться с группами, на которым необходим srep (от него в планах полностью отказаться). Таких групп 5.

1. Файл 297D5900.raw (Ethnic_Mix2.wav), на нём цепочка srep+ofr, показывает результат примерно на 2 мб лучше, чем просто ofr. Внутри файла два одинаковых куска по 3,43 МБ (3 605 990 байт) на смещениях 0x4B3A44 и 0x10598A4, удалив второй блок конечное сжатие улучшилось примерно на 16 кб.

2. Файлы 13A1F100.raw (Dark_Ambient.wav), 47F4C800.raw (SuspenseSlow.wav), 1B382C00.raw (SuspenseFast.wav). SuspenseSlow можно легко восстановить из Dark_Ambient если скопировать данные из Dark_Ambient со смещения 0x80CCA4, размер = 42087260. С SuspenseFast немного сложнее, первое нужно вырезать из SuspenseSlow кусок размером 5081864 байт со смещения 0x31FA27, а потом между ними построить дельта патч. Данные манипуляции на этих трёх файлах дают примерно -220кб.

3. Файлы 0B4B1A00.raw (Action3.wav), 375C1B00.raw (Action3_End+Electronics.wav). Тоже простой набор. Из Action3_End+Electronics вырезается начало на 32721 байт, а потом просто приклеиваются данные из Action3 на 13546239 байт со смещения 0x9BFFD5. Тут улучшений всего ~ на 2 кб.

Последние две группы не разобрал, т.к они куда сложнее, да и файлов в них больше, результаты предварительные, возможно выйдет еще улучшить сжатие. В принципе просто памятка, чтобы не забыть самому. :)
 

Edison007

Ветеран
Модератор
Памятка, чтобы не забыть, и отписаться Флорину.
Возможно, баг в OptimFrog. Не работает либо опция --aca, либо --no-aca - нужно провести больше тестов, чтобы знать наверняка, а может даже в IDA поковыряться, но это фиг знает, такое себе занятие :S

Код:
--mode ultranew-light --seek slow --optimize best                  - 27,0 МБ (28 362 683 байт)
--mode ultranew-light --seek slow --optimize best --aca            - 27,0 МБ (28 362 683 байт)
--mode ultranew-light --seek slow --optimize best --no-aca         - 27,0 МБ (28 362 683 байт)

--mode ultranew-light --seek slow --optimize best --acm            - 27,0 МБ (28 348 737 байт)
--mode ultranew-light --seek slow --optimize best --aca --acm      - 27,0 МБ (28 348 737 байт)
--mode ultranew-light --seek slow --optimize best --no-aca --acm   - 27,0 МБ (28 348 737 байт)
если обратить внимания ни одна из опций не влияет на конечный результат, кроме --acm
 
Последнее редактирование:

Edison007

Ветеран
Модератор
Итак, дописал/переписал дампер, добавил некоторый функционал.

Немного об опциях:
Код:
Use:
  exe [options] pc_eng.str

Options:
  -e   - Извлекает аудио-данные и сохраняет оригинальные структуру папок и файлов.
  -d   - Дампит аудио-данные, без сохранения структуры. Имена файлов = смещения (оффсеты) из pc_eng.str.
  -da  - Дампит анимационную данные (.lip - файлы).
  -a   - Добавляет WAVE-заголовки к PCM/IMA_ADPCM данным, можно послушать :).
  -z   - Опция на данный момент не работает. Должна обнулять участки в pc_eng извлеченных данных.
  -r   - Опция на данный момент не работает. Должна восстановлять pc_eng из сдампленной анимационной, аудио инфы и трёх таблиц (которые на данный момент не дампятся).
Так же дампер автоматически разбивает Tosca, M06PartyRock, M06PartyBlues и M06PartySalsa на два файла. Ну и соответственно не дампит в аудио-поток анимационную информацию.


Немного о структуре файла:

4 байта что-то неизвестное, но у меня отмечено, как /* Identifier? */, возможно некий хэш по которому сортированы файлы. Проверить.
Сто процентов некий хэш, но пока непонятно, как считается

8 байт всегда ноль, возможно резерв на будущее был
НЕ ВСЕГДА НОЛЬ! Для типа 17 всегда 2, для тех же файлов с типом 2 может быть либо 1, либо 2. Кол-во аудио-файлов в потоке/порядковый номер в потоке?

вообще все файлы с типом 17, надо изучить внимательнее
Посмотрел, по сути внутри потока два моно-файла, но как показала практика лучше жать это всё, как стерео
Если мне не изменяет память (проходил всё же больше 10 лет назад) в миссии "Убийство Воронов", можно подобрать рацию от одного из киллеров и слушать, что говорит напарник. Так вот, второй аудио-поток, как раз и похож на разговор по рации. :)

А еще если всю эту группу жать вместе srep:m3:l16+ofr:seek=min, то сжимается ~ на 7кб лучше, чем мой сохранённый предыдущий результат


Немного о сжатии:

Новых результатов, как таковых нет. Дописывал, переписывал, оптимизировал свой брутер для аудио файлов.
Ну и еще один тест показал, что иногда сжатие улучшается если поменять местами левый и правый каналы.
 

Вложения

Последнее редактирование:

Skymmer

Новичок
Проверенный
Что ж, не знаю, есть ли правила, запрещающие использование мата на форуме, но если есть, то я это правило нарушу.
Кто меня знает, тот знает, что я скуп на похвалу, но в данном случае могу сказать одно: О*****о !
Если не сказать больше...
Боже мой, сразу вспомнились ранние эксперименты с этим файлом, переписка с Кампастером, а потом и с PAQer-ом, который высмеял меня и ткнул как щенка в направлении улучшения сжатия, все эти безумные бруты разных параметров.... И вечная такая микро-мечта, чтобы получить все данные пофайлово.
Да, были конечно ToWav от Xplorer, MusGamePlayer от Heimdallr, и возможно что-то еще, что я забыл, но всё это были достаточно сырые и поверхностные реализации поддержки STR.
Ты молодец, Эдя!
Остается лишь аплодировать стоя.
 
Последнее редактирование модератором:

Skymmer

Новичок
Проверенный
Немного тестов и статистики.
Hardware: Core i7-3770K @4500MHz
Software: Win7x64 + SoftPerfect RAMDisk NTFS

Код:
v0.2 x64                  verbose               | silent
-----------------------------------------------------------------------------
Process Time     : 3.681s                       | 2.932s
Clock Time       : 7.942s                       | 2.945s
Working Set      : 156 MB                       | 156 MB
Pagefile         : 154 MB                       | 154 MB
IO Read          : 1793 MB (in 13987 reads)     | 1793 MB (in 13987 reads)
IO Write         : 1790 MB (in 11872 writes)    | 1790 MB (in 12403 writes)

v0.3 x86                  verbose               | silent
-----------------------------------------------------------------------------
Process Time     : 4.274s                       | 3.010s
Clock Time       : 8.199s                       | 3.008s
Working Set      : 155 MB                       | 155 MB
Pagefile         : 154 MB                       | 154 MB
IO Read          : 1793 MB (in 13987 reads)     | 1793 MB (in 13987 reads)
IO Write         : 1790 MB (in 11872 writes)    | 1790 MB (in 11872 writes)

v0.3 x64                  verbose               | silent
-----------------------------------------------------------------------------
Process Time     : 3.665s                       | 2.947s
Clock Time       : 7.961s                       | 2.941s
Working Set      : 156 MB                       | 156 MB
Pagefile         : 154 MB                       | 154 MB
IO Read          : 1793 MB (in 13987 reads)     | 1793 MB (in 13987 reads)
IO Write         : 1790 MB (in 11872 writes)    | 1790 MB (in 11872 writes)

v0.4 x86                  verbose               | silent
-----------------------------------------------------------------------------
Process Time     : 3.229s                       | 2.558s
Clock Time       : 7.474s                       | 2.561s
Working Set      : 107 MB                       | 107 MB
Pagefile         : 105 MB                       | 105 MB
IO Read          : 1793 MB (in 13987 reads)     | 1793 MB (in 13987 reads)
IO Write         : 1790 MB (in 11872 writes)    | 1790 MB (in 11872 writes)

v0.4 x64                  verbose               | silent
-----------------------------------------------------------------------------
Process Time     : 3.322s                       | 2.511s
Clock Time       : 7.439s                       | 2.508s
Working Set      : 107 MB                       | 107 MB
Pagefile         : 106 MB                       | 106 MB
IO Read          : 1793 MB (in 13987 reads)     | 1793 MB (in 13987 reads)
IO Write         : 1790 MB (in 11872 writes)    | 1790 MB (in 11872 writes)
Ну или ссылкой на голый текстовик, если кому так удобнее.
http://skymmer.narod.ru/data/pc_eng_dump/procprofile.txt
 
Последнее редактирование модератором:
Сверху