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