Список изменений

Версия 0.9.3 (03.05.2026)

  • Анизотропное направленное размытие (blur.wgsl): Алгоритм размытия модифицирован: он вычисляет локальный вектор градиента яркости и выравнивает ядро размытия вдоль касательной к ребру (edge_dir).
  • Интеграция Macro-Tangent AA: Добавлен алгоритм субпиксельного антиалиасинга (смешивание сэмплов под углами касательных на расстояниях ±1.0px и ±2.2px). Это позволяет эффективно сглаживать «лесенки» на контрастных диагональных гранях интерфейса и видеокадра.
  • Многомасштабный шейдер резкости (sharpness.wgsl): Шейдер переведен на метод декомпозиции по пирамиде Лапласа. Резкость повышается раздельно на трех частотных диапазонах (Fine, Medium, Coarse), предотвращая подчеркивание шума. Добавлен расчет анизотропного тензора структуры для стабилизации деталей вдоль граней. Внедрено ограничение амплитуды по Веберу для подавления белых ореолов (Dehalo) на границах перепада контраста.
  • Вспомогательный буфер оригинального кадра (Original Frame Buffer): В графический движок добавлена дополнительная текстура original_tex (@group(2) @binding(0) var t_original). В начале каждого кадра чистый декодированный кадр сохраняется в этот буфер. Последующие шейдеры в цепочке (например, резкость) могут обращаться к оригинальному неискаженному источнику для анализа граней, исключая накопление ошибок постобработки от предыдущих шейдеров.
  • Безопасная компиляция шейдеров: Вызовы компиляции в pipeline.rs обернуты в валидационный скоп ошибок device.push_error_scope. При наличии синтаксических ошибок в пользовательских шейдерах приложение не завершает работу аварийно, а выводит детальный лог ошибки компиляции в консоль и безопасно возвращается к последней рабочей версии шейдерного конвейера.

Версия 0.9.2 (30.04.2026)

  • Редактор базы данных: На экран editor.rs добавлены кнопки «+» (создание пустой записи фильма) и «-» (удаление выбранного фильма из SQLite-БД вместе со всеми связанными посезонными настройками и закладками эпизодов).
  • Оптимизация видеодекодера: В метод copy_plane внесена проверка границ копирования плоскостей YUV. При нечетном разрешении кадра отсутствующие строки и пиксели автоматически заполняются нулями, предотвращая выход за пределы буфера. Функция отправки декодированных кадров в очередь переведена на неблокирующий вызов send_timeout(..., Duration::from_millis(50)). При переполнении буфера поток декодирования больше не зависает, что снижает вероятность возникновения микрофризов на видео со сверхвысоким битрейтом.
  • Стабилизация аудио-часов: В аудио-коллбэке SDL2 накопление счетчика played_samples теперь жестко привязано к объему запрошенного системного буфера out.len(), что помогает избежать рассинхронизации аудио/видео при воспроизведении бесшумных сцен или возникновении прерываний звука (underrun).

Версия 0.9.1 (29.04.2026)

  • Кастомизация UI и темы: Реализована внешняя база тем оформления через файл themes.json. Приложение на лету считывает профили цветов для заднего фона, активных элементов, кнопок, слайдеров и текста. Встроенный редактор тем на экране настроек позволяет вручную корректировать цвета активной темы с помощью RGB-слайдеров в реальном времени. Сканирование папки fonts/ при запуске группирует уникальные шрифты по PostScript-именам, позволяя пользователю переназначать их для пяти функциональных ролей (заголовки, обычный, тонкий, специальный и субтитры).
  • Интернационализация (i18n): Внедрена мультиязыковая локализация через внешние .loc файлы в папке lang/ (добавлены ru-RU.loc и en-US.loc), динамически переводящие все элементы интерфейса.
  • Горячая перезагрузка шейдеров (Hot-Reload): Добавлено событие ReloadShaders (горячая клавиша «R»), позволяющее на лету перечитывать файлы эффектов постобработки с диска без перезапуска видеофайла.

