Záznam procházky ve VRML
Semestrální práce do předmětu MUS
Zadání
Do existujícího prohlížeče statických světů VRML s názvem GOAL naprogramujte modul, který umožní záznam
poloh uživatele při procházce virtuálním světem. Navrhněte a implementujte jednoduchý editor této procházky tak,
aby ji bylo možno znovu interpretovat a off-line vygenerovat řadu obrázků virtuálního světa na disk.
Tyto obrázky pak zkonvertujte do souboru MPEG.
Postup řešení
| Týden | Popis činnosti | Zpráva |
| 2.-3. | Orientace v dodaném kódu, průzkum částí potřebných pro implementaci úlohy | Zpráva |
| 4.-5. | Implementace ukládání a přehrávání průchodu scénou | Zpráva |
| 6.-7. | Ukládání průchodu scénou do MPEGu | Zpráva |
| 8.-9. | Tvorba dialogu pro řízení komprese do MPEG | Zpráva |
| 10.-11. | Editace procházky v prohlížeči | Zpráva |
| 12.-13. | Závěrečné testování, odevzdání | Dokumentace |
Zpráva ze 2. a 3. týdne
Datum poslední ústní konzultace: 11. 3. 2003
Překlad
Dostal jsem k dispozici zdrojové kódy VRML prohlížeče GOAL. Program je určen pro systém Windows. Pracuji v
prostředí Visual C++ verze 6.0 s překladačem od firmy Microsoft. Prvním úkolem bylo
obstarat vše potřebné pro přeložení (knihovny flex a bison, kód knihovny ALIB). Překlad funguje bez problémů
v Debug i Release verzi.
Průzkum prohlížeče
Vyzkoušel jsem prohlížeč na několika scénách. Zaměřil jsem se na funkce, které budu využívat
ve své úloze. Narazil jsem na drobné problémy s exportem pohledu na scénu do obrázku. Export bude potřeba pro
ukládání sekvence nasnímaných obrázků do formátu MPEG. U obou podporovaných formátů (bmp a jpg) nefunguje na
mém počítači správně. Výsledný obrázek je totiž vždy bíly, ale jeho velikost souhlasí. Mohlo by to být
způsobené verzí OpenGL, protože na ostatních počítačích je vše bez problémů. Tento nedostatek bude třeba dořešit.

