Обсуждение Утаптываем 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 кб.

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