Версия 0.9.0 (28.04.2026)

  • Новый интерфейс настроек (settings.rs): Разработан полноценный экран конфигурации приложения с разделением по вкладкам: внешний вид (смена темы, типа процедурного фона), аудио (селектор аудиоустройств) и декодирование.
  • Аппаратная интеграция: SDL2-коллбэк теперь опрашивает операционную систему на доступные устройства воспроизведения, позволяя выбирать аудиовыход из выпадающего списка. Реализовано перечисление доступных видеокарт через enumerate_adapters для ручного выбора физического ускорителя рендеринга. Добавлен селектор используемых ядер CPU для распределения нагрузки декодирования FFmpeg.
  • Доработки плеера: Реализована независимая вертикальная прокрутка длинных списков внутри панелей звука и шейдеров плеера для предотвращения выезда за границы экрана. Внедрен обработчик ошибок запуска видео: если файл отсутствует на диске или декодер дал сбой, плеер безопасно переходит в режим отображения ошибки с выводом лога без падения программы.

Версия 0.8.2 (26.04.2026)

  • Медиа-движок и GPU-конвейер: Реализована система извлечения метаданных цвета extract_color_info из видеопотока через C-API. Декодер считывает диапазон яркости (Full vs Limited Range), цветовое пространство (BT.709, BT.470BG, BT.601/SMPTE170M, BT.2020), праймериз и тип передаточной характеристики (SDR, HDR/PQ, HLG). Эти параметры передаются в GPU через uniform-буфер (14-й слот массива custom). В видео-шейдер pipeline.rs добавлена функция decode_yuv, выполняющая аппаратную конвертацию YUV -> RGB на лету по соответствующим матрицам.
  • Шейдеры постобработки: Полностью переписан алгоритм кинозерна (grain.wgsl). Эффект постобработки разделен на два независимых слоя шума на основе FBM: привязанный к контурам исходного изображения (noise_anchored) и свободный (noise_free), симулирующий хаотическое движение частиц. Добавлена регулировка гаммы шума и случайного цветового сдвига (HSV).

Версия 0.8.1 (25.04.2026)

  • База данных и разделение метаданных: Спроектирована и добавлена поддержка таблиц season_settings и episode_bookmarks для сериалов. Параметры изображения, шейдеров, звука и постобработки теперь изолированы и сохраняются индивидуально для каждого сезона, а закладки — для каждой серии. Логика parse_db_settings расширена для динамической подгрузки конфигураций в зависимости от выбранного сезона и эпизода.
  • Интерфейс каталога (catalogue.rs): Внедрена функция calc_fade_alpha(y: f32) для наложения мягкого эффекта прозрачности на карточки фильмов на границах прокрутки (в диапазонах 130px и 970px). Реализовано событие ScrollList(d) для автоматического удержания активного элемента правого списка в зоне видимости с плавной докруткой при переключении фокуса с клавиатуры. Реализован динамический глитч-эффект: текст горизонтального меню поджанров при быстром скроллинге отрисовывает двойную смещенную тень (Red/Cyan) с процедурным дрожанием и вспышками. Добавлен эффект Marquee (бегущая строка с пинг-понгом по оси X) при переполнении границ длинных названий фильмов и категорий.
  • Управление: В обработчик ToggleFilterMode встроено правило автоматического переключения в списочный режим отображения при активации фильтрации по режиссерам или антологиям.

