H.264/AVC i H.625/HEVC Standardy kompresji wideo

| Technika

Sygnał wideo składa się z sekwencji nieruchomych obrazów (klatek), które są wyświetlane jedna po drugiej z tak dużą szybkością, że obserwator ma złudzenie ich płynnego ruchu. Im większą rozdzielczość mają te obrazy i im więcej jest ich wyświetlanych w ciągu sekundy, tym przekaz staje się wyraźniejszy i płynniej się zmienia. Równocześnie generowane są wówczas olbrzymie ilości danych. Aby można było, w rozsądnych ramach czasowych, zapisywać je i przesyłać, na nośnikach oraz łączami, których pojemność i przepustowość wprawdzie stale się zwiększają, lecz mimo wszystko są ograniczone, wideo trzeba skompresować.

H.264/AVC i H.625/HEVC Standardy kompresji wideo

Obecnie najpopularniejszym standardem kompresji wideo jest H.264/AVC (Advanced Video Coding). Kilka lat temu opracowano kolejną wersję - H.265/HEVC (High Efficiency Video Coding). Oba standardy będą tematem tego artykułu.

Na wstępie warto wyjaśnić, dzięki jakim zależnościom kompresja wideo jest w ogóle możliwa. W większości standardów wykorzystuje się dwie charakterystyczne cechy sekwencji nieruchomych klatek. Są nimi: ich przestrzenna, czyli wewnątrzklatkowa oraz czasowa, czyli międzyklatkowa, nadmiarowość.

Czym się różni nadmiarowość przestrzenna od czasowej?

Rys. 1. Schemat blokowy dekodera H.264

Nadmiarowość przestrzenna polega na tym, że piksele w obrazie, które ze sobą sąsiadują, bardzo często mają podobne wartości. Na przykład, jeżeli dany piksel ma kolor niebieski, to z bardzo dużym prawdopodobieństwem można założyć, że piksele, które go otaczają, również będą tego samego koloru.

Ewentualnie mogą one mieć nieco inny odcień, trochę jaśniejszy lub ciemniejszy. Dzięki temu nie ma potrzeby przechowywania pełnej informacji o kolorze każdego piksela oddzielnie. W zamian, wykorzystując do tego mniejszą liczbę bitów, można zapisać jedynie informacje o różnicach, które je dzielą.

Nadmiarowość czasowa też polega na podobieństwie, ale w tym przypadku między kolejno po sobie następującymi klatkami. Bardzo często są one w zasadzie identyczne, z tą różnicą, że z powodu ruchu obiektów w danej scenie następna klatka jest względem tej poprzedniej nieco przesunięta.

Wykorzystuje się to, zapisując wyłącznie informację o różnicy pomiędzy kolejnymi klatkami. Ponieważ jest ona z reguły mała, do jej zapisu potrzeba mniej bitów niż do zapisu wszystkich pikseli obrazu w obu klatkach.

Dzięki tym zależnościom oraz kilku innym rozwiązaniom z zakresu przetwarzania i kodowania danych aktualnie standard H.264/AVC w dziedzinie kompresji wideo w zasadzie nie ma sobie równych. Jego przewaga dotyczy zarówno stopnia kompresji, jak i jakości wideo.

Najważniejsze z tych technik wymieniono na rysunku 1. Zostały one przedstawione jako bloki funkcyjne na uproszczonym schemacie blokowym dekodera AVC.

Kodowanie entropijne

Na strumieniu bitów zakodowanych zgodnie ze standardem H.264 wykonywanych jest kolejno kilka operacji. Pierwszą z nich jest dekodowanie entropijne. Jest to działanie odwrotne do kodowania entropijnego w koderze.

Kodowanie entropijne jest to bezstratna metoda kompresji, w której symbol wejściowy o stałej długości zostaje zastąpiony słowem kodowym o zmiennej długości. Dzięki temu, że symbolom, które występują najczęściej, przypisywane są najkrótsze słowa kodowe, uzyskuje się duży stopień kompresji.

Standard AVC dopuszcza stosowanie dwóch alternatywnych metod kodowania entropijnego. Jedną z nich jest kodowanie CAVLC (Context-Adaptive Variable Length Coding), czyli kodowanie o zmiennej długości słowa kodowego z adaptacyjnym przełączaniem kontekstowym. Jest to adaptacyjna odmiana kodowania Huffmana.

