Pour les flux PS, récemment, en raison de besoins professionnels, j'ai étudié le format du flux PS et le processus de déballage en MPEG2.
Nous devons d'abord savoir quel est le format du flux de paquets PS :
Effectuez l'empaquetage PS suivant pour H264 : Chaque NALU IDR contient généralement des NALU telles que SPS et PPS, donc encapsulez le NALU de SPS, PPS et IDR dans un package PS, y compris l'en-tête ps, puis ajoutez l'en-tête du système PS, la carte du système PS et les données brutes h264 de l'en-tête PES. Par conséquent, l'ordre de l'extérieur vers l'intérieur d'un paquet IDR NALU PS est le suivant : PSheader | PS system Header | PS system Header | Pour les autres paquets PS sans image clé, c'est beaucoup plus simple. Il suffit d'ajouter directement l'en-tête PS et l'en-tête PES. L'ordre est le suivant : en-tête PS | En-tête PES | données h264raw. Ce qui précède concerne le cas où il n’y a que de la vidéo. Si vous souhaitez regrouper l’audio dans le package PS, vous pouvez également le faire. Lorsqu'il y a des données audio, ajoutez simplement l'en-tête PES aux données et placez-le après le PES vidéo. La séquence est la suivante : paquet PS = en-tête PS | PES (vidéo) | PES (audio), puis utilisez RTP pour l'encapsuler et l'envoyer.
Ce qui précède est un format d'encapsulation global pour le flux de données. Examinons chaque partie de chaque encapsulation :
La première est. la partie PSheader : (à partir du document chinois standard MPEG2)
Syntaxe |
bit Numéro |
Mnémonique |
pack_header() { |
|
|
pack_start_code |
32 |
bslbf |
'01' |
2 |
bslbf |
system_clock_reference_base[32..30] |
3 |
bslbf |
marker_bit |
1 |
bslbf |
system_clock_reference_base[29..15] |
15 |
bslbf |
marker_bit |
1 |
bslbf |
system_clock_reference_base[14..0] |
15 |
bslbf |
marker_bit |
1 |
bslbf |
system_clock_reference_extension |
9 |
uimsbf |
marker_bit |
1 |
bslbf |
program_mux_rate |
22 |
uimsbf |
Marker_bit |
1 |
bslbf |
Marker_bit |
1 |
bslbf |
réservé |
5 |
bslbf |
pack_stuffing_length |
3 |
uimsbf |
pour (i=0;i |
|
|
stuffing_byte |
8 |
bslbf |
} |
|
|
if (nextbits()==system_header_start_code) { |
|
|
system_header() |
|
|
} |
|
|
} |
|
|
La définition sémantique de chaque champ dans le paquet de flux de programme (en-tête PS) :
Champ du code de démarrage du pack pack_start_code
La valeur est une chaîne de bits '0000 0000 0000 0000 0000 0001 1011 1010' (0x000001BA), utilisée pour marquer le début d'un paquet.
Champ de référence de l'horloge système system_clock_reference_base, system_clock_reference_extenstion
La référence de l'horloge système (SCR) est un champ de 42 bits codé en deux parties. La première partie system_clock_reference_base est un champ d'une longueur de 33 bits, et sa valeur SCR_base(i) est donnée par l'équation 2-19 ; la deuxième partie system_clock_reference_extenstion est un champ d'une longueur de 9 bits, et sa valeur SCR_ext( i) est donné par l’équation 2-20 donnée. Le champ SCR indique le temps attendu pour que l'octet du flux élémentaire contenant le dernier bit de ESCR_base arrive à l'entrée du décodeur cible du programme.
Voir 2.7.1 pour les exigences de fréquence de codage du champ SCR.
Champ de bit marqueur marqueur_bit
Champ de 1 bit, valeur '1'.
Champ de débit composite du programme program_mux_rate
Un entier de 22 bits spécifiant la fréquence à laquelle le P-STD reçoit le flux du programme pendant le paquet contenant ce champ. Sa valeur est en unités de 50 octets/seconde. Une valeur de 0 n'est pas autorisée. La valeur représentée par ce champ est utilisée pour définir l'heure d'arrivée de l'octet à l'entrée P-STD en 2.5.2. La valeur de ce champ peut être différente dans différents paquets du flux composite multiplexé du programme dans cette norme.
Champ de longueur de bourrage du pack pack_stuffing_length
Entier à 3 chiffres, spécifie le nombre d'octets de bourrage après ce champ.
Champ d'octet de remplissage stuffing_byte
Champ de 8 bits, la valeur est toujours '1111 1111'. Ce champ peut être inséré par l'encodeur, par exemple pour répondre aux besoins du canal. Il est rejeté par le décodeur. Seul un maximum de 7 octets de remplissage est autorisé dans chaque en-tête de paquet.
Son ordre d'octet défini est le suivant :
Code de démarrage du paquet 4B :
|
octet 1 |
octet 2 |
octet 3 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 td> |
6 |
5 |
4 |
3 |
2 td> |
1 |
0 |
7 |
6 |
5 td> |
4 |
3 |
2 |
1 |
0 td> |
7 |
6 |
5 |
4 |
3 td> |
2 |
1 |
0 |
7 |
6 td> |
5 |
4 |
3 |
2 |
1 td> |
0 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0000 0000 0000 0000 0000 0001 |
1011 1010 |
Identifiant du PACK -- 0xBA
系统时钟基准(Référence de l'horloge du système SCR)的基本部分、SCR的扩展部分:
|
octet 5 |
octet 6 |
octet 7 |
octet 8 |
octet 9 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 |
6 |
5 | 4 |
3 |
2 |
1 |
0 | 7 |
6 |
5 |
4 |
3 | 2 |
1 |
0 |
7 |
6 | 5 |
4 |
3 |
2 |
1 | 0 |
7 |
6 |
5 |
4 | 3 |
2 |
1 |
0 |
7 | 6 |
5 |
4 |
3 |
2 | 1 |
0 |
7 |
6 |
5 | 4 |
3 |
2 |
1 |
0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
01 |
SCR 32..30 |
1 |
SCR 29..15 |
1 |
SCR 14..00 |
1 |
SCR_ext |
1 |
|
octet 11 |
octet 12 |
octet 13 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 |
5 |
4 |
3 |
1 |
0 |
7 |
6 |
4 |
3 |
2 |
1 |
7 |
6 |
5 |
4 |
2 |
1 |
0 |
7 |
5 |
4 |
3 |
2 |
0 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Program_Mux_Rate |
1 |
1 |
réservé |
pack_stuffing_length |
=============================================== === ===============
Ensuite, jetez un œil à la définition de l'en-tête du système PS (c'est-à-dire en-tête du système PS : titre du système du flux de programme ) partie : (À partir du document standard MPEG-2)
Tableau 2-34 Titre du système de streaming du programme
Langue |
Chiffres |
Mnémonique |
system_header() { |
|
|
system_header_start_code | 32 |
bslbf |
header_length |
16 |
uimsbf |
marqueur_bit |
1 |
bslbf |
rate_bound |
22 |
uimsbf |
Marker_bit |
1 |
bslbf |
audio_bound |
6 |
uimsbf |
fixed_flag |
1 |
bslbf |
CSPS_flag |
1 |
bslbf |
system_audio_lock_flag |
1 |
bslbf |
system_video_lock_flag |
1 |
bslbf |
marker_bit |
1 |
bslbf |
vedio_bound |
5 |
uimsbf |
packet_rate_restriction_flag |
1 |
bslbf |
bits_réservés |
7 |
bslbf |
while (nextbits()=='1') { |
|
|
stream_id |
8 |
uimsbf |
'11' |
2 |
bslbf |
P-STD_buffer_bound_scale |
1 |
bslbf |
P-STD_buffer_size_bound |
13 |
uimsbf |
} |
|
|
} |
|
|
Définition sémantique de chaque champ dans l'en-tête système :
Champ du code de démarrage de l'en-tête système system_header_start_code
Valeur '0000 0000 0000 0000 A chaîne de bits de 0000 0001 1011 1011' (0x000001BB), indiquant le début de l'en-tête système.
Champ de longueur d'en-tête header_length
Champ de 16 bits. Indique la longueur en octets de l'en-tête système suivant ce champ. Ce champ pourra être étendu dans de futures extensions de cette spécification.
Champ de limite de débit rate_bound
Champ de 22 bits, la valeur n'est pas inférieure à la valeur maximale du champ program_mux_rate codé dans n'importe quel paquet du flux de programme. Ce champ peut être utilisé par le décodeur pour estimer s'il est capable de décoder l'intégralité du flux.
Champ lié audio audio_bound
Champ de 6 bits, la valeur est un entier dans la plage fermée de 0 à 32, et n'est pas inférieure au processus de décodage dans le flux du programme en même temps. Le nombre maximum de flux audio GB/T XXXX.3 et GB/T AAAA.3 actifs. Dans cette section, si le tampon STD n'est pas vide ou si l'unité de présentation est présentée dans le modèle P-STD, le processus de décodage des flux audio GB/T XXXX.3 et GB/T AAAA.3 est actif.
Champ de drapeau fixe fixed_flag
Drapeau 1 bit. Lorsqu'il est réglé sur « 1 », il indique une opération à débit binaire constant ; lorsqu'il est réglé sur « 0 », il indique une opération à débit binaire variable. Pendant le fonctionnement à débit constant, la valeur du champ system_clock_reference dans le flux composite GB/T XXXX.1 doit obéir à la formule linéaire suivante :
SCR_base(i )=( (c1×i+c2) p 300) % 233 (2-22)
SCR_ext(i)=((c1×i+c2) p 300) % 300 ( 2-23 )
Parmi eux :
c1 est une constante réelle valable pour tout i
c2 est une constante réelle valable pour tout i
i L'index d'octet du dernier bit de tout champ system_clock_reference contenu dans le flux composite GB/T XXXX.1.
CSPS Champ de drapeau CSPS_flag
Champ de 1 bit. Lorsqu'il est défini sur « 1 », le flux de programme est conforme aux restrictions définies en 2.7.9.
Champ d'indicateur de verrouillage audio du système system_audio_lock_flag
Champ de 1 bit. Indique qu'il existe un rapport spécifié entre la fréquence d'échantillonnage audio du décodeur cible du système et system_clock_ Frequency. system_clock_ Frequency est défini en 2.5.2.1 et le taux d'échantillonnage audio est spécifié par GB/T XXXX.3. Si le rapport SCASR entre system_clock_ Frequency et la fréquence d'échantillonnage audio réelle est constant pour toutes les unités de présentation de tous les flux élémentaires audio du flux de programme, et que la fréquence d'échantillonnage standard indiquée dans le flux audio est égale à la valeur du tableau ci-dessous, alors ceci le champ ne peut être que « 1 ».
SCASR=(system_clock_ Frequency) / audio_sample_rate_in_the_P-STD (2-24)
Les symboles X/Y représentent division des nombres réels.
Audio standard Fréquence d'échantillonnage (kHz)
|
16 |
32 |
22.05 |
44.1 |
24 |
48 |
||||||||||||||
SCASR |
27 000 000 -------- 16 000 |
27 000 000 ------- 32 000 |
27 000 000 ------ 22 050 |
27 000 000 ------ 44 100 |
27 000 000 ------ 24 000 |
27 000 000 -------- 48 000 |
Champ d'indicateur de verrouillage vidéo du système system_video_lock_flag
Champ de 1 bit. Indique qu'il existe un rapport spécifié entre la fréquence d'images vidéo du décodeur cible du système et system_clock_ Frequency. system_clock_ Frequency est défini en 2.5.2.1 et la fréquence d'images vidéo est spécifiée par GB/T XXXX.2. Si le rapport SCFR entre system_clock_ Frequency et la fréquence d'images vidéo réelle est constant pour toutes les unités de présentation de tous les flux élémentaires vidéo en GB/T XXXX.1, et que la fréquence d'images standard indiquée dans le flux vidéo est égale à la valeur du tableau ci-dessous , alors ce champ ne peut être que « 1 ».
SCFR=system_clock_ Frequency / frame_rate_in_the_P-STD (2-25)
Fréquence d'images standard (Hz)
|
23,976 |
24 |
25 |
30 |
50 |
59.94 |
60 |
||||||||||||||||||
SCFR |
1 126 125 |
1 125 000 |
1 080 000 |
900 900 |
900 000 |
540 000 |
450 450 |
450 000 |
Méthode de langage |
Numéro de bit |
Mnémonique |
program_stream_map() { |
|
|
packet_start_code_prefix |
24 |
bslbf |
map_stream_id |
8 |
uimsbf |
program_stream_map_length |
16 |
uimsbf |
current_next_indicator |
1 |
bslbf |
réservé |
2 |
bslbf |
program_stream_map_version |
5 |
uimsbf |
réservé |
7 |
bslbf |
Marker_bit |
1 |
bslbf |
program_stream_info_length |
16 |
uimsbf |
pour (i=0;i |
|
|
descripteur() |
|
|
} |
|
|
elementary_stream_map_length |
16 |
uimsbf |
pour (i=0;i |
|
|
stream_type |
8 |
uimsbf |
elementary_stream_id |
8 |
uimsbf |
elementary_stream_info_length |
16 |
uimsbf |
pour (i=0;i |
|
|
descripteur() |
|
|
} |
|
|
} |
|
|
CRC_32 |
32 |
rpchof |
} |
|
|
La définition sémantique de chaque champ dans le mappage du flux du programme :
Champ de préfixe du code de démarrage du paquet packet_start_code_prefix
Code 24 bits. Lui et le map_stream_id suivant forment ensemble un code de début de groupe pour marquer le début du groupe. Ce champ est une chaîne de bits avec la valeur '0000 0000 0000 0000 0000 0001' (0x000001).
Champ d'identification du flux cartographique map_stream_id
Champ de 8 bits, la valeur est 0xBC.
Champ de longueur de carte de flux de programme program_stream_map_length
Champ de 16 bits. Indique le nombre d'octets dans program_stream_map immédiatement après ce champ. La valeur maximale de ce champ est 1018 (0x3FA).
Champ indicateur suivant actuel current_next_indicator
Champ de 1 bit. Lorsqu'il est réglé sur « 1 », il indique que le mappage du flux de programme transmis est actuellement disponible. Lorsqu'il est réglé sur « 0 », cela signifie que le mappage du flux de programme transmis n'est pas encore disponible, mais ce sera la prochaine table effective.
Champ de version de la carte de flux de programme program_stream_map_version
Champ de 5 bits, indiquant le numéro de version de l'ensemble de la carte de flux de programme. Chaque fois que la définition de la carte du flux du programme change, ce champ sera incrémenté de 1, modulo 32. Lorsque current_next_indicator est « 1 », ce champ doit être le numéro de version du mappage de flux de programme actuellement applicable ; lorsque current_next_indicator est « 0 », ce champ doit être le numéro de version du prochain mappage de flux de programme applicable.
Champ de longueur des informations du flux de programme program_stream_info_length
Champ de 16 bits, indiquant la longueur totale du descripteur qui suit immédiatement ce champ.
Champ de bit marqueur marqueur_bit
Champ de 1 bit, la valeur est « 1 ».
Champ de longueur de la carte de flux élémentaire elementary_stream_map_length
Champ de 16 bits, indiquant la longueur en octets de toutes les informations de flux élémentaires dans la carte de flux du programme. Il inclut uniquement les champs stream_type, elementaire_stream_id et elementaire_stream_info_length. (Notez ici que la longueur du mappage de flux de base inclut ici uniquement la somme des champs de définition spécifiés plus tard. Autrement dit, à partir de cette longueur, nous pouvons savoir combien de types de définitions de flux il a plus tard. , car la somme des champs de définition d'un flux : stream_type (1BYTE), elementaire_stream_id (1octet) et elementaire_stream_info_length (2octets) est de 4 octets, vous pouvez donc utiliser elementaire_stream_map_length/4 pour obtenir plusieurs informations de type de flux définies plus tard)<.>Champ de type de flux stream_type
Champ de 8 bits, qui spécifie le type de flux selon le tableau 2-29. Ce champ ne peut marquer que le flux élémentaire contenu dans le paquet PES et la valeur ne peut pas être 0x05.
(Ici, nous pouvons temporairement le savoir sur la base de la définition de la norme nationale GB281811. Flux vidéo MPEG-4 : 0x10 ; 2. Flux vidéo H.264 : 0x1B; 3. Flux vidéo SVAC : 0x80 ; 4. Flux audio G.711 : 5. 🎜>6. Flux audio G.723.1 : 0x93 ;
7. Flux audio G.729 :
8. 🎜 >Étant donné que le champ de flux de mappage du programme n'existe que lorsque les images clés sont empaquetées, donc si vous souhaitez déterminer le type d'encodage de flux de l'empaquetage PS, vous pouvez juger en fonction de ce champ
)En gros. Champ d'identification du flux elementary_stream_id
Champ de 8 bits, indiquant la valeur du champ stream_id dans l'en-tête du groupe PES où se trouve le flux élémentaire.
(Définition de ce champ, 0x(C0~DF) fait référence à l'audio, 0x(E0~EF) fait référence à la vidéo)
Informations de base sur le flux length Champ elmentary_stream_info_length
Champ de 16 bits, indiquant la longueur en octets du descripteur qui suit immédiatement ce champ. ( est la longueur de description du flux de ce type. La longueur spécifiée après ce champ n'est pas dans la classe de plage spécifiée par elementary_stream_map_length.)
CRC 32
field CRC_32
Un champ de 32 bits qui contient la valeur CRC pour produire une valeur de sortie de 0 dans les registres du décodeur définis dans l'annexe A après avoir traité l'intégralité de la carte du flux du programme.Pour l'analyse de ce champ, nous avons besoin d'une chaîne de bits avec une valeur de 0x000001BC, indiquant le début du mappage du flux du programme pour le moment. . Lisez la longueur de l'en-tête et ignorez-la directement. Oui, si vous devez analyser le type d'encodage du flux, vous devez analyser ce champ en détail.
==================Pack PES
=============== === =============Ensuite, analysons le contenu du package PES : package PES=données brutes du code d'en-tête PES ;
Jetons un coup d'œil à l'en-tête PES : (à partir de http://www.php.cn/)
Jetons ensuite un coup d'œil aux étapes d'analyse : (à partir du document standard MPEG-2)
Tableau 2-17 Regroupement PES
Langue |
Chiffres |
Mnémonique |
PES_packet(){ |
|
|
packet_start_code_prefix |
24 |
bslbf |
stream_id |
8 |
uimsbf |
PES_packet_length |
16 |
uimsbf |
if(stream_id != program_stream_map |
|
|
&& stream_id !=padding_stream |
|
|
&& stream_id !=private_stream_2 |
|
|
&& stream_id !=ECM |
|
|
&& stream_id =EMM ! |
|
|
&& stream_id !=program_stream_directory |
|
|
&& stream_id !=DSMCC_stream |
|
|
&& stream_id !=ITU-T Rec.H.222.1 type E stream){ |
|
|
'10' |
2 |
bslbf |
PES_scrambling_control |
2 |
bslbf |
PES_priorité |
1 |
bslbf |
data_alignment_indicator |
1 |
bslbf |
copyright |
1 |
bslbf |
original_or_copy |
1 |
bslbf |
PTS_DTS_flags |
2 |
bslbf |
ESCR_flag |
1 |
bslbf |
ES_rate_flag |
1 |
bslbf |
DSM_trick_mode_flag |
1 |
bslbf |
additional_copy_info_flag |
1 |
bslbf |
PES_CRC_flag |
1 |
bslbf |
PES_extension_flag |
1 | bslbf |
PES_header_data_length |
8 |
uimsbf |
if(PTS_DTS_flags ==' 10'){ |
|
|
'0010' |
4 |
bslbf |
PTS[32..30] |
3 |
bslbf |
marker_bit |
1 |
bslbf |
PTS[29..15] |
15 |
bslbf |
marker_bit |
1 | bslbf |
PTS[14..0] | 15 |
bslbf |
marker_bit |
1 |
bslbf |
} |
|
|
if(PTS_DTS_flags =='11'){ |
|
|
'0011' |
4 |
bslbf |
PTS[32..30 ] |
3 |
bslbf |
marker_bit |
1 |
bslbf |
PTS[29..15] |
15 |
bslbf |
marker_bit |
1 |
bslbf |
PTS[14..0] |
15 |
bslbf |
Marker_bit |
1 |
bslbf |
'0001' |
4 |
bslbf |
PTS[32..30] |
3 |
bslbf |
marker_bit |
1 |
bslbf |
PTS[29..15] |
15 |
bslbf |
marker_bit |
1 |
bslbf |
PTS[14..0] |
15 |
bslbf |
marker_bit |
1 |
bslbf |
} |
|
|
if(ESCR_flag =='1'){ |
|
|
réservé |
2 |
bslbf |
ESCR_base[32..30] |
3 |
bslbf |
marker_bit |
1 |
bslbf |
ESCR_base[29..15] |
15 |
bslbf |
marker_bit |
1 |
bslbf |
ESCR_base[14..0] |
15 |
bslbf |
marker_bit |
1 |
bslbf |
ESCR_extension |
9 |
uimsbf |
marker_bit |
1 |
bslbf |
} |
|
|
if(ES_rate_flag =='1'){ |
|
|
marker_bit |
1 |
bslbf |
ES_rate |
22 |
uimsbf |
marker_bit |
1 |
bslbf |
} |
|
|
if (DSM_trick_mode_flag =='1'){ |
|
|
trick_mode_control |
3 |
uimsbf |
if ( trick_mode_control = =fast_forward ) { |
|
|
field_id |
2 |
bslbf |
intra_slice_refresh |
1 |
bslbf |
truncation_fréquence |
2 |
bslbf |
} |
|
|
sinon si ( trick_mode_control = = slow_motion ) { |
|
|
rep_cntrl |
5 |
uimsbf |
} |
|
|
else if ( trick_mode _control = = freeze_frame ) { |
|
|
field_id |
2 |
uimsbf |
réservé |
3 |
bslbf |
} |
|
|
sinon si ( trick_mode _control = = fast_reverse ) { |
|
|
field_id |
2 |
bslbf |
intra_slice_refresh |
1 |
bslbf |
fréquence_troncation |
2 |
bslbf |
else if ( trick_mode_control = = slow_reverse ) { |
|
|
rep_cntrl |
5 |
uimsbf |
} |
|
|
autre |
|
|
réservé |
5 |
bslbf |
} |
|
|
if (additional_copy_info_flag = ='1'){ |
|
|
marker_bit |
1 |
bslbf |
additional_copy_info |
7 |
bslbf |
} |
|
|
if (PES_CRC_flag=='1'){ |
|
|
previous_PES_packet_CRC |
16 |
bslbf |
} |
|
|
if ( PES_extension_flag =='1') { |
|
|
PES_private_data_flag |
1 |
bslbf |
pack_header_field_flag |
1 |
bslbf |
program_packet_sequence_counter_flag |
1 |
bslbf |
P-STD_buffer_flag |
1 |
bslbf |
réservé |
3 |
bslbf |
PES_extension_flag_2 |
1 |
bslbf |
if(PES_private_data_flag =='1'){ |
|
|
PES_private_data |
128 |
bslbf |
} |
|
|
if (pack_header_field_flag == '1'){ |
|
|
pack_field_length |
8 |
uimsbf |
pack_header() |
|
|
} |
|
|
if (program_packer_sequence_counter_flag == '1'){ |
|
|
marker_bit |
1 |
bslbf |
program_packet_sequence_counter |
7 |
uimsbf |
marqueur -bit |
1 |
bslbf |
MPEG1_MPEG2_indentifier |
1 |
bslbf |
original_stuff_length |
6 |
uimsbf |
} |
|
|
if (P-STD_buffer_flag = = '1'({ |
|
|
'01' |
2 |
bslbf |
P-STD_buffer_scale |
1 |
bslbf |
P-STD_buffer_size |
13 |
uimsbf |
} |
|
|
if (PES_extension_flag_2 == '1'{ |
|
|
marker_bit |
1 |
bslbf |
PES_extension_field_length |
7 |
uimsbf |
pour(i=0;i< ;PES_extension_field_length;i ){ |
|
|
réservé |
8 |
bslbf |
} |
|
|
} |
|
|
} |
|
|
pour (i=0;i |
|
|
stuffing_byte |
8 |
bslbf |
} |
|
|
pour (i=0;i |
|
|
PES_packet_data_byte |
8 |
bslbf |
} |
|
|
} |
|
|
sinon si (stream_id = = program_stream_map |
|
|
|| stream_id = = private_stream_2 |
|
|
|| stream_id = = ECM |
|
|
| | stream_id = = EMM |
|
|
|| = = program_stream_directory |
|
|
|| stream_id = = DSMCC_stream |
|
|
|| stream_id = = ITU- T Rec. H.222.1 flux de type E){ |
|
|
pour (i=0;i |
|
|
PES_packet_data_byte |
8 |
bslbf |
} |
|
|
} |
|
|
sinon si (steam_id = = padding_stream){ |
|
|
pour (i=0;i |
|
|
padding_byte |
8 |
bslbf |
} |
|
|
} |
|
|
} |
|
|
Parmi eux :
Tableau 2-18 Assignation Stream_id
stream_id |
Remarque |
Encodage du flux |
1011 1100 |
1 |
program_stream_map(0xBC) |
1011 1101 |
2 |
private_stream_1(0xBD) |
1011 1110 |
|
padding_stream(0xBE) |
1011 1111 |
3 |
private_stream-2(0xBF) |
110x xxxx |
|
GB/T XXXX.3 ou GB/T AAAA.3 numéro de flux audio xxxx (0xC0~0xDF ) |
1110 xxxx |
|
GB/T XXXX. 2 Ou GB/T AAAA.2 numéro de flux vidéo xxxx (0xE0~0xEF) |
1111 0000 |
3 |
ECM_stream(0xF0) |
1111 0001 |
3 |
EMM_stream(0xF1) |
1111 0010 |
5 |
GB/T XXXX.1 Annexe B ou GB/T XXXX.6_DSMCC_stream(0xF2) |
1111 0011 |
2 |
ISO/IEC_13522_stream(0xF3) |
1111 0100 |
6 |
Rec. UIT-T H.222.1 Type A |
1111 0101 |
6 |
ITU-T Rec. H.222.1 Type B |
1111 0110 |
6 |
Rec. UIT-T H.222.1 Type C. |
1111 0111 |
6 |
Rec. H.222.1 Type D |
1111 1000 |
6 |
UIT-T Rec. 🎜 > ancillary_stream(0xF9) |
1111 1010…1111 1110 | Préserver le flux de données | |
1111 1111 | 4 |
program_stream_directory(0xFF) |
Le symbole x indique que les valeurs '0' ou '1' sont toutes deux autorisées et peuvent produire la même chose type de flux. Le numéro de flux est déterminé par la valeur de x. | Remarque 1 | Les paquets PES de type program_stream_map ont une syntaxe unique, qui est spécifiée en 2.5.4.1.
2 paquets PES de type private_stream_1 et ISO/IEC_13352_stream obéissent à la même syntaxe de paquet PES que les flux audio GB/T XXXX.2 et GB/T XXXX.3. 3 paquets PES de type private_stream_2, ECM_stream et EMM_stream sont similaires à private_stream_1, sauf qu'aucune syntaxe n'est spécifiée après le champ PES_packet_length. 4 Les paquets PES de type program_stream_directory ont une syntaxe unique, qui est spécifiée en 2.5.5 . 5 paquets PES de type DSM_CC_stream ont une syntaxe unique, spécifiée dans GB/T XXXX.6. 6 stream_id est associé à stream_type 0x09 dans le tableau 2-29. 7 stream_id est utilisé uniquement pour le regroupement PES. Les paquets PES transportent des données provenant de flux de programme ou de flux de système GB/T AAAA.1 dans le flux de transport (voir 2.4.3.7). |
Définition sémantique de chaque champ du paquet PES
Champ de préfixe du code de démarrage du paquet packet_start_code_prefix
Code 24 bits, qui est le de la même manière que le stream_id suivant constitue le code de début du paquet qui identifie le début du paquet. Il s'agit d'une chaîne de bits avec la valeur '0000 0000 0000 0000 0000 0001' (0x000001).
Champ d'identification du flux stream_id
Dans le flux du programme, il précise le numéro et le type du flux de base. Voir le tableau 2-18 pour les définitions. Dans un flux de transport, il peut être fixé à n'importe quelle valeur valide qui décrit correctement le type de flux élémentaire défini dans le Tableau 2-18. Dans les flux de transport, le type de flux élémentaire est spécifié dans les informations spécifiques au programme du § 2.4.4.
PESChamp de longueur de paquet PES_packet_length
Champ de 16 bits, indiquant le nombre d'octets suivant ce champ dans le paquet PES. Une valeur de 0 indique que la longueur du paquet PES est soit non spécifiée, soit illimitée. Ceci n'est autorisé que dans les paquets PES dont la charge utile contient des octets provenant de l'un des flux élémentaires vidéo du paquet Transport Stream.
PESChamp de contrôle de brouillage PES_scrambling_control
Champ de 2 bits, indiquant la méthode de brouillage de la charge utile du paquet PES. Lorsque le brouillage se produit au niveau de la couche PES, l'en-tête du paquet PES, y compris les champs facultatifs s'ils sont présents, ne doit pas être brouillé (voir 2-19).
PESChamp de priorité PES_priority
Champ de 1 bit indiquant la priorité de la charge utile dans le paquet PES. « 1 » indique que la charge utile du paquet PES a une priorité plus élevée que la charge utile du paquet PES, ce champ étant défini sur « 0 ». Le multiplexeur peut utiliser ce champ pour prioriser les données dans les flux élémentaires. Le mécanisme de transport ne doit pas modifier ce champ.
Champ de l'indicateur d'alignement des données data_alignment_indicator
Drapeau 1 bit. Lorsqu'il est défini sur « 1 », cela signifie que l'en-tête du paquet PES est suivi du code de démarrage vidéo ou du mot de synchronisation audio indiqué par le data_alignment_indicator en 2.6.10, s'il existe un descripteur data_alignment_indicator. Si sa valeur est « 1 » et qu'il n'existe pas de descripteur de ce type, l'alignement représenté par le type d'alignement « 01 » dans les Tableaux 2-47 et 2-48 est requis. Lorsque la valeur est « 0 », il n'est pas défini s'il existe un tel alignement.
Champ de copyright copyright
Champ à 1 chiffre. Lorsqu'il est défini sur « 1 », indique que le matériel contenu dans la charge utile du paquet PES associé est protégé par le droit d'auteur. Lorsque la valeur est « 0 », il n'est pas défini si le matériel est protégé par le droit d'auteur. Les descripteurs de copyright décrits au § 2.6.24 sont associés à des flux élémentaires contenant des paquets PES. Si le descripteur est appliqué à du matériel contenant des paquets PES, l'indicateur de droit d'auteur est défini sur « 1 ».
Champ original ou copie original_or_copy
Champ de 1 bit. Lorsqu'il est défini sur « 1 », cela indique que le contenu de la charge utile du paquet PES concerné est original ; une valeur de « 0 » indique que le contenu de la charge utile du paquet PES concerné est une copie.
PTS DTS Champ de drapeau PTS_DTS_flags
Champ de 2 bits. Lorsque la valeur est « 10 », le champ PTS doit apparaître dans l'en-tête du groupe PES ; lorsque la valeur est « 11 », le champ PTS et le champ DTS doivent apparaître dans l'en-tête du groupe PES ; lorsque la valeur est « 00 » ; , le champ PTS Ni les champs ni DTS n'apparaissent dans l'en-tête du paquet PES. La valeur '01' n'est pas autorisée.
ESCRChamp de drapeau ESCR_flag
Drapeau 1 bit. Lorsqu'il est défini sur « 1 », il indique que les champs ESCR de base et étendu apparaissent dans l'en-tête du paquet PES ; une valeur de « 0 » indique qu'il n'y a pas de champ ESCR.
ESChamp d'indicateur de taux ES_rate_flag
Drapeau 1 bit. Lorsqu'il est défini sur « 1 », il indique que le champ ES_rate apparaît dans l'en-tête du paquet PES ; une valeur de « 0 » indique qu'il n'y a pas de champ ES_rate.
DSMChamp d'indicateur du mode Trick DSM_trick_mode_flag
Drapeau 1 bit. Lorsqu'il est défini sur « 1 », cela signifie qu'il existe un champ de mode cascade de 8 bits ; lorsque la valeur est « 0 », cela signifie qu'il n'y a pas de champ de ce type.
Champ de drapeau d'informations supplémentaires sur le droit d'auteur additionnel_copy_info_flag
Drapeau 1 bit. Lorsqu'il est défini sur « 1 », cela signifie qu'il existe un champ d'informations de copie supplémentaire ; lorsque la valeur est « 0 », cela signifie qu'il n'y a pas de tel champ.
PES CRCChamp de drapeau PES_CRC_flag
Drapeau 1 bit. Lorsqu'il est défini sur « 1 », il indique que le champ CRC apparaît dans l'en-tête du paquet PES ; une valeur de « 0 » indique qu'un tel champ n'existe pas.
PESChamp d'indicateur d'extension PES_extension_flag
Drapeau 1 bit. Lorsqu'il est défini sur « 1 », il indique qu'il existe un champ d'extension dans l'en-tête du paquet PES ; une valeur de « 0 » indique qu'un tel champ n'existe pas.
PESChamp de longueur des données d'en-tête PES_header_data_length
Champ de 8 bits. Indique le nombre total d'octets occupés par les champs facultatifs et tous les octets de remplissage contenus dans l'en-tête du paquet PES. Les octets précédant ce champ indiquent si des champs facultatifs sont présents.
Champ de bit marqueur marqueur_bit
Un champ de 1 bit avec une valeur de « 1 ».
Afficher le champ d'horodatage PTS
La relation entre l'heure de présentation et l'heure de décodage est la suivante : PTS est un nombre de 33 bits codé dans trois champs distincts. Il indique l'heure de présentation tpn(k) de la k-ème unité de présentation du flux élémentaire n dans le décodeur cible du système. La valeur de PTS est exprimée en unités de 1/300 de la fréquence d'horloge du système (c'est-à-dire 90 kHz). Le temps d'affichage est calculé par PTS selon l'équation 2-11. Voir 2.7.4 pour les contraintes sur la fréquence de codage des horodatages de présentation.
PTS(k)=((system_clock_ Frequency×tpn(k)) p 300) % 233 (2-11)
Parmi eux, tpn(k) est l'unité d'affichage P L'heure d'affichage de n(k).
Pour l'audio, s'il y a un PTS dans l'en-tête du groupe PES, il fait référence à la première unité d'accès démarrant dans le groupe PES. S'il y a le premier octet de l'unité d'accès audio dans le paquet PES, alors il y a une unité d'accès audio commençant dans le paquet PES.
Pour la vidéo, s'il y a un PTS dans l'en-tête du paquet PES, il fait référence à l'unité d'accès contenant le premier code de début d'image commençant dans le paquet PES. S'il existe le premier octet du code de début d'image dans le paquet PES, alors il y a un code de début d'image commençant dans le paquet PES.
Pour l'unité de présentation audio (PU), la vidéo PU et l'image B dans la séquence low_delay, le temps de présentation tpn(k) doit être égal à tdn(k) .
Pour les images I et P en non-low_delay, lorsqu'il n'y a pas de discontinuité de décodage entre les unités d'accès (AU) k et k', le temps de présentation tpn(k) doit être égal à l'instant de décodage de la prochaine image I ou image P transmise tdn(k) (voir 2.7.5). S'il y a une discontinuité de décodage ou une terminaison de flux, la différence entre tpn(k) et tdn(k) devrait continuer avec le flux initial sans discontinuité ni terminaison. même.
Remarque 1 : La séquence low_delay est la séquence vidéo avec l'indicateur low_delay défini (voir 6.2.2.3 dans GB/T XXXX.2).
S'il y a un filtrage dans l'audio, le modèle du système suppose que le filtrage ne provoque pas de latence. Par conséquent, les échantillons impliqués dans le PTS lors du codage sont les mêmes que les échantillons impliqués dans le PTS lors du décodage. Pour un codage évolutif, voir 2.7.6.
Décoder le champ d'horodatage DTS
DTS est un nombre de 33 bits codé dans trois champs distincts. Il indique l'instant de décodage tdn(j) de la j-ème unité de présentation du flux élémentaire n dans le décodeur cible du système. La valeur de DTS est en unités de 1/300 de la fréquence d'horloge du système (c'est-à-dire 90 kHz). Le temps de décodage est calculé par DTS selon l'équation 2-12 :
DTS(j)=((system_clock_ Frequency×td n(j)) p 300) % 233 (2-12)
Parmi eux, tdn( j) est l'heure de décodage de l'unité d'accès An(j).
Pour la vidéo, s'il y a DTS dans l'en-tête du paquet PES, il fait référence à l'unité d'accès contenant le premier code de début d'image commençant dans le paquet PES. S'il existe le premier octet du code de début d'image dans le groupe PES, le code de début d'image démarre dans le groupe PES.
Pour un encodage évolutif, voir 2.7.6.
ESCR champ ESCR_base, ESCR_extension
Champ de 42 bits, codé en deux parties. La première partie est un champ d'une longueur de 33 bits, et sa valeur ESCR_base(i) est donnée par l'équation 2-14 ; la deuxième partie est un champ d'une longueur de 9 bits, et sa valeur ESCR_ext(i) est donnée. par l'équation 2-15. Le champ ESCR indique le temps attendu pour que l'octet contenant le dernier bit de ESCR_base dans le flux élémentaire arrive à la sortie PES-STD (voir 2.5.2.4).
Spécialement
ESCR(i)=ESCR_base(i)×300+ESCR_ext(i) (2-13)
Parmi eux :
ESCR_base(i) =((system_clock_frequence×t(i)) p 300) % 233 (2-14)
ESCR _ext(i)=((system_clock_frequence×t(i)) p 1) % 300 (2-15) Les champs
ESCR et ES_rate (voir la sémantique immédiatement ci-dessous) contiennent des informations de synchronisation liées à la séquence de flux PES. Ces champs doivent satisfaire aux contraintes définies en 2.7.3.
Champ de débit de flux de base ES_rate
Entier non signé de 22 bits. Pour les flux PES, il indique la vitesse à laquelle le décodeur cible du système recevra les paquets PES. Ce champ est valide dans le paquet PES auquel il appartient et dans les paquets PES suivants du même flux PES jusqu'à ce qu'un nouveau champ ES_rate soit rencontré. La valeur de ce champ est en unités de 50 octets/seconde et ne peut pas être 0. Ce champ est utilisé pour définir l'heure à laquelle les octets du flux PES arrivent à l'entrée P-STD (voir définition au 2.5.2.4). La valeur codée dans ce champ peut différer entre les paquets PES.
Champ de contrôle du mode Trick trick_mode_control
Champ de 3 bits. Il représente un mode cascade appliqué au flux vidéo associé. Pour les autres types de flux élémentaires, la signification de ce champ et des cinq bits suivants n'est pas définie. Pour la définition de l'état trick_mode, veuillez vous référer à la section mode trick de 2.4.2.3.
Lorsque le statut trick_mode est faux, pour la vidéo GB/T XXXX.2, le numéro N de chaque image dans la séquence progressive issue du processus de décodage est spécifié par les champs repeat_first_field et top_field_first. Pour les vidéos GB/T AAAA.2, il est déterminé par le titre de la séquence.
Pour les séquences entrelacées, lorsque le statut trick_mode est faux, pour la vidéo GB/T XXXX.2, le nombre de fois N est précisé par les champs repeat_first_field et progressif_frame.
Lorsque le statut trick_mode est vrai, le nombre de fois que l'image est lue dépend de la valeur N.
Tableau 2-20 Valeurs de contrôle du mode Cascade
|
Description | ||||||||||||||
'000' | Avance rapide | ||||||||||||||
Ralenti | |||||||||||||||
'010' | Geler cadre | ||||||||||||||
'011' | Recul rapide | ||||||||||||||
'100' | Ralentissez|||||||||||||||
'101 ' -'111' | Réservé |
Lorsque la valeur de ce champ change ou que le fonctionnement du mode cascade s'arrête, toute combinaison des situations suivantes peut se produire :
l La base de temps est discontinue
l Le décodage est discontinu ; ;
l Le compteur de continuité n'est pas continu
Dans le cas du mode astuce, la vitesse non standard de décodage et de présentation peut faire en sorte que certains champs définis dans les données du flux élémentaire vidéo aient valeurs incorrectes. De même, les contraintes sémantiques sur les structures de fragments peuvent être invalides. Les éléments de syntaxe vidéo impliqués dans ces exceptions sont : v_axis_positive;
l field_sequence;
l subcarrier;
l burst_amplitude;
l subcarrier_phase;
En mode astuce, le décodeur ne doit pas dépendre de l'encodage des valeurs de ces champs.
La norme n'exige pas que le décodeur soit capable de décoder le champ trick_mode_control. Cependant, les décodeurs capables de décoder ce champ doivent répondre aux exigences standard suivantes.
Avance rapide, avance rapide
La valeur '000' dans le champ trick_mode_control. Lorsque cette valeur est présente, elle représente un flux vidéo en avance rapide et définit la signification des 5 bits suivants dans l'en-tête du paquet PES. Le bit intra_slice_refresh peut être mis à « 1 » pour indiquer qu'il peut y avoir des macroblocs manquants. Le décodeur peut remplacer le macrobloc par la même position dans l'image décodée précédente. Le champ field_id défini dans le Tableau 2-21 indique le ou les champs à afficher. Le champ Frequency_troncation indique un ensemble restreint de coefficients pouvant être inclus. La signification de cette valeur de champ est indiquée dans le Tableau 2-22.
Ralenti ralentiLa valeur '001' dans le champ trick_mode_control. Lorsque cette valeur est présente, elle représente un flux vidéo au ralenti et définit la signification des 5 bits suivants dans l'en-tête du paquet PES. Pour les séquences progressives, l'image doit être affichée pendant un temps N×rep_cntrl, où N est défini comme ci-dessus.
Pour la séquence vidéo progressive GB/T AAAA.2 et GB/T XXXX.2, l'image doit être affichée pendant N×rep_cntrl time, où N est défini comme ci-dessus.
Pour les séquences entrelacées GB/T XXXX.2, cet écran doit être affiché pendant le temps N×rep_cntrl. Si l'image est une image encadrée, le premier champ à afficher doit être le champ supérieur lorsque top_field_first vaut 1, et le champ inférieur lorsque top_field_first vaut 0 (voir GB/T XXXX.2). Ce champ est affiché N×rep_cntrl/2 fois. Les autres champs de l'écran sont affichés N-N×rep_cntrl/2 fois.
arrêt sur image arrêt sur image
La valeur '010' dans le champ trick_mode_control. Lorsque cette valeur apparaît, elle représente le flux vidéo d'arrêt sur image et définit la signification des 5 bits suivants dans l'en-tête du paquet PES. Le champ field_id défini dans le Tableau 2-21 indique quel(s) champ(s) doivent être affichés. Le champ field_id indique la première unité d'accès vidéo commençant dans le paquet PES contenant ce champ, à moins que le paquet PES ne contienne 0 octet de charge utile. Dans ce dernier cas, le champ field_id indique l'unité d'accès vidéo précédente la plus récente.
retour rapideLa valeur '011' dans le champ trick_mode_control. Lorsque cette valeur est présente, elle représente un flux vidéo de rembobinage et définit la signification des 5 bits suivants dans l'en-tête du paquet PES. Le bit intra_slice_refresh peut être mis à « 1 » pour indiquer qu'il peut y avoir des macroblocs manquants. Le décodeur peut remplacer le macrobloc par la même position dans l'image décodée précédente. Le champ field_id défini dans le Tableau 2-21 indique le ou les champs à afficher. Le champ Frequency_troncation indique un ensemble restreint de coefficients qui peuvent être inclus. La signification de cette valeur de champ est indiquée dans le Tableau 2-22 « Valeur de sélection du coefficient ».
inversion lente inversion lenteLa valeur '100' dans le champ trick_mode_control. Lorsque cette valeur est présente, elle représente un flux vidéo à retour lent et définit la signification des 5 bits suivants dans l'en-tête du paquet PES. Pour les séquences vidéo progressives GB/T AAAA.2 et GB/T XXXX.2, l'image doit être affichée pendant une durée N×rep_cntrl, où N est défini comme ci-dessus.
Pour les séquences entrelacées GB/T XXXX.2, cet écran doit être affiché pendant le temps N×rep_cntrl. Si l'image est une image encadrée, le premier champ à afficher doit être le champ du bas lorsque top_field_first est 1, et le champ du haut lorsque top_field_first est '0' (voir GB/T XXXX.2). Ce champ est affiché N×rep_cntrl/2 fois. Les autres champs de l'écran sont affichés N-N×rep_cntrl/2 fois.
Champ d'identification du champ field_id
Champ à 2 chiffres, indiquant quel(s) champ(s) doivent être affichés. Codez-le selon le tableau 2-21.
Tableau 2-21 valeur de contrôle du champ field_id
|
Description | ||||||||||
'00' | Jouer de haut en bas uniquement | ||||||||||
Jouer de bas en haut uniquement td> |
|||||||||||
'10' | Lire toutes les images
|
||||||||||
'11' | Réservé |
Valeur | Description |
'00' | Seul le coefficient DC est non-0 |
'01' | Uniquement les trois premiers les coefficients sont non nuls |
'10' | Seuls les six premiers coefficients sont non-0 |
'11' | Tous les coefficients peuvent être non nuls |