# H.261

H.261 is een videocompressiestandaard uit 1988 die in datzelfde jaar door het CCITT is geratificeerd. De standaard was ontworpen voor videoconferentie en ander audiovisuele services over ISDN-telefoonlijnen. Oorspronkelijk was het ontworpen om meerdere kanalen te ondersteunen van 384 kbps. Uiteindelijk is het ertoe gekomen dat H.261 p kanalen ondersteunde van 64 kbps waarbij p varieert tussen de 1 en de 30 kanalen. Vandaar dat de standaard vroeger ook bekend was als "p * 64", uitgesproken als "p star 64". Wat zeer belangrijk was bij deze standaard was dat de video-encoder een maximale vertraging veroorzaakte van 150msec, op deze manier was realtime bi-directionele videocommunicatie mogelijk.

## Videoformaten

De volgende videoformaten worden ondersteund door H.261.
| Videoformaat | Luminantieresolutie | Chrominantieresolutie | Bitrate (Mbps indien 30fps en niet gecomprimeerd) |
| QCIF | 176 x144 | 88 x 72 | 9,1 |
| CIF | 352 x 288 | 176 x 144 | 36,5 |

## Intra- en interframecodering

De onderstaande figuur illustreert een typische H.261-framesequentie.
Er zijn 2 soorten frames:
* Intra-frames (I-frames)
* Inter-frames (P-frames)
I-frames zijn onafhankelijke beelden. De transformatiecoderingsmethode is bij deze beelden zeer gelijkaardig aan JPEG. P-frames zijn niet onafhankelijk. Deze frames zijn afhankelijk van de voorgaande frame. Bij P-frames maakt men gebruik van de techniek predictive coding. Bij deze methode bepaalt de encoder de huidige macroblokken aan de hand van gelijkaardige macroblokken in het voorgaande I- of P-frame, de encoder gaat dus enkel de verschillen tussen de macroblokken bij opeenvolgende frames coderen. Het interval tussen twee I-frames is variabel en wordt bepaald door de encoder, maar je mag ervan uitgaan dat je een paar I-frames per seconde kan terugvinden in een normale digitale video die gecodeerd is met de H.261-codec.

## H.261 Video Bitstream Syntax

In de H.261 Video Bitstream syntax heb je vier lagen:
* Picture-laag
* Group Of Blocks (GOB)-laag
* Macroblock-laag
* Block-laag
Aan de hand van de onderstaande figuur kan de syntaxis laag per laag geanalyseerd worden.

### Picture-laag

De Picture Start Code (PSC) definieert de grens tussen twee opeenvolgende beelden. De Temporal Reference (TR) zorgt voor een tijdsstempel voor het beeld. Deze tijdsstempel is belangrijk om de opeenvolgende beelden gesynchroniseerd te houden met de overeenkomstige audio. De Picture Type definieert het formaat van het beeld, ofwel is het formaat CIF, ofwel is het formaat QCIF.

### GOB-laag

H.261-beelden zijn opgedeeld in regio's van 11x3 macroblocks, bijvoorbeeld regio's van 176x48 pixels in luminantiebeelden. Elke regio van 176x48 pixels is een Group of Blocks. Een QCIF-beeld bestaat uit drie GOB's, zo kom je uit op een resolutie van 176x144 pixels, terwijl een CIF-beeld samengesteld is uit 2x6 GOB's om zo op een resolutie uit te komen van 352x288 pixels. Elke GOB heeft een Start Code (GBSC); deze startcode is uniek en kan teruggevonden worden zonder heel de code in de bitstream te decoderen. Dit is handig wanneer er bij de transmissie van video een aantal bits verloren gaan. Op deze manier kan de H.261-video hersteld en opnieuw gesynchroniseerd worden bij de volgende GOB aan de hand van de GBSC en de Group Number. De GOB Quantizer duidt aan welke quantizer er gebruikt moet worden binnen de GOB.

### Macroblock-laag

Elk macroblock begint met een adres. Dit geeft de positie van het macroblock binnen de GOB weer. Type duidt aan of het een P-Frame is of een I-Frame. Opnieuw duidt de Macroblock Quantizer aan welke quantizer er gebruikt moet worden. De Motion Vector Data (MVD) verkrijg je door het verschil tussen de motion vectors van de voorgaande en de huidige macroblock te nemen. Er is natuurlijk het probleem dat sommige macroblokken zeer goed overeenkomen met andere macroblokken in het voorgaande frame, maar andere helemaal niet. Hier komt het Coded Block Blast (CBB) handig van pas. Het CBP zorgt ervoor dat enkel de coëfficiënten van de macroblocks die goed overeenkomen worden verstuurd.

### Block-laag

Voor elk 8x8-block start de bitstream met een DC value gevolgd door paren van zero-length-codering. Uiteindelijk heb je de End of Block (EOB)-code, Deze duidt aan dat het huidige blok beëindigd is.
* http://www.itu.int/rec/T-REC-H.261-199303-I/en
* http://www.cs.cf.ac.uk/Dave/Multimedia/node246.html
* http://www.javvin.com/protocolH261.html