Drugą metodą jest kodowanie CABAC (Context-Adaptive Binary Arithmetic Coding). To z kolei jest adaptacyjna wersja kodowania arytmetycznego, które od kodowania Huffmana różni to, że symbole nie są kodowane oddzielnie. W zamian całym ciągom wiadomości przypisywane są wartości z przedziału 0...1.

Zapewnia to stopień kompresji nawet kilkukrotnie większy niż w kodowaniu CAVLC. Dzięki temu kodowanie CABAC jest m.in. wykorzystywane w kompresji wideo HD. Jednocześnie, ze względu na złożoność obliczeniową, może ono zająć nawet 50% czasu pracy dekodera H.264.

Kwantyzacja, DCT

Następnie w dekoderze wykonywana jest dekwantyzacja. Jest to operacja odwrotna do kwantyzacji w koderze.

Kwantyzacja polega na podzieleniu współczynników przez odpowiadające im wartości ze specjalnej tablicy, a następnie zaokrągleniu otrzymanych wyników. Dzięki temu można je zakodować, używając mniejszej liczby bitów. To przede wszystkim z powodu kwantyzacji kompresja wideo w standardzie H.264 jest stratna.

W dekoderze skwantowane współczynniki mnoży się przez taką samą tablicę jak w koderze. Odtworzone w ten sposób wartości nie są wprawdzie identyczne z oryginalnymi, lecz na tyle do nich zbliżone, że w wyniku dzielących je różnic tracone są wyłącznie te najmniej dostrzegalne szczegóły obrazów.

Współczynniki, które poddaje się kwantyzacji w koderze, są wynikiem dwuwymiarowej dyskretnej transformaty kosinusowej DCT (Discrete Cosine Transform). Jej zadaniem jest przedstawienie wejściowych informacji o obrazie w dziedzinie częstotliwości.

Dzięki temu później łatwo można wyszukać składowe wysokoczęstotliwościowe, odpowiadające najmniej dostrzegalnym szczegółom obrazów i usunąć je w procesie kwantyzacji. W AVC, inaczej niż w innych standardach kompresji, wykorzystuje się transformatę całkowitoliczbową.

Do jej zalet zalicza się: prostszą oraz szybszą realizację oraz brak strat związanych z dokładnością liczb zmiennoprzecinkowych. Transformatę kosinusową wykonuje się na blokach o rozmiarze 4×4 piksele albo większym, 8×8 pikseli. W dekoderze przeprowadza się natomiast operację odwrotną - IDCT (Inverse DCT).

Typy klatek

W standardzie H.264 rozróżnia się trzy rodzaje klatek, typów: I, P i B. W kodowaniu pierwszych wykorzystuje się predykcję intra (wewnątrzklatkową), w której każdy makroblok jest kodowany na podstawie makrobloków, które sąsiadują z nim w tej samej klatce. Klatki typu I nie zależą zatem od innych klatek.

W kodowaniu klatek typu P stosuje się natomiast zarówno predykcję intra, jak i estymację ruchu, w której wykorzystuje się czasową korelację pomiędzy kolejnymi klatkami. Klatki typu P zależą w związku z tym od jednej albo większej liczby poprzedzających je klatek. Mogą to być zarówno klatki typu I, P, jak i B. W przypadku klatek ostatniego typu stosuje się dwukierunkową estymację ruchu. W związku z tym klatki B mogą zależeć od klatek poprzednich, jak i tych następujących po nich.

W dekoderze kolejność odkodowywania klatek może się różnić od kolejności ich wyświetlania. Wynika to stąd, że klatki typu B mogą zależeć również od tych, które następują po nich. Oprócz tego klatka referencyjna powinna zostać odkodowana przed klatkami, które od niej zależą.

Predykcje intra i inter

Pierwsza klatka danej sceny zazwyczaj nie jest podobna do klatek z innej sceny, która ją poprzedza. Dlatego jest to przeważnie klatka typu I, kodowana w wyniku predykcji intra, czyli na podstawie zależności występujących pomiędzy pikselami tylko w jej obrębie.

