Exemples de conteneurs

Transcription

Exemples de conteneurs
Annexe CODEC
Exemples de conteneurs
I) Exemples dans le cas de flux mpeg2 (ISO 13818-1 )
Formation de paquet à partir d'une source d'information: PES
Pour les flux audio et vidéo: Un flux numérique est compressé selon son codec, puis découpé en paquets
= Packetizer. On lui ajoute une entête.
Pour les données: Un flux numérique est découpé en paquets = Packetizer. On lui ajoute une entête.
=> On obtient différents PES Packetized Elementary Stream qui vont formé les flux.
Les paquets PES quelque soit leur type ont la même entête:
Start Code ( 3 oct )
Stream ID ( 1oct )
Longueur du paquet ( 2 oct )
Stream ID donne le type de paquet ( 110x xxxx = audio, 1110 xxxx = vidéo, 1011 1110 bourrage, ... )
Le champ longueur permet d'avoir des paquets de longueur variable.
Pour les paquets audio ou vidéo, on ajoute des informations supplémentaires entre l'entête et les données:
PTS ( 1 oct )
DTS ( 1oct )
ESCR ( 1 oct )
Du fait des codages prédictifs et bidirectionnels en vidéo, on change l'ordre des images.
Du fait d'avoir de l'audio et de la vidéo qui n'ont pas les mêmes volumes, il faut les synchroniser.
=> utilisation de marqueurs temporels: PTS ( Presentation Time Stamps ) et DTS ( Decode TS ).
( en option ESCR Elementatry Stream Clock Reference = temps absolu )
En local, le décodeur fait évoluer son compteur.
Quand il vaut DTS, le paquet PES avec ce DTS est décodé et mis en mémoire avec son PTS.
Quand il vaut PTS, le paquet PES décodé est présenté en sortie du décodeur.
1
Annexe CODEC
Il existe ensuite 2 techniques pour multiplexer des flux selon la norme mpeg2:
MPEG2 PS
- Permettre le stockage de flux ayant la même base de temps. Ensuite utilisé pour la
( Program Stream ) diffusion mais mal adapté.
Ex:DVD
- 1 flux PS ne contient qu'un programme vidéo.
- Utilisé dans un environnement avec peu d'erreurs => Paquets de grande taille
- Taille des paquets variables => Décodage matériel difficile, il faut interpréter un champ.
MPEG2 TS
- Un flux contient plusieurs programmes.
( Transport Stream ) - Ces programmes peuvent ne pas avoir de référence de temps commune.
Ex: bouquets TV - Taille de paquets fixe = 188 octets
=> En milieu avec erreur courante, on peut récupérer des paquets perdus ou manquants
satellite, adsl, câble
=> Décodage matériel => Plus rapide.
=> Plus compliqué à créer ( découpage ) et gérer ( mux/démux ) que le flux PS.
Aperçu de MPEG2 PS Program Stream
A partir d'un flux video, de N audios et M données, on forme le flux PS.
Il est fait d'entête PS ( pack header ) et de paquets ( pack ) contenant les différents flux ( PES ).
pack
header
MPEG2
pack
header
pack
layer
pack
program system
start 01 SCR mux
header
code
rate
program
stream
pack 1
pack 2
PES packet 1
...
...
pack
header
pack n
...
PES packet i
flags
system header rate
audio
header length bound bound
audio video
start
fixed CSPS lock lock
code
P_STD P_STD
stream
buffer
11 bound buffer
size
id
scale bound
video
band
MPEG
program
end code
PES packet n
N loop
.......
.......
Il y a différents types de paquets PS ( packs ) identifiés par le champ Stream_ID.
Stream_ID = 0xBC => Le paquet PS est le PS map décrivant les PES présents dans le flux et leurs relations.
Stream_ID = 0xFF => Le paquet PS est le répertoire du flux de programme ( PS directory )...
Pour le DVD: Un fichier VOB peut être fait de 4 types de paquets PS de longueur fixe 2048 octets:
- vidéo
- audio
- Navigation: NavPack ( controle de la présentation PCI et recherche de données DSI )
- SubPictures
2
Annexe CODEC
Aperçu de MPEG2 TS Transport Stream
Un paquet TS commence par un préfixe de 4 octets avec en particulier le PID ( Packet ID ) sur 13 bits. Il permet
d'identifier le programme grâce aux tables PSI ( Program Specific Information ).
Un paquet TS avec un PID ne contient qu'un programme ( PES ).
Les tables PSI sont pour partie définies selon la norme, pour partie définies par l'opérateur selon les programmes à
acheminer ( private data ).
Ces tables PSI sont définies dans le flux TS sous 4 formes:
- La PAT: Program Association Table = PID 0x0000:
Correspondance entre un numéro de programme et le PID contenant la définition du programme dans la PMT du
programme.
- Les PMT: Program Map Table: Une PMT indique entre autre les PID associés à une programme.
- NIT: Network Information Table = définie par l'opérateur.
- CAT: Conditional Access Table = PID 0x0001 = Abonnement et pay per view.
Indique les PID qui vont gérer les accès conditionnels aux programmes selon l'EMM
( Entitlement Management Message ).
Le décodeur recherche la PAT ( PID = 0x0000 ). Elle indique quel PID contient la PMT du programme = les PID
associés à ce programme ( vidéo, audio, sous titres, infos diverses,... ).
Les paquets sont de taille fixe: 188 octets
=> en utilisera ensuite facilement un code correcteur d'erreur en bloc: Reed Solomon RS(188,204,8) qui ajoute
16 octets aux 188 => 204 octets. Il peut corriger 8 octets sur les 188 envoyés.
=> Il faut découper et regrouper les flux multiplexés pour les incorporer au flux TS.
Principaux champs d'un flux MPEG2 TS: ( longueurs indiquées en bits )
188 bytes
transport
packet
stream
header
payload
header
payload
header
...
payload
packet header
transport
packet
(188 bytes)
sync transport payload transport
byte error
unit start scrambling
indicator indicator control
8
1
2
1
transport
adaptation
PID
priority
field control
continuity
counter
13
4
1
adaptation
field
length
8
2
adaptation
field
payload
discontinuity random elementary
optional stuffing
access stream
5 flags fields
indicator
bytes
priority
indicator indicator
1
1
1
PCR OPCR
33+9
+6 res
3
33+9
+6 res
transport adaptation
splice
field
countdown private
extension
data
8
Annexe CODEC
Exemple:
- L'utilisateur demande au décodeur la chaine numéro 1
- Le décodeur lit la PAT ( PID = 0x0000 ) => Le programme n°1 est défini par la PMT de PID 15.
- Le décodeur lit la PMT de PID 15 qui définit le multiplex du programme 1. Il en déduit que ce programme n°1 contient
* la vidéo = PID 51
* l'audio en anglais = PID 64
* l'audio en français = PID 66
* les soutitres en langue ... = PID 101
* etc...
- Le décodeur accède aux paquets élémentaires avec les PID.
Exemple: Logiciel de décodage de flux MPEG2 TS
4
Annexe CODEC
II) Exemple du format AVI ( Audio Video Interleaved )
AVI est un cas particulier de fichier RIFF ( Resource Interchange File Format ) défini par Microsoft et IBM qui est un
clone d' IFF inventé par Electronic Arts en 1984.
IFF utilise des entêtes de 4 caractères ( 4-character code headers = FourCC).
L'élément de base du fichier AVi est le CHUNK ( Tronçon, Morceau ):
- 4 oct: ckID pour identifier les données contenues dans le CHUNK.
- 4 oct: cKSize: Taille données du CHUNK (sans l'éventuel remplissage à la fin pour avoir 4 octets ).
- cKData: Données du CHUNK ( avec remplissage pour avoir à la fin un paquet de 4 octets ).
Les CHUNK forment ensuite des LIST = ensemble de CHUNK ou de LIST = CHUNK avec en plus le type du contenu
- 4 oct: 'LIST'
- 4 oct: Longueur de la liste
- 4 oct: Type de liste
- Contenu: Listes ou Chunk
Arborescence d'un ficher AVI
RIFF
|-AVI
|-hdrl
| |-avih
| |-strl
| | |-strh
| | |-strf
| | |-strd
| | |-strn
| |-strl
| | |-strh
| | |-strf
| | |-strd
| | |-strn
Entête RIFF ( RIFF HEADER )
Contenu AVI ( AVI CHUNK )
- Entête principale ( MAIN AVI HEADER )
-Entête du fichier AVI ( AVI HEADER )
-LIST décrivant le flux ( STREAM LIST ): 1 par
flux
Entête du flux ( STREAM HEADER ): associé au strl
Format du flux ( STREAM FORMAT )
OPTION -- Données liées au flux ( STREAM DATA )
OPTION -- Nom du flux ( STREAM NAME )
-LIST décrivant le flux ( STREAM LIST ): 1 par flux
Entête du flux ( STREAM HEADER ): associé au strl
Format du flux ( STREAM FORMAT )
OPTION -- Données liées au flux ( STREAM DATA )
OPTION -- Nom du flux ( STREAM NAME )
... selon le nombre de flux
|-movi
| |-rec
|
|-[data subchunks]
|-idx1
|-[index data]
strl défini le type du flux ( 'auds' = audio,
- Données ( MOVIE DATA )
-Données d'un enregistrement ( RECORD DATA )
Valeurs des données en bloc ( RAW DATA )
- Index ( AVI INDEX )
- Données de l'index ( DATA )
'mids' = MIDI, 'txts' =Texte, sous titres, 'vids' = Video ) .
Remarque: AVI2 On trouve aussi le type de liste "odml" suivi de "dmlh" ( dml header ). Cela représente des données
Open DML ( Open Digital Media Language, Microsoft a amené à ajouter en 1996 ces options => AVI2.0 ) permettant
d'utiliser un autre indexage pour diminuer les entêtes, de traviller à la trame et non à l'image,...
Contenu du fichier AVI 1.0
Le fichier est fait de paquets de 4 octets dw = DWORD double word ( sauf un ou deux WORD w = 2 octets ).
"RIFF" / dwChunkSize (Taille fichier sans 8 octets RIFF et Taille) / "AVI " (Type fichier) /
"LIST" / dwLIST1ChunkSize (Taille liste sans 8 octets LIST et Taille) / "hdrl" (Liste hdrl=entête principale) /
"avih" (Entête fichier AVI ) / dwMicroSecPerFrame (durée trame en µs) / dwMaxBytesPerSec (débit maxi approximatif: octets par sec ) /
dwReserved1 (mis à 0) / dwFlags ( Bit 4=présence d'index idx1, Bit 5=lecture de l'AVI avec index plutot que par ordre d'apparition dans le
fichier,...,Bit17=copyright sur les données,... ) / dwTotalFrames (Nombre total de trames) /
dwInitialFrames ( Trame initiale pour fichier entrelacé, 0 pour non entrelacé ) / dwStreams ( Nombre de flux dans le fichier ) /
dwSuggestedBufferSize ( Taille de buffer suggérée, plus grande que le plus grand CHUNK ) /
dwWidth (largeur image en pixels) / dwHeight (Hauteur image en pixels) / dwReserved4 (misà 0).
"LIST" / dwLISTChunkSize (Taille de cette 2ème LIST) / "strl" /
5
Annexe CODEC
"strh" / dwstrhSize (Taille) / fccType (Type de données du flux: 'auds' = audio, 'mids' = MIDI, 'txts' =Texte, 'vids' = Video) /
fccHandler ( FourCC du codec utilisé, sinon est défini dans strf) / dwFlags / wPriority / wLanguage / dwInitialFrames / dwScale /
dwRate / dwStart / dwLength / dwSuggestedBufferSize / dwQuality / dwSampleSize
"JUNK" / Taille du Chunk /
suivi d'information sur le logiciel de codage.
ou suivi de 0 pour remplissage et avoir des éléments de 2 ko.
"LIST" / dwLIST1ChunkSize (Taille liste ) / "movi" (Liste movi=données des flux) /
"LIST" / Taille / "rec "
"##wb" ( Chunk audio ) / Taille / Valeurs
"##db" ( Chunk video non compressée ) / Taille / Valeurs
"##dc" ( Chunk video compressée ) / Taille / Valeurs
## est le numéro du flux
"idx1" / dwSize ( Taille de idx1 ) /
dwChunkId (##wb, ##db ou ##dc => décrit aussi le type) / dwFlags / dwOffset ( Offset de la trame ) / dwSize ( Taille trame )
pour chaque trame.
L'offset est calculé par rapport à l'octet suivant "movi" ( exemple: première location = 4 après l'identifiant du flux ##wb, db ou dc qui donnera d'abord
la taille à lire puis les données de la trame ).
Remarque:
- On peut avoir "rec " seul sans "LIST" s'il n'y a qu'une vidéo seule
- JUNK est ignoré par le lecteur du fichier.
- L'indexage a étét amélioré en incluant des éléments d'indexage dans "movi": idx1
6
Annexe CODEC
Exemple
Avec indexage amélioré: Présence du code FourCC "indx", de ix00,...
[ 0
000000000: 52
000000016: CC
000000032: 50
000000048: A8
000000064: 40
000000080: 00
000000096: 73
000000112: 00
000000128: 64
000000144: 00
000000160: 40
000000176: 40
000000192: 00
000000208: 00
000000224: 01
000000240: 00
1
49
41
C3
02
01
00
74
00
00
84
01
01
84
00
00
00
2
46
00
00
00
00
00
72
00
00
03
F0
00
03
00
00
00
3
46
00
00
00
00
00
6C
00
00
00
00
00
00
00
00
00
4
DC
68
00
00
F0
00
73
00
D0
10
73
F0
00
69
30
0C
5
6C
64
B0
00
00
00
74
00
07
27
74
00
00
6E
30
44
6
57
72
04
00
00
00
72
00
00
00
72
00
00
64
64
00
7
09
6C
00
00
00
00
68
00
00
00
66
00
00
78
62
00
8
41
61
00
01
00
4C
38
00
00
00
28
01
00
F8
00
00
9
56
76
00
00
00
49
00
00
00
00
00
00
00
3F
00
00
10
49
69
00
00
00
53
00
00
00
00
00
18
00
00
00
00
11
20
68
00
00
00
54
00
00
00
00
00
00
00
00
00
00
12
4C
38
10
00
00
74
76
00
A8
00
28
00
00
04
00
00
13
49
00
00
84
00
40
69
00
02
00
00
00
00
00
00
40
14
53
00
00
03
00
00
64
00
00
00
00
00
00
00
00
00
15
54
00
00
00
00
00
73
00
00
00
00
00
00
00
00
00
0123456789012345]
|RIFF.lW.AVI LIST|RIFF
fileSize
fileType
LIST
|.A..hdrlavih8...|listSize listType
avih
structureSize
|P...............|microSecondPerFrame maxBytesPerSec
|................|totalFrames initialFrames streams suggestedBufferSize
|@...............|width
height
|........LISTt@..|
|strlstrh8...vids|
|................|
|d...............|
|.....'..........|
|@...strf(...(...|
|@...............|
|................|
|....indx.?......|
|....00db........|
|.....D.......@..|
.
.
000017408: 4C 49 53 54 38 F9 56 09 6D 6F 76 69 69 78 30 30 |LIST8.V.moviix00|LISTlistSize listType indexBlock ( ix00 )
000017424: F8 3F 00 00 02 00 00 01 A8 02 00 00 30 30 64 62 |.?..........00db| .... 00db ( uncompressed video frame )
.
.
voir logiciel virtualdub: Editeur hex => RIFF Tree
voir logiciel AVI-MUX_GUI => RIFF Tree
http://msdn2.microsoft.com/en-us/library/ms779636.aspx
7
Annexe CODEC
Annexe ToIP
PoE: Power Over Ethernet ( 802.3 af )
Pour les téléphones IP, au lieu de mettre une alimentation externe ( cablage IP + cablage électrique ), on
peut comme pour un téléphone classique intégrer l'alimentation 48V continu à la connexion réseau.
!
"
!
Mais cela reste en nombre de ports limités et cher ( très compliqué électroniquement de faire
une alim stable et de la commutation électronique = basculement de niveau ).
Il existe des adaptateurs PoE externe: Boitier avec sorties PoE qui est relié au 230V et au switch
ethernet. ( Injecteur PoE ).
8
Annexe ToIP

Documents pareils