
Парсинг метаданных FLAC-файлов на Ассемблере

Парсинг метаданных FLAC-файлов на Ассемблере
Продолжу тему парсинга метаданных из медиафайлов разных форматов. Сегодня разберем аудиофайлы FLAC. Это очень популярный кодек, предназначенный для сжатия аудиоданных без потерь, используется с 2001 года и поддерживается большинством плееров. Формат хорошо документирован, к тому же имеет очень простую внутреннюю структуру.
Файл начинается с сигнатуры "fLaC", после нее следует DWORD с размером обязательного блока STREAMINFO, после которого могут быть расположены блоки метаданных и, наконец, закодированный аудиопоток. Нам нужны только блоки метаданных, в которых содержится интересующая информация об исполнителе, названии трека, альбоме и т.п. Блок метаданных начинается с 4-байтного заголовка, в котором первый байт содержит тип блока, а следующие 3 байта - длина данных этого блока. При последовательном переборе отдельных блоков нужно найти тот, который имеет тип 4, то есть VORBIS_COMMENT, другие типы просто пропускаем. Блок с тегами начинается с DWORD, в котором записана длина название используемой для кодирования библиотеки. Эти данные можно пропустить. Дальше следует блок тегов, его парсинг выполнятся точно так же, как это делалось для файлов OGG, структура данных также соответствует схеме Vorbis.
Code (Assembler) : Убрать нумерацию
- ; Открыть файл для чтения
- invoke CreateFile,sample,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
- mov [desc],eax
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,8
- ; Проверить корректность файла
- mov esi,buff
- cmp dword [esi],'fLaC'
- jne loc_close
- ; Длина STREAMINFO
- mov ebx,[esi+4]
- bswap ebx
- ; Пропустить блок STREAMINFO
- invoke _llseek,[desc],ebx,FILE_CURRENT
- cmp eax,-1
- je loc_close
- loc_read:
- ; Заголовок блока
- invoke _lread,[desc],buff,4
- ; Проверить тип блока, 4 = VORBIS_COMMENT
- mov ebx,dword [buff]
- cmp bl,4
- je @f
- ; Длина данных для пропуска
- mov bl