1 /*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
2  *
3  *  Use of this source code is governed by a BSD-style license that can
4  *  be found in the License.html file in the root of the source tree.
5  */
6 
7 //---------------------------------------------------------------------------
8 // Pre-compilation
9 #include "MediaInfo/PreComp.h"
10 #ifdef __BORLANDC__
11     #pragma hdrstop
12 #endif
13 //---------------------------------------------------------------------------
14 
15 //---------------------------------------------------------------------------
16 #include "MediaInfo/Setup.h"
17 //---------------------------------------------------------------------------
18 
19 //---------------------------------------------------------------------------
20 #if defined(MEDIAINFO_MPEGPS_YES) || defined(MEDIAINFO_MPEGTS_YES)
21 //---------------------------------------------------------------------------
22 
23 //---------------------------------------------------------------------------
24 #include "MediaInfo/Multiple/File_Mpeg_Psi.h"
25 #include "MediaInfo/Multiple/File_Mpeg_Descriptors.h"
26 #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
27 #include "MediaInfo/MediaInfo_Internal.h"
28 #include "MediaInfo/TimeCode.h"
29 #if defined(MEDIAINFO_DIRECTORY_YES)
30 #include "ZenLib/Dir.h"
31 #endif //defined(MEDIAINFO_DIRECTORY_YES)
32 #include <memory>
33 #include <algorithm>
34 using namespace std;
35 //---------------------------------------------------------------------------
36 
37 namespace MediaInfoLib
38 {
39 
40 //***************************************************************************
41 // Constants
42 //***************************************************************************
43 
44 namespace Elements
45 {
46     const int32u CUEI=0x43554549; //SCTE
47     const int32u GA94=0x47413934; //ATSC - Terrestrial
48     const int32u HDMV=0x48444D56; //BluRay
49     const int32u S14A=0x53313441; //ATSC - Satellite
50     const int32u SCTE=0x53435445; //SCTE
51     const int32u TSHV=0x54534856; //TSHV
52 }
53 
54 //***************************************************************************
55 // Infos
56 //***************************************************************************
57 
58 //---------------------------------------------------------------------------
Mpeg_Psi_ATSC_table_type(int16u ID)59 static const char* Mpeg_Psi_ATSC_table_type(int16u ID)
60 {
61     switch (ID)
62     {
63         case 0x0000 : return "Terrestrial VCT with current_next_indicator=1";
64         case 0x0001 : return "Terrestrial VCT with current_next_indicator=0";
65         case 0x0002 : return "Cable VCT with current_next_indicator=1";
66         case 0x0003 : return "Cable VCT with current_next_indicator==0";
67         case 0x0004 : return "Channel ETT";
68         case 0x0005 : return "DCCSCT";
69         case 0x0010 : return "Short-form Virtual Channel Table-VCM Subtyp";
70         case 0x0011 : return "Short-form Virtual Channel Table-DCM Subtyp";
71         case 0x0012 : return "Short-form Virtual Channel Table-ICM Subtyp";
72         case 0x0020 : return "Network Information Table-CDS Table Subtype";
73         case 0x0021 : return "Network Information Table-MMS Table Subtype";
74         case 0x0030 : return "Network Text Tabl e-SNS Subtype";
75         default :
76             if (ID>=0x0100
77              && ID<=0x017F) return "Event Information Table (EIT)";
78             if (ID>=0x0200
79              && ID<=0x027F) return "Event Extended Text Table (EETT)";
80             if (ID>=0x0300
81              && ID<=0x03FF) return "Rating Region Table (RRT)";
82             if (ID>=0x0400
83              && ID<=0x0FFF) return "User private";
84             if (ID>=0x1000
85              && ID<=0x10FF) return "Aggregate Event Information Table (AEIT)";
86             if (ID>=0x1100
87              && ID<=0x11FF) return "Aggregate Extended Text Table (AETT)";
88             if (ID>=0x1400
89              && ID<=0x14FF) return "DCCT";
90             return "Reserved";
91     }
92 }
93 
94 //---------------------------------------------------------------------------
Mpeg_Psi_stream_type_Format(int8u stream_type,int32u format_identifier)95 const char* Mpeg_Psi_stream_type_Format(int8u stream_type, int32u format_identifier)
96 {
97     switch (stream_type)
98     {
99         case 0x01 : return "MPEG Video"; //Version 1
100         case 0x02 : return "MPEG Video"; //Version 2
101         case 0x03 : return "MPEG Audio"; //Version 1
102         case 0x04 : return "MPEG Audio"; //Version 2
103         case 0x0F : return "AAC";
104         case 0x10 : return "MPEG-4 Visual";
105         case 0x11 : return "AAC";
106         case 0x1B : return "AVC";
107         case 0x1C : return "AAC";
108         case 0x1D : return "Timed Text";
109         case 0x1E : return "MPEG Video"; //ISO/IEC 23002-3
110         case 0x1F : return "AVC";
111         case 0x20 : return "AVC";
112         case 0x24 :
113         case 0x27 : return "HEVC";
114         case 0x2D : return "MPEG-H 3D Audio";
115         case 0x2E : return "MPEG-H 3D Audio";
116         default :
117             switch (format_identifier)
118             {
119                 case Elements::CUEI :
120                 case Elements::SCTE : //SCTE
121                 case Elements::GA94 :
122                 case Elements::S14A : //ATSC
123                         switch (stream_type)
124                         {
125                             case 0x80 : return "MPEG Video";
126                             case 0x81 : return "AC-3";
127                             case 0x82 : return "Text";
128                             case 0x86 : return "SCTE 35";
129                             case 0x87 : return "E-AC-3";
130                             default   : return "";
131                         }
132                 case Elements::HDMV : //Bluray
133                         switch (stream_type)
134                         {
135                             case 0x80 : return "PCM";
136                             case 0x81 : return "AC-3";
137                             case 0x82 : return "DTS";
138                             case 0x83 : return "AC-3"; // (TrueHD)"
139                             case 0x84 : return "E-AC-3";
140                             case 0x85 : return "DTS"; //" (HD-HRA)"
141                             case 0x86 : return "DTS"; //" (HD-MA)"
142                             case 0x90 : return "PGS";
143                             case 0x91 : return "PGS";
144                             case 0x92 : return "TEXTST"; //Blu-ray subtitle text
145                             case 0xA1 : return "AC-3";
146                             case 0xA2 : return "DTS";
147                             case 0xEA : return "VC-1";
148                             default   : return "";
149                         }
150                 case 0xFFFFFFFF : //Unknown
151                         return "";
152                 default                     :
153                         switch (stream_type)
154                         {
155                             case 0x80 : return "MPEG Video";
156                             case 0x81 : return "AC-3";
157                             case 0x87 : return "E-AC-3";
158                             case 0x88 : return "VC-1";
159                             case 0xD1 : return "Dirac";
160                             default   : return "";
161                         }
162             }
163     }
164 }
165 
166 //---------------------------------------------------------------------------
Mpeg_Psi_stream_type_Codec(int8u stream_type,int32u format_identifier)167 const char* Mpeg_Psi_stream_type_Codec(int8u stream_type, int32u format_identifier)
168 {
169     switch (stream_type)
170     {
171         case 0x01 : return "MPEG-1V";
172         case 0x02 : return "MPEG-2V";
173         case 0x03 : return "MPEG-1A";
174         case 0x04 : return "MPEG-2A";
175         case 0x0F : return "AAC";
176         case 0x10 : return "MPEG-4V";
177         case 0x11 : return "AAC";
178         case 0x1B : return "AVC";
179         case 0x1C : return "AAC";
180         case 0x1D : return "Text";
181         case 0x1E : return "MPEG-2V";
182         case 0x1F : return "AVC";
183         case 0x20 : return "AVC";
184         case 0x24 :
185         case 0x27 : return "HEVC";
186         default :
187             switch (format_identifier)
188             {
189                 case Elements::CUEI :
190                 case Elements::SCTE : //SCTE
191                 case Elements::GA94 :
192                 case Elements::S14A : //ATSC
193                         switch (stream_type)
194                         {
195                             case 0x80 : return "MPEG-2V";
196                             case 0x81 : return "AC3";
197                             case 0x82 : return "Text";
198                             case 0x87 : return "AC3+";
199                             default   : return "";
200                         }
201                 case Elements::HDMV : //Bluray
202                         switch (stream_type)
203                         {
204                             case 0x80 : return "PCM";
205                             case 0x81 : return "AC3";
206                             case 0x82 : return "DTS";
207                             case 0x83 : return "AC3+";
208                             case 0x86 : return "DTS";
209                             case 0x90 : return "PGS";
210                             case 0x91 : return "PGS";
211                             case 0x92 : return "TEXTST"; //Blu-ray Subtitle Text
212                             case 0xEA : return "VC1";
213                             default   : return "";
214                         }
215                 case 0xFFFFFFFF : //Unknown
216                         return "";
217                 default                     :
218                         switch (stream_type)
219                         {
220                             case 0x80 : return "MPEG-2V";
221                             case 0x81 : return "AC3";
222                             case 0x87 : return "AC3+";
223                             case 0x88 : return "VC-1";
224                             case 0xD1 : return "Dirac";
225                             default   : return "";
226                         }
227             }
228     }
229 }
230 
231 //---------------------------------------------------------------------------
Mpeg_Psi_stream_type_StreamKind(int32u stream_type,int32u format_identifier)232 stream_t Mpeg_Psi_stream_type_StreamKind(int32u stream_type, int32u format_identifier)
233 {
234     switch (stream_type)
235     {
236         case 0x01 :
237         case 0x02 :
238         case 0x10 :
239         case 0x1B :
240         case 0x1E :
241         case 0x1F :
242         case 0x20 :
243         case 0x24 :
244         case 0x27 :
245                     return Stream_Video;
246         case 0x03 :
247         case 0x04 :
248         case 0x0F :
249         case 0x11 :
250         case 0x1C :
251         case 0x2D :
252         case 0x2E :
253                     return Stream_Audio;
254         case 0x1D :
255                     return Stream_Text;
256         default :
257             switch (format_identifier)
258             {
259                 case Elements::CUEI :
260                 case Elements::SCTE : //SCTE
261                 case Elements::GA94 :
262                 case Elements::S14A : //ATSC
263                         switch (stream_type)
264                         {
265                             case 0x80 : return Stream_Video;
266                             case 0x81 : return Stream_Audio;
267                             case 0x82 : return Stream_Text;
268                             case 0x87 : return Stream_Audio;
269                             default   : return Stream_Max;
270                         }
271                 case Elements::HDMV : //Bluray
272                         switch (stream_type)
273                         {
274                             case 0x80 : return Stream_Audio;
275                             case 0x81 : return Stream_Audio;
276                             case 0x82 : return Stream_Audio;
277                             case 0x83 : return Stream_Audio;
278                             case 0x84 : return Stream_Audio;
279                             case 0x85 : return Stream_Audio;
280                             case 0x86 : return Stream_Audio;
281                             case 0x90 : return Stream_Text;
282                             case 0x91 : return Stream_Text;
283                             case 0x92 : return Stream_Text;
284                             case 0xA1 : return Stream_Audio;
285                             case 0xA2 : return Stream_Audio;
286                             case 0xEA : return Stream_Video;
287                             default   : return Stream_Max;
288                         }
289                 case Elements::TSHV : //DV
290                         switch (stream_type)
291                         {
292                             case 0xA0 : return Stream_General;
293                             case 0xA1 : return Stream_General;
294                             default   : return Stream_Max;
295                         }
296                 case 0xFFFFFFFF : //Unknown
297                         return Stream_Max;
298                 default                     :
299                         switch (stream_type)
300                         {
301                             case 0x80 : return Stream_Video;
302                             case 0x81 : return Stream_Audio;
303                             case 0x87 : return Stream_Audio;
304                             case 0x88 : return Stream_Video;
305                             case 0xD1 : return Stream_Video;
306                             default   : return Stream_Max;
307                         }
308             }
309     }
310 }
311 
312 //---------------------------------------------------------------------------
Mpeg_Psi_stream_type_Info(int8u stream_type,int32u format_identifier)313 const char* Mpeg_Psi_stream_type_Info(int8u stream_type, int32u format_identifier)
314 {
315     switch (stream_type)
316     {
317         case 0x00 : return "ITU-T | ISO/IEC Reserved";
318         case 0x01 : return "ISO/IEC 11172 Video";
319         case 0x02 : return "ITU-T Rec. H.262 | ISO/IEC 13818-2 Video or ISO/IEC 11172-2 constrained parameter video stream";
320         case 0x03 : return "ISO/IEC 11172 Audio";
321         case 0x04 : return "ISO/IEC 13818-3 Audio";
322         case 0x05 : return "ITU-T Rec. H.222.0 | ISO/IEC 13818-1 private_sections";
323         case 0x06 : return "ITU-T Rec. H.222.0 | ISO/IEC 13818-1 PES packets containing private data";
324         case 0x07 : return "ISO/IEC 13522 MHEG";
325         case 0x08 : return "ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Annex A DSM-CC";
326         case 0x09 : return "ITU-T Rec. H.222.1";
327         case 0x0A : return "ISO/IEC 13818-6 type A";
328         case 0x0B : return "ISO/IEC 13818-6 type B";
329         case 0x0C : return "ISO/IEC 13818-6 type C";
330         case 0x0D : return "ISO/IEC 13818-6 type D";
331         case 0x0E : return "ITU-T Rec. H.222.0 | ISO/IEC 13818-1 auxiliary";
332         case 0x0F : return "ISO/IEC 13818-7 Audio with ADTS transport syntax";
333         case 0x10 : return "ISO/IEC 14496-2 Visual";
334         case 0x11 : return "ISO/IEC 14496-3 Audio with the LATM transport syntax as defined in ISO/IEC 14496-3 / AMD 1";
335         case 0x12 : return "ISO/IEC 14496-1 SL-packetized stream or FlexMux stream carried in PES packets";
336         case 0x13 : return "ISO/IEC 14496-1 SL-packetized stream or FlexMux stream carried in ISO/IEC14496_sections.";
337         case 0x14 : return "ISO/IEC 13818-6 Synchronized Download Protocol";
338         case 0x15 : return "Metadata carried in PES packets";
339         case 0x16 : return "Metadata carried in metadata_sections";
340         case 0x17 : return "Metadata carried in ISO/IEC 13818-6 Data Carousel";
341         case 0x18 : return "Metadata carried in ISO/IEC 13818-6 Object Carousel";
342         case 0x19 : return "Metadata carried in ISO/IEC 13818-6 Synchronized Download Protocol";
343         case 0x1A : return "IPMP stream (defined in ISO/IEC 13818-11, MPEG-2 IPMP)";
344         case 0x1B : return "AVC video stream as defined in ITU-T Rec. H.264 | ISO/IEC 14496-10 Video";
345         case 0x1C : return "ISO/IEC 14496-3 Audio, without using any additional transport syntax";
346         case 0x1D : return "ISO/IEC 14496-17 Text";
347         case 0x1E : return "Auxiliary video data stream as defined in ISO/IEC 23002-3";
348         case 0x1F : return "SVC video sub-bitstream of an AVC video stream conforming to one or more profiles defined in Annex G of ITU-T Rec. H.264 | ISO/IEC 14496-10";
349         case 0x20 : return "MVC video sub-bitstream of an AVC video stream conforming to one or more profiles defined in Annex H of ITU-T Rec. H.264 | ISO/IEC 14496-10";
350         case 0x24 :
351         case 0x27 : return "ITU-T Rec. H.265 | ISO/IEC 23008-2 MPEG-H Part 2 / HEVC video stream";
352         case 0x2D : return "MPEG-H 3D Audio (main)";
353         case 0x2E : return "MPEG-H 3D Audio (auxilary)";
354         case 0x7F : return "IPMP stream";
355         default :
356             if (stream_type<=0x7F) return "ITU-T Rec. H.222.0 | ISO/IEC 13818-1 reserved";
357             switch (format_identifier)
358             {
359                 case Elements::CUEI :
360                 case Elements::GA94 :
361                 case Elements::S14A : //ATSC
362                 case Elements::SCTE : //SCTE
363                         switch (stream_type)
364                         {
365                             case 0x80 : return "SCTE - MPEG Video";
366                             case 0x81 : return "ATSC - AC-3";
367                             case 0x82 : return "SCTE - Standard Subtitle";
368                             case 0x83 : return "SCTE - Isochronous Data";
369                             case 0x84 : return "ATSC - Reserved";
370                             case 0x85 : return "ATSC - Program Identifier";
371                             case 0x86 : return "SCTE - Splice";
372                             case 0x87 : return "ATSC - E-AC-3";
373                             case 0x90 : return "DVB  - stream_type value for Time Slicing / MPE-FEC";
374                             case 0x95 : return "ATSC - Data Service Table, Network Resources Table";
375                             default   : return "ATSC/SCTE - Unknown";
376                         }
377                 case Elements::HDMV : //Bluray
378                         switch (stream_type)
379                         {
380                             case 0x80 : return "BluRay - PCM";
381                             case 0x81 : return "BluRay - AC-3";
382                             case 0x82 : return "BluRay - DTS";
383                             case 0x83 : return "BluRay - AC-3 (TrueHD)";
384                             case 0x84 : return "BluRay - E-AC-3";
385                             case 0x85 : return "BluRay - DTS (HD-HRA)";
386                             case 0x86 : return "BluRay - DTS (HD-MA)";
387                             case 0x90 : return "BluRay - PGS";
388                             case 0x91 : return "BluRay - PGS";
389                             case 0x92 : return "BluRay - TEXTST";
390                             case 0xA1 : return "BluRay - AC-3";
391                             case 0xA2 : return "BluRay - DTS";
392                             case 0xEA : return "BluRay - VC-1";
393                             default   : return "Bluray - Unknown";
394                         }
395                 case Elements::TSHV : //DV
396                         switch (stream_type)
397                         {
398                             case 0xA0 : return "DV - Data 0";
399                             case 0xA1 : return "DV - Data 1";
400                             default   : return "Bluray - Unknown";
401                         }
402                 case 0xFFFFFFFF : //Unknown
403                         return "";
404                 default                     :
405                         switch (stream_type)
406                         {
407                             case 0x80 : return "DigiCipher II video";
408                             case 0x81 : return "AC-3";
409                             case 0x88 : return "VC-1";
410                             case 0x87 : return "E-AC-3";
411                             case 0xD1 : return "Dirac";
412                             default   : return "User Private";
413                         }
414             }
415     }
416 }
417 
418 //---------------------------------------------------------------------------
Mpeg_Psi_table_id(int8u table_id)419 const char* Mpeg_Psi_table_id(int8u table_id)
420 {
421     switch (table_id)
422     {
423         case 0x00 : return "program_association_section";
424         case 0x01 : return "conditional_access_section";
425         case 0x02 : return "TS_program_map_section";
426         case 0x03 : return "TS_description_section";
427         case 0x04 : return "ISO_IEC_14496_scene_description_section";
428         case 0x05 : return "ISO_IEC_14496_object_descriptor_section";
429         case 0x06 : return "Metadata?";
430         case 0x38 : return "ISO/IEC 13818-6 reserved";
431         case 0x39 : return "DSM-CC addressable section";
432         case 0x3A : return "DSM-CC : return MPE";
433         case 0x3B : return "DSM-CC : return U-N messages : return except DDM";
434         case 0x3C : return "DSM-CC : return DDM";
435         case 0x3D : return "DSM-CC : return stream descriptors";
436         case 0x3E : return "DSM-CC : return private data : return IP-Datagram";
437         case 0x3F : return "DSM-CC addressable section";
438         case 0x40 : return "DVB - network_information_section - actual_network";
439         case 0x41 : return "DVB - network_information_section - other_network";
440         case 0x42 : return "DVB - service_description_section - actual_transport_stream";
441         case 0x46 : return "DVB - service_description_section - other_transport_stream";
442         case 0x4A : return "DVB - bouquet_association_section";
443         case 0x4E : return "DVB - event_information_section - actual_transport_stream : return present/following";
444         case 0x4F : return "DVB - event_information_section - other_transport_stream : return present/following";
445         case 0x50 :
446         case 0x51 :
447         case 0x52 :
448         case 0x53 :
449         case 0x54 :
450         case 0x55 :
451         case 0x56 :
452         case 0x57 :
453         case 0x58 :
454         case 0x59 :
455         case 0x5A :
456         case 0x5B :
457         case 0x5C :
458         case 0x5E :
459         case 0x5F : return "DVB - event_information_section - actual_transport_stream : return schedule";
460         case 0x60 :
461         case 0x61 :
462         case 0x62 :
463         case 0x63 :
464         case 0x64 :
465         case 0x65 :
466         case 0x66 :
467         case 0x67 :
468         case 0x68 :
469         case 0x69 :
470         case 0x6A :
471         case 0x6B :
472         case 0x6C :
473         case 0x6D :
474         case 0x6E :
475         case 0x6F : return "DVB - event_information_section - other_transport_stream : return schedule";
476         case 0x70 : return "DVB - time_date_section";
477         case 0x71 : return "DVB - running_status_section";
478         case 0x72 : return "DVB - stuffing_section";
479         case 0x73 : return "DVB - time_offset_section";
480         case 0x74 : return "DVB - application information section";
481         case 0x75 : return "DVB - container section";
482         case 0x76 : return "DVB - related content section";
483         case 0x77 : return "DVB - content identifier section";
484         case 0x78 : return "DVB - MPE-FEC section";
485         case 0x79 : return "DVB - resolution notification section";
486         case 0x7E : return "DVB - discontinuity_information_section";
487         case 0x7F : return "DVB - selection_information_section";
488         case 0xC0 : return "ATSC - Program Information Message";
489         case 0xC1 : return "ATSC - Program Name Message";
490         case 0xC2 : return "ATSC/SCTE - Network Information Message";
491         case 0xC3 : return "ATSC/SCTE - Network Text Table (NTT)";
492         case 0xC4 : return "ATSC/SCTE - Short Form Virtual Channel Table (S-VCT)";
493         case 0xC5 : return "ATSC/SCTE - System Time Table (STT)";
494         case 0xC6 : return "ATSC/SCTE - Subtitle Message";
495         case 0xC7 : return "ATSC - Master Guide Table (MGT)";
496         case 0xC8 : return "ATSC - Terrestrial Virtual Channel Table (TVCT)";
497         case 0xC9 : return "ATSC - Cable Virtual Channel Table (CVCT) / Long-form Virtual Channel Table (L-VCT)";
498         case 0xCA : return "ATSC - Rating Region Table (RRT)";
499         case 0xCB : return "ATSC - Event Information Table (EIT)";
500         case 0xCC : return "ATSC - Extended Text Table (ETT)";
501         case 0xCD : return "ATSC - System Time Table (STT)";
502         case 0xCE : return "ATSC - Data Event Table (DET)";
503         case 0xCF : return "ATSC - Data Service Table (DST)";
504         case 0xD0 : return "ATSC - Program Identifier Table (PIT)";
505         case 0xD1 : return "ATSC - Network Resource Table (NRT)";
506         case 0xD2 : return "ATSC - Long-term Service Table (L-TST)";
507         case 0xD3 : return "ATSC - Directed Channel Change Table (DCCT)";
508         case 0xD4 : return "ATSC - DCC Selection Code Table (DCCSCT)";
509         case 0xD5 : return "ATSC - Selection Information Table (SIT)";
510         case 0xD6 : return "ATSC - Aggregate Event Information Table (AEIT)";
511         case 0xD7 : return "ATSC - Aggregate Extended Text Table (AETT)";
512         case 0xD8 : return "ATSC - Cable Emergency Alert";
513         case 0xD9 : return "ATSC - Aggregate Data Event Table";
514         case 0xDA : return "ATSC - Satellite VCT (SVCT)";
515         case 0xFC : return "SCTE - Splice";
516         default :
517             if (table_id>=0x06
518              && table_id<=0x37) return "ITU-T Rec. H.222.0 | ISO/IEC 13818-1 reserved";
519             if (table_id>=0x40
520              && table_id<=0x7F) return "DVB - reserved";
521             if (table_id>=0x80
522              && table_id<=0x8F) return "CA message";
523             if (table_id>=0xC0
524              && table_id<=0xDF) return "ATSC/SCTE - reserved";
525             if (table_id<=0xFE) return "User Private";
526             return "unknown";
527     }
528 }
529 
530 //---------------------------------------------------------------------------
Mpeg_Psi_atsc_service_type(int8u service_type)531 static const char* Mpeg_Psi_atsc_service_type(int8u service_type)
532 {
533     switch (service_type)
534     {
535         case 0x00 : return "reserved";
536         case 0x01 : return "Analog television";
537         case 0x02 : return "Digital television";
538         case 0x03 : return "Digital radio";
539         case 0x04 : return "Data";
540         default   : return "reserved for future use";
541     }
542 }
543 
544 //---------------------------------------------------------------------------
Mpeg_Psi_atsc_modulation_mode(int8u modulation_mode)545 static string Mpeg_Psi_atsc_modulation_mode(int8u modulation_mode)
546 {
547     switch (modulation_mode)
548     {
549         case 0x01 : return "Analog";
550         case 0x02 : return "SCTE_mode_1";
551         case 0x03 : return "SCTE_mode_2";
552         case 0x04 : return "ATSC (8 VSB)";
553         case 0x05 : return "ATSC (16 VSB)";
554         default   : return Ztring::ToZtring(modulation_mode).To_UTF8();
555     }
556 }
557 
558 //---------------------------------------------------------------------------
Mpeg_Psi_table_id_extension(int8u table_id)559 static const char* Mpeg_Psi_table_id_extension(int8u table_id)
560 {
561     switch (table_id)
562     {
563         case 0x00 : return "transport_stream_id";
564         case 0x01 : return "reserved";
565         case 0x02 : return "program_number";
566         case 0x03 : return "reserved";
567         case 0x40 : return "network_id";
568         case 0x42 :
569         case 0x46 : return "transport_stream_id";
570         case 0x4E :
571         case 0x4F :
572         case 0x50 :
573         case 0x51 :
574         case 0x52 :
575         case 0x53 :
576         case 0x54 :
577         case 0x55 :
578         case 0x56 :
579         case 0x57 :
580         case 0x58 :
581         case 0x59 :
582         case 0x5A :
583         case 0x5B :
584         case 0x5C :
585         case 0x5E :
586         case 0x5F :
587         case 0x60 :
588         case 0x61 :
589         case 0x62 :
590         case 0x63 :
591         case 0x64 :
592         case 0x65 :
593         case 0x66 :
594         case 0x67 :
595         case 0x68 :
596         case 0x69 :
597         case 0x6A :
598         case 0x6B :
599         case 0x6C :
600         case 0x6D :
601         case 0x6E :
602         case 0x6F : return "service_id";
603         case 0x7F : return "DVB_reserved_for_future_use";
604         case 0xC8 :
605         case 0xC9 : return "transport_stream_id";
606         case 0xCA : return "reserved + rating_region";
607         case 0xCB : return "source_id";
608         case 0xCC : return "ETT_table_id_extension";
609         case 0xD9 : return "AEIT_subtype + MGT_tag";
610         case 0xDA : return "SVCT_subtype + SVCT_id";
611         default : return "table_id_extension";
612     }
613 }
614 
615 //---------------------------------------------------------------------------
616 // CRC_32_Table
617 // A CRC is computed like this:
618 // Init: int32u CRC_32 = 0xFFFFFFFF;
619 // for each data byte do
620 //     CRC_32=(CRC_32<<8) ^ CRC_32_Table[(CRC_32>>24)^(data_byte)];
621 extern const int32u Psi_CRC_32_Table[256] =
622 {
623   0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
624   0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
625   0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
626   0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,
627   0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9,
628   0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,
629   0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011,
630   0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,
631   0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,
632   0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,
633   0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81,
634   0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,
635   0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49,
636   0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,
637   0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,
638   0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,
639   0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE,
640   0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,
641   0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,
642   0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,
643   0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,
644   0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,
645   0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066,
646   0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
647   0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E,
648   0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,
649   0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,
650   0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,
651   0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,
652   0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,
653   0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686,
654   0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,
655   0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,
656   0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,
657   0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F,
658   0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,
659   0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47,
660   0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,
661   0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,
662   0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,
663   0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7,
664   0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,
665   0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F,
666   0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,
667   0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,
668   0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,
669   0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F,
670   0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,
671   0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,
672   0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,
673   0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,
674   0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,
675   0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30,
676   0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,
677   0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088,
678   0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,
679   0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,
680   0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,
681   0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,
682   0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,
683   0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0,
684   0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,
685   0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668,
686   0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4
687 };
688 
689 //---------------------------------------------------------------------------
690 static const char* Mpeg_Psi_running_status[]=
691 {
692     "",
693     "Not running",
694     "Starts in a few seconds",
695     "Pausing",
696     "Running",
697     "Reserved",
698     "Reserved",
699     "Reserved",
700 };
701 
702 //---------------------------------------------------------------------------
703 extern const char* Mpeg_Descriptors_original_network_id(int16u original_network_id);
704 
705 //---------------------------------------------------------------------------
Mpeg_Psi_splice_command_type(int8u splice_command_type)706 static const char* Mpeg_Psi_splice_command_type(int8u splice_command_type)
707 {
708     switch (splice_command_type)
709     {
710         case 0x00 : return "splice_null";
711         case 0x04 : return "splice_schedule";
712         case 0x05 : return "splice_insert";
713         case 0x06 : return "time_signal";
714         case 0x07 : return "bandwidth_reservation";
715         default   : return "Reserved";
716     }
717 };
718 
719 
720 
721 //***************************************************************************
722 // Constructor/Destructor
723 //***************************************************************************
724 
725 //---------------------------------------------------------------------------
File_Mpeg_Psi()726 File_Mpeg_Psi::File_Mpeg_Psi()
727 :File__Analyze()
728 {
729     //In
730     From_TS=true; //Default is from TS
731     Complete_Stream=NULL;
732     pid=(int16u)-1;
733 
734     //Temp
735     transport_stream_id=0x0000; //Impossible
736     CRC_32=0;
737     elementary_PID=0x0000;
738     program_number=0x0000;
739     stream_type=0x00;
740     event_id=0x0000;
741     elementary_PID_IsValid=false;
742     program_number_IsValid=false;
743     stream_type_IsValid=false;
744     event_id_IsValid=false;
745     current_next_indicator=false;
746     IsATSC=false;
747     ForceStreamDisplay=MediaInfoLib::Config.MpegTs_ForceStreamDisplay_Get();
748 }
749 
750 //---------------------------------------------------------------------------
~File_Mpeg_Psi()751 File_Mpeg_Psi::~File_Mpeg_Psi()
752 {
753 }
754 
755 //***************************************************************************
756 // Buffer - File header
757 //***************************************************************************
758 
759 //---------------------------------------------------------------------------
FileHeader_Parse()760 void File_Mpeg_Psi::FileHeader_Parse()
761 {
762     //Parsing
763     if (From_TS)
764     {
765         int8u pointer_field;
766         Get_B1 (pointer_field,                                  "pointer_field");
767         if (pointer_field)
768             Skip_XX(pointer_field,                              "payload");
769     }
770 }
771 
772 //***************************************************************************
773 // Buffer
774 //***************************************************************************
775 
776 //---------------------------------------------------------------------------
Header_Begin()777 bool File_Mpeg_Psi::Header_Begin()
778 {
779     if (Buffer_Offset) //Not the first one
780     {
781         Peek_B1(table_id);
782         if (table_id==0xFF)
783         {
784             Accept();
785             Fill();
786             Finish();
787             return false;
788         }
789     }
790 
791     return true;
792 }
793 
794 //---------------------------------------------------------------------------
Header_Parse()795 void File_Mpeg_Psi::Header_Parse()
796 {
797     //From Program stream
798     if (!From_TS)
799     {
800         //Filling
801         table_id=0xFF; //Make it invalid
802         section_syntax_indicator=false;
803         Header_Fill_Code((int64u)-1, "program_stream_map"); //(int64u)-1 for precising "out of scope"
804         Header_Fill_Size(Element_Size-4);
805         return;
806     }
807 
808     //Parsing
809     int16u section_length;
810     Get_B1 (table_id,                                           "table_id");
811     BS_Begin();
812     Get_SB (    section_syntax_indicator,                       "section_syntax_indicator");
813     Skip_SB(                                                    "private_indicator");
814     Skip_S1( 2,                                                 "reserved");
815     Get_S2 (12, section_length,                                 "section_length");
816     BS_End();
817 
818     //Size
819     if ((size_t)section_length<Element_Offset+(section_syntax_indicator?4:0)) //We must have 4 more byte for CRC
820     {
821         Reject("PSI"); //Error, we exit
822         return;
823     }
824     if (Element_Size<Element_Offset+section_length)
825     {
826         Element_WaitForMoreData();
827         return;
828     }
829     //Element[Element_Level-1].IsComplete=true;
830 
831     //CRC32
832     if (table_id<=0x06 && !section_syntax_indicator)
833     {
834         Trusted_IsNot("CRC error");
835         CRC_32=0xffffffff;
836         Reject();
837         return;
838     }
839     if (section_syntax_indicator || table_id==0xC1)
840     {
841         CRC_32=0xffffffff;
842         const int8u* CRC_32_Buffer=Buffer+Buffer_Offset+(size_t)Element_Offset-3; //table_id position
843 
844         while(CRC_32_Buffer<Buffer+Buffer_Offset+(size_t)Element_Offset+section_length) //from table_id to the end, CRC_32 included
845         {
846             CRC_32=(CRC_32<<8) ^ Psi_CRC_32_Table[(CRC_32>>24)^(*CRC_32_Buffer)];
847             CRC_32_Buffer++;
848         }
849 
850         if (CRC_32)
851         {
852             Trusted_IsNot("CRC error");
853             Reject();
854             return;
855         }
856     }
857 
858     //Filling
859     Header_Fill_Code(table_id, Ztring().From_Number(table_id, 16));
860     Header_Fill_Size(3+section_length);
861 }
862 
863 //---------------------------------------------------------------------------
Data_Parse()864 void File_Mpeg_Psi::Data_Parse()
865 {
866     //Check if OK
867     if (table_id<=0x06 && !section_syntax_indicator)
868     {
869         Skip_XX(Element_Size,                                   "Data (section_syntax_indicator failed)");
870         Finish("PSI");
871         return;
872     }
873 
874     if (section_syntax_indicator)
875     {
876         Element_Size-=4; //Reserving size of CRC32
877         Get_B2(     table_id_extension,                         Mpeg_Psi_table_id_extension(table_id)); Element_Name(Ztring(Mpeg_Psi_table_id_extension(table_id))+__T("=")+Ztring::ToZtring_From_CC2(table_id_extension));
878         BS_Begin();
879         Skip_S1( 2,                                             "reserved");
880         Get_S1 ( 5, version_number,                             "version_number"); Element_Info1(__T("Version=")+Ztring::ToZtring(version_number));
881         Get_SB (    current_next_indicator,                     "current_next_indicator");
882         BS_End();
883         Info_B1(    section_number,                             "section_number"); Element_Info1(__T("Section=")+Ztring::ToZtring(section_number));
884         Skip_B1(                                                "last_section_number");
885     }
886     else if (table_id==0xC1)
887     {
888         Element_Size-=4; //Reserving size of CRC32
889     }
890 
891     #define ELEMENT_CASE(_NAME, _DETAIL) \
892         case 0x##_NAME : Element_Name(_DETAIL); Table_##_NAME(); break;
893 
894     switch (table_id)
895     {
896         ELEMENT_CASE(00, "program_association_section");
897         ELEMENT_CASE(01, "conditional_access_section");
898         ELEMENT_CASE(02, "TS_program_map_section");
899         ELEMENT_CASE(03, "TS_description_section");
900         ELEMENT_CASE(04, "ISO_IEC_14496_scene_description_section");
901         ELEMENT_CASE(05, "ISO_IEC_14496_object_descriptor_section");
902         ELEMENT_CASE(06, "Metadata?");
903         ELEMENT_CASE(38, "ISO/IEC 13818-6 reserved");
904         ELEMENT_CASE(39, "DSM-CC addressable section");
905         ELEMENT_CASE(3A, "DSM-CC, MPE");
906         ELEMENT_CASE(3B, "DSM-CC, U-N messages, except DDM");
907         ELEMENT_CASE(3C, "DSM-CC, DDM");
908         ELEMENT_CASE(3D, "DSM-CC, stream descriptors");
909         ELEMENT_CASE(3E, "DSM-CC, private data, IP-Datagram");
910         ELEMENT_CASE(3F, "DSM-CC addressable section");
911         ELEMENT_CASE(40, "DVB - network_information_section - actual_network");
912         ELEMENT_CASE(41, "DVB - network_information_section - other_network");
913         ELEMENT_CASE(42, "DVB - service_description_section - actual_transport_stream");
914         ELEMENT_CASE(46, "DVB - service_description_section - other_transport_stream");
915         ELEMENT_CASE(4A, "DVB - bouquet_association_section");
916         ELEMENT_CASE(4E, "DVB - event_information_section - actual_transport_stream, present/following");
917         ELEMENT_CASE(4F, "DVB - event_information_section - other_transport_stream, present/following");
918         case 0x50 :
919         case 0x51 :
920         case 0x52 :
921         case 0x53 :
922         case 0x54 :
923         case 0x55 :
924         case 0x56 :
925         case 0x57 :
926         case 0x58 :
927         case 0x59 :
928         case 0x5A :
929         case 0x5B :
930         case 0x5C :
931         case 0x5E :
932         ELEMENT_CASE(5F, "DVB - event_information_section - actual_transport_stream, schedule");
933         case 0x60 :
934         case 0x61 :
935         case 0x62 :
936         case 0x63 :
937         case 0x64 :
938         case 0x65 :
939         case 0x66 :
940         case 0x67 :
941         case 0x68 :
942         case 0x69 :
943         case 0x6A :
944         case 0x6B :
945         case 0x6C :
946         case 0x6D :
947         case 0x6E :
948         ELEMENT_CASE(6F, "DVB - event_information_section - other_transport_stream, schedule");
949         ELEMENT_CASE(70, "DVB - time_date_section");
950         ELEMENT_CASE(71, "DVB - running_status_section");
951         ELEMENT_CASE(72, "DVB - stuffing_section");
952         ELEMENT_CASE(73, "DVB - time_offset_section");
953         ELEMENT_CASE(74, "DVB - application information section");
954         ELEMENT_CASE(75, "DVB - container section");
955         ELEMENT_CASE(76, "DVB - related content section");
956         ELEMENT_CASE(77, "DVB - content identifier section");
957         ELEMENT_CASE(78, "DVB - MPE-FEC section");
958         ELEMENT_CASE(79, "DVB - resolution notification section");
959         ELEMENT_CASE(7E, "DVB - discontinuity_information_section");
960         ELEMENT_CASE(7F, "DVB - selection_information_section");
961         ELEMENT_CASE(C0, "ATSC - Program Information Message");
962         ELEMENT_CASE(C1, "ATSC - Program Name Message");
963         ELEMENT_CASE(C2, "ATSC/SCTE - Network Information Message");
964         ELEMENT_CASE(C3, "ATSC/SCTE - Network Text Table (NTT)");
965         ELEMENT_CASE(C4, "ATSC/SCTE - Short Form Virtual Channel Table (S-VCT)");
966         ELEMENT_CASE(C5, "ATSC/SCTE - System Time Table (STT)");
967         ELEMENT_CASE(C6, "ATSC/SCTE - Subtitle Message");
968         ELEMENT_CASE(C7, "ATSC - Master Guide Table (MGT)");
969         ELEMENT_CASE(C8, "ATSC - Terrestrial Virtual Channel Table (TVCT)");
970         ELEMENT_CASE(C9, "ATSC - Cable Virtual Channel Table (CVCT) / Long-form Virtual Channel Table (L-VCT)");
971         ELEMENT_CASE(CA, "ATSC - Rating Region Table (RRT)");
972         ELEMENT_CASE(CB, "ATSC - Event Information Table (EIT)");
973         ELEMENT_CASE(CC, "ATSC - Extended Text Table (ETT)");
974         ELEMENT_CASE(CD, "ATSC - System Time Table (STT)");
975         ELEMENT_CASE(CE, "ATSC - Data Event Table (DET)");
976         ELEMENT_CASE(CF, "ATSC - Data Service Table (DST)");
977         ELEMENT_CASE(D0, "ATSC - Program Identifier Table (PIT)");
978         ELEMENT_CASE(D1, "ATSC - Network Resource Table (NRT)");
979         ELEMENT_CASE(D2, "ATSC - Long-term Service Table (L-TST)");
980         ELEMENT_CASE(D3, "ATSC - Directed Channel Change Table (DCCT)");
981         ELEMENT_CASE(D4, "ATSC - DCC Selection Code Table (DCCSCT)");
982         ELEMENT_CASE(D5, "ATSC - Selection Information Table (SIT)");
983         ELEMENT_CASE(D6, "ATSC - Aggregate Event Information Table (AEIT)");
984         ELEMENT_CASE(D7, "ATSC - Aggregate Extended Text Table (AETT)");
985         ELEMENT_CASE(D8, "ATSC - Cable Emergency Alert");
986         ELEMENT_CASE(D9, "ATSC - Aggregate Data Event Table");
987         ELEMENT_CASE(DA, "ATSC - Satellite VCT");
988         ELEMENT_CASE(FC, "SCTE - Splice");
989         default :
990             if (table_id>=0x06
991              && table_id<=0x37) {Element_Name("ITU-T Rec. H.222.0 | ISO/IEC 13818-1 reserved"); Skip_XX(Element_Size, "Unknown"); break;}
992             if (table_id>=0x40
993              && table_id<=0x7F) {Element_Name("DVB - reserved"); Skip_XX(Element_Size, "Unknown"); break;}
994             if (table_id>=0x80
995              && table_id<=0x8F) {Element_Name("CA message, EMM, ECM"); Skip_XX(Element_Size, "Unknown"); break;}
996             if (table_id>=0xC0
997              && table_id<=0xDF) {Element_Name("ATSC/SCTE - reserved");Skip_XX(Element_Size, "Unknown");  break;}
998             if (table_id<=0xFE) {Element_Name("User Private"); Skip_XX(Element_Size, "Unknown"); break;}
999             if (Element_Code==(int64u)-1) {program_stream_map(); break;} //Specific to MPEG-PS
1000                                 {Element_Name("forbidden"); Skip_XX(Element_Size, "Unknown"); break;}
1001     }
1002 
1003     if (section_syntax_indicator || table_id==0xC1)
1004     {
1005         Element_Size+=4;
1006         Skip_B4(                                                "CRC32");
1007     }
1008 
1009     if (table_id>=0x40
1010      && Config->ParseSpeed>=0.5
1011      && Complete_Stream->Streams_NotParsedCount!=(size_t)-1 && Complete_Stream->Streams_NotParsedCount!=0)
1012         Complete_Stream->Streams_NotParsedCount=(size_t)-1; //Disabling speed up for detection in case of DVB/ATSC tables, we want all of them.
1013 
1014     if (Buffer_Offset+Element_Size==Buffer_Size)
1015     {
1016         Accept();
1017         Fill();
1018         Finish();
1019     }
1020 }
1021 
1022 //---------------------------------------------------------------------------
Table_reserved()1023 void File_Mpeg_Psi::Table_reserved()
1024 {
1025 
1026 }
1027 
1028 //---------------------------------------------------------------------------
Table_iso13818_6()1029 void File_Mpeg_Psi::Table_iso13818_6()
1030 {
1031     Element_Info1("Defined in ISO/IEC 13818-6");
1032     Skip_XX(Element_Size,                                       "Data");
1033 }
1034 
1035 //---------------------------------------------------------------------------
Table_user_private()1036 void File_Mpeg_Psi::Table_user_private()
1037 {
1038     Element_Info1("user_private");
1039     Skip_XX(Element_Size,                                       "Data");
1040 }
1041 
1042 //---------------------------------------------------------------------------
Table_forbidden()1043 void File_Mpeg_Psi::Table_forbidden()
1044 {
1045     Element_Info1("forbidden");
1046     Skip_XX(Element_Size,                                       "Data");
1047 }
1048 
1049 //---------------------------------------------------------------------------
program_stream_map()1050 void File_Mpeg_Psi::program_stream_map()
1051 {
1052     Element_Name("program_stream_map");
1053     table_id=0x02; // program_map_section
1054 
1055     //Parsing
1056     int16u elementary_stream_map_length;
1057     bool single_extension_stream_flag;
1058     BS_Begin();
1059     Skip_SB(                                                    "current_next_indicator");
1060     Get_SB (single_extension_stream_flag,                       "single_extension_stream_flag");
1061     Skip_SB(                                                    "reserved");
1062     Skip_S1( 5,                                                 "program_stream_map_version");
1063     Skip_S1( 7,                                                 "reserved");
1064     Mark_1 ();
1065     BS_End();
1066     Get_B2 (Descriptors_Size,                                   "program_stream_info_length");
1067     if (Descriptors_Size>0)
1068         Descriptors();
1069 
1070     Get_B2 (elementary_stream_map_length,                       "elementary_stream_map_length");
1071     int16u elementary_stream_map_Pos=0;
1072     while (Element_Offset<Element_Size && elementary_stream_map_Pos<elementary_stream_map_length)
1073     {
1074         Element_Begin0();
1075         int16u ES_info_length;
1076         int8u stream_type, elementary_stream_id;
1077         Get_B1 (stream_type,                                    "stream_type"); Param_Info1(Mpeg_Psi_stream_type_Info(stream_type, 0x00000000));
1078         Get_B1 (elementary_stream_id,                           "elementary_stream_id");
1079         Get_B2 (ES_info_length,                                 "ES_info_length");
1080         Descriptors_Size=ES_info_length;
1081         Element_Name(Ztring::ToZtring(elementary_stream_id, 16));
1082         if (elementary_stream_id==0xFD && !single_extension_stream_flag)
1083         {
1084             Skip_S1(8,                                          "pseudo_descriptor_tag");
1085             Skip_S1(8,                                          "pseudo_descriptor_length");
1086             Mark_1();
1087             Skip_S1(7,                                          "elementary_stream_id_extension");
1088             if (Descriptors_Size>=3)
1089                 Descriptors_Size-=3;
1090         }
1091         if (Descriptors_Size>0)
1092         {
1093             elementary_PID=elementary_stream_id;
1094             elementary_PID_IsValid=true;
1095             Descriptors();
1096         }
1097         Element_End0();
1098         elementary_stream_map_Pos+=4+ES_info_length;
1099 
1100         FILLING_BEGIN();
1101             Complete_Stream->Streams[elementary_stream_id]->stream_type=stream_type;
1102             Complete_Stream->Streams[elementary_stream_id]->Infos["CodecID"].From_Number(stream_type);
1103         FILLING_END();
1104     }
1105 }
1106 
1107 //---------------------------------------------------------------------------
Table_00()1108 void File_Mpeg_Psi::Table_00()
1109 {
1110     //transport_stream_id
1111     if (!Complete_Stream->transport_stream_id_IsValid || table_id_extension!=Complete_Stream->transport_stream_id)
1112     {
1113         if (Complete_Stream->Transport_Streams.find(Complete_Stream->transport_stream_id)!=Complete_Stream->Transport_Streams.end())
1114             while (!Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs.empty())
1115             {
1116                 program_number=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs.begin()->first;
1117                 program_number_Remove();
1118             }
1119 
1120         Complete_Stream->transport_stream_id=table_id_extension;
1121         Complete_Stream->transport_stream_id_IsValid=true;
1122     }
1123     complete_stream::transport_stream& transportStream = Complete_Stream->Transport_Streams[table_id_extension];
1124     if (transportStream.Programs_NotParsedCount==(size_t)-1)
1125         transportStream.Programs_NotParsedCount=0;
1126     transportStream.programs_List.clear();
1127 
1128     //Saving previous status
1129     std::map<int16u, complete_stream::transport_stream::program> program_numbers_Previous=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs;
1130 
1131     //Reseting
1132     std::vector<int16u> Table_ID_Extension_List;
1133     for (complete_stream::stream::table_id::table_id_extensions::iterator Table_ID_Extension=Complete_Stream->Streams[0x0000]->Table_IDs[0x00]->Table_ID_Extensions.begin(); Table_ID_Extension!=Complete_Stream->Streams[0x0000]->Table_IDs[0x00]->Table_ID_Extensions.end(); ++Table_ID_Extension)
1134         if (Table_ID_Extension->first!=table_id_extension)
1135             Table_ID_Extension_List.push_back(Table_ID_Extension->first);
1136     for (size_t Pos=0; Pos<Table_ID_Extension_List.size(); Pos++)
1137         Complete_Stream->Streams[0x0000]->Table_IDs[0x00]->Table_ID_Extensions.erase(Table_ID_Extension_List[Pos]);
1138 
1139     //Parsing
1140     while (Element_Offset<Element_Size)
1141     {
1142         Element_Begin1("program");
1143         Get_B2 (    program_number,                             "program_number");
1144         BS_Begin();
1145         Skip_S1( 3,                                             "reserved");
1146         Get_S2 ( 13, elementary_PID,                            program_number?"program_map_PID":"network_PID"); Element_Info1(Ztring::ToZtring_From_CC2(elementary_PID));
1147         BS_End();
1148         Element_End0();
1149 
1150         FILLING_BEGIN();
1151             if (elementary_PID
1152             #if MEDIAINFO_FILTER
1153                 && Config->File_Filter_Get(program_number)
1154             #endif //MEDIAINFO_FILTER
1155                 )
1156             {
1157                 program_number_Update();
1158 
1159                 std::map<int16u, complete_stream::transport_stream::program>::iterator program_number_Previous=program_numbers_Previous.find(program_number);
1160                 if (program_number_Previous!=program_numbers_Previous.end())
1161                     program_numbers_Previous.erase(program_number_Previous);
1162             }
1163         FILLING_END();
1164     }
1165     BS_End();
1166 
1167     FILLING_BEGIN();
1168         //Removing previous elementary_PIDs no more used
1169         for (std::map<int16u, complete_stream::transport_stream::program>::iterator program_number_Previous=program_numbers_Previous.begin(); program_number_Previous!=program_numbers_Previous.end(); ++program_number_Previous)
1170         {
1171             program_number=program_number_Previous->first;
1172             program_number_Remove();
1173         }
1174     FILLING_END();
1175 
1176     #if MEDIAINFO_EVENTS
1177         if (Complete_Stream->Transport_Streams[table_id_extension].Programs_NotParsedCount>1)
1178             Config->Events_TimestampShift_Disabled=true; //Enabled only if there is 1 program. TODO: support of more than 1 program
1179     #endif //MEDIAINFO_EVENTS
1180 }
1181 
1182 //---------------------------------------------------------------------------
Table_01()1183 void File_Mpeg_Psi::Table_01()
1184 {
1185     //Parsing
1186     if (Element_Offset<Element_Size)
1187     {
1188         Descriptors_Size=(int16u)(Element_Size-Element_Offset);
1189         if (Descriptors_Size>0)
1190             Descriptors();
1191     }
1192 }
1193 
1194 //---------------------------------------------------------------------------
Table_02()1195 void File_Mpeg_Psi::Table_02()
1196 {
1197     //Informing PSI is parsed
1198     complete_stream::transport_stream& transportStream = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id];
1199     complete_stream::transport_stream::program& progItem = transportStream.Programs[table_id_extension];
1200     if (!progItem.IsParsed && transportStream.Programs_NotParsedCount)
1201     {
1202         transportStream.Programs_NotParsedCount--;
1203         progItem.IsParsed=true;
1204     }
1205 
1206     //Saving previous status
1207     std::vector<int16u> elementary_PIDs_Previous= progItem.elementary_PIDs;
1208 
1209     //Parsing
1210     int16u PCR_PID;
1211     BS_Begin();
1212     Skip_S1( 3,                                                 "reserved");
1213     Get_S2 (13, PCR_PID,                                        "PCR_PID");
1214     Skip_S1( 4,                                                 "reserved");
1215     Get_S2 (12, Descriptors_Size,                               "program_info_length");
1216     BS_End();
1217 
1218     //Descriptors
1219     transport_stream_id=Complete_Stream->transport_stream_id;
1220     program_number=table_id_extension;
1221     program_number_IsValid=true;
1222     if (Descriptors_Size>0)
1223         Descriptors();
1224 
1225     //Parsing
1226     while (Element_Offset<Element_Size)
1227     {
1228         Element_Begin0();
1229         BS_Begin();
1230         Get_S1 ( 8, stream_type,                                "stream_type"); Element_Info1(Mpeg_Psi_stream_type_Info(stream_type, Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].registration_format_identifier)); Param_Info1(Mpeg_Psi_stream_type_Info(stream_type, Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].registration_format_identifier));
1231         Skip_S1( 3,                                             "reserved");
1232         Get_S2 (13, elementary_PID,                             "elementary_PID");
1233         Skip_S1( 4,                                             "reserved");
1234         Get_S2 (12, Descriptors_Size,                           "ES_info_length");
1235         BS_End();
1236 
1237         FILLING_BEGIN();
1238             //Searching for hidden Stereoscopic stream
1239             #if defined(MEDIAINFO_DIRECTORY_YES)
1240             if (stream_type==0x20 && File_Name_WithoutDemux.size()>=4+1+6+1+4+1+10 && Config->File_Bdmv_ParseTargetedFile_Get())
1241             {
1242                 //Searching the playlist with the pid
1243                 Ztring Name=File_Name_WithoutDemux;
1244                 Name.resize(Name.size()-(4+1+6+1+4+1+10)); //Removing BDMV/STREAM/SSIF/xxxxx.ssif
1245                 ZtringList List=Dir::GetAllFileNames(Name+__T("BDMV")+PathSeparator+__T("PLAYLIST")+PathSeparator+__T("*.mpls"), Dir::Include_Files);
1246                 std::vector<MediaInfo_Internal*> MIs;
1247                 MIs.resize(List.size());
1248                 size_t FileWithRightPID_Pos=(size_t)-1;
1249                 for (size_t Pos=0; Pos<MIs.size(); Pos++)
1250                 {
1251                     MIs[Pos]=new MediaInfo_Internal();
1252                     MIs[Pos]->Option(__T("File_Bdmv_ParseTargetedFile"), __T("0"));
1253                     MIs[Pos]->Open(List[Pos]);
1254                     if (MIs[Pos]->Count_Get(Stream_Video)==1)
1255                     {
1256                         int16u pid=Ztring(MIs[Pos]->Get(Stream_Video, 0, Video_ID)).To_int16u();
1257                         if (pid==elementary_PID)
1258                         {
1259                             FileWithRightPID_Pos=Pos;
1260                             break;
1261                         }
1262                     }
1263                 }
1264 
1265                 if (FileWithRightPID_Pos!=(size_t)-1)
1266                 {
1267                     ZtringList ID_List;
1268                     ID_List.Separator_Set(0, __T(" / "));
1269                     ID_List.Write(MIs[FileWithRightPID_Pos]->Get(Stream_Video, 0, Video_ID));
1270                     if (ID_List.size()==2)
1271                     {
1272                         Complete_Stream->Streams[ID_List[1].To_int16u()]->SubStream_pid=elementary_PID;
1273                         Complete_Stream->Streams[elementary_PID]->SubStream_pid=ID_List[1].To_int16u();
1274 
1275                         elementary_PID=ID_List[1].To_int16u();
1276                         stream_type=0x1B;
1277 
1278                         bool IsAlreadyPresent=false;
1279                         for (size_t Pos=0; Pos<Complete_Stream->Streams[elementary_PID]->program_numbers.size(); Pos++)
1280                             if (Complete_Stream->Streams[elementary_PID]->program_numbers[Pos]==program_number)
1281                                 IsAlreadyPresent=true;
1282                         if (!IsAlreadyPresent)
1283                         {
1284                             complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
1285                             progItem.elementary_PIDs.push_back(elementary_PID);
1286                             Complete_Stream->Streams[elementary_PID]->program_numbers.push_back(program_number);
1287                             Complete_Stream->Streams[elementary_PID]->registration_format_identifier= progItem.registration_format_identifier;
1288                         }
1289                         if (Complete_Stream->Streams[elementary_PID]->Kind!=complete_stream::stream::pes)
1290                         {
1291                             if (Complete_Stream->Streams_NotParsedCount==(size_t)-1)
1292                                 Complete_Stream->Streams_NotParsedCount=0;
1293                             Complete_Stream->Streams_NotParsedCount++;
1294                             Complete_Stream->Streams[elementary_PID]->Kind=complete_stream::stream::pes;
1295                             Complete_Stream->Streams[elementary_PID]->stream_type=stream_type;
1296                             Complete_Stream->Streams[elementary_PID]->Searching_Payload_Start_Set(true);
1297                             #ifdef MEDIAINFO_MPEGTS_PCR_YES
1298                                 Complete_Stream->Streams[elementary_PID]->Searching_TimeStamp_Start_Set(true);
1299                                 Complete_Stream->Streams[elementary_PID]->PCR_PID=PCR_PID;
1300                             #endif //MEDIAINFO_MPEGTS_PCR_YES
1301                             #ifdef MEDIAINFO_MPEGTS_PESTIMESTAMP_YES
1302                                 //Complete_Stream->Streams[elementary_PID]->Searching_ParserTimeStamp_Start_Set(true);
1303                             #endif //MEDIAINFO_MPEGTS_PESTIMESTAMP_YES
1304                             #if MEDIAINFO_TRACE
1305                                 Complete_Stream->Streams[elementary_PID]->Element_Info1="PES";
1306                             #endif //MEDIAINFO_TRACE
1307                             #if MEDIAINFO_DUPLICATE
1308                                 if (Complete_Stream->File__Duplicate_Get_From_PID(elementary_PID))
1309                                 Complete_Stream->Streams[elementary_PID]->ShouldDuplicate=true;
1310                             #endif //MEDIAINFO_DUPLICATE
1311                         }
1312                     }
1313 
1314                 }
1315 
1316                 for (size_t Pos=0; Pos<MIs.size(); Pos++)
1317                     delete MIs[Pos]; //MIs[Pos]=NULL;
1318             }
1319             #endif //defined(MEDIAINFO_DIRECTORY_YES)
1320 
1321             if (elementary_PID)
1322             {
1323                 elementary_PID_Update(PCR_PID);
1324 
1325                 //Removing from the list of previous elementary_PIDs to remove
1326                 for (size_t Pos=0; Pos<elementary_PIDs_Previous.size(); Pos++)
1327                     if (elementary_PIDs_Previous[Pos]==elementary_PID)
1328                         elementary_PIDs_Previous.erase(elementary_PIDs_Previous.begin()+Pos);
1329             }
1330         FILLING_END();
1331 
1332         //Descriptors
1333         elementary_PID_IsValid=true;
1334         if (Descriptors_Size>0)
1335             Descriptors();
1336 
1337         Element_End1(Ztring::ToZtring_From_CC2(elementary_PID));
1338     }
1339 
1340     FILLING_BEGIN();
1341         //Removing previous elementary_PIDs no more used
1342         if (Config->File_MpegTs_RealTime_Get())
1343         {
1344             for (size_t Pos=0; Pos<elementary_PIDs_Previous.size(); Pos++)
1345             {
1346                 elementary_PID=elementary_PIDs_Previous[Pos];
1347                 elementary_PID_Remove();
1348 
1349                 Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].Update_Needed_StreamCount=true;
1350             }
1351         }
1352 
1353         #ifdef MEDIAINFO_MPEGTS_PCR_YES
1354             if (PCR_PID!=0x1FFF) //Not padding packet
1355             {
1356                 Complete_Stream->Streams[PCR_PID]->IsPCR=true;
1357                 Complete_Stream->PCR_PIDs[PCR_PID]++;
1358                 Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].PCR_PID=PCR_PID;
1359                 if (Complete_Stream->Streams[PCR_PID]->TimeStamp_Start==(int64u)-1)
1360                     Complete_Stream->Streams[PCR_PID]->Searching_TimeStamp_Start_Set(true);
1361                 #if MEDIAINFO_TRACE
1362                     if (Complete_Stream->Streams[PCR_PID]->Kind==complete_stream::stream::unknown)
1363                         Complete_Stream->Streams[PCR_PID]->Element_Info1="PCR";
1364                 #endif //MEDIAINFO_TRACE
1365             }
1366         #endif //MEDIAINFO_MPEGTS_PCR_YES
1367 
1368         //Handling ATSC/CEA/DVB
1369         if (!Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs_NotParsedCount)
1370         {
1371             //We know what is each pid, so we can try known values
1372             #ifdef MEDIAINFO_MPEGTS_ALLSTREAMS_YES
1373                 for (size_t pid=0x10; pid<0x1FFF; pid++) //Wanting 0x10-->0x2F (DVB), 0x1ABC (cea_osd), 0x1FF7-->0x1FFF (ATSC)
1374                     for (size_t Table_ID=0x00; Table_ID<0xFF; Table_ID++)
1375                     {
1376                         Complete_Stream->Streams[pid]->init(Table_ID); //event_information_section - actual_transport_stream, schedule
1377 
1378                         if (Pos==0x001F)
1379                             Pos=0x1ABB; //Skipping normal data
1380                         if (Pos==0x01ABC)
1381                             Pos=0x1FF6; //Skipping normal data
1382                     }
1383             #else //MEDIAINFO_MPEGTS_ALLSTREAMS_YES
1384                 if (Complete_Stream->Streams[0x0010]->Kind==complete_stream::stream::unknown)
1385                 {
1386                     Complete_Stream->Streams[0x0010]->init(0x40); //network_information_section - actual_network
1387                 }
1388                 if (Complete_Stream->Streams[0x0011]->Kind==complete_stream::stream::unknown)
1389                 {
1390                     Complete_Stream->Streams[0x0011]->init(0x42); //service_description_section - actual_transport_stream
1391                 }
1392                 if (Complete_Stream->Streams[0x0012]->Kind==complete_stream::stream::unknown)
1393                 {
1394                     Complete_Stream->Streams[0x0012]->init(0x4E); //event_information_section - actual_transport_stream, present/following
1395                     for (size_t Table_ID=0x50; Table_ID<0x60; Table_ID++)
1396                         Complete_Stream->Streams[0x0012]->Table_IDs[Table_ID]=new complete_stream::stream::table_id; //event_information_section - actual_transport_stream, schedule
1397                 }
1398                 if (Complete_Stream->Streams[0x0014]->Kind==complete_stream::stream::unknown)
1399                 {
1400                     Complete_Stream->Streams[0x0014]->init(0x70); //time_date_section
1401                     Complete_Stream->Streams[0x0014]->Table_IDs[0x73]=new complete_stream::stream::table_id; //time_offset_section
1402                 }
1403                 if (Complete_Stream->Streams[0x1FFB]->Kind==complete_stream::stream::unknown)
1404                 {
1405                     Complete_Stream->Streams[0x1FFB]->init(0xC7); //Master Guide Table
1406                     Complete_Stream->Streams[0x1FFB]->Table_IDs[0xCD]=new complete_stream::stream::table_id; //System Time Table
1407                 }
1408             #endif //MEDIAINFO_MPEGTS_ALLSTREAMS_YES
1409         }
1410         complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
1411         if (Buffer_Offset>=4)
1412         {
1413             progItem.ExtraInfos_Content["pointer_field"].From_Number(Buffer_Offset-4);
1414             progItem.ExtraInfos_Option["pointer_field"]=__T("N NT");
1415         }
1416         progItem.ExtraInfos_Content["section_length"].From_Number(Element_Size+4);
1417         progItem.ExtraInfos_Option["section_length"]=__T("N NT");
1418     FILLING_END();
1419 }
1420 
1421 //---------------------------------------------------------------------------
Table_03()1422 void File_Mpeg_Psi::Table_03()
1423 {
1424     //Parsing
1425     if (Element_Offset<Element_Size)
1426     {
1427         Descriptors_Size=(int16u)(Element_Size-Element_Offset);
1428         if (Descriptors_Size>0)
1429             Descriptors();
1430     }
1431 }
1432 
1433 //---------------------------------------------------------------------------
Table_40()1434 void File_Mpeg_Psi::Table_40()
1435 {
1436     if (IsATSC)
1437     {
1438         Skip_XX(Element_Size,                               "Unknown ATSC");
1439         return;
1440     }
1441 
1442     //Parsing
1443     BS_Begin();
1444     Skip_S1( 4,                                             "reserved");
1445     Get_S2 (12, Descriptors_Size,                           "network_descriptors_length");
1446     BS_End();
1447 
1448     //Descriptors
1449     if (Descriptors_Size>0)
1450         Descriptors();
1451 
1452     //Parsing
1453     int16u transport_stream_loop_length;
1454     BS_Begin();
1455     Skip_S1( 4,                                             "reserved");
1456     Get_S2 (12, transport_stream_loop_length,               "transport_stream_loop_length");
1457     BS_End();
1458 
1459     if (Element_Offset<Element_Size)
1460     {
1461         int16u original_network_id;
1462         Element_Begin0();
1463         Get_B2 (transport_stream_id,                        "transport_stream_id"); Element_Info1(transport_stream_id);
1464         Get_B2 (original_network_id,                        "original_network_id"); Param_Info1(Mpeg_Descriptors_original_network_id(original_network_id));
1465         BS_Begin();
1466         Skip_S1( 4,                                         "reserved");
1467         Get_S2 (12, Descriptors_Size,                       "transport_descriptors_length");
1468         BS_End();
1469 
1470         //Descriptors
1471         if (Descriptors_Size>0)
1472             Descriptors();
1473 
1474         Element_End0();
1475 
1476         FILLING_BEGIN();
1477             Complete_Stream->original_network_name=Mpeg_Descriptors_original_network_id(original_network_id);
1478         FILLING_END();
1479     }
1480 }
1481 
1482 //---------------------------------------------------------------------------
Table_42()1483 void File_Mpeg_Psi::Table_42()
1484 {
1485     //Parsing
1486     Skip_B2(                                                    "original_network_id");
1487     Skip_B1(                                                    "reserved_future_use");
1488     while (Element_Offset<Element_Size)
1489     {
1490         Element_Begin0();
1491         int64u Test;
1492         Peek_B5(Test);
1493         if (Test!=0xFFFFFFFFFFULL)
1494         {
1495             Get_B2 (    program_number,                         "service_id");
1496             BS_Begin();
1497             Skip_S1( 6,                                         "reserved_future_use");
1498             Skip_SB(                                            "EIT_schedule_flag");
1499             Skip_SB(                                            "EIT_present_following_flag");
1500             Info_S1( 3, running_status,                         "running_status"); Param_Info1(Mpeg_Psi_running_status[running_status]);
1501             Skip_SB(                                            "free_CA_mode");
1502             Get_S2 (12, Descriptors_Size,                       "ES_info_length");
1503             BS_End();
1504 
1505             //Descriptors
1506             program_number_IsValid=true;
1507             if (Descriptors_Size>0)
1508                 Descriptors();
1509 
1510             Element_End1(Ztring::ToZtring_From_CC2(program_number));
1511         }
1512         else
1513         {
1514             Skip_XX(Element_Size-Element_Offset,                    "Junk");
1515             Element_End1("Junk");
1516         }
1517     }
1518 }
1519 
1520 //---------------------------------------------------------------------------
Table_46()1521 void File_Mpeg_Psi::Table_46()
1522 {
1523     Table_42();
1524 }
1525 
1526 //---------------------------------------------------------------------------
Table_4E()1527 void File_Mpeg_Psi::Table_4E()
1528 {
1529     //Clearing
1530     complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension];
1531     progItem.DVB_EPG_Blocks[table_id].Events.clear();
1532     progItem.DVB_EPG_Blocks_IsUpdated=true;
1533     Complete_Stream->Programs_IsUpdated=true;
1534 
1535     //Parsing
1536     Get_B2 (transport_stream_id,                                "transport_stream_id");
1537     if (table_id==0x4E || (table_id&0xF0)==0x50) //current transport_stream_id
1538         transport_stream_id=Complete_Stream->transport_stream_id; //On the example I have, transport_stream_id is something else, what?
1539     Skip_B2(                                                    "original_network_id");
1540     Skip_B1(                                                    "segment_last_section_number");
1541     Skip_B1(                                                    "last_table_id");
1542     if (Element_Offset==Element_Size)
1543     {
1544         Element_DoNotShow(); //This is empty!
1545         return;
1546     }
1547     while (Element_Offset<Element_Size)
1548     {
1549         Element_Begin0();
1550         int32u time, duration;
1551         int16u date;
1552         int8u running_status;
1553         Get_B2 (event_id,                                       "event_id");
1554         Get_B2 (date,                                           "start_time (date)"); Param_Info1(Date_MJD(date));
1555         Get_B3 (time,                                           "start_time (time)"); Param_Info1(Time_BCD(time));
1556         Get_B3 (duration,                                       "duration"); Param_Info1(Time_BCD(duration));
1557         BS_Begin();
1558         Get_S1 ( 3, running_status,                             "running_status"); Param_Info1(Mpeg_Psi_running_status[running_status]);
1559         Skip_SB(                                                "free_CA_mode");
1560         Get_S2 (12, Descriptors_Size,                           "descriptors_loop_length");
1561         BS_End();
1562 
1563         //Descriptors
1564         event_id_IsValid=true;
1565         if (Descriptors_Size>0)
1566             Descriptors();
1567 
1568         Element_End1(Ztring::ToZtring_From_CC2(event_id));
1569 
1570         FILLING_BEGIN();
1571             complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension];
1572             complete_stream::transport_stream::program::dvb_epg_block::event& eventItem = progItem.DVB_EPG_Blocks[table_id].Events[event_id];
1573             eventItem.start_time=__T("UTC ")+Date_MJD(date)+__T(" ")+Time_BCD(time);
1574             eventItem.duration=Time_BCD(duration);
1575             if (running_status)
1576                 eventItem.running_status=Mpeg_Psi_running_status[running_status];
1577         FILLING_END();
1578     }
1579 }
1580 
1581 //---------------------------------------------------------------------------
Table_4F()1582 void File_Mpeg_Psi::Table_4F()
1583 {
1584     Table_4E();
1585 }
1586 
1587 //---------------------------------------------------------------------------
Table_5F()1588 void File_Mpeg_Psi::Table_5F()
1589 {
1590     Table_4E();
1591 }
1592 
1593 //---------------------------------------------------------------------------
Table_6F()1594 void File_Mpeg_Psi::Table_6F()
1595 {
1596     Table_4F();
1597 }
1598 
1599 //---------------------------------------------------------------------------
Table_70()1600 void File_Mpeg_Psi::Table_70()
1601 {
1602     //Parsing
1603     int32u time;
1604     int16u date;
1605     Get_B2 (date,                                               "UTC_time (date)"); Param_Info1(Date_MJD(date));
1606     Get_B3 (time,                                               "UTC_time (time)"); Param_Info1(Time_BCD(time));
1607 
1608     FILLING_BEGIN();
1609         if (Complete_Stream->Duration_Start.empty())
1610             Complete_Stream->Duration_Start=__T("UTC ")+Date_MJD(date)+__T(" ")+Time_BCD(time);
1611         Complete_Stream->Duration_End=__T("UTC ")+Date_MJD(date)+__T(" ")+Time_BCD(time);
1612         Complete_Stream->Duration_End_IsUpdated=true;
1613     FILLING_END();
1614 }
1615 
1616 //---------------------------------------------------------------------------
Table_73()1617 void File_Mpeg_Psi::Table_73()
1618 {
1619     //Parsing
1620     int32u time;
1621     int16u date;
1622     Get_B2 (date,                                               "UTC_time (date)"); Param_Info1(Date_MJD(date));
1623     Get_B3 (time,                                               "UTC_time (time)"); Param_Info1(Time_BCD(time));
1624     BS_Begin();
1625     Skip_S1( 4,                                                 "DVB_reserved_for_future_use");
1626     Get_S2 (12, Descriptors_Size,                               "transmission_info_loop_length");
1627     BS_End();
1628 
1629     //Descriptors
1630     if (Descriptors_Size>0)
1631         Descriptors();
1632 
1633     Skip_B4(                                                    "CRC32");
1634 
1635     FILLING_BEGIN();
1636         if (Complete_Stream->Duration_Start.empty())
1637             Complete_Stream->Duration_Start=__T("UTC ")+Date_MJD(date)+__T(" ")+Time_BCD(time);
1638         Complete_Stream->Duration_End=__T("UTC ")+Date_MJD(date)+__T(" ")+Time_BCD(time);
1639         Complete_Stream->Duration_End_IsUpdated=true;
1640     FILLING_END();
1641 }
1642 
1643 //---------------------------------------------------------------------------
Table_7F()1644 void File_Mpeg_Psi::Table_7F()
1645 {
1646     //Parsing
1647     BS_Begin();
1648     Skip_S1( 4,                                                 "DVB_reserved_for_future_use");
1649     Get_S2 (12, Descriptors_Size,                               "transmission_info_loop_length");
1650     BS_End();
1651 
1652     //Descriptors
1653     if (Descriptors_Size>0)
1654         Descriptors();
1655 
1656     while (Element_Offset<Element_Size)
1657     {
1658         Element_Begin0();
1659         Get_B2 (    program_number,                             "service_id");
1660         BS_Begin();
1661         Skip_SB(                                                "DVB_reserved_future_use");
1662         Info_S1( 3, running_status,                             "running_status"); Param_Info1(Mpeg_Psi_running_status[running_status]);
1663         Get_S2 (12, Descriptors_Size,                           "service_loop_length");
1664         BS_End();
1665 
1666         //Descriptors
1667         program_number_IsValid=true;
1668         if (Descriptors_Size>0)
1669             Descriptors();
1670 
1671         Element_End1(Ztring::ToZtring_From_CC2(program_number));
1672     }
1673 }
1674 
1675 //---------------------------------------------------------------------------
Table_C0()1676 void File_Mpeg_Psi::Table_C0()
1677 {
1678         //TODO
1679         Skip_XX(Element_Size-Element_Offset,                    "data");
1680 }
1681 
1682 //---------------------------------------------------------------------------
Table_C1()1683 void File_Mpeg_Psi::Table_C1()
1684 {
1685     IsATSC=true;
1686 
1687     //Parsing
1688     Ztring program_name, alternate_program_name;
1689     int8u protocol_version, program_name_length, alternate_program_name_length, package_count;
1690     BS_Begin();
1691     Skip_S1(3,                                                  "reserved");
1692     Get_S1 (5, protocol_version,                                "protocol_version");
1693     BS_End();
1694     if (protocol_version!=0)
1695     {
1696         Skip_XX(Element_Size-Element_Offset,                    "data");
1697         return;
1698     }
1699     Skip_C3(                                                    "ISO_639_language_code");
1700     Skip_B2(                                                    "program_number");
1701     Skip_B1(                                                    "reserved");
1702     Skip_B1(                                                    "sequence");
1703     Skip_B1(                                                    "program_epoch_number");
1704     BS_Begin();
1705     Skip_SB(                                                    "display_name_when_not_auth");
1706     Skip_SB(                                                    "use_alt_name_in_purchase_history");
1707     Skip_SB(                                                    "use_alt_name_if_not_auth");
1708     Skip_SB(                                                    "display_ratings");
1709     Skip_S1(4,                                                  "reserved");
1710     BS_End();
1711     Get_B1 (program_name_length,                                "program_name_length");
1712     SCTE_multilingual_text_string(program_name_length, program_name, "program_name");
1713     Get_B1 (alternate_program_name_length,                      "alternate_program_name_length");
1714     SCTE_multilingual_text_string(alternate_program_name_length, alternate_program_name, "alternate_program_name");
1715     BS_Begin();
1716     Skip_S1(3,                                                  "reserved");
1717     Get_S1 (5, package_count,                                   "package_count");
1718     BS_End();
1719     for (int8u Pos=0; Pos<package_count; Pos++)
1720     {
1721         Ztring package_name;
1722         int8u package_name_length;
1723         Get_B1 (package_name_length,                            "package_name_length");
1724         SCTE_multilingual_text_string(package_name_length, package_name, "package_name");
1725     }
1726 
1727     if (Element_Offset<Element_Size)
1728     {
1729         BS_Begin();
1730         Skip_S1( 6,                                             "reserved");
1731         Get_S2 (10, Descriptors_Size,                           "descriptors_length");
1732         BS_End();
1733 
1734         //Descriptors
1735         if (Descriptors_Size>0)
1736             Descriptors();
1737     }
1738 }
1739 
1740 //---------------------------------------------------------------------------
Table_C7()1741 void File_Mpeg_Psi::Table_C7()
1742 {
1743     //Parsing
1744     int16u tables_defined;
1745     int8u protocol_version;
1746     Get_B1 (protocol_version,                                   "protocol_version");
1747     if (protocol_version!=0)
1748     {
1749         Skip_XX(Element_Size-Element_Offset,                    "data");
1750         return;
1751     }
1752     Get_B2 (tables_defined,                                     "tables_defined");
1753     for (int16u Pos=0; Pos<tables_defined; Pos++)
1754     {
1755         int16u table_type, table_type_PID;
1756         Element_Begin0();
1757         Get_B2 (    table_type,                                 "table_type"); Param_Info1(Mpeg_Psi_ATSC_table_type(table_type));
1758         BS_Begin();
1759         Skip_S1( 3,                                             "reserved");
1760         Get_S2 (13, table_type_PID,                             "table_type_PID");
1761         Skip_S1( 3,                                             "reserved");
1762         Skip_S1( 5,                                             "table_type_version_number");
1763         BS_End();
1764         Skip_B4(                                                "number_bytes");
1765         BS_Begin();
1766         Skip_S1( 4,                                             "reserved");
1767         Get_S2 (12, Descriptors_Size,                           "table_type_descriptors_length");
1768         BS_End();
1769 
1770         //Descriptors
1771         if (Descriptors_Size>0)
1772             Descriptors();
1773 
1774         Element_Info1(Mpeg_Psi_ATSC_table_type(table_type));
1775         Element_Info1C((table_type>=0x0100), table_type%0x100);
1776         Element_End1(Ztring::ToZtring_From_CC2(table_type_PID));
1777 
1778         FILLING_BEGIN();
1779             if (Complete_Stream->Streams[table_type_PID]->Kind==complete_stream::stream::unknown && table_type!=0x0001 && table_type!=0x0003) //Not activing current_next_indicator='0'
1780             {
1781                 Complete_Stream->Streams[table_type_PID]->Searching_Payload_Start_Set(true);
1782                 Complete_Stream->Streams[table_type_PID]->Kind=complete_stream::stream::psi;
1783                 Complete_Stream->Streams[table_type_PID]->Table_IDs.resize(0x100);
1784             }
1785             #ifdef MEDIAINFO_MPEGTS_ALLSTREAMS_YES
1786                 for (int8u table_id=0x00; table_id<0xFF; table_id++)
1787                     if (Complete_Stream->Streams[table_type_PID].Table_IDs[table_id]==NULL)
1788                         Complete_Stream->Streams[table_type_PID].Table_IDs[table_id]=new complete_stream::stream::table_id; //Master Guide Table
1789             #else //MEDIAINFO_MPEGTS_ALLSTREAMS_YES
1790                 int8u table_id;
1791                      if (table_type==0x0000) //Terrestrial VCT with current_next_indicator=1
1792                     table_id=0xC8;
1793                 else if (table_type==0x0002) //Cable VCT with current_next_indicator=1
1794                     table_id=0xC9;
1795                 else if (table_type==0x0004) //Channel ETT
1796                     table_id=0xCC;
1797                 else if (table_type>=0x0100 && table_type<=0x017F) //EIT-0 to EIT-127
1798                     table_id=0xCB;
1799                 else if (table_type>=0x0200 && table_type<=0x027F) //Event ETT-0 to event ETT-127
1800                     table_id=0xCC;
1801                 else if (table_type>=0x0301 && table_type<=0x03FF) //RRT with rating_region 1-255
1802                     table_id=0xCA;
1803                 else if (table_type>=0x1000 && table_type<0x10FF) //Aggregate Event Information Table
1804                     table_id=0xD6;
1805                 else if (table_type>=0x1100 && table_type<0x11FF) //Aggregate Extended Text Table
1806                     table_id=0xD7;
1807                 else if (table_type>=0x1600 && table_type<0x16FF) //Satellite Virtual Channel Table
1808                     table_id=0xDA;
1809                 else
1810                     table_id=0xFF;
1811                 if (table_id!=0xFF && Complete_Stream->Streams[table_type_PID]->Table_IDs[table_id]==NULL)
1812                     Complete_Stream->Streams[table_type_PID]->Table_IDs[table_id]=new complete_stream::stream::table_id; //Master Guide Table
1813             #endif //MEDIAINFO_MPEGTS_ALLSTREAMS_YES
1814             Complete_Stream->Streams[table_type_PID]->table_type=table_type-((table_type&0x200)?0x100:0); //For having the same table_type for both EIT and ETT
1815         FILLING_END();
1816     }
1817     BS_Begin();
1818     Skip_S1( 4,                                                 "reserved");
1819     Get_S2 (12, Descriptors_Size,                               "descriptors_length");
1820     BS_End();
1821 
1822     //Descriptors
1823     if (Descriptors_Size>0)
1824         Descriptors();
1825 }
1826 
1827 //---------------------------------------------------------------------------
Table_C9()1828 void File_Mpeg_Psi::Table_C9()
1829 {
1830     //Parsing
1831     Ztring short_name;
1832     int8u num_channels_in_section;
1833     Skip_B1(                                                    "protocol_version");
1834     Get_B1 (    num_channels_in_section,                        "num_channels_in_section");
1835     BS_End();
1836     for (int8u Pos=0; Pos<num_channels_in_section; Pos++)
1837     {
1838         int16u major_channel_number, minor_channel_number, source_id;
1839         int8u service_type, modulation_mode;
1840         Element_Begin0();
1841         Get_UTF16B(table_id==0xDA?16:14, short_name,            "short_name"); //8 chars for satellite, else 7 chars
1842         BS_Begin();
1843         Skip_S1( 4,                                             "reserved");
1844         Get_S2 (10, major_channel_number,                       "major_channel_number");
1845         Get_S2 (10, minor_channel_number,                       "minor_channel_number");
1846         if (table_id==0xDA) //Satellite
1847         {
1848             Get_S1 ( 6, modulation_mode,                        "modulation_mode");
1849             Skip_S4(32,                                         "carrier_frequency");
1850             Skip_S4(32,                                         "carrier_symbol_rate");
1851             Skip_S1( 2,                                         "polarization");
1852             BS_End();
1853             Skip_B1(                                            "FEC_Inner");
1854         }
1855         else //Terrestrial and Cable
1856         {
1857             BS_End();
1858             Get_B1 (modulation_mode,                            "modulation_mode");
1859             Skip_B4(                                            "carrier_frequency");
1860         }
1861         Skip_B2(                                                "channel_TSID");
1862         Get_B2 (    program_number,                             "program_number");
1863         BS_Begin();
1864         Skip_S1( 2,                                             "ETM_location");
1865         Skip_SB(                                                table_id==0xDA?"reserved":"access_controlled");
1866         Skip_SB(                                                "hidden");
1867         if (table_id==0xC8) //Terrestrial
1868         {
1869             Skip_SB(                                            "path_select");
1870             Skip_SB(                                            "out_of_band");
1871         }
1872         else //Cable and satellite
1873             Skip_S1( 2,                                         "reserved");
1874         Skip_SB(                                                "hide_guide");
1875         Skip_S1( 3,                                             "reserved");
1876         Get_S1 ( 6, service_type,                               "service_type");
1877         BS_End();
1878         Get_B2 (    source_id,                                  "source_id");
1879         if (table_id==0xDA) //Satellite
1880             Skip_B1(                                            "feed_id");
1881         BS_Begin();
1882         Skip_S1( 6,                                             "reserved");
1883         Get_S2 (10, Descriptors_Size,                           "descriptors_length");
1884         BS_End();
1885 
1886         FILLING_BEGIN();
1887             if (!Config->File_MpegTs_Atsc_transport_stream_id_Trust_Get())
1888                 table_id_extension=Complete_Stream->transport_stream_id;
1889             Ztring Channel=Ztring::ToZtring(major_channel_number);
1890             if (minor_channel_number)
1891                 Channel+=__T("-")+Ztring::ToZtring(minor_channel_number);
1892             if (minor_channel_number==0 || program_number==0xFFFF)
1893             {
1894                 Complete_Stream->Transport_Streams[table_id_extension].Infos["ServiceName"]=short_name;
1895                 Complete_Stream->Transport_Streams[table_id_extension].Infos["ServiceChannel"]=Channel;
1896                 Complete_Stream->Transport_Streams[table_id_extension].Infos["ServiceType"]=Mpeg_Psi_atsc_service_type(service_type);
1897                 Complete_Stream->Transport_Streams[table_id_extension].source_id=source_id;
1898                 Complete_Stream->Transport_Streams[table_id_extension].source_id_IsValid=true;
1899             }
1900             else if (program_number<0x2000)
1901             {
1902                 Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].Infos["ServiceName"]=short_name;
1903                 Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].Infos["ServiceChannel"]=Channel;
1904                 Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].Infos["ServiceType"]=Mpeg_Psi_atsc_service_type(service_type);
1905                 Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].source_id=source_id;
1906                 Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].source_id_IsValid=true;
1907             }
1908             if (modulation_mode)
1909                 Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].Infos["ModulationMode"].From_UTF8(Mpeg_Psi_atsc_modulation_mode(modulation_mode).c_str());
1910         FILLING_END();
1911 
1912         //Descriptors
1913         program_number_IsValid=true;
1914         if (Descriptors_Size>0)
1915             Descriptors();
1916 
1917         Element_End1(Ztring::ToZtring_From_CC2(program_number));
1918     }
1919 
1920     BS_Begin();
1921     Skip_S1( 6,                                             "reserved");
1922     Get_S2 (10, Descriptors_Size,                           "additional_descriptors_length");
1923     BS_End();
1924 
1925     //Descriptors
1926     if (Descriptors_Size>0)
1927         Descriptors();
1928 }
1929 
1930 //---------------------------------------------------------------------------
Table_CA()1931 void File_Mpeg_Psi::Table_CA()
1932 {
1933     //Parsing
1934     Ztring rating_region_name;
1935     int8u dimensions_defined;
1936     Skip_B1(                                                    "protocol_version");
1937     Skip_B1(                                                    "rating_region_name_length"); //Not used
1938     ATSC_multiple_string_structure(rating_region_name,          "rating_region_name");
1939     Get_B1 (    dimensions_defined,                             "dimensions_defined");
1940     BS_End();
1941     for (int8u dimension_Pos=0; dimension_Pos<dimensions_defined; dimension_Pos++)
1942     {
1943         Element_Begin1("dimension");
1944         Ztring dimension_name;
1945         int8u values_defined;
1946         Skip_B1(                                                "dimension_name_length"); //Not used
1947         ATSC_multiple_string_structure(dimension_name,          "dimension_name");  Element_Info1(dimension_name);
1948         BS_Begin();
1949         Skip_S1( 3,                                             "reserved");
1950         Skip_SB(                                                "graduated_scale");
1951         Get_S1 ( 4, values_defined,                             "values_defined");
1952         BS_End();
1953         for (int8u value_Pos=0; value_Pos<values_defined; value_Pos++)
1954         {
1955             Element_Begin1("value");
1956             Ztring abbrev_rating_value, rating_value;
1957             Skip_B1(                                            "abbrev_rating_value_length"); //Not used
1958             ATSC_multiple_string_structure(abbrev_rating_value, "abbrev_rating_value");  Element_Info1(abbrev_rating_value);
1959             Skip_B1(                                            "rating_value_length"); //Not used
1960             ATSC_multiple_string_structure(rating_value,        "rating_value"); Element_Info1(rating_value);
1961             Element_End0();
1962         }
1963             Element_End0();
1964     }
1965 
1966     BS_Begin();
1967     Skip_S1( 6,                                             "reserved");
1968     Get_S2 (10, Descriptors_Size,                           "descriptors_length");
1969     BS_End();
1970 
1971     //Descriptors
1972     if (Descriptors_Size>0)
1973         Descriptors();
1974 }
1975 
1976 //---------------------------------------------------------------------------
Table_CB()1977 void File_Mpeg_Psi::Table_CB()
1978 {
1979     //Clear
1980     Complete_Stream->Sources[table_id_extension].ATSC_EPG_Blocks[table_id].Events.clear();
1981     Complete_Stream->Sources[table_id_extension].ATSC_EPG_Blocks_IsUpdated=true;
1982     Status[IsUpdated]=true;
1983 
1984     //Parsing
1985     int8u num_events_in_section;
1986     if (table_id==0xCB) //EIT (not A-EIT)
1987         Skip_B1(                                                "protocol_version");
1988     Get_B1 (    num_events_in_section,                          "num_events_in_section");
1989     BS_End();
1990     for (int8u Pos=0; Pos<num_events_in_section; Pos++)
1991     {
1992         Ztring title;
1993         int32u start_time, length_in_seconds;
1994         Element_Begin0();
1995         BS_Begin();
1996         Skip_SB(                                                table_id==0xD9?"off_air":"reserved");
1997         Skip_SB(                                                "reserved");
1998         Get_S2 (14, event_id,                                   "event_id");
1999         BS_End();
2000         Get_B4 (    start_time,                                 "start_time"); Param_Info1(Ztring().Date_From_Seconds_1970(start_time+315964800)); Element_Info1(Ztring().Date_From_Seconds_1970(start_time+315964800-Complete_Stream->GPS_UTC_offset)); //UTC 1980-01-06 00:00:00
2001         BS_Begin();
2002         Skip_S1( 2,                                             "reserved");
2003         Skip_S1( 2,                                             table_id==0xCB?"ETM_location":"reserved");
2004         Get_S3 (20, length_in_seconds,                          "length_in_seconds");
2005         BS_End();
2006         Skip_B1 (                                               "title_length"); //We don't use it for verification
2007         ATSC_multiple_string_structure(title,                   "title");
2008         BS_Begin();
2009         Skip_S1( 6,                                             "reserved");
2010         Get_S2 (10, Descriptors_Size,                           "descriptors_length");
2011         BS_End();
2012 
2013         //Descriptors
2014         event_id_IsValid=true;
2015         if (Descriptors_Size>0)
2016             Descriptors();
2017 
2018         Element_End1(Ztring::ToZtring_From_CC2(event_id));
2019 
2020         FILLING_BEGIN();
2021             Complete_Stream->Sources[table_id_extension].ATSC_EPG_Blocks[Complete_Stream->Streams[pid]->table_type].Events[event_id].start_time=start_time;
2022             Ztring duration =(length_in_seconds<36000?__T("0"):__T(""))+Ztring::ToZtring(length_in_seconds/3600)+__T(":");
2023             length_in_seconds%=3600;
2024                    duration+=(length_in_seconds<  600?__T("0"):__T(""))+Ztring::ToZtring(length_in_seconds/  60)+__T(":");
2025             length_in_seconds%=60;
2026                    duration+=(length_in_seconds<   10?__T("0"):__T(""))+Ztring::ToZtring(length_in_seconds     );
2027             Complete_Stream->Sources[table_id_extension].ATSC_EPG_Blocks[Complete_Stream->Streams[pid]->table_type].Events[event_id].duration=duration;
2028             Complete_Stream->Sources[table_id_extension].ATSC_EPG_Blocks[Complete_Stream->Streams[pid]->table_type].Events[event_id].title=title;
2029         FILLING_END();
2030     }
2031 }
2032 
2033 //---------------------------------------------------------------------------
Table_CC()2034 void File_Mpeg_Psi::Table_CC()
2035 {
2036     //Parsing
2037     Ztring extended_text_message;
2038     int16u source_id, event_id;
2039     Skip_B1(                                                    "protocol_version");
2040     Element_Begin1("ETM_id");
2041         Get_B2 (    source_id,                                  "source_id");
2042         BS_Begin();
2043         Get_S2 (14, event_id,                                   "event_id");
2044         Skip_S1( 2,                                             "lsb");
2045         BS_End();
2046     Element_End0();
2047     ATSC_multiple_string_structure(extended_text_message,       "extended_text_message");
2048 
2049     FILLING_BEGIN();
2050         if (Complete_Stream->Streams[pid]->table_type==4)
2051             Complete_Stream->Sources[source_id].texts[table_id_extension]=extended_text_message;
2052         else
2053         {
2054             Complete_Stream->Sources[source_id].ATSC_EPG_Blocks[Complete_Stream->Streams[pid]->table_type].Events[event_id].texts[table_id_extension]=extended_text_message;
2055             Complete_Stream->Sources[source_id].ATSC_EPG_Blocks_IsUpdated=true;
2056             Complete_Stream->Sources_IsUpdated=true;
2057         }
2058     FILLING_END();
2059 }
2060 
2061 //---------------------------------------------------------------------------
Table_CD()2062 void File_Mpeg_Psi::Table_CD()
2063 {
2064     //Parsing
2065     int32u system_time;
2066     int8u  GPS_UTC_offset;
2067     Skip_B1(                                                    "protocol_version");
2068     Get_B4 (system_time,                                        "system_time"); Param_Info1(Ztring().Date_From_Seconds_1970(system_time+315964800)); //UTC 1980-01-06 00:00:00
2069     Get_B1 (GPS_UTC_offset,                                     "GPS_UTC_offset");
2070     Element_Begin1("daylight_savings");
2071         BS_Begin();
2072         Skip_SB(                                                "DS_status");
2073         Skip_SB(                                                "Reserved");
2074         Skip_SB(                                                "Reserved");
2075         Skip_S1(5,                                              "DS_day_of_month");
2076         BS_End();
2077         Skip_B1(                                                "DS_hour");
2078     Element_End0();
2079 
2080     //Descriptors
2081     Descriptors_Size=(int16u)(Element_Size-Element_Offset);
2082     if (Descriptors_Size>0)
2083         Descriptors();
2084 
2085     FILLING_BEGIN();
2086         if (Complete_Stream->Duration_Start.empty())
2087             Complete_Stream->Duration_Start=Ztring().Date_From_Seconds_1970(system_time+315964800-GPS_UTC_offset);
2088         Complete_Stream->Duration_End=Ztring().Date_From_Seconds_1970(system_time+315964800-GPS_UTC_offset);
2089         Complete_Stream->Duration_End_IsUpdated=true;
2090         Complete_Stream->GPS_UTC_offset=GPS_UTC_offset;
2091     FILLING_END();
2092 }
2093 
2094 //---------------------------------------------------------------------------
Table_D6()2095 void File_Mpeg_Psi::Table_D6()
2096 {
2097     //Parsing
2098     if ((table_id_extension&0xFF00)==0x0000)
2099     {
2100         int8u num_sources_in_section;
2101         Get_B1 (    num_sources_in_section,                     "num_sources_in_section");
2102         for (int8u Pos=0; Pos<num_sources_in_section; Pos++)
2103         {
2104             Get_B2 (table_id_extension,                         "source_id");
2105             Table_CB();
2106         }
2107     }
2108     else
2109         Skip_XX(Element_Size,                                   "reserved");
2110 }
2111 
2112 //---------------------------------------------------------------------------
Table_FC()2113 void File_Mpeg_Psi::Table_FC()
2114 {
2115     //Parsing
2116     int16u splice_command_length;
2117     int8u splice_command_type;
2118     bool encrypted_packet;
2119     Skip_B1(                                                    "protocol_version");
2120     BS_Begin();
2121     Get_SB (    encrypted_packet,                               "encrypted_packet");
2122     Skip_S1( 6,                                                 "encryption_algorithm");
2123     Skip_S5(33,                                                 "pts_adjustment");
2124     Skip_S1( 8,                                                 "cw_index");
2125     Skip_S2(12,                                                 "reserved");
2126     Get_S2 (12, splice_command_length,                          "splice_command_length");
2127     if (splice_command_length==0xFFF)
2128         splice_command_length=(int16u)(Element_Size-4-Element_Offset);
2129     Get_S1 ( 8, splice_command_type,                            "splice_command_type"); Param_Info1(Mpeg_Psi_splice_command_type(splice_command_type));
2130     BS_End();
2131 
2132     Element_Begin0();
2133     #undef ELEMENT_CASE
2134     #define ELEMENT_CASE(_NAME, _DETAIL) \
2135         case 0x##_NAME : Element_Name(_DETAIL); Table_FC_##_NAME(); break;
2136     switch (splice_command_type)
2137     {
2138         ELEMENT_CASE (00, "splice_null");
2139         ELEMENT_CASE (04, "splice_schedule");
2140         ELEMENT_CASE (05, "splice_insert");
2141         ELEMENT_CASE (06, "time_signal");
2142         ELEMENT_CASE (07, "bandwidth_reservation");
2143         default   : Skip_XX(splice_command_length,              "Unknown");
2144     }
2145     Element_End0();
2146 
2147     if (Element_Offset+4<Element_Size)
2148     {
2149         Get_B2 (Descriptors_Size,                               "descriptor_loop_length");
2150         transport_stream_id=Complete_Stream->transport_stream_id; //SCTE 35 is automaticly linked to the current transport_stream_id
2151         if (Descriptors_Size>0)
2152             Descriptors();
2153     }
2154 
2155     if (Element_Offset+4<Element_Size)
2156         Skip_XX(Element_Size-(Element_Offset+4),                "alignment_stuffing");
2157     if (encrypted_packet)
2158         Skip_B4(                                                "E_CRC_32");
2159     Skip_B4(                                                    "CRC32");
2160 }
2161 
2162 //---------------------------------------------------------------------------
Table_FC_00()2163 void File_Mpeg_Psi::Table_FC_00()
2164 {
2165     //Null
2166 }
2167 
2168 //---------------------------------------------------------------------------
Table_FC_04()2169 void File_Mpeg_Psi::Table_FC_04()
2170 {
2171     //TODO
2172 }
2173 
2174 //---------------------------------------------------------------------------
Table_FC_05()2175 void File_Mpeg_Psi::Table_FC_05()
2176 {
2177     //Parsing
2178     bool splice_event_cancel_indicator;
2179     Skip_B4(                                                    "splice_event_id");
2180     BS_Begin();
2181     Get_SB (    splice_event_cancel_indicator,                  "splice_event_cancel_indicator");
2182     Skip_S1( 7,                                                 "reserved");
2183     BS_End();
2184     if (!splice_event_cancel_indicator)
2185     {
2186         bool program_splice_flag, duration_flag, splice_immediate_flag;
2187         BS_Begin();
2188         Skip_SB(                                                "out_of_network_indicator");
2189         Get_SB (    program_splice_flag,                        "program_splice_flag");
2190         Get_SB (    duration_flag,                              "duration_flag");
2191         Get_SB (    splice_immediate_flag,                      "splice_immediate_flag");
2192         Skip_S1( 4,                                             "reserved");
2193         BS_End();
2194         if(program_splice_flag && !splice_immediate_flag)
2195             Table_FC_05_splice_time();
2196         if (!program_splice_flag)
2197         {
2198             int8u component_count;
2199             Get_B1(component_count,                             "component_count");
2200             for (int8u component=0; component<component_count; component++)
2201             {
2202                 Skip_B1(                                        "component_tag");
2203                 Table_FC_05_splice_time();
2204             }
2205         }
2206         if(duration_flag)
2207             Table_FC_05_break_duration();
2208         Skip_B2(                                                "unique_program_id");
2209         Skip_B1(                                                "avail_num");
2210         Skip_B1(                                                "avails_expected");
2211     }
2212 }
2213 
2214 //---------------------------------------------------------------------------
Table_FC_05_break_duration()2215 void File_Mpeg_Psi::Table_FC_05_break_duration()
2216 {
2217     Element_Begin1("break_duration");
2218 
2219     //Parsing
2220     BS_Begin();
2221     Skip_SB(                                                    "auto_return");
2222     Skip_S1( 6,                                                 "reserved");
2223     Skip_S5(33,                                                 "duration");
2224     BS_End();
2225 
2226     Element_End0();
2227 }
2228 
2229 //---------------------------------------------------------------------------
Table_FC_05_splice_time()2230 void File_Mpeg_Psi::Table_FC_05_splice_time()
2231 {
2232     Element_Begin1("splice_time");
2233 
2234     //Parsing
2235     bool time_specified_flag;
2236     BS_Begin();
2237     Get_SB (    time_specified_flag,                            "time_specified_flag");
2238     if (time_specified_flag)
2239     {
2240         Skip_S1( 6,                                             "reserved");
2241         Skip_S5(33,                                             "pts_time");
2242 
2243     }
2244     else
2245         Skip_S5(7,                                              "reserved");
2246     BS_End();
2247 
2248    Element_End0();
2249 }
2250 
2251 //---------------------------------------------------------------------------
Table_FC_06()2252 void File_Mpeg_Psi::Table_FC_06()
2253 {
2254     Table_FC_05_splice_time();
2255 }
2256 
2257 //---------------------------------------------------------------------------
Table_FC_07()2258 void File_Mpeg_Psi::Table_FC_07()
2259 {
2260     //TODO
2261 }
2262 
2263 //***************************************************************************
2264 // Helpers
2265 //***************************************************************************
2266 
2267 //---------------------------------------------------------------------------
Descriptors()2268 void File_Mpeg_Psi::Descriptors()
2269 {
2270     if (Element_Offset+Descriptors_Size>Element_Size)
2271     {
2272         Trusted_IsNot("Descriptor size too big");
2273         return;
2274     }
2275 
2276     //Configuring
2277     File_Mpeg_Descriptors Descriptors;
2278     Descriptors.Complete_Stream=Complete_Stream;
2279     Descriptors.transport_stream_id=transport_stream_id;
2280     Descriptors.pid=pid;
2281     Descriptors.table_id=table_id;
2282     Descriptors.table_id_extension=table_id_extension;
2283     Descriptors.elementary_PID=elementary_PID;
2284     Descriptors.program_number=program_number;
2285     Descriptors.stream_type=stream_type;
2286     Descriptors.event_id=event_id;
2287     Descriptors.elementary_PID_IsValid=elementary_PID_IsValid;
2288     Descriptors.program_number_IsValid=program_number_IsValid;
2289     Descriptors.stream_type_IsValid=stream_type_IsValid;
2290     Descriptors.event_id_IsValid=event_id_IsValid;
2291 
2292     //Parsing
2293     if (Descriptors_Size!=0)
2294     {
2295         Element_Begin1("Descriptors");
2296         Open_Buffer_Init(&Descriptors);
2297         Open_Buffer_Continue(&Descriptors, Descriptors_Size);
2298         Element_End0();
2299     }
2300 
2301     //Configuring
2302     elementary_PID_IsValid=false;
2303     program_number_IsValid=false;
2304     stream_type_IsValid=false;
2305     event_id_IsValid=false;
2306 }
2307 
2308 //---------------------------------------------------------------------------
ATSC_multiple_string_structure(Ztring & Value,const char * Name)2309 void File_Mpeg_Psi::ATSC_multiple_string_structure(Ztring &Value, const char* Name)
2310 {
2311     //Parsing
2312     Ztring string;
2313     int8u number_strings, number_segments;
2314     Element_Begin1(Name);
2315     Get_B1(number_strings,                                      "number_strings");
2316     for (int8u string_Pos=0; string_Pos<number_strings; string_Pos++)
2317     {
2318         Element_Begin1("String");
2319         int32u ISO_639_language_code;
2320         Get_C3(ISO_639_language_code,                           "ISO_639_language_code");
2321         Get_B1(number_segments,                                 "number_segments");
2322         for (int8u segment_Pos=0; segment_Pos<number_segments; segment_Pos++)
2323         {
2324             Element_Begin1("Segment");
2325             Ztring segment;
2326             int8u compression_type, mode, number_bytes;
2327             Get_B1 (compression_type,                           "compression_type");
2328             Get_B1 (mode,                                       "mode");
2329             Get_B1 (number_bytes,                               "number_bytes");
2330             switch (compression_type)
2331             {
2332                 case 0x00 :
2333                             switch (mode)
2334                             {
2335                                 case 0x00 : Get_UTF8(number_bytes, segment, "string"); break;
2336                                 case 0x3F : Get_UTF16B(number_bytes, segment, "string"); break;
2337                                 default   : Skip_XX(number_bytes, "Unknown");
2338                                             segment=__T("(Encoded with mode=0x")+Ztring::ToZtring(mode, 16)+__T(')');
2339                             }
2340                             break;
2341                 default   : Skip_XX(number_bytes,               "(Compressed)");
2342                             segment=__T("(Compressed)");
2343             }
2344             Element_End0();
2345 
2346             FILLING_BEGIN();
2347                 if (segment.find_first_not_of(__T("\t\n "))!=std::string::npos)
2348                     string+=segment+__T(" - ");
2349             FILLING_END();
2350         }
2351 
2352         FILLING_BEGIN();
2353             if (!string.empty())
2354                 string.resize(string.size()-3);
2355             Ztring ISO_639_2=Ztring().From_CC3(ISO_639_language_code);
2356             const Ztring& ISO_639_1=MediaInfoLib::Config.Iso639_1_Get(ISO_639_2);
2357             Value+=(ISO_639_1.empty()?ISO_639_2:ISO_639_1)+__T(':')+string+__T(" - ");
2358         FILLING_END();
2359 
2360         Element_Info1(string);
2361         Element_End1("String");
2362     }
2363 
2364     if (!Value.empty())
2365         Value.resize(Value.size()-3);
2366 
2367     Element_Info1(Value);
2368     Element_End0();
2369 }
2370 
2371 //---------------------------------------------------------------------------
SCTE_multilingual_text_string(int8u Size,Ztring & Value,const char * Name)2372 void File_Mpeg_Psi::SCTE_multilingual_text_string(int8u Size, Ztring &Value, const char* Name)
2373 {
2374     //Parsing
2375     Element_Begin1(Name);
2376     int64u End=Element_Offset+Size;
2377     while (Element_Offset<End)
2378     {
2379         int8u mode;
2380         Get_B1 (mode,                                           "mode");
2381         if (mode<0x3F)
2382         {
2383             int8u eightbit_string_length;
2384             Get_B1 (eightbit_string_length,                     "eightbit_string_length");
2385             if (mode==0)
2386                 Get_ISO_8859_1(eightbit_string_length, Value,   "eightbit_string");
2387             else
2388                 Skip_XX(eightbit_string_length,                 "eightbit_string (unsupporeted)");
2389         }
2390         else if (mode==0x3F)
2391         {
2392             int8u sixteenbit_string_length;
2393             Get_B1 (sixteenbit_string_length,                   "sixteenbit_string_length");
2394             Get_UTF16B(sixteenbit_string_length, Value,         "sixteenbit_string");
2395         }
2396         else if (mode>=0xA0)
2397         {
2398             int8u format_effector_param_length;
2399             Get_B1 (format_effector_param_length,               "format_effector_param_length");
2400             Skip_XX(format_effector_param_length,               "format_effector_data");
2401         }
2402     }
2403     Element_End0();
2404 }
2405 
2406 //***************************************************************************
2407 // Helpers
2408 //***************************************************************************
2409 
2410 //---------------------------------------------------------------------------
program_number_Update()2411 void File_Mpeg_Psi::program_number_Update()
2412 {
2413     //Setting the pid as program_map_section
2414     if (Complete_Stream->Streams[elementary_PID]->Kind!=complete_stream::stream::psi)
2415     {
2416         Complete_Stream->Streams[elementary_PID]->Searching_Payload_Start_Set(true);
2417         Complete_Stream->Streams[elementary_PID]->Kind=complete_stream::stream::psi;
2418         Complete_Stream->Streams[elementary_PID]->Table_IDs.resize(0x100);
2419         if (program_number)
2420             Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]=new complete_stream::stream::table_id; //program_map_section
2421     }
2422     #if MEDIAINFO_DUPLICATE
2423     if (Complete_Stream->File__Duplicate_Get_From_PID(elementary_PID))
2424         Complete_Stream->Streams[elementary_PID]->ShouldDuplicate=true;
2425     #endif //MEDIAINFO_DUPLICATE
2426 
2427     //Handling a program
2428     if (program_number)
2429     {
2430         Complete_Stream->Transport_Streams[table_id_extension].Programs_NotParsedCount++;
2431         Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].pid=elementary_PID;
2432         Complete_Stream->Transport_Streams[table_id_extension].programs_List.push_back(program_number);
2433         if (Complete_Stream->Streams.size()<0x2000)
2434             Complete_Stream->Streams.resize(0x2000); //TODO: find the reason this code is called
2435         Complete_Stream->Streams[elementary_PID]->program_numbers.push_back(program_number);
2436         if (Complete_Stream->Streams[elementary_PID]->Table_IDs.size()<0x100)
2437             Complete_Stream->Streams[elementary_PID]->Table_IDs.resize(0x100); //TODO: find the reason this code is called
2438         if (Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]==NULL)
2439             Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]=new complete_stream::stream::table_id; //TODO: find the reason this code is called
2440         if (Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]->Table_ID_Extensions.find(program_number)==Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]->Table_ID_Extensions.end())
2441         {
2442             Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]->Table_ID_Extensions_CanAdd=false;
2443             Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]->Table_ID_Extensions[program_number].version_number=0xFF;
2444             Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]->Table_ID_Extensions[program_number].Section_Numbers.clear();
2445             Complete_Stream->Streams[elementary_PID]->Table_IDs[0x02]->Table_ID_Extensions[program_number].Section_Numbers.resize(0x100);
2446         }
2447     }
2448 
2449     //Handling a network except basic version
2450     else if (Complete_Stream->Streams[elementary_PID]->Table_IDs[0x00]==NULL)
2451     {
2452         for (size_t Table_ID=1; Table_ID<0x100; Table_ID++)
2453         {
2454             if (Complete_Stream->Streams[elementary_PID]->Table_IDs[Table_ID]==NULL)
2455                 Complete_Stream->Streams[elementary_PID]->Table_IDs[Table_ID]=new complete_stream::stream::table_id; //all
2456 
2457             if (Table_ID==1)
2458                 Table_ID++; //Skipping TableID 2
2459         }
2460     }
2461 }
2462 
2463 //---------------------------------------------------------------------------
program_number_Remove()2464 void File_Mpeg_Psi::program_number_Remove()
2465 {
2466     //Removing this program_number from the list of program_numbers for each elementary_PID
2467     complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
2468     for (size_t Pos=0; Pos<progItem.elementary_PIDs.size(); Pos++)
2469     {
2470         const int16u elementary_PID_Temp= progItem.elementary_PIDs[Pos];
2471 
2472         //Removing this program_number from the list of program_numbers for this elementary_PID
2473         for (size_t Pos=0; Pos<Complete_Stream->Streams[elementary_PID_Temp]->program_numbers.size(); Pos++)
2474             if (Complete_Stream->Streams[elementary_PID_Temp]->program_numbers[Pos]==program_number)
2475                 Complete_Stream->Streams[elementary_PID_Temp]->program_numbers.erase(Complete_Stream->Streams[elementary_PID_Temp]->program_numbers.begin()+Pos);
2476 
2477         //Removing parser if no more program_number
2478         if (Complete_Stream->Streams[elementary_PID_Temp]->program_numbers.empty())
2479         {
2480             stream_t StreamKind=Complete_Stream->Streams[elementary_PID_Temp]->StreamKind;
2481             size_t StreamPos=Complete_Stream->Streams[elementary_PID_Temp]->StreamPos;
2482             if (StreamKind!=Stream_Max && StreamPos!=(size_t)-1)
2483                 Complete_Stream->StreamPos_ToRemove[StreamKind].push_back(StreamPos);
2484 
2485             if (Complete_Stream->Streams_NotParsedCount!=(size_t)-1 && Complete_Stream->Streams_NotParsedCount && !Complete_Stream->Streams[elementary_PID_Temp]->IsParsed)
2486                 Complete_Stream->Streams_NotParsedCount--; //Not parsed, and no need to parse it now
2487             delete Complete_Stream->Streams[elementary_PID_Temp]; Complete_Stream->Streams[elementary_PID_Temp]=new complete_stream::stream;
2488         }
2489     }
2490 
2491     //Removing related PCR
2492     std::map<int16u, int16u>::iterator PCR_PID=Complete_Stream->PCR_PIDs.find(Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].PCR_PID);
2493     if (PCR_PID!=Complete_Stream->PCR_PIDs.end())
2494     {
2495         PCR_PID->second--;
2496         if (PCR_PID->second==0)
2497             Complete_Stream->PCR_PIDs.erase(PCR_PID);
2498     }
2499 
2500     //Removing program_number
2501     size_t StreamPos= progItem.StreamPos;
2502     if (StreamPos!=(size_t)-1)
2503     {
2504         Complete_Stream->StreamPos_ToRemove[Stream_Menu].push_back(StreamPos);
2505         progItem.StreamPos=(size_t)-1;
2506     }
2507     const int16u program_number_pid= progItem.pid;
2508     if (program_number_pid)
2509     {
2510         for (size_t Pos=0; Pos<Complete_Stream->Streams[program_number_pid]->program_numbers.size(); Pos++)
2511             if (Complete_Stream->Streams[program_number_pid]->program_numbers[Pos]==program_number)
2512                 Complete_Stream->Streams[program_number_pid]->program_numbers.erase(Complete_Stream->Streams[program_number_pid]->program_numbers.begin()+Pos);
2513         if (Complete_Stream->Streams[program_number_pid]->Table_IDs[0x02])
2514             Complete_Stream->Streams[program_number_pid]->Table_IDs[0x02]->Table_ID_Extensions.erase(program_number);
2515     }
2516     Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs.erase(program_number);
2517 }
2518 
2519 //---------------------------------------------------------------------------
elementary_PID_Update(int16u PCR_PID)2520 void File_Mpeg_Psi::elementary_PID_Update(int16u PCR_PID)
2521 {
2522     if (Complete_Stream->Streams[elementary_PID]->Kind==complete_stream::stream::psi)
2523     {
2524         //A PID can not be PSI and PES at the same time
2525         return;
2526     }
2527 
2528     //stream_type
2529     if (stream_type!=Complete_Stream->Streams[elementary_PID]->stream_type && Complete_Stream->Streams[elementary_PID]->stream_type!=(int8u)-1)
2530     {
2531         if (Complete_Stream->Streams_NotParsedCount!=(size_t)-1 && Complete_Stream->Streams_NotParsedCount && !Complete_Stream->Streams[elementary_PID]->IsParsed)
2532             Complete_Stream->Streams_NotParsedCount--; //Not parsed, and no need to parse it now
2533         delete Complete_Stream->Streams[elementary_PID]; Complete_Stream->Streams[elementary_PID]=new complete_stream::stream;
2534         Complete_Stream->Streams[elementary_PID]->Kind=complete_stream::stream::unknown;
2535     }
2536     if (Complete_Stream->Streams[elementary_PID]->Kind!=complete_stream::stream::pes)
2537     {
2538         delete Complete_Stream->Streams[elementary_PID]; Complete_Stream->Streams[elementary_PID]=new complete_stream::stream;
2539 
2540         if (Complete_Stream->Streams_NotParsedCount==(size_t)-1)
2541             Complete_Stream->Streams_NotParsedCount=0;
2542         Complete_Stream->Streams_NotParsedCount++;
2543         complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension];
2544         if (stream_type==0x86 && progItem.registration_format_identifier==Elements::CUEI)
2545         {
2546             progItem.HasNotDisplayableStreams=true;
2547             Complete_Stream->Streams[elementary_PID]->Kind=complete_stream::stream::psi;
2548             Complete_Stream->Streams[elementary_PID]->Table_IDs.resize(0x100);
2549             Complete_Stream->Streams[elementary_PID]->Table_IDs[0xFC]=new complete_stream::stream::table_id; //Splice
2550             if (progItem.Scte35==NULL)
2551             {
2552                 progItem.Scte35=new complete_stream::transport_stream::program::scte35;
2553                 progItem.Scte35->pid=elementary_PID;
2554             }
2555             #if MEDIAINFO_TRACE
2556                 Complete_Stream->Streams[elementary_PID]->Element_Info1="PSI";
2557             #endif //MEDIAINFO_TRACE
2558         }
2559         else
2560         {
2561             Complete_Stream->Streams[elementary_PID]->Kind=complete_stream::stream::pes;
2562             Complete_Stream->Streams[elementary_PID]->Infos["CodecID"].From_Number(stream_type);
2563             #if MEDIAINFO_TRACE
2564                 Complete_Stream->Streams[elementary_PID]->Element_Info1="PES";
2565             #endif //MEDIAINFO_TRACE
2566         }
2567         Complete_Stream->Streams[elementary_PID]->stream_type=stream_type;
2568         Complete_Stream->Streams[elementary_PID]->Searching_Payload_Start_Set(true);
2569         #ifdef MEDIAINFO_MPEGTS_PCR_YES
2570             Complete_Stream->Streams[elementary_PID]->Searching_TimeStamp_Start_Set(true);
2571             Complete_Stream->Streams[elementary_PID]->PCR_PID=PCR_PID;
2572         #endif //MEDIAINFO_MPEGTS_PCR_YES
2573         #ifdef MEDIAINFO_MPEGTS_PESTIMESTAMP_YES
2574             //Complete_Stream->Streams[elementary_PID]->Searching_ParserTimeStamp_Start_Set(true);
2575         #endif //MEDIAINFO_MPEGTS_PESTIMESTAMP_YES
2576         #if MEDIAINFO_DUPLICATE
2577         if (Complete_Stream->File__Duplicate_Get_From_PID(elementary_PID))
2578             Complete_Stream->Streams[elementary_PID]->ShouldDuplicate=true;
2579         #endif //MEDIAINFO_DUPLICATE
2580     }
2581 
2582     //Program information
2583     bool IsAlreadyPresent=false;
2584     for (size_t Pos=0; Pos<Complete_Stream->Streams[elementary_PID]->program_numbers.size(); Pos++)
2585         if (Complete_Stream->Streams[elementary_PID]->program_numbers[Pos]==program_number)
2586             IsAlreadyPresent=true;
2587     if (!IsAlreadyPresent)
2588     {
2589         complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
2590         progItem.elementary_PIDs.push_back(elementary_PID);
2591         Complete_Stream->Streams[elementary_PID]->program_numbers.push_back(program_number);
2592         if (ForceStreamDisplay || (progItem.registration_format_identifier==Elements::HDMV && Complete_Stream->Streams[elementary_PID]->stream_type==0x90)) //Testing if forcing display of all streams or if it is a PGS from Blu-ray
2593             Complete_Stream->PES_PIDs.insert(elementary_PID); //Adding it for sure
2594     }
2595 }
2596 
2597 //---------------------------------------------------------------------------
elementary_PID_Remove()2598 void File_Mpeg_Psi::elementary_PID_Remove()
2599 {
2600     //Removing this elementary_PID from the list of elementary_PIDs for this program_number
2601     complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
2602     for (size_t Pos=0; Pos<progItem.elementary_PIDs.size(); Pos++)
2603         if (progItem.elementary_PIDs[Pos]==elementary_PID)
2604             progItem.elementary_PIDs.erase(progItem.elementary_PIDs.begin()+Pos);
2605 
2606     //Removing this program_number from the list of program_numbers for this elementary_PID
2607     for (size_t Pos=0; Pos<Complete_Stream->Streams[elementary_PID]->program_numbers.size(); Pos++)
2608         if (Complete_Stream->Streams[elementary_PID]->program_numbers[Pos]==program_number)
2609             Complete_Stream->Streams[elementary_PID]->program_numbers.erase(Complete_Stream->Streams[elementary_PID]->program_numbers.begin()+Pos);
2610 
2611     //Removing parser if no more program_number
2612     if (Complete_Stream->Streams[elementary_PID]->program_numbers.empty())
2613     {
2614         stream_t StreamKind=Complete_Stream->Streams[elementary_PID]->StreamKind;
2615         size_t StreamPos=Complete_Stream->Streams[elementary_PID]->StreamPos;
2616         if (StreamKind!=Stream_Max && StreamPos!=(size_t)-1)
2617             Complete_Stream->StreamPos_ToRemove[StreamKind].push_back(StreamPos);
2618 
2619         if (Complete_Stream->Streams_NotParsedCount!=(size_t)-1 && Complete_Stream->Streams_NotParsedCount && !Complete_Stream->Streams[elementary_PID]->IsParsed)
2620             Complete_Stream->Streams_NotParsedCount--; //Not parsed, and no need to parse it now
2621         delete Complete_Stream->Streams[elementary_PID]; Complete_Stream->Streams[elementary_PID]=new complete_stream::stream;
2622         Complete_Stream->PES_PIDs.erase(elementary_PID);
2623     }
2624 }
2625 
2626 //***************************************************************************
2627 // C++
2628 //***************************************************************************
2629 
2630 } //NameSpace
2631 
2632 #endif //MEDIAINFO_MPEGTS_YES
2633 
2634