Версия 0.8.0 (24.04.2026)

  • Отказ от CLI-процессов в пользу C-API (ffmpeg-next): Логика запуска дочерних процессов FFmpeg через командную строку полностью удалена. Проект переведен на прямые системные вызовы библиотек декодирования через безопасную Rust-обертку ffmpeg-next (связана с FFmpeg 8.1). Декодирование видеопланов, аудиосэмплов, масштабирование и ресемплинг выполняются внутри адресного пространства приложения, исключая накладные расходы на IPC и утечки памяти.
  • Асинхронные lock-free очереди: Передача видеокадров в графический поток переведена на потокобезопасный канал crossbeam_channel::bounded с контролем таймаутов для устранения микрофризов. Передача аудио в поток SDL2 переведена на неблокирующий кольцевой буфер ringbuf::HeapRb (разделение на producer/consumer), гарантируя отсутствие щелчков звука даже при 100% нагрузке на CPU.
  • Низкоуровневая оптимизация аудиопроцессора (SSE Assembly): Внутренние циклы обработки компрессии (Soundgoodizer) в dsp.rs оптимизированы с помощью встроенного ассемблера asm!. Математические операции нахождения модуля, сравнения с лимитом и жесткого ограничения амплитуды сэмплов выполняются на векторных регистрах SSE (инструкции andps, ucomiss, minss, maxss), снижая нагрузку на CPU от аудиоколлбэка более чем в 3 раза.
  • Служба очистки потерянных ресурсов (Orphan Covers Cleaner): В editor.rs добавлена функция clean_orphan_covers. При сохранении изменений база данных сверяет пути всех активных обложек, кадров и значков. Все неиспользуемые более файлы JXL и WebP автоматически удаляются с диска.
  • Синхронизация по аппаратному таймеру: В аудиоколлбэке audio.rs счетчик воспроизведенных сэмплов played_samples инкрементируется строго на размер системного буфера out.len(), независимо от наличия данных в кольцевом буфере, предотвращая рассинхронизацию часов видео и аудио в тихих сценах или при аудио-голодании.

Версия 0.7.0 (20.04.2026)

  • Переход на нативный YUV-рендеринг: FFmpeg переведен на выдачу высокобитного планарного формата -pix_fmt yuv420p16le (16-битный YUV 4:2:0). В texture.rs выделены три раздельные текстуры VideoY, VideoU и VideoV в формате R16Unorm, снизив объем передаваемых на GPU данных кадра примерно на 50% по сравнению с RGBA. Преобразование YUV -> RGB перенесено на аппаратный шейдер fs_video с матрицей BT.709.
  • Многопроходный конвейер эффектов (Ping-Pong Buffering): Созданы две промежуточные текстуры высокого разрешения (4K) pass_a_tex и pass_b_tex в HDR-формате Rgba16Float. Движок динамически переключает исходный буфер и буфер отрисовки между ними для последовательного наложения цепочки шейдеров постобработки.
  • 5-проходный шейдер резкости (sharpness.wgsl): Пассы 0-1 выполняют двумерный апскейл методом Lanczos4. Пасс 2 вычисляет тензор структуры и уровень высокочастотного шума. Пасс 3 выполняет выравнивание и утончение граней (Edge Thinning) путем субпиксельного сдвига текстурных координат. Пасс 4 реализует анизотропную диффузию потока для подавления звона (Ringing) и сохранения естественной микротекстуры.
  • Интерактивный инструмент «Лупа» (Zoom & Pan): Добавлен инструмент масштабирования видео (до 5x) с возможностью перемещения кадра зажатой левой кнопкой мыши. Координаты передаются в шейдер UI через переменные zoom_factor и zoom_offset.
  • Сохранение истории просмотра и автопродолжение: Реализовано автосохранение прогресса воспроизведения в файл movies.json каждые 5 секунд. При повторном открытии фильма отображается интерактивная плашка «Продолжить просмотр?» для быстрого перехода к сохраненной позиции.
  • Bilateral Blur: Алгоритм размытия в blur.wgsl дополнен двусторонней фильтрацией по яркости. Пиксели размываются только в случае, если разница их светимости с центральным пикселем укладывается в рамки экспоненциального распределения, что сохраняет контрастные границы объектов.

Версия 0.6.0 (18.04.2026)

  • Шейдер кинопленки (cinema.wgsl): Разработан алгоритм стилизации под аналоговую пленку: тетраэдральная интерполяция цвета (симуляция смещения спектра в сторону Teal & Orange), субтрактивная плотность (эмуляция физического поглощения света пленочной эмульсией), сжатие цветового охвата (Cube Shrink для устранения клиппинга «ядовитых» неоновых оттенков) и Highlight Roll-Off по кривой Райнхарда с мягкой десатурацией в светах.
  • Аппаратный декодер 3D LUT: Добавлена поддержка трехмерных таблиц поиска цвета (файлы .cube). Движок парсит файлы из папки shaders/LUT, преобразует их в единую 3D-текстуру t_lut (Rgba32Float) и выполняет выборку с тетраэдральной интерполяцией на GPU (lut.wgsl).
  • Субтрактивный CMY-шейдер (subtractive.wgsl): Реализует экспоненциальное уплотнение красок в пространстве CMY с функцией защиты оригинальной светимости cmy_luma_prot для предотвращения нежелательного затемнения кадра.

