7-Zip плагины\WavPack7z\Технические детали
Свойства декодера
При упаковке при вызове у кодера метода WriteCoderProperties кодер сохраняет в качестве свойств один байт. Старший полубайт определяет версию кодера, в текущей реализации версия имеет значение 0x0. Младший полубайт определяет уровень сжатия, и служит лишь для информационных целей.
Декодирование потоков, созданных кодеком WavPack2
При упаковке кодеком WavPack2 создается три выходных потока. Первый поток предназначен для сжатых аудио данных, второй для несжатых заголовков и окончаний файлов, третий для хранения управляющей информации. Распаковка исходного файла происходит на основе информации из третьего потока.
Управляющий поток состоит из последовательно записанных пар ID-Размер. Каждая пара определяет один неразрывный блок данных, ID определяет тип данных и поток, из которого нужно прочитать данные блока, Размер определяет размер блока в упакованном виде. Значения ID и Размер записаны в упакованном формате, метод упаковки описан в файле 7zFormat.txt из состава исходных кодов программы 7-Zip.
Определены следующие значения ID:
- 0 – аудио данные из первого потока. Аудио данные представляют собой стандартный WavPack контейнер. При декодировании WavPack контейнера декодер должен декодировать только аудио данные, все дополнительные данные, хранящиеся в контейнере (заголовки и окончания), должны игнорироваться. Декодируемые исходные аудио данные имеют порядок байтов little-endian. Алгоритм распаковки WavPack контейнера можно изучить по исходным файлам программы wvunpack, которые можно скачать с сайта www.wavpack.com.
- 1 – Тоже самое, что и 0, но декодируемые исходные аудио данные имеют порядок байтов big-endian. Разделение упакованных аудио данных на два типа происходит из-за того, что при упаковке в библиотеку WavPack не передается флаг QMODE_BIG_ENDIAN, поскольку он увеличивает размер WavPack контейнера.
- 2 – Данные из второго потока. Декодер должен просто скопировать байты один в один в выходной поток.
- 3 – Данные из первого потока. Декодер должен просто скопировать байты один в один в выходной поток.
- 4 – Данные из второго потока, обработанные фильтром. Декодер должен скопировать байты в выходной поток, предварительно обработав их фильтром-декодером. Идентификатор фильтра записан в упакованном виде в третьем потоке сразу после размера блока. Далее там же записано в упакованном виде количество байт с информацией для декодера, которая должна быть передана декодеру через интерфейс ICompressSetDecoderProperties2, и непосредственно сами байты с информацией.
Пример данных управляющего потока:
02 B0 00 00 E6 EE DA 75 02 08 04 C2 20 BB 03 01 01
Декодирование:
Данные | Расшифровка |
---|---|
02 B0 00 | ID = 2, Size = 0x3000 |
00 E6 EE DA 75 | ID = 0, Size = 0x675DAEE |
02 08 | ID = 2, Size = 0x8 |
04 C2 20 BB 03 01 01 | ID = 4, Size = 0x2BB20, FilterID = 0x3, FilterDataSize = 0x1, FilterData = [0x1] |