Al sentir parlar de formats de video, codecs, DivX, MPEG4, etc. sovint surten a la conversa termes com ara els I-frame, P-frame i B-frame. Cansat de que em soni a xinès he decidit fer-me un petit resum de què és tot plegat, sempre des del punt de vista d’algú que en sap ben poc d’aquests temes.
Podem dividir els ‘frames’ de video en 3 tipus:
- I-Frame: també anomenat keyframe. No té cap frame de referència i pot ser decodificat per si mateix. Podem pensar que és algo semblant a un JPEG.
- P-Frame: El contingut del mateix és dedueix d’un frame previ de tipus I o P, és impossible decodificar-lo sense mirar aquesta referència.
- B-Frame: per decodificar-los cal mirar els frames anteriors i següents de tipus I i P.
Aquest últim tipus de frames són interessant per dues raons:
- Són fàcils de predir
- No impacten en la qualitat dels frames següents
Degut a que els B-frames depenen del passat i el futur, llavors el decodificador li calen frames I-P del passat i el futur per poder decodificar el frame B. Això ens porta als conceptes PTS/DTS.
- PTS Presentation Time Stamp: també podem entendre’l com una forma de saber el número de frame, ordre en que es poden veure els frames decodificats.
- DTS Decoder Time Stamp: ordre en que es processen els frames per ser decodificats.
Un exemple, per entendre-ho millor:
- Suposem que això és un petit video: I-0 B-1 B-2 P-3
- L’ordre DTS seria: I-0 P-3 B-1 B-2
Per tal de simplificar les coses el video s’enmagatzema en l’ordre DTS.
El problema
Arribat en aquest punt podeu imaginar-vos el problema que suposa mostrar un video en ordre, ja que el decodificador ha d’anar composant els frames per mostrar-los am és d’inserir frames on no n’hi han per mostrar el frame que toca.
DIVX (i Xvid)
Aquests famosos codecs per tal de d’atacar aquest problema fan servir un petit truc. La idea seria usar una variant dels frames PB i empaqueten diversos frames en un. Això fa que les aplicacions es pensin que només hi ha un frame i el codec oculta la resta.
Per exemple, si tenim un fitxer que te empaquetat el següent:
In (0 3 1 2) - - - ...
el codec haurà de treure això:
Out 0 1 2 3 ...
El codec posa frames de tipus ‘null’ en el lloc on hi haurien d’haver els frames que no té pel fet de tenir-los empaquetats en un frame. Els codecs ja saben que quan reben un frame null han de descartar-los.
Des del punt de vista del codificador, és important fixar-nos que no s’introdueix un delay corresponent als frames nulls. En un fitxer AVI no hi ha cap relació entre el PTS/DTS guardada enlloc per tal d’informar al decoder quan aquest ha de reproduir.