Skip to content

Latest commit

 

History

History
200 lines (157 loc) · 9.72 KB

File metadata and controls

200 lines (157 loc) · 9.72 KB

Статус реализации FLAC декодера

✅ Реализованные функции

Метаданные

  • check_flac_header() - проверка заголовка FLAC файла (сигнатура "fLaC")
  • StreamInfo::process_stream_info_block() - парсинг блока STREAMINFO:
    • Минимальный/максимальный размер блока
    • Минимальный/максимальный размер фрейма
    • Частота дискретизации (sample rate)
    • Количество каналов
    • Битность (bits per sample)
    • Общее количество сэмплов
    • MD5 контрольная сумма

Блоки метаданных (src/metadata/blocks.rs)

  • get_header() - чтение заголовка блока метаданных (флаг last, тип блока, длина)
  • process_metadata() - обработка всех блоков метаданных с пропуском неподдерживаемых
  • PictureBlock::process_picture_block() - извлечение и сохранение обложки:
    • Тип картинки
    • MIME тип
    • Описание
    • Размеры (ширина/высота)
    • Глубина цвета
    • Сохранение в файл (с флагом --save-cover)

Фреймы

  • FrameHeader::read_frame_header() - полный парсинг заголовка фрейма:
    • Синхронизирующий код (14 бит, 0x3FFE)
    • Стратегия блокирования
    • Размер блока (с обработкой переменной длины)
    • Частота дискретизации (с обработкой переменной длины)
    • Назначение каналов (mono, stereo, 5.1, 7.1, mid-side и т.д.)
    • Битность (с фоллбэком на StreamInfo)
    • Номер фрейма/сэмпла (UTF-8 кодирование)
    • CRC-8 контрольная сумма
  • read_utf8_u64() - декодирование UTF-8 переменной длины для номеров фреймов/сэмплов
  • find_wasted_bits() - определение количества убитых бит (wasted bits)
  • 🟡 fixed_prediction() - частично реализована фиксированная линейная предсказка (orders 0-4):
    • ✅ Чтение прогревочных сэмплов
    • ✅ Формулы предсказания для orders 0-4
    • ❌ Применение residual к предсказанным значениям (не завершено)

Основная программа (src/main.rs)

  • ✅ Парсинг аргументов командной строки (clap)
  • ✅ Чтение и валидация FLAC файла
  • ✅ Обработка метаданных
  • ✅ Инициализация битового ридера для фреймов
  • ✅ Чтение заголовка фрейма
  • ✅ Определение типа subframe (Constant, Verbatim, Fixed, LPC)

❌ Оставшиеся функции для реализации

Subframe типы

Constant Subframe

  • constant_value() - декодирование константного subframe (все сэмплы одинаковые)

Verbatim Subframe

  • verbatim() - декодирование verbatim subframe (сэмплы хранятся как есть, без сжатия)

Fixed Prediction Subframe

  • ❌ Завершить fixed_prediction():
    • Правильное применение residual к предсказанным значениям
    • Обработка signed значений

LPC Subframe (Linear Predictive Coding)

  • lpc() - декодирование LPC subframe:
    • Чтение прогревочных сэмплов
    • Чтение порядка LPC (до 32)
    • Чтение коэффициентов LPC
    • Чтение precision и shift
    • Применение LPC предсказания с residual

Residual декодирование

Rice/Rice2 кодирование

  • 🟡 decode_rice_residual() - заглушка, требуется полная реализация:
    • ❌ Чтение типа кодирования (Rice/Rice2)
    • ❌ Чтение параметров партиций
    • ❌ Декодирование Rice-кодированных значений
    • ❌ Обработка escape кодов
    • ❌ Конвертация unsigned в signed (zigzag декодирование)

Frame декодирование

Frame структура (src/frame/frame.rs)

  • ❌ Полное декодирование Frame:
    • Чтение всех subframes (по количеству каналов)
    • Обработка различных channel assignments (left-side, side-right, mid-side)
    • Применение декорреляции каналов
    • Padding до границы байта
    • CRC-16 проверка фрейма

SubframeHeader

  • ❌ Реализация SubframeHeader:
    • Чтение типа subframe (1 бит padding + 6 бит тип)
    • Обработка wasted bits flag

Декодирование аудио

Полный процесс декодирования

  • ❌ Цикл чтения всех фреймов до конца файла
  • ❌ Восстановление PCM данных из всех фреймов
  • ❌ Сборка декодированного аудио
  • ❌ Обработка межканальной декорреляции:
    • Left-side: right = side - left
    • Side-right: left = side + right
    • Mid-side: left = (mid + side)/2, right = (mid - side)/2

Вывод аудио

Экспорт в WAV

  • ❌ Создание WAV заголовка
  • ❌ Запись PCM данных в WAV формат
  • ❌ Сохранение декодированного аудио в файл

Воспроизведение (опционально)

  • ❌ Интеграция с библиотекой для воспроизведения (например, cpal или rodio)
  • ❌ Потоковое воспроизведение декодированного аудио

Обработка ошибок

  • ❌ Улучшенная обработка ошибок вместо panic!() и unwrap()
  • ❌ Валидация CRC-8 для заголовков фреймов
  • ❌ Валидация CRC-16 для фреймов
  • ❌ Проверка MD5 контрольной суммы декодированных данных

Дополнительные блоки метаданных

Не реализованные блоки:

  • Padding (type 1) - пропускается
  • Application (type 2) - пропускается
  • Seek table (type 3) - таблица для быстрого поиска
  • Vorbis comment (type 4) - теги (исполнитель, альбом и т.д.)
  • Cuesheet (type 5) - информация о треках

Тестирование

  • 🟡 Частичное покрытие тестами:
    • stream_info.rs - хорошее покрытие
    • blocks.rs - базовые тесты
    • frame_header.rs - тесты UTF-8 декодирования
    • ❌ Интеграционные тесты с реальными FLAC файлами
    • ❌ Тесты декодирования полных фреймов
    • ❌ Тесты различных типов subframe

📊 Прогресс

По модулям:

  • Метаданные: ~80% (основное готово, не хватает Vorbis comments и Seek table)
  • Frame Header: 100% ✅
  • Subframe: ~20% (только каркас и частичная реализация Fixed)
  • Residual: 0% (только заглушка)
  • Полное декодирование: 0%
  • Вывод аудио: 0%

Общий прогресс: ~35%


🎯 Приоритет следующих шагов

  1. Высокий приоритет (критично для базового декодирования):

    • Завершить decode_rice_residual() - Rice/Rice2 декодирование
    • Завершить fixed_prediction() - применение residual
    • Реализовать constant_value() и verbatim()
    • Реализовать полное чтение Frame с multiple subframes
  2. Средний приоритет (для полной функциональности):

    • Реализовать lpc() - LPC subframes
    • Обработка channel decorrelation (mid-side, etc.)
    • Экспорт в WAV
    • Проверка CRC
  3. Низкий приоритет (улучшения):

    • Vorbis comments парсинг
    • Seek table поддержка
    • Потоковое воспроизведение
    • MD5 проверка

📝 Примечания

  • Код использует bitstream_io для побитового чтения
  • Реализованы comprehensive тесты для критичных функций
  • Поддержка CLI через clap
  • Обработка изображений через image crate
  • Текущий код может читать метаданные и заголовки фреймов, но не может декодировать аудио