Пакер/препроцессор для мультимедиа данных. На данный момент поддерживаются данные следующих типов: dds (raw,dxt), bmp, wav (pcm), mp3. Т.к. этот препроцессор затачивается под работу с freearc'ом, то обработка данных осуществляется с одним входным файлом. На выходе получается так же один архив собственного формата.
Текущая версия пока не доведена до ума, в частности не доделана обратная упаковка извлеченных медиаданных в архив (команда i), команда "e" пока работает без возможности удаления исходных данных.
Эта версия пока не умеет распаковывать упакованные в bmf данные (raw dds, bmp).
Анпакер сделан пока только в виде ехе файла (для более простого отлова багов), когда все доделаю он будет так же и в виде CLS фильтра для фриарка с параллельной распаковкой относительно основного алгоритма сжатия фриарка (например lzma).
Изменения (относительно v0.0.5c):
v0.0.6
Текущая версия пока не доведена до ума, в частности не доделана обратная упаковка извлеченных медиаданных в архив (команда i), команда "e" пока работает без возможности удаления исходных данных.
Краткое описание команд и опций пакера:
[Команды]:
[Команды]:
- с - команда на упаковку входных данных. Эта команда является дефолтной, т.е. если не была указана ни одна команда, программа будет работать в режиме упаковки. Эта единственная команда, для которой кроме входного файла надо указывать так же и выходной.
- s - просто сканирование входного файла с целью детекта различного рода медиаданных. В конце выводится подробная статистика найденных готовых к упаковке данных, а так же валидных, но по той или иной причине не годных для упаковки.
- e - извлекает все найденные медиаданные в папку с названием схожую с названием входного файла. Задумано для извлечения неупаковываемых данных, типа bik, ogg, последующим ручным их lossy сжатием и вставлением обратно в исходный архив командой "i" с обнулением данных оставшейся области после каждого файла длиной равной разности исходного размера файла и lossy сжатого, что при последующем сжатии в lzma (или в любой другой конечный алгоритм) даст некий выигрыш.
- ec - аналогичен предыдущей команде, но извлекает только готовых к упаковке данных.
- i - пока не рабочая.
- -h или -? - показывает хелп на (ломаном) английском;
- -log=xxx - логгирует все выводимое на экран в файл xxx;
- -wav=N - включает (если N=1) или выключает (N=0) детект RIFF WAVE файлы. По умолчанию -wav=1;
- -raw=N - задает уровень детекта raw (без заголовков) аудио потоков. При N=0 фильтр выключается, при N=1 включается быстрый режим поиска (~20мб/с на 4х ядерном проце), при N=2 включается улучшенный поиск с lzma-взвешиванием (исключаются некоторые "шумные" данные и двухбайтные таблицы (каждый элемент которых является двухбайтам целым числом). Скорость 20-5мб/с, при увеличении % содержания аудио данных приближается к меньшей скорости). По умолчанию -raw=0;
- -bmp=N - включает (если N=1) или выключает (N=0) детект BMP файлов. По умолчанию -bmp=0;
- -dds[DXT,RAW]=N - включает (если N=1) или выключает (N=0) детект DDS DXT или DDS RAW файлов. По умолчанию -ddsDXT=1 и -ddsRAW=0;
- -mp3=N - задает уровень детекта mp3 фреймов. При N=0 выключает поиск mp3, при N=1 ищет только последовательно идущие mp3 фреймы, при N=2 ищутся фреймы с возможным некоторым небольшом расстоянии друг от друга (помогает искать "кривые" mp3 и другие нестандартные расположения mp3 фреймов). При -mp3=2 (для -mp3=1 это не распростаняется) выключается поиск RAW аудио блоков, т.к. оба искать контента не представляется возможным. По умолчанию -mp3=1;
- -minMP3Frames=N - минимальное количество найденных фреймов, при котором определяется, что это на самом деле и есть mpeg файл, а не удачно расположенный мусор. По умолчанию -minMP3Frames=20;
- -maxMP3Block=N - задает максимальный размер найденного mp3 блока, после которого файл режется. Т.е. если попался mp3 файл размером 6мб, а -maxMP3Block=1mb, то этот файл разрежется на 6 кусков и каждый зажмется по отдельности. Это необходимо для более плавной распаковки. А размер особо не страдает, если вообще меняется (не измерял). По умолчанию -maxMP3Block=1m;
- -lzma:x:y:... - задает параметры компрессии для lzma-взвешивания, необходимого при детекте DXT DDS (только при -dxt=2) и RAW аудио блоков (при -raw=2). Возможны следующие параметры алгоритма: bt4/hc4, lc, lp, pb, fb и mc. Указываются те же, что будут использованы для конечного сжатия lzma во фриарке. Без указания каких-либо параметров или вообще наличия данной опции они принимают следующие значения: -lzma:bt4:lc3:lp0:pb2:fb32:mc32 (Вместо двоеточий могут быть любые знаки).
- -bmf=N - уровень сжатия bmf кодера [1..9] для raw dds и bmp. При задании уровня так же можно добавить символ "s" (например -bmf=9s), который включит усиленное сжатие, но упаковка и, что главное, распаковка будет занимать гораздо больше времени (на порядок). Значение по умолчанию -bmf=9;
- -frog=N и -tak=N - взаимоисключающие опции для задания уровня сжатия wav pcm данных [1..9] OptimFrog'ом и TAK'ом соответственно. Если устанавливается одна опция, вторая автоматически выключается. Значения по умолчанию -frog=(off); -tak=9;
- -dxt=N - уровень оптимизации DDS DXT текстур. При N=0 любая оптимизация отключена, текстуры сохраняются в архив в исходном виде. При N=1 для всех dxt включается простая перестановка сходных по содержимому данных вблизи друг с другом. При N=2 включается lzma взвешивание - если исходный файл сожмется лучше, чем оптимизированный (не всегда перестановка улучшает конечное сжатие), то в выходной поток он пройдет без изменения. В будущем планирую добавить еще кучку моделей транформации индексов и цветов, соответственно и добавятся уровни сжатия. По умолчанию N=2;
- -f - выключает фильтры по размерам данных.
- -maxDDS[RAW,DXT,MIP]=N , -minDDS[RAW,DXT,MIP]=N - задает сответственно максимальный и минимальный размер для DDS файлов различных подтипов. Если найденный файл превысит или будет меньше указанных величин, то он исключится из обработки. RAW - размер для фильтра RAW DDS текстур. DXT - размер для фильтра DXT DDS текстур. MIP - при сжатии RAW DDS тестур с помощью bmf компрессора из текстур по одному извлекаются и сжимаются все mip уровни, так вот этот фильтр устанавливает минимальный и максимальный размер мип-уровня, который сожмется компрессором, остальное скопируется в исходном виде;
- -max[BMP,WAV,RAW]=N - задает максимальный размер для соответствующих типов данных. Максимальный размер для mp3 не задается, они все равно режутся на куски опцией -maxMP3Block;
- -min[BMP,WAV,MP3,RAW]=N - задает максимальный размер для соответствующих типов данных.
- -t=N - задает число используемых потоков. При значении равном 0 число потоков определяется по числу ядер процессора. По умолчанию N=0;
- -v - вывод подробной информации о происходящих процессах, а так же подробной конечной информации о найденных данных (для команды s она автоматом включена). Рекомендую всегда юзать, т.к. так легче понять в чем проблема при какой-либо ошибке в программе.
- -vv - показывает так же некоторую инфу о найденных RAW аудио блоках и их смещения относительно начала сканируемого файла.
Эта версия пока не умеет распаковывать упакованные в bmf данные (raw dds, bmp).
Анпакер сделан пока только в виде ехе файла (для более простого отлова багов), когда все доделаю он будет так же и в виде CLS фильтра для фриарка с параллельной распаковкой относительно основного алгоритма сжатия фриарка (например lzma).
MSC v0.0.1(24.06.2011)
MSC v0.0.2(13.08.2011)
MSC v0.0.3(18.10.2011)
MSC v0.0.4(24.10.2011)
MSC v0.0.5(03.12.2011)
Эта версия пока не умеет распаковывать упакованные в bmf данные (raw dds, bmp).
Анпакер сделан пока только в виде ехе файла (для более простого отлова багов), когда все доделаю он будет так же и в виде CLS фильтра для фриарка с параллельной распаковкой относительно основного алгоритма сжатия фриарка (например lzma).
Анпакер сделан пока только в виде ехе файла (для более простого отлова багов), когда все доделаю он будет так же и в виде CLS фильтра для фриарка с параллельной распаковкой относительно основного алгоритма сжатия фриарка (например lzma).
MSC v0.0.2(13.08.2011)
- чего-то то там правил в пакере, но уже не помню , надо записывать
- добавил распаковку данных, упакованных с bmf (dds raw, bmp). В библиотеке распаковки bmf'а обнаружился баг - он иногда переворачивал изображения, но благодаря помощи kampaster'а Дмитрию Шкарину был отправлен багрепорт, который в свою очередь подправил это дело и выслал рабочую библиотеку.
- зашил все дллки в анпакер. Для распаковки можно выбрать ехе файл с необходимой комбинацией анпакеров (не люблю кучу дллок рядом с прогой).
MSC v0.0.3(18.10.2011)
- пофиксил некоторые баги, добавил новые;
- переписал все под чистый винапи;
- в режиме оптимизации DXT DDS заменил zlib взвешивание на lzma (включается через -dxt=2) с заданием через двоеточие (или любой другой знак) параметров для алгоритма (lc,lp.pb,fb)
- добавил детект нестандартных mp3 файлов (с некоторым возможным расстояние между фреймами и неверным выравниванием), которые более или менее нормально жмутся пакером.
- больше не помню чего менял.
MSC v0.0.4(24.10.2011)
- пофиксил баг с падением проги при отображении нестандартных частот дискретизации;
- исправил некоректное извлечение файлов опций e/ec;
- перековырял весь код с целью все той же оптимизиции.
MSC v0.0.5(03.12.2011)
Изменения:
Небольшое исправление:
Еще одно исправление:
- добавил поблочный (на данный момент блоки только по 16кб) детект 16-ти битных raw аудио потоков. До идеала пока явно не дотягивает, но все же довольно корректно находит аудио данные без заголовков. Надо будет сделать еще некоторое "сглаживание" найденных блоков, а то местами в реально одном звуковом стерео файле находятся блоки с моно содержанием. Так же нужно будет чтобы сглаживались резкие смены содержимого (например в 20 блоках детектятся аудио, потом 1 блок якобы мусора, а далее снова аудио). Поиск raw аудио включается опцией -raw=N, где N=1 или 2. В первом режиме скорость скана на 4хядерном проце порядка 20мб/с, во втором - 5-20мб/с. При чем не обязательно второй режим даст лучший детект, скорее он отсекает некоторые "шумные" и "тихие" данные, а так же некоторые другие последовательности данных;
- исправил зависание при некорректном размере в заголовке любого сканирумого подтипа (при превышении размера, полученного из заголовка найденных медиаданных, размера самого сканируемого файла);
- при возрате системой ошибки открытия или создания временного файла сделал циклический повтор на определенный промежуток времени. Все из-за того, что в некоторых случаях при работе с одинаковыми именами временных файлов система возращает отрицательный результат (я так думаю винда просто не успевает обработать удаление старого файла, или индексирование косячит);
- для LZMA-взвешивания добавил параметры bt4/hc4 (Match Finder), mc=N (Match Finder Cycles);
- отключил проверку частоты дискретизации для RIFF WAVE;
- в парсере командной строки добавил обработку значений размерностей байт/кбайт/мбайт/гбайт;
- всякие мелкие исправления и добавления.
Небольшое исправление:
- Разделил опцию -dds на -ddsraw и -ddsdxt;
- подкорректировал взаимосвязи опций -mp3 и -raw;
Еще одно исправление:
- Исправил утечку памяти при lzma-взвешивании, приводившую через какое-то время к нехватке памяти приложению;
- чуть ускорил взвешивание dxt dds;
Изменения (относительно v0.0.5c):
v0.0.6
- исправил детект при расположении целевого субфайла впритык с концом архива;
- добавил обработку ATI2 текстур в dds (преобладают в crysis 2);
- исправил ошибку при детекте raw audio (криво детектилось при -raw=1). Вообще пока в моих тестах -raw=1 дает лучший конечный результат нежели -raw=2;
- сделал сглаживание резких переходов в детекте raw audio;
- опции -ddsraw и -bmp теперь по умолчанию равны 0;
- исправил детект wav'ок с валидным заголовком, но нулевой длиной данных;
- добавил вывод информации в лог-файл (опция -log=file);
- исправил неверную обработку опций начинающихся на "min.." и "max.." (на них выдавало ошибку);
- исправил вылет cls фильтра при деинициализации, если он не был использован в инсталле;
- исправил ошибку при использовании опции -log;
- обновил ТАК до версии 2.3.0;