Ukázka prohlížeče GOAL
Průzkum kódu
Zorientoval jsem se v částech kódu souvisejících s mojí úlohou.
Hledání knihovny pro ukládání do MPEG
Našel jsem free knihovnu FAME pro kompresi videa do formátu MPEG. Jako vstup se předkládájí framy ve formátu YUV.
Rozhraní knihovny vypadá velmi jednoduše. Podporuje základní nastavení jako jsou rychlost, poměr a kvalita komprese.
Jediným nedostatkem je poněkud strohá dokumentace.
Odkaz: http://fame.sourceforge.net/libfame/overview/
Zpráva ze 4. a 5. týdne
Datum poslední ústní konzultace: 11. 3. 2003
Implementace ukládání a přehrávání průchodu scénou
Vytvořil jsem mechanizmus pro zaznamenávání průchodu scénou. Do paměti se ukládají 4 transformační matice, ze
kterých se počítá poloha pozorovatele při vykreslování. Jemnost takto navzorkovaného pohybu závisí
pouze na aktuální rychlosti zobrazování (počet snímku za sekundu) a během průchodu scénou není ekvidistantní, proto
je nutné zaznamenávat také čas, při kterém k pohybu došlo. Zaznamenanou sekvenci je možno znovu přehrát. Editace
zatím není možná.
Průzkum knihovny pro ukládání do MPEGu
Díky úžasné jednoduchosti rozhraní knihovny FAME jsem
se rozhodl ji trochu otestovat. Je to knihovna vyvíjená pod veřejnou GNU licencí, což automaticky umožňuje nasazení
v programu GOAL. Hlavním důvodem jejího vytvoření bylo umožnit komprimaci videa do MPEGu v reálném čase. Tuto možnost
sice v GOALu nevyužijeme, protože vyrenderovat obecnou scénu rychlostí 25 snímků za sekundu a současně zkomprimovat
do MPEGu by bylo nad rámec možností současných počítačů. Nesporná výhoda ale spočívá v proudovém zpracování
vstupních (obrázek) a výstupních (video) dat, protože není nutné mít v jednom okamžiku v paměti všechny snímky.
Naopak nevýhodou je, že knihovna zatím nepodporuje B-snímky, které nejvíce spoří velikost výsledné vidoesekvence.
V současnosti je podporován formát MPEG-4.
Pro pochopení rozhraní bylo přece jen nutné prostudovat si něco o formátech MPEG-1,2,4. Zde je několik odkazů:
Na vstupu funkcí pro kompresi videa se předpokládají obrázky v barevném modelu YUV12 (neboli YUV 4:2:0). Způsob konverze
z RGB do YUV není příliš složitý a je dán příslušnou transformační maticí. Formát YUV12 ale vyžaduje oproti prostému
YUV podvzorkované (subsampled) chrominanční složky U a V. Podvzorkováním se objem dat, kterým přispívají tyto složky,
zkrátí na čtvrtinu a dojde ke ztrátě informace. Proto je nutné použít vhodný algoritmus, který přiliš nezhorší barevnou
kvalitu videa.
Nejprve jsem si napsal testovací program, který vytvoří krátkou videosekvenci s použitím knihovny FAME. Po malých
problémech s barvami (černá byla ve výsledku tmavězelená a bílá světlezelená) se mi podařilo vše odladit. Vygenerovanou
videosekvenci se mi podařilo bez problémů přehrát v různých přehrávačích (WM player, Micro DVD player, Quicktime, atd.)
Po úspěšném otestování jsem si vytvořil třídu CMpegEncoder pro snadnější "zacházení" s knihovnou FAME, kterou
bych chtěl posléze použít v GOALu. Zde je její zdrojový kód. Zjistil jsem, že konverze z
RGB do YUV12 trvá přibližně stejnou dobu jako samotná komprese do MPEGu, a to i přes její optimalizaci (viz kód). Je
to asi tím, že nelze použít funkce pro práci s bloky paměti a každý pixel se musí převádět samostatně.
Zpráva ze 6. a 7. týdne
Ukládání průchodu scénou na disk do formátu MPEG
Program GOAL již má zatím velmi omezené ovládací prvky pro přehrávání průchodu VRML scénou. Nyní je konečně možné uložit
celý průchod na disk ve formátu MPEG. Pro kódování obrazu do MPEGu jsem použil knihovnu FAME, resp. její
objektovou nadstavbu, kterou jsem vyrobil v rámci dosavadních prací na projektu. Jako vstup předkládám obrazové informace
získané uložením úseku videopaměti do formátu BMP při simulovaném průchodu scénou. Protože BMP formát je kódován jako
posloupnost řádků směrem zdola nahoru a navíc pořadí barevných složek v pixelu je obrácené (ne RGB, ale BGR), bylo ještě nutné
dovyrobit funkci pro převod do formátu YUV ve správném pořadí. Převod zatím funguje pouze pro 24-bitovou hloubku obrazu.
Jako důkaz jsem vyrobil krátkou videosekvenci (280 KB) zaznamenanou v GOALu.
Průběh dalších prací bych viděl následovně:
- Vytvoření dialogu pro nastavení základních parametrů MPEGu jako jsou kvalita obrazu, počet snímků za sekundu
a některé další.
- Protože převod trvá poměrně dlouhou dobu, bude jej třeba provádět v samostatném threadu, aby aplikace nezůstala
po tu dobu úplně mrtvá, v úvahu též připadá progress bar a odhad zbývajícího času komprese.
- Umožnění jednoduché editace průchodu scénou
- Pokus o nějakou optimalizaci (např. donucení knihovny FAME ukládat rozdílové P-snímky)
Zpráva z 8. a 9. týdne
Tvorba dialogu pro řízení komprese do MPEG
Vytvořil jsem dialog pro nastavení základních parametrů MPEGu (viz obrázek níže)

Okno pro kompresi do MPEGu
Jak je patrno z obrázku, je zde možnost vytvořit též videosekvenci pouze v odstínech šedi. Díky tomu lze ušetřit:
- Přibližně 1/3 doby potřebné pro kompresi (nepočítají se barevné složky)
- Velikost výsledného souboru, protože barevné složky jsou vždy nulové a díky tomu se dosáhne lepší komprese
Provedl jsem také několik optimalizací převodu RGB->YUV, např. použití celočíselné aritmetiky pro veškeré výpočty, použití bitových
operací pro dělení/násobení mocninami dvou, atd.
Zpráva z 10. a 11. týdne
Rozšířil jsem Goal o možnost editace zaznamenané procházky. Vytvořil jsem následující panel nástrojů:

Panel nástrojů poskytuje následující funkce: (zleva)
- Ukládání průchodu scénou. Pokud byl již předtím uložen nějaký průchod, naváže se na něj v místě, na které se uživatel
v záznamu posunul a zbytek předchozího záznamu se smaže.
- Smazání začátku záznamu až po aktuální polohu.
- Smazání jednoho záznamu daném aktuální polohou.
- Smazání celého záznamu
- Přehrání průchodu od aktuální polohy. (nebo od začátku pokud je aktální poloha na poslením záznamu)
- Zastavení přehrávání. Aktuální poloha je nastavena na místo přerušení.
- Zastavení přehrávání. Aktuální poloha je nastavena na počátek záznamu.
- Přesun na začátek záznamu.
- Přesun na předcházející záznam.
- Přesun na následující záznam.
- Přesun na konec záznamu.