VP9 verbeteren zonder het te veranderen - Deel 1

7 november 2017
  door Blog Team
Temporele schaalbaarheid met drie lagen

Vidyo heeft onlangs zijn eigen codec-implementatie van schaalbaar VP9 aangekondigd, met aanzienlijke prestatie- en efficiëntieverbeteringen in vergelijking met de open-source VP9-codec-implementatie van WebM, vooral op mobiele apparaten. Bovendien blijft de VP9-codec van Vidyo volledig compatibel met WebRTC en elke toepassing die de WebM VP9-codec gebruikt, inclusief de Chrome-browser van Google. In deze driedelige blogreeks zal ik de specifieke kenmerken en voordelen van dit opwindende nieuwe ontwerp in meer detail uitleggen. Maar voordat we dat doen, is het belangrijk om eerst de achtergrond en context van VP9, schaalbaarheid en videocodecs in het algemeen te begrijpen.

De VP9-videocodec werd eind 2015 voor het eerst beschikbaar in de Google Chrome-browser, toen Chroom 48 werd uitgebracht. Hoewel WebRTC vereist dat zowel VP8 als H.264 worden ondersteund in een browser, introduceerde VP9 een open source en naar verluidt royaltyvrij alternatief dat beter presteerde dan H.264 en natuurlijk het veel oudere VP8. In een blogbericht in december 2015heb ik de geschiedenis van de ontwikkeling van VP9 samengevat in de context van WebRTC en Google+ Hangouts.

Het belang van VP9 voor realtime communicatie gaat veel verder dan het feit dat het state-of-the-art compressie-efficiëntie biedt in een open source, royaltyvrij pakket. Zoals ik in april 2016 al schreef in mijn gastbijdrage "Schaalbaarheid, VP9 en wat het betekent voor WebRTC". in BlogGeek.Me, is het de eerste codec die state of the art schaalbaarheid brengt in browser-gebaseerde videocommunicatie. Schaalbaarheid heeft bewezen een essentieel hulpmiddel te zijn voor de implementatie van multipoint video van hoge kwaliteit en wordt ondersteund in de HEVC- en H.264-codec-standaarden, waarvoor royalty's zijn betaald.

Schaalbare codering betekent dat dezelfde videobitstream subsets van gegevens bevat, lagen genaamd, die het mogelijk maken om het origineel op verschillende resoluties te reconstrueren. Schaalbaarheid kan verwijzen naar een aantal dimensies, namelijk temporele, ruimtelijke of kwaliteit, waarbij de eerste twee worden gebruikt in realtime communicatietoepassingen.

Temporele schaalbaarheid betekent dat je met dezelfde videobitstream een subset van de gegevens kunt nemen en de video met verschillende framesnelheden kunt weergeven. Figuur 1 laat zien hoe video wordt gecodeerd in real-time communicatie wanneer er geen schaalbaarheid wordt gebruikt, d.w.z. met een enkele laag. Elk beeld gebruikt het vorige gecodeerde beeld als referentie; op deze manier hoeft de encoder alleen het verschil tussen opeenvolgende beelden te verzenden, waardoor de hoeveelheid gegevens die hij moet verzenden wordt verminderd. Deze afbeeldingen worden "P" genoemd van het woord "predicted". Het allereerste beeld gebruikt geen voorspelling van een vorig beeld en wordt een intra- of "I"-beeld genoemd. Een beperking is dat om een beeld te decoderen, men alle voorgaande beelden in de keten moet hebben ontvangen. Deze beeldcoderingsstructuur wordt meestal IPPP genoemd, naar de reeks beeldtypes waaruit het is opgebouwd.

Codering met één laag

Afbeelding 1: Codering met één laag

Figuur 2 laat zien hoe het coderen in zijn werk gaat als er drie temporele lagen worden gebruikt. De afbeeldingen worden getoond met een verticale verschuiving om de verschillende lagen gemakkelijk te herkennen. Laten we aannemen dat de volledige beeldsnelheid 30 beelden per seconde (fps) is. De onderste laag (laag 0) codeert een van elke vier beelden, wat een snelheid van 7,5 fps oplevert. Merk op dat deze laag op dezelfde manier is gecodeerd als in Figuur 1 - de eerste afbeelding is een I-afbeelding en de volgende afbeeldingen zijn allemaal P-afbeeldingen (P0).

Temporele schaalbaarheid met drie lagen

Figuur 2: Temporele schaalbaarheid met drie lagen

Laag 1 wordt dan opgebouwd door de afbeeldingen toe te voegen die halverwege tussen de laag 0-afbeeldingen staan. In afbeelding 2 zou dat afbeelding P1 zijn. Merk op dat het is gecodeerd met behulp van het onmiddellijk voorafgaande beeld van laag 0. Als we de P1-beelden toevoegen aan de P0-beelden, hebben we een totale snelheid van 15 fps. Tot slot wordt laag 2 opgebouwd door alle resterende afbeeldingen (P2) toe te voegen. Deze afbeeldingen worden weer gecodeerd met behulp van de direct voorafgaande afbeeldingen van een lagere laag. Voor de eerste P2 betekent dit I0 (of P0 later in de tijd) terwijl het voor de tweede P2 de P1 op tijdstip 2 betekent. Als we de P2 beelden optellen bij de P0 en P1, krijgen we een totaal van 30 fps.

Deze structuur, die hiërarchische P-beeldcodering wordt genoemd, heeft een aantal nuttige eigenschappen. Ten eerste kunnen we hogere lagen verwijderen zonder ons vermogen om lagere lagen te decoderen aan te tasten. Het is dan mogelijk om de framerate op elk moment in de tijd te verlagen zonder signaalbewerking. Ten tweede stelt de structuur ons ook in staat om op elk moment naar een hogere temporele laag te gaan. Ik kan bijvoorbeeld alleen laag 0 ontvangen en decoderen met 7,5 fps, maar dan besluiten om over te gaan naar volledige 30 fps en dat doen zonder enige vertraging of extra signaalverwerking. De structuur heeft ook een aanzienlijk verbeterde robuustheid. Alleen laag 0 hoeft bijvoorbeeld betrouwbaar te worden ontvangen.

 

Abonneren op blog

Ontvang een melding wanneer nieuwe blogs in deze categorie worden gepubliceerd: .

Volg ons

Ga naar de inhoud