engrus

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 00ID = 2, Size = 0x3000
00 E6 EE DA 75ID = 0, Size = 0x675DAEE
02 08ID = 2, Size = 0x8
04 C2 20 BB 03 01 01ID = 4, Size = 0x2BB20, FilterID = 0x3, FilterDataSize = 0x1, FilterData = [0x1]