Standard H.264 dopuszcza wykonywanie predykcji intra na blokach o rozmiarach 4×4, 8×8 i 16×16 pikseli. Przykładowo w pierwszym przypadku makroblok o rozmiarze 16×16 pikseli jest dzielony na szesnaście bloków o rozmiarze 4×4 pikseli. Dla każdego z nich stosowana jest predykcja intra. Jest ona możliwa w jednym z dziewięciu trybów. Dla każdego bloku 4×4 pikseli może zostać zastosowany inny tryb.

Jeżeli z kolei chodzi o predykcję intra, standard AVC dopuszcza różne rozmiary makrobloków, od 16×16 pikseli, do 4×4 pikseli. Polega ona na estymacji ruchu, czyli na wyszukaniu dla każdego makrobloku w danej klatce makrobloku w klatce referencyjnej, który najlepiej pasuje do tego pierwszego.

Następnie koder oblicza różnicę położeń obu makrobloków. W ten sposób dla każdego makrobloku wyznaczany jest wektor ruchu, który charakteryzuje przestrzenne przesunięcie, jakie wykonuje on przy zmianie klatki.

Wektory ruchu są estymowane z dokładnością do 1/4 piksela. Oznacza to, że opisują one także przesunięcia w miejsca pomiędzy pikselami, a najlepiej pasujący blok jest wyznaczany przez interpolację.

W standardzie H.264 dopuszczalne jest wyznaczanie wektora ruchu na podstawie kilku, maksymalnie szesnastu, klatek odniesienia. Zwiększa to dokładność predykcji, równocześnie jednak spowalnia przetwarzanie.

Filtr deblokujący

Jak wynika z powyższego opisu, najważniejsze operacje w procesie kompresji wideo wykonuje się nie na całej klatce, lecz na jej mniejszych fragmentach - makroblokach. Takie rozwiązanie stosuje się z dwóch powodów.

Po pierwsze zmniejsza to złożoność obliczeniową wymienionych działań. Po drugie dzięki podziałowi klatki na makrobloki dokładność predykcji jest większa. Niestety równocześnie negatywnie wpływa to na jakość wideo.

W odkodowanym wideo widoczne są bowiem krawędzie tych bloków. Są one tym wyraźniejsze, im silniejszą kwantyzację zastosowano. Aby ten niepożądany efekt zredukować, w dekoderze, na wyjściu bloku obliczającego dyskretną transformatę kosinusową, umieszcza się filtr deblokujący.

Jego zadaniem jest wygładzenie krawędzi makrobloków. Stopień wygładzania jest dobierany w taki sposób, by niezamierzenie filtr ten nie usunął krawędzi również tam, gdzie się one rzeczywiście znajdują także w oryginale.

Podsumowanie

Jedną z najważniejszych różnic między standardem kompresji H.264 a wcześniejszymi wersjami jest to, że dopuszcza on zmienne rozmiary bloków w procesie estymacji ruchu. Tymczasem w przypadku MPEG-2 operację tę przeprowadzano na blokach 16×16 pikseli, zaś w MPEG-4 na fragmentach klatki o rozmiarach od 16×16 pikseli do 8×8 pikseli.

Ponadto w H.264 estymacja ruchu jest przeprowadzana z dokładnością do 1/4 piksela. Było to wykonalne już w MPEG-4, ale tylko jako opcja, natomiast w MPEG-2 taka precyzja nie była możliwa do osiągnięcia.

W obu starszych wersjach standardu MPEG nie było także wykonalne estymowanie ruchu na podstawie wielu klatek referencyjnych. Oprócz tego dzięki temu, że w H.264 dostępnych jest więcej trybów predykcji intra niż jeden, jak to było we wcześniejszych wersjach, zapewnia on większy stopień kompresji wewnątrzklatkowej.

W AVC filtr deblokujący jest obowiązkowy, podczas gdy w MPEG-2 i MPEG-4 nie był on w ogóle używany. Stopień kompresji wideo zapewniany przez H.264 jest większy również dzięki temu, że wprowadzono w nim możliwość kodowania entropijnego CABAC, zaś transformatę kosinusową wykonuje się w wersji całkowitoliczbowej oraz na blokach o zmiennym rozmiarze 4×4 piksele i 8×8 pikseli.

