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