Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Парсинг метаданных DSF-файлов на Ассемблере
Парсинг метаданных DSF-файлов на Ассемблере

Во время очередного пиратского набега на торренты мне попался музыкальный альбом в формате DSF. Это контейнер для аудиопотока в супер-мега качестве, разработанный компаниями Sony и Philips. В результате и файлы получаются по 400-500 мегабайт на одну песню. Может быть для аудиофилов такое качество как-то можно обосновать, но для меня этот формат представляет исключительно спортивный интерес. А точнее, как из таких файлов извлечь метаданные.

В спецификации формата DSF внутренняя структура описана очень подробно, хотя там особо ничего и описывать не надо. Формат очень простой.

Спецификация формата файлов DSF (ENG)Спецификация формата файлов DSF (ENG)

DSF.File.Format.Specification.ENG.zip (37,409 bytes)

Первые четыре байта заголовка - сигнатура файла "DSD " (строка с пробелом в конце), затем QWORD с размером заголовка файла, это фиксированное значение 1Ch или 28 в десятичной системе счисления. Следующий QWORD - полный размер DSF-файла. Оставшиеся 8 байт - смещение от начала файла до блока метаданных. Если это значение нулевое, то метаданных в файле нет. Сами метаданные хранятся в стандартном формате ID3v2.

На первом этапе надо прочитать заголовок файла, проверить его принадлежность к DSF-формату, проверить наличие метаданных, а затем с помощью функции SetFilePointer передвинуть указатель от начала файла до обозначенной в заголовке позиции.
  1.         invoke  CreateFile,sample,GENERIC_READ,\
  2.                 FILE_SHARE_READ,0,OPEN_EXISTING,0,0
  3.         mov     [desc],eax
  4.  
  5.         ; Прочитать заголовок файла
  6.         invoke  _lread,[desc],buff,28
  7.         ; Проверить корректность формата
  8.         cmp     dword[buff],'DSD '
  9.         jne     loc_ret
  10.         cmp     dword[buff+4],1Ch
  11.         jne     loc_ret
  12.         ; Проверить наличие метаданных
  13.         cmp     dword[buff+14h],0
  14.         jnz     @f
  15.         cmp     dword[buff+18h],0
  16.         je      loc_ret
  17. @@:
  18.         ; Установить указатель файла на блок метаданных
  19.         invoke  SetFilePointer,[desc],\
  20.                 dword[buff+14h],buff+18h,FILE_BEGIN
  21.         ; Что-то пошло не так
  22.         cmp     eax,-1
  23.         je      loc_ret
Дальнейший разбор содержимого контейнера ID3v2 выполняется точно так же, как написано в статье по ссылке выше.

В приложении пример программы с исходным текстом, которая парсит метаданные из файла DSF и выводит их. Сам сэмпл не прикладываю, так как файлы слишком большие.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

DSF.Metadata.Demo.zip (4,279 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 231 | Комментариев: 0

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0053 сек.) / Память: 4.5 Mb
Наверх