W porównaniu do standardów, które zastąpił, H.264 zapewnił około dwukrotnie większy stopień kompresji. Taki jest też cel prac nad kolejnymi standardami. Jednym z ich najnowszych wyników jest specyfikacja H.265/HEVC. Pierwsza wersja tego standardu została oficjalnie ogłoszona w 2013 roku.

Co nowego w H.265?

Rys. 2. W H.625 klatkę dzieli się na CTB i CU o zmiennych rozmiarach

Podobnie jak w AVC w porównaniu do wcześniejszych wersji, tak i w HEVC w porównaniu do H.264 nie wprowadzono żadnych rewolucyjnych zmian. Podstawowe operacje jak: dzielenie klatki na makrobloki, redukcja nadmiarowości przestrzennej przez predykcję intra oraz nadmiarowości czasowej poprzez predykcję inter, tzn. estymację ruchu (w koderze) oraz jego kompensację (w dekoderze), transformacja i kwantyzacja oraz kodowanie entropijne, są nadal wykonywane. W HEVC jednak, podobnie jak wcześniej w AVC, zostały one udoskonalone.

Na przykład inaczej niż w H.264, w którym klatkę dzielono na makrobloki o stałym rozmiarze 16×16 pikseli, w H.265 dzieli się ją na CTB (Coding Tree Blocks) o zmiennych rozmiarach, od 64×64 pikseli do 16×16 pikseli. Co więcej, każdy CTB można dalej podzielić na CU (Coding Units) o rozmiarach od 32×32 pikseli do 8×8 pikseli (rys. 2).

Zmienne rozmiary makrobloków zapewniają większą elastyczność i pozwalają dostosować sposób kodowania do treści obrazu. Jego obszary z większą liczbą szczegółów można bowiem podzielić na więcej mniejszych bloków CU.

W ten sposób warto jest na przykład podzielić fragmenty przedstawiające krawędzie obiektów na obrazie. Z kolei obszary z małą liczbą detali, jak na przykład tło, opłaca się zakodować w jednym bloku. Znacząco zwiększa to stopień kompresji.

Czym są TU?

Operację transformaty w przypadku HEVC wykonuje się na TU (Transform Units), na które dzieli się CU. Inaczej niż w przypadku AVC, w którym DCT poddawane były przede wszystkim bloki o rozmiarze 4×4 piksele, a rzadziej 8×8 pikseli, w H.265 bloki TU mogą mieć rozmiary: 32×32 piksele, 16×16 pikseli, 8×8 pikseli oraz 4×4 piksele.

Jak się bowiem okazuje, dzięki większym TU efektywniej koduje się sygnały stacjonarne, zaś te mniejsze lepiej sprawdzają się przy sygnałach impulsowych. W HEVC poza DCT na blokach 4×4 piksele wykonuje się też transformatę DST (Discrete Sine Transform), co również zwiększa stopień kompresji.

W porównaniu do AVC w HEVC znacząco zwiększono liczbę trybów predykcji intra, z 9 do aż 35. Podobnie jak w H264, również w H.264 wektory ruchu są estymowane z dokładnością do 1/4 piksela, jednak w tym drugim korzysta się z filtrów z większą liczbą odczepów, co poprawia dokładność estymacji i stabilizuje obraz.

Jeżeli z kolei chodzi o kodowanie entropijne, to w HEVC całkowicie zrezygnowano z techniki CAVLC. Dopuszczalne jest jedynie zapewniające większy stopień kompresji kodowanie CABAC.

H.265 ułatwia przetwarzanie równoległe

Ponadto w H.265 filtrowanie deblokujące wykonywane jest wyłącznie na blokach o rozmiarze 8×8 pikseli, podczas gdy w H.265 krawędzie wygładzano już na blokach 4×4 piksele. Zmiana ta skraca ten proces.

W związku z tym, że pod względem złożoności obliczeniowej kompresja wideo według wytycznych standardu HEVC przewyższa wcześniejsze techniki, wprowadzono w nim szereg rozwiązań umożliwiających wykorzystanie możliwości nowoczesnych procesorów w zakresie przetwarzania równoległego.

Przede wszystkim postarano się, aby ograniczyć wzajemne zależności między poszczególnymi operacjami. W tym celu m.in. klatkę dzieli się w taki sposób, aby na granicach wydzielonych obszarów nie wykonywano ani predykcji intra, ani estymacji ruchu.

Monika Jaworowska