Zaawansowana kompresja wideo w oparciu o układy FPGA
| TechnikaNowoczesne algorytmy kompresji sygnału wideo, takie jak H.264/AVC charakteryzują się bardzo korzystnym współczynnikiem jakości obrazu do ilości pamięci zajmowanej przez tak skompresowane dane. Pewną trudnością związaną z ich stosowaniem jest duża złożoność, przez którą wydajna implementacja wymaga odpowiednio dużej mocy obliczeniowej. O ile w przypadku klasycznych komputerów i procesorów w nich stosowanych, problem implementacji kodera i dekodera H.264/AVC (Advanced Video Codec) sprowadza się do napisania odpowiedniego programu i uruchomieniu go na wystarczająco wydajnym komputerze, w przypadku implementacji sprzętowych sprawa jest dużo bardziej skomplikowana.
Wersje sprzętowe algorytmów mogą być zrealizowane w ogólności na trzy sposoby. Po pierwsze do kodowania lub dekodowania może być wykorzystywany główny procesor urządzenia. Rozwiązanie to wymaga bardzo wydajnej centralnej jednostki obliczeniowej i zazwyczaj jest nieosiągalne w niewielkich urządzeniach przenośnych. Drugą możliwością jest wykorzystanie dodatkowego procesora sygnałowego, który może służyć jako pewnego rodzaju koprocesor dla tych danych, które wymagają przetwarzania strumieniowego. Takie podejście do tematu pozwala wygodnie dysponować zużyciem mocy i wybudzać układ DSP ze stanu uśpienia tylko na czas przetwarzania sygnału wideo. Dodatkowy procesor sygnałowy zabezpiecza też system operacyjny urządzenia przed „zawieszeniem” związanym ze zbytnim przeciążeniem obliczeniowym CPU.
Jeszcze inną możliwością jest wykorzystanie odpowiednio zaprogramowanego układu FPGA, który wykonywałby niektóre lub wszystkie z operacji typowych dla H.264. Sposób przetwarzania danych przez układ programowalny może być na tyle dostosowany do specyfiki algorytmu, że z teoretycznego punktu widzenia wykorzystanie FPGA jest optymalnym rozwiązaniem. Dzieje się tak głównie dzięki licznym domenom czasowym, jakie mogą funkcjonować w ramach jednego programowalnego układu scalonego. Pozwala to podzielić poszczególne rodzaje zadań kodera lub dekodera pomiędzy grupy skonfigurowanych komórek logicznych i taktować je z takimi częstotliwościami, aby każde z nich wykonywały swoje zadania w ściśle określonym czasie. Czas ten nie zawsze musi być najkrótszy, gdyż złożoność algorytmów wykonywanych przez poszczególne bloki nie jest identyczna i część z nich może być taktowana niższym zegarem niż maksymalnym możliwym. Odpowiednia synchronizacja poszczególnych etapów i elementów algorytmu prowadzi do konstrukcji optymalnej pod względem szybkości pracy i mocy pochłanianej przez cały układ.Układ FPGA może zostać także zastosowany jako koprocesor dla procesora sygnałowego, który to w danym urządzeniu służy nie tylko przetwarzaniu sygnałów wideo H.264, ale także i innych strumieni danych. Duża elastyczność konfiguracji FPGA pozwala na zaimplementowanie tylko wybranych fragmentów algorytmu AVC, a nawet zwielokrotnienie niektórych bloków w celu przyspieszenia przetwarzania danych. Koncepcja ta została zilustrowana na rys. 1. Oczywiście, rozwiązanie to nie musi być optymalne pod względem kosztu, rozmiarów PCB, a czasami nawet wydajności. Wszystko zależy od tego, jakie są priorytety i ograniczenia, do których muszą się dostosować projektanci urządzenia.
Co w FPGA?
Na algorytmy kodowania i dekodowania H.264 składa się wiele nowych metod przetwarzania danych i zabiegów, które mają na celu polepszenie jakości obrazu lub zmniejszenie wielkości plików wynikowych. Metody te mogą być w bardzo wydajny sposób implementowane właśnie wewnątrz FPGA. Przykładem może być kompensacja ruchu typu „Quarter Pixel”, która polega na tym, że wykrywane są przemieszczenia o jedną czwartą piksela, zamiast o połowę piksela, tak jak to było we wcześniej stosowanych algorytmach. Tego typu interpolacja wymaga większej ilości obliczeń i warto ją zapisać w postaci odpowiedniego bloku FPGA. Innym zabiegiem charakterystycznym dla AVC jest przeszukiwanie obrazu w celu znalezienia przemieszczających się bloków różnej wielkości. O ile w klasycznych algorytmach kompresji wykorzystywano jedynie bloki o wymiarach 16 na 16 pikseli, to nowy algorytm pozwala na kompresje z uwzględnieniem bloków prostokątnych o bokach 16, 8 i 4 piksele. Wprowadzenie wyszukiwania bloków różnej wielkości jako odrębnych grup komórek FPGA umożliwia znaczne zrównoleglenie obliczeń, a więc i ich przyspieszenie.
Opisane powyżej elementy algorytmu AVC to tylko niektóre z wielu, jakie mogą być z powodzeniem zaimplementowane w układach programowalnych. Na potwierdzenie tej teorii wystarczy podać przykłady prawdziwych realizacji H.264, jakie pojawiły się niebawem po ustanowieniu nowego standardu. Pierwszym z nich było zaprezentowane w kwietniu 2005 roku urządzenie wykorzystujące do kompresji AVC układ Stratix II firmy Altera. Pięć miesięcy później firma Xilinx przedstawiła własną implementację kodera H.264 w postaci FPGA. Tym razem stworzono kod w języku VHDL i Verilog, który mógł być wgrany do układów z rodziny Virtex lub Spartan. Rozwiązanie to przewyższało projekt Altery, gdyż była to pierwsza implementacja algorytmu AVC w całości, a nie tylko w części wykonana w postaci programu układu FPGA.
Podsumowanie
Obecnie na rynku dostępne są odpowiednie moduły IP realizujące kompresję i dekompresję H.264. Ich ceny różnią się w zależności od dostawcy i obsługiwanych opcji. Często udostępniane są także w wersji testowej do zastosowań niekomercyjnych. Dobrym pomysłem może być także wykorzystanie układów programowalnych ze zintegrowanymi modułami DSP.
Marcin Karbowniczek