Версия 0.5.2 (15.04.2026)

  • Коррекция выравнивания текста: В catalogue.rs исправлен баг смещения описания фильма. Вертикальное выравнивание v_align принудительно установлено в значение 0, предотвращая «уползание» длинного текста за верхнюю границу маски при динамическом масштабировании карточки.
  • Стабилизация многомодульной сборки: Временное отключение настроек релиза profile.release в корневом Cargo.toml для ускорения инкрементальной сборки и упрощения отладки межпроцессного взаимодействия FFmpeg и SDL2 на тестовых стендах.

Версия 0.5.1 (14.04.2026)

  • Менеджер UI-звуков (UiAudioManager): В графический движок интегрирована звуковая подсистема на базе SDL2 Audio. Реализовано декодирование файлов .opus из директории SFX/ через программный пайп FFmpeg с выводом сырого потока pcm_f32le (48000 Гц, стерео) в память приложения.
  • Микшер эффектов (UiMixer): Разработан аудиомикшер для одновременного воспроизведения циклических фоновых текстур и коротких эффектов (SFX).
  • Сглаживание бесшовных циклов (Crossfade): Реализован алгоритм бесшовного зацикливания фоновой музыки: при приближении к концу аудиоданных микшер плавно смешивает затухающий конец (fade_out) с нарастающим началом (fade_in) по синусоидальной траектории, убирая щелчки и паузы.
  • Интеграция событий звука: В state.rs добавлен список событий AppEvent::PlayUiSound. Звуковое сопровождение привязано к действиям пользователя: клики по кнопкам, переключение поджанров и скроллинг фильмов.
  • Ограничение частоты звуков: Внедрена переменная last_played_movie_sfx_idx для предотвращения перегрузки аудиосистемы при сверхбыстром кинетическом скроллинге списка фильмов.

Версия 0.5.0 (13.04.2026)

  • Разделение проходов рендеринга: Логика конвейера рекомпонована в pipeline.rs. Функция sample_pipeline теперь выполняет исключительно первичную подготовку кадра (цветокоррекцию и приведение HDR к SDR). Пространственные эффекты (кинозерно, резкость и др.) вынесены в общую последовательную цепочку постобработки, исключив взаимное искажение эффектов.
  • Решение проблемы переполнения атласа шрифтов: В метод render структуры Renderer добавлен принудительный вызов self.text_atlas.trim() в конце каждого кадра, что полностью устранило ошибку AtlasFull при длительном скроллинге. Из функций подготовки текста prepare удален вызов .unwrap() для предотвращения аварийного завершения программы при редких кадровых сбоях.
  • Процедурный расчет фона: В фрагментном шейдере ui.wgsl для режима наложения 5u (Color Dodge) статический шум заменен процедурным фоном на базе fs_background. Это устранило баг, при котором фоновое размытие застывало при движении интерфейса.
  • Слой наложения Mode 12: Добавлен режим 12u в ui.wgsl для наложения эффекта Color Dodge поверх кадрового буфера SCREEN_BUFFER, позволив применять эффекты свечения к элементам интерфейса второго плана.
  • Миграция схемы БД: В класс инициализации Db добавлены безопасные блоки ALTER TABLE для автоматического добавления колонок bookmarks и audio_track при обновлении баз данных предыдущих версий.

