From 9372af442259b84e7c38d4c3ff6bbac2943c1077 Mon Sep 17 00:00:00 2001 From: sShemet Date: Sat, 19 Apr 2025 00:51:05 +0500 Subject: [PATCH] vault backup: 2025-04-19 00:51:05 --- .obsidian/workspace.json | 8 +-- PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md | 78 +++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index f4ae0d2..3508305 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -41,12 +41,12 @@ "state": { "type": "markdown", "state": { - "file": "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md", + "file": "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "PS1 IRQ" + "title": "PS1 DMA" } } ], @@ -207,9 +207,10 @@ }, "active": "dd912cc876184c4f", "lastOpenFiles": [ + "PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md", + "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md", - "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md", "PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Geometry Transformation Engine.md", "PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md", @@ -221,7 +222,6 @@ "PERSONAL PROJECTS/PS1 DOCS/PSX code - modules load and exec.md", "PERSONAL PROJECTS/PS1 DOCS/PSX code - Load texture from SECTOR!.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Vblank.md", - "PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA CD-ROM.md", "WORK & PROJECTS/Mol/Ideas/Все идеи для Моли.md", diff --git a/PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md b/PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md index f7b561f..06d171a 100644 --- a/PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md +++ b/PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md @@ -143,4 +143,80 @@ void play_fmv() { 3. **Вывод** через GPU. 4. **Синхронизация** с VBlank. -Именно так работали FMV в играх вроде *Metal Gear Solid* и *Final Fantasy VII*! 🎥 \ No newline at end of file + +----------------- + + +# Функция `DecDCTvlc2` в библиотеке PsyQ для PlayStation 1 + +Функция `DecDCTvlc2` является частью аппаратно-оптимизированной библиотеки декодирования видеоданных в реальном времени для PlayStation 1. Она выполняет декодирование **переменнодлинных кодов (VLC - Variable Length Coding)** в процессе декомпрессии **DCT (Discrete Cosine Transform)** данных, обычно используемых в видеоформатах типа MPEG. + +## Основное назначение + +`DecDCTvlc2` декодирует: +1. Битовые потоки с переменнодлинным кодированием (VLC) +2. Коэффициенты DCT после обратного зигзаг-сканирования +3. Данные в формате, используемом аппаратным декодером PS1 + +## Технические детали + +```c +void DecDCTvlc2(unsigned short *data, int *macroblock); +``` + +Где: +- `data` - указатель на входной битовый поток VLC +- `macroblock` - указатель на выходной буфер для декодированных данных макроблока (6 блоков по 64 элемента: 4 яркостных, 2 цветностных) + +## Особенности реализации + +1. **Аппаратное ускорение** - использует специальные возможности графического процессора PS1 +2. **Оптимизировано для MPEG-подобных потоков** - но не является полным MPEG-декодером +3. **Работает с макроблоками** - 16x16 пикселей (4 блока яркости Y, 1 блок каждой цветности Cr/Cb) +4. **Требует предварительной настройки** - через `DecDCTin()`, `DecDCTout()` и другие функции видеоцепи + +## Пример использования + +```c +#include +#include +#include +#include +#include + +void decode_video_frame(unsigned short *vlc_data) { + // Буфер для декодированного макроблока (6 блоков по 64 коэффициента) + int macroblock[6*64]; + + // Настройка ввода/вывода декодера + DecDCTin(vlc_data, 0); + DecDCTout((unsigned char*)macroblock, 0); + + // Декодирование VLC-потока + DecDCTvlc2(vlc_data, macroblock); + + // Дальнейшая обработка декодированных данных... +} +``` + +## Типичный контекст использования + +1. **Декодирование внутрикадровых (I-кадров) MPEG-видео** +2. **Обработка видеопотоков в реальном времени** +3. **Специальные эффекты с использованием DCT-данных** +4. **Собственные алгоритмы видеокомпрессии** + +## Важные нюансы + +1. **Не является полным MPEG-декодером** - требует дополнительной логики для полного декодирования видео + +2. **Требует точного соответствия формату данных** - входной поток должен быть правильно сформирован + +3. **Работает в паре с другими функциями DCT-цепи**: + - `DecDCTin()` - настройка входного буфера + - `DecDCTout()` - настройка выходного буфера + - `DecDCToutCallback()` - установка callback'а по завершении + +4. **Использует аппаратные возможности PS1** - дает значительный выигрыш в производительности по сравнению с программной реализацией + +Функция `DecDCTvlc2` представляет собой низкоуровневый инструмент для работы с видео на PS1 и требует глубокого понимания принципов DCT-компрессии и форматов видеоданных, используемых на этой платформе. \ No newline at end of file