Версия 0.4.2 (08.04.2026)

  • Многополосный звуковой процессор (engine/dsp.rs): Написан 8-полосный параметрический Peak-эквалайзер на базе каскада фильтров второго порядка (Biquad). Разработан алгоритм компрессии Soundgoodizer с поддержкой четырех сигнатур сжатия (A, B, C, D) на основе трехполосного кроссовера и независимых компрессоров TrueCompressor.
  • Нулевая задержка звука: Обработка DSP перенесена непосредственно в аудио-коллбэк SDL2 (вместо обработки на этапе чтения из FFmpeg), что устранило многосекундную задержку при изменении параметров звука в реальном времени.
  • Многопоточный декодер JPEG XL: Кодек изображений заменен на библиотеку jxl-oxide, поддерживающую параллельное декодирование обложек через глобальный пул потоков Rayon.
  • Улучшение качества видеоэффектов: Алгоритм нерезкого маскирования в sharpness.wgsl дополнен расчетом локального контраста для подавления белых и черных ореолов на стыках контрастных объектов (Dehalo). Написан тонокомпенсатор на базе формулы Uncharted 2 и цветовой матрицы BT.2020 -> BT.709 для корректного отображения HDR-видео (PQ) на обычных мониторах (SDR).
  • Функциональные улучшения: Добавлен экспорт скриншотов в формате .png без потерь на Рабочий стол пользователя. Добавлена система закладок (с сохранением в БД и визуализацией рисок на шкале времени плеера). Реализовано застывание шума кинозерна при приостановке воспроизведения (паузе).
  • Оптимизация бинарного файла: Настроена конфигурация компиляции релиза в Cargo.toml (LTO, codegen-units, panic abort и strip) для многократного сокращения размера готовой программы.

Версия 0.4.1 (05.04.2026)

  • Поддержка сериалов: Внедрен алгоритм автоматического распознавания структуры каталогов с сериалами. Плеер парсит файлы в директории по именам с разметкой сезонов и серий в скобках (например, {1 сезон} {2 серия}) и выводит интерактивные списки селекторов сезонов/серий в интерфейс плеера.
  • Динамический парсинг шейдеров с диска: Шейдеры эффектов перенесены в изолированные файлы в папку shaders/effects/. На стороне Rust реализован синтаксический анализатор заголовков файлов (парсинг строк // NAME:, // FUNC: и // PARAM:). Приложение считывает файлы при старте и автоматически формирует структуру параметров и ползунки в GUI.
  • Гибкий буфер параметров: Данные Uniform-буфера реорганизованы в массив custom: array<vec4<f32>, 16>. Это позволило передавать параметры любых новых шейдеров без изменения и перекомпиляции Rust-кода.
  • Оптимизация навигации и скроллинга: Внедрен алгоритм плавного кинетического скроллинга (интерполяция LERP) для списков, каруселей и категорий. Реализована адаптивная ширина левой панели каталога (автоматическое сворачивание в компактный режим при выборе режима «Все фильмы»).

Версия 0.4.0 (03.04.2026)

  • Интеграция видеоплеера (engine/media.rs): Реализован запуск и чтение потоков из двух параллельных дочерних процессов ffmpeg: один декодирует видео в сырой RGBA-поток, второй — аудио в формат pcm_f32le. Интегрирован вывод звука через аудиоподсистему библиотеки sdl2. Организована синхронизация кадров по внутреннему таймеру аудиовывода (current_audio_time).
  • Экран воспроизведения (screens/player.rs): Написан пользовательский интерфейс плеера с таймлайном (поддерживающим перемотку кликом мыши), индикатором буферизации, кнопками управления и панелью настроек.
  • Конвейер динамических эффектов: Внедрен механизм сборки финального шейдера на лету. В коде PipelineManager шаблон original.wgsl динамически модифицируется на основе списка активных эффектов, встраивая цепочки вызовов шейдеров. Параметры постобработки вынесены в обновленную структуру ShaderParams Uniform-буфера.
  • Первые шейдерные эффекты: Написаны отдельные файлы эффектов для видеопотока: кинозерно (grain.wgsl), размытие (blur.wgsl), хроматические аберрации (chroma.wgsl) и нерезкое маскирование (sharpness.wgsl).

Версия 0.3.0 (25.03.2026)

  • Интеграция Glyphon: Устаревшие библиотеки wgpu_text и ab_glyph заменены на современный текстовый конвейер glyphon (версии 0.9.0). Это улучшило качество рендеринга шрифтов, оптимизировало кэширование символов во встроенном атласе и снизило потребление оперативной памяти (внедрена автоматическая очистка кэша буферов при достижении лимита).
  • Многопроходный рендеринг (Offscreen Pass): В состав GpuState включена промежуточная текстура offscreen_texture для предварительного рендеринга фонового слоя. Реализована двухпроходная схема рендеринга: сначала сцена рисуется во внеэкранный буфер, после чего результат копируется в кадровый буфер и поверх него накладывается слой оверлея.
  • Эффект «Дисперсионного стекла»: На базе Offscreen-буфера разработан шейдерный эффект матового стекла (режим 6u в ui.wgsl). Размытие оптимизировано с помощью IGN (Interleaved Gradient Noise) и хроматической дисперсии каналов, что позволило получить мягкий эффект размытия без просадки производительности.
  • Динамический интерфейс каталога (catalogue.rs):
    • Карусель поджанров: Реализована горизонтальная прокрутка элементов с эффектом хроматических аберраций и визуальных глитчей при быстром перемещении.
    • Вертикальный 3D-скроллинг фильмов: Спроектирована вертикальная карусель карточек фильмов, распределяющая элементы по 5 фиксированным пространственным слотам (Main Center, Top Left/Right, Bottom Left/Right). Масштабирование, прозрачность и фейд-эффект на границах рассчитываются динамически для каждой карточки.
  • Реорганизация БД: Для упрощения отладки на ранних этапах схема базы данных в core_db временно переведена со связей через целочисленные идентификаторы ID на прямую запись текстовых данных.

Версия 0.2.0 (23.03.2026)

  • Кастомный текстовый макет: Полностью удалена зависимость от egui. В файле gui/text_layout.rs с помощью ab_glyph реализовано ручное построение текстовых строк, расчет ширины символов и вычисление границ (bounding boxes).
  • Интерактивный ввод текста:
    • Разработан алгоритм hit_test для определения позиции каретки (символьного индекса) по клику мыши в полях ввода.
    • Реализована логика выделения текста мышью (get_selection_rects).
    • Внедрена поддержка буфера обмена через библиотеку arboard (копирование, вставка, выделение всего текста по Ctrl+A/C/V).
  • Оптимизация архитектуры Rust: Устранена критическая ошибка компиляции E0499 (конфликт уникальных заимствований self при обработке полей ввода). Вся логика изменения текстовых полей перенесена в единый метод apply_text_logic структуры AppState.
  • Интерфейсные события: Добавлены новые системные события UpdateCursor и ToggleMultiSelect для расширенного взаимодействия с элементами управления (например, для множественного выбора поджанров в выпадающих списках).

Версия 0.1.0 (21.03.2026)

  • Архитектура воркспейса: Проект разделен на два отдельных пакета: core_db (библиотека для работы с базой данных SQLite через rusqlite) и app_main (основное графическое приложение).
  • Графический стек: Осуществлен переход от прототипа на базе eframe/egui к разработке собственного графического движка на низкоуровневом API wgpu (с окном winit).
  • Компоновщик интерфейса (GuiComposer): Создан базовый компоновщик для накопления геометрии UI (вертексов и индексов) и пакетной отрисовки примитивов за минимальное число вызовов отрисовки (draw calls).
  • Отрисовка текста: Интегрирована библиотека wgpu_text (использующая ab_glyph) для базового вывода текстовых элементов на экран.
  • Шейдерный конвейер: Написан базовый WGSL-шейдер (shader.wgsl), поддерживающий несколько режимов рендеринга примитивов:
    • Отрисовка сплошным цветом.
    • Вывод сырых текстур и окрашенных иконок (рендеринг векторных SVG-ресурсов реализован с помощью resvg, usvg и tiny-skia).
    • Программное размытие (Blur) и эффект цветового осветления (Color Dodge).
  • База данных и сканирование: Спроектирована SQLite-схема базы данных (cinema.db) с таблицами для фильмов (movies) и словарей жанров, категорий, типов медиа, качества и формата кадра. Реализовано рекурсивное сканирование директорий на наличие файлов .mp4 и .mkv с использованием библиотеки walkdir.
  • Инструменты импорта: Добавлены базовые функции в image_utils.rs для конвертации изображений обложек в формат JPEG XL (.jxl) посредством вызова системного процесса ffmpeg.