|
MythTV
0.26-pre
|
00001 // -*- Mode: c++ -*- 00002 // Copyright (c) 2003-2004, Daniel Thor Kristjansson 00003 #ifndef _ATSC_TABLES_H_ 00004 #define _ATSC_TABLES_H_ 00005 00006 #include <stdint.h> // uint32_t 00007 #include <QString> 00008 00009 #include "atscdescriptors.h" 00010 #include "mpegtables.h" 00011 #include "mythtvexp.h" 00012 00013 // Some sample code is in pcHDTV's dtvscan.c, 00014 // accum_sect/dequeue_buf/atsc_tables. We should stuff 00015 // this data back into the channel's guide data, though if 00016 // it's unreliable we will need to be able to prefer the 00017 // downloaded XMLTV data. 00018 00049 class MTV_PUBLIC TableClass 00050 { 00051 public: 00052 typedef enum 00053 { 00054 UNKNOWN = -1, 00055 TVCTc = 0, 00056 TVCTnc = 1, 00057 CVCTc = 2, 00058 CVCTnc = 3, 00059 ETTc = 4, 00060 DCCSCT = 5, 00061 EIT = 6, 00062 ETTe = 7, 00063 DCCT = 8, 00064 RRT = 9, 00065 } kTableTypes; 00066 }; 00067 00072 class MTV_PUBLIC MasterGuideTable : public PSIPTable 00073 { 00074 public: 00075 MasterGuideTable(const MasterGuideTable& table) : PSIPTable(table) 00076 { 00077 assert(TableID::MGT == TableID()); 00078 Parse(); 00079 } 00080 MasterGuideTable(const PSIPTable& table) : PSIPTable(table) 00081 { 00082 assert(TableID::MGT == TableID()); 00083 Parse(); 00084 } 00085 ~MasterGuideTable() { ; } 00086 00087 // Name bits loc expected value 00088 // table_id 8 0.0 0xC7 00089 // section_syntax_indicator 1 1.0 1 00090 // private_indicator 1 1.1 1 00091 // reserved 2 1.2 3 00092 // table_id_extension 16 3.0 0x0000 00093 00094 /* Each Map ID corresponds to one set of channel mappings. Each STB 00095 * is expected to ignore any Map ID's other than the one corresponding 00096 * to it's head-end. 00097 * 00098 * Note: This is only defined for SCTE streams, it is always 0 in ATSC streams 00099 */ 00100 uint SCTEMapId() const 00101 { 00102 return (pesdata()[3]<<8) | pesdata()[4]; 00103 } 00104 00105 // reserved 2 5.0 3 00106 // current_next_indicator 1 5.7 1 00107 // section_number 8 6.0 0x00 00108 // last_section_number 8 7.0 0x00 00109 // protocol_version 8 8.0 0x00 for now 00110 00111 // tables_defined 16 9.0, 6-370 valid OTA, 2-370 valid w/Cable 00112 uint TableCount() const 00113 { 00114 return (pesdata()[9]<<8) | pesdata()[10]; 00115 } 00116 // for (i=0; i<tableCount(); i++) { 00117 // table_type 16 0.0 00118 uint TableType(uint i) const 00119 { 00120 return (_ptrs[i][0]<<8) | _ptrs[i][1]; 00121 } 00122 int TableClass(uint i) const; 00123 QString TableClassString(uint i) const; 00124 // reserved 3 2.0 0x7 00125 // table_type_PID 13 2.3 00126 uint TablePID(uint i) const 00127 { 00128 return ((_ptrs[i][2]<<8) | (_ptrs[i][3])) & 0x1fff; 00129 } 00130 // reserved 3 4.0 0x7 00131 // table_type_version_number 5 4.3 00132 uint TableVersion(uint i) const 00133 { 00134 return (_ptrs[i][4]) & 0x1f; 00135 } 00136 // number_bytes for table desc. 32 5.0 00137 uint TableDescriptorsBytes(uint i) const 00138 { 00139 return ((_ptrs[i][5]<<24) | (_ptrs[i][6]<<16) | 00140 (_ptrs[i][7]<<8) | (_ptrs[i][8])); 00141 } 00142 // reserved 4 9.0 0xf 00143 // table_type_descriptors_length 12 9.4 00144 uint TableDescriptorsLength(uint i) const 00145 { 00146 return ((_ptrs[i][9]<<8) | (_ptrs[i][10])) & 0xfff; 00147 } 00148 00149 // for (I = 0; I<M; I++) 00150 // descriptor = 11 + (offset) 00151 // } 00152 // } 00153 const unsigned char* TableDescriptors(uint i) const 00154 { 00155 return _ptrs[i]+11; 00156 } 00157 // reserved 4 0xf 00158 // descriptors_length 12 00159 uint GlobalDescriptorsLength() const 00160 { 00161 return ((_ptrs[TableCount()][0]<<8) | 00162 (_ptrs[TableCount()][1])) & 0xfff; 00163 } 00164 00165 const unsigned char* GlobalDescriptors() const 00166 { 00167 return _ptrs[TableCount()]+2; 00168 } 00169 // for (I=0; I<N; I++) { 00170 // descriptor() 00171 // } 00172 // CRC_32 32 00173 00174 void Parse(void) const; 00175 virtual QString toString(void) const; 00176 virtual QString toStringXML(uint indent_level) const; 00177 private: 00178 mutable vector<unsigned char*> _ptrs; // used to parse 00179 }; 00180 00187 class MTV_PUBLIC VirtualChannelTable : public PSIPTable 00188 { 00189 public: 00190 VirtualChannelTable(const VirtualChannelTable &table) : PSIPTable(table) 00191 { 00192 assert(TableID::TVCT == TableID() || TableID::CVCT == TableID()); 00193 Parse(); 00194 } 00195 VirtualChannelTable(const PSIPTable &table) : PSIPTable(table) 00196 { 00197 assert(TableID::TVCT == TableID() || TableID::CVCT == TableID()); 00198 Parse(); 00199 } 00200 00201 ~VirtualChannelTable() { ; } 00202 00203 // Name bits loc expected value 00204 // table_id 8 0.0 0xC8/0xC9 00205 // section_syntax_indicator 1 1.0 1 00206 // private_indicator 1 1.1 1 00207 // reserved 2 1.2 3 00208 // table_id_extension 16 3.0 0x0000 00209 // reserved 2 5.0 3 00210 // current_next_indicator 1 5.7 1 00211 // section_number 8 6.0 0x00 00212 // last_section_number 8 7.0 0x00 00213 // protocol_version 8 8.0 0x00 for now 00214 00215 // transport_stream_id 16 3.0 00216 uint TransportStreamID() const { return TableIDExtension(); } 00217 00218 // num_channels_in_section 8 9.0 00219 uint ChannelCount() const { return pesdata()[9]; } 00220 00221 // for(i=0; i<num_channels_in_section; i++) { 00222 // short_name 7*16 0.0 (7 UTF-16 chars padded by 0x0000) 00223 const QString ShortChannelName(uint i) const 00224 { 00225 QString str; 00226 const unsigned short* ustr = 00227 reinterpret_cast<const unsigned short*>(_ptrs[i]); 00228 for (int j=0; j<7; j++) 00229 { 00230 QChar c((ustr[j]<<8) | (ustr[j]>>8)); 00231 if (c != QChar('\0')) str.append(c); 00232 } 00233 return str; 00234 } 00235 // reserved 4 13.0 0xf 00236 00237 // major_channel_number 10 13.4 00238 // 14 RRRR JJJJ 15 jjjj jjmm 16 MMMM MMMM 00239 // JJ JJjj jjjj mm MMMM MMMM 00240 uint MajorChannel(uint i) const 00241 { 00242 return (((_ptrs[i][14])<<6)&0x3c0) | (_ptrs[i][15]>>2); 00243 } 00244 // minor_channel_number 10 14.6 00245 uint MinorChannel(uint i) const 00246 { 00247 return (((_ptrs[i][15])<<8)&0x300) | _ptrs[i][16]; 00248 } 00249 // modulation_mode 8 16.0 00250 uint ModulationMode(uint i) const 00251 { 00252 return _ptrs[i][17]; 00253 } 00254 QString ModulationModeString(uint i) const; 00255 // carrier_frequency 32 17.0 deprecated 00256 // channel_TSID 16 21.0 00257 uint ChannelTransportStreamID(uint i) const 00258 { 00259 return ((_ptrs[i][22]<<8) | _ptrs[i][23]); 00260 } 00261 // program_number 16 23.0 00262 uint ProgramNumber(uint i) const 00263 { 00264 return ((_ptrs[i][24]<<8) | _ptrs[i][25]); 00265 } 00266 // ETM_location 2 25.0 00267 uint ETMlocation(uint i) const 00268 { 00269 return (_ptrs[i][26]>>6) & 0x03; 00270 } 00271 // access_controlled 1 25.2 00272 bool IsAccessControlled(uint i) const 00273 { 00274 return bool(_ptrs[i][26] & 0x20); 00275 } 00276 // hidden 1 25.3 00277 bool IsHidden(uint i) const 00278 { 00279 return bool(_ptrs[i][26] & 0x10); 00280 } 00281 // reserved 2 25.4 3 00282 // hide_guide 1 25.6 00283 bool IsHiddenInGuide(uint i) const 00284 { 00285 return bool(_ptrs[i][26] & 0x2); 00286 } 00287 // reserved 6 25.7 0x3f 00288 // service_type 6 26.2 00289 uint ServiceType(uint i) const 00290 { 00291 return _ptrs[i][27] & 0x3f; 00292 } 00293 QString ServiceTypeString(uint i) const; 00294 // source_id 16 27.0 00295 uint SourceID(uint i) const 00296 { 00297 return ((_ptrs[i][28]<<8) | _ptrs[i][29]); 00298 } 00299 // reserved 6 29.0 0xfb 00300 // descriptors_length 10 29.6 00301 uint DescriptorsLength(uint i) const 00302 { 00303 return ((_ptrs[i][30]<<8) | _ptrs[i][31]) & 0x03ff; 00304 } 00305 // for (i=0;i<N;i++) { descriptor() } 00306 const unsigned char* Descriptors(uint i) const 00307 { 00308 return _ptrs[i]+32; 00309 } 00310 // } 00311 // reserved 6 0xfb 00312 // additional_descriptors_length 10 00313 uint GlobalDescriptorsLength() const 00314 { 00315 uint i = ChannelCount(); 00316 return ((_ptrs[i][0]<<8) | _ptrs[i][1]) & 0x03ff; 00317 } 00318 // for (j=0; j<N; j++) { additional_descriptor() } 00319 const unsigned char* GlobalDescriptors() const 00320 { 00321 return _ptrs[ChannelCount()]+2; 00322 } 00323 // CRC_32 32 00324 void Parse() const; 00325 int Find(int major, int minor) const; 00326 QString GetExtendedChannelName(uint idx) const; 00327 virtual QString toString(void) const; 00328 virtual QString ChannelString(uint channel) const = 0; 00329 virtual QString toStringXML(uint indent_level) const; 00330 virtual QString ChannelStringXML(uint indent_level, uint channel) const; 00331 virtual QString XMLChannelValues(uint indent_level, uint channel) const; 00332 protected: 00333 mutable vector<unsigned char*> _ptrs; 00334 }; 00335 00341 class MTV_PUBLIC TerrestrialVirtualChannelTable : public VirtualChannelTable 00342 { 00343 public: 00344 TerrestrialVirtualChannelTable(const TerrestrialVirtualChannelTable &table) 00345 : VirtualChannelTable(table) 00346 { 00347 assert(TableID::TVCT == TableID()); 00348 } 00349 TerrestrialVirtualChannelTable(const PSIPTable &table) 00350 : VirtualChannelTable(table) 00351 { 00352 assert(TableID::TVCT == TableID()); 00353 } 00354 ~TerrestrialVirtualChannelTable() { ; } 00355 00356 // Name bits loc expected value 00357 // table_id 8 0.0 0xC8 00358 // section_syntax_indicator 1 1.0 1 00359 // private_indicator 1 1.1 1 00360 // reserved 2 1.2 3 00361 // table_id_extension 16 3.0 0x0000 00362 // reserved 2 5.0 3 00363 // current_next_indicator 1 5.7 1 00364 // section_number 8 6.0 0x00 00365 // last_section_number 8 7.0 0x00 00366 // protocol_version 8 8.0 0x00 for now 00367 00368 // transport_stream_id 16 3.0 00369 // num_channels_in_section 8 9.0 00370 00371 // for (i=0; i<num_channels_in_section; i++) 00372 // { 00373 // short_name 7*16 0.0 (7 UTF-16 chars padded by 0x0000) 00374 // reserved 4 14.0 0xf 00375 00376 // major_channel_number 10 14.4 00377 // 14 RRRR JJJJ 15 jjjj jjmm 16 MMMM MMMM 00378 // JJ JJjj jjjj mm MMMM MMMM 00379 // minor_channel_number 10 15.6 00380 // modulation_mode 8 17.0 00381 // carrier_frequency 32 18.0 deprecated 00382 // channel_TSID 16 22.0 00383 // program_number 16 24.0 00384 // ETM_location 2 26.0 00385 // access_controlled 1 26.2 00386 // hidden 1 26.3 00387 // reserved 2 26.4 3 00388 // hide_guide 1 26.6 00389 // reserved 6 26.7 0x3f 00390 // service_type 6 27.2 00391 // source_id 16 28.0 00392 // reserved 6 30.0 0xfb 00393 // descriptors_length 10 30.6-31 00394 // for (i=0;i<N;i++) { descriptor() } 00395 // } 00396 // reserved 6 0xfb 00397 // additional_descriptors_length 10 00398 // for (j=0; j<N; j++) { additional_descriptor() } 00399 // CRC_32 32 00400 virtual QString ChannelString(uint channel) const; 00401 virtual QString XMLChannelValues(uint indent_level, uint channel) const; 00402 }; 00403 00404 00410 class MTV_PUBLIC CableVirtualChannelTable : public VirtualChannelTable 00411 { 00412 public: 00413 CableVirtualChannelTable(const CableVirtualChannelTable &table) 00414 : VirtualChannelTable(table) 00415 { 00416 assert(TableID::CVCT == TableID()); 00417 } 00418 CableVirtualChannelTable(const PSIPTable &table) 00419 : VirtualChannelTable(table) 00420 { 00421 assert(TableID::CVCT == TableID()); 00422 } 00423 ~CableVirtualChannelTable() { ; } 00424 00425 // Name bits loc expected value 00426 // table_id 8 0.0 0xC9 00427 // section_syntax_indicator 1 1.0 1 00428 // private_indicator 1 1.1 1 00429 // reserved 2 1.2 3 00430 // table_id_extension 16 3.0 0x0000 00431 00432 /* Each Map ID corresponds to one set of channel mappings. Each STB 00433 * is expected to ignore any Map ID's other than the one corresponding 00434 * to it's head-end. 00435 * 00436 * Note: This is only defined for SCTE streams, 00437 * it is always 0 in ATSC streams. 00438 */ 00439 uint SCTEMapId() const 00440 { 00441 return (pesdata()[3]<<8) | pesdata()[4]; 00442 } 00443 00444 // reserved 2 5.0 3 00445 // current_next_indicator 1 5.7 1 00446 // section_number 8 6.0 0x00 00447 // last_section_number 8 7.0 0x00 00448 // protocol_version 8 8.0 0x00 for now 00449 00450 // for (i=0; i<num_channels_in_section; i++) 00451 // { 00452 // short_name 7*16 0.0 (7 UTF-16 chars padded by 0x0000) 00453 // reserved 4 14.0 0xf 00454 00455 // major_channel_number 10 14.4 00456 // 14 RRRR JJJJ 15 jjjj jjmm 16 MMMM MMMM 00457 // JJ JJjj jjjj mm MMMM MMMM 00458 // minor_channel_number 10 15.6 00459 00460 bool SCTEIsChannelNumberOnePart(uint i) const 00461 { 00462 return (MajorChannel(i) >> 4) == 0x3f; 00463 } 00464 bool SCTEIsChannelNumberTwoPart(uint i) const 00465 { 00466 return MajorChannel(i) < 1000; 00467 } 00468 // Note: In SCTE streams, the channel number is undefined if 00469 // the two functions above return false. As of 2002 spec. 00470 00471 uint SCTEOnePartChannel(uint i) const 00472 { 00473 if (SCTEIsChannelNumberOnePart(i)) 00474 return ((MajorChannel(i) & 0xf) << 10) | MinorChannel(i); 00475 return 0; 00476 } 00477 00478 // modulation_mode 8 17.0 00479 // carrier_frequency 32 18.0 deprecated 00480 // channel_TSID 16 22.0 00481 // program_number 16 24.0 00482 // ETM_location 2 26.0 00483 // access_controlled 1 26.2 00484 // hidden 1 26.3 00485 // path_select 1 26.4 00486 bool IsPathSelect(uint i) const 00487 { 00488 return bool(_ptrs[i][26] & 0x8); 00489 } 00490 // out_of_band 1 26.5 00491 bool IsOutOfBand(uint i) const 00492 { 00493 return bool(_ptrs[i][26] & 0x4); 00494 } 00495 // hide_guide 1 26.6 00496 // reserved 3 26.7 7 00497 // service_type 6 27.2 00498 // source_id 16 28.0 00499 // reserved 6 30.0 0xfb 00500 // descriptors_length 10 30.6-31 00501 // for (i=0;i<N;i++) { descriptor() } 00502 // } 00503 // reserved 6 0xfb 00504 // additional_descriptors_length 10 00505 // for (j=0; j<N; j++) { additional_descriptor() } 00506 // CRC_32 32 00507 virtual QString ChannelString(uint channel) const; 00508 virtual QString XMLChannelValues(uint indent_level, uint channel) const; 00509 }; 00510 00516 class MTV_PUBLIC EventInformationTable : public PSIPTable 00517 { 00518 public: 00519 EventInformationTable(const EventInformationTable &table) 00520 : PSIPTable(table) 00521 { 00522 assert(TableID::EIT == TableID()); 00523 Parse(); 00524 } 00525 EventInformationTable(const PSIPTable &table) : PSIPTable(table) 00526 { 00527 assert(TableID::EIT == TableID()); 00528 Parse(); 00529 } 00530 ~EventInformationTable() { ; } 00531 00532 // Name bits loc expected value 00533 // table_id 8 0.0 0xCB 00534 // section_syntax_indicator 1 1.0 1 00535 // private_indicator 1 1.1 1 00536 // reserved 2 1.2 3 00537 // table_id_extension 16 3.0 0x0000 00538 // reserved 2 5.0 3 00539 // current_next_indicator 1 5.7 1 00540 // section_number 8 6.0 0x00 00541 // last_section_number 8 7.0 0x00 00542 // protocol_version 8 8.0 0x00 for now 00543 00544 // source_id 16 3.0 0x0000 00545 uint SourceID() const { return TableIDExtension(); } 00546 00547 // num_events_in_section 8 9.0 00548 uint EventCount() const { return psipdata()[1]; } 00549 // for (j = 0; j< num_events_in_section;j++) 00550 // { 00551 // reserved 2 0.0 3 00552 // event_id 14 0.2 00553 uint EventID(uint i) const 00554 { 00555 return ((_ptrs[i][0]<<8) | _ptrs[i][1])&0x3fff; 00556 } 00557 // start_time 32 2.0 00558 uint StartTimeRaw(uint i) const 00559 { 00560 return ((_ptrs[i][2]<<24) | (_ptrs[i][3]<<16) | 00561 (_ptrs[i][4]<<8) | (_ptrs[i][5])); 00562 } 00563 QDateTime StartTimeGPS(uint i) const 00564 { 00565 // Time in GPS seconds since 00:00:00 on January 6th, 1980 UTC 00566 QDateTime dt; 00567 dt.setTime_t(GPS_EPOCH + StartTimeRaw(i)); 00568 return dt; 00569 } 00570 // reserved 2 6.0 3 00571 // ETM_location 2 6.2 00572 uint ETMLocation(uint i) const 00573 { 00574 return (_ptrs[i][6]>>4)&3; 00575 } 00576 // length_in_seconds 20 6.4 00577 uint LengthInSeconds(uint i) const 00578 { 00579 return ((_ptrs[i][6]<<16) | (_ptrs[i][7]<<8) | 00580 (_ptrs[i][8])) & 0xfffff; 00581 } 00582 // title_length 8 9.0 00583 uint TitleLength(uint i) const 00584 { return _ptrs[i][9]; } 00585 // title_text() var * 10.0 00586 MultipleStringStructure title(int i) const 00587 { 00588 return MultipleStringStructure(_ptrs[i]+10); 00589 } 00590 // reserved 4 0xf 00591 // descriptors_length 12 00592 uint DescriptorsLength(uint i) const 00593 { 00594 unsigned char *desc=_ptrs[i]+10+TitleLength(i); 00595 return ((desc[0]<<8)|(desc[1]))&0xfff; 00596 } 00597 // for (i=0;i<N;i++) 00598 // { 00599 // descriptor() 00600 const unsigned char* Descriptors(uint i) const 00601 { 00602 return _ptrs[i]+12+TitleLength(i); 00603 } 00604 // } 00605 // } 00606 // CRC_32 32 00607 void Parse() const; 00608 QString toString() const; 00609 private: 00610 mutable vector<unsigned char*> _ptrs; 00611 }; 00612 00618 class MTV_PUBLIC ExtendedTextTable : public PSIPTable 00619 { 00620 public: 00621 ExtendedTextTable(const ExtendedTextTable &table) : PSIPTable(table) 00622 { 00623 assert(TableID::ETT == TableID()); 00624 } 00625 ExtendedTextTable(const PSIPTable &table) : PSIPTable(table) 00626 { 00627 assert(TableID::ETT == TableID()); 00628 } 00629 ~ExtendedTextTable() { ; } 00630 00631 // Name bits loc expected value 00632 // table_id 8 0.0 0xCC 00633 // section_syntax_indicator 1 1.0 1 00634 // private_indicator 1 1.1 1 00635 // reserved 2 1.2 3 00636 // section_length 12 1.4 00637 // ETT_table_id_extension 16 3.0 unique per pid 00638 // reserved 2 5.0 3 00639 // current_next_indicator 1 5.7 1 00640 // section_number 8 6.0 0x00 00641 // last_section_number 8 7.0 0x00 00642 // protocol_version 8 8.0 0x00 for now 00643 00644 uint ExtendedTextTableID() const { return TableIDExtension(); } 00645 void SetExtendedTextTableID(uint id) 00646 { SetTableIDExtension(id); } 00647 00648 // ETM_id 32 10.0 00649 // 31..16 15..2 iff 1..0 00650 // channel ETM_id source_id 0 00 00651 // event ETM_id source_id event_id 10 00652 bool IsChannelETM(void) const { return 0 == (psipdata()[4] & 3); } 00653 bool IsEventETM(void) const { return 2 == (psipdata()[4] & 3); } 00654 uint SourceID(void) const 00655 { return (psipdata()[1] << 8) | psipdata()[2]; } 00656 uint EventID(void) const 00657 { return (psipdata()[3] << 6) | (psipdata()[4] >> 2); } 00658 00659 // extended_text_message * 14.0 multiple string structure a/65b p81 00660 const MultipleStringStructure ExtendedTextMessage() const 00661 { 00662 return MultipleStringStructure(psipdata() + 5); 00663 } 00664 00665 QString toString() const; 00666 // CRC_32 32 00667 }; 00668 00676 class MTV_PUBLIC SystemTimeTable : public PSIPTable 00677 { 00678 public: 00679 SystemTimeTable(const SystemTimeTable &table) : PSIPTable(table) 00680 { 00681 assert(TableID::STT == TableID()); 00682 } 00683 SystemTimeTable(const PSIPTable &table) : PSIPTable(table) 00684 { 00685 assert(TableID::STT == TableID()); 00686 } 00687 00688 // Name bits loc expected value 00689 // table_id 8 0.0 0xCD 00690 // section_syntax_indicator 1 1.0 1 00691 // private_indicator 1 1.1 1 00692 // reserved 2 1.2 3 00693 // section_length 12 1.4 00694 // table_id_extension 16 3.0 0 00695 // reserved 2 5.0 3 00696 // version_number 5 5.2 0 00697 // current_next_indicator 1 5.7 1 00698 // section_number 8 6.0 0x00 00699 // last_section_number 8 7.0 0x00 00700 // protocol_version 8 8.0 0x00 for now 00701 00702 // system_time 32 9.0 00703 uint32_t GPSRaw(void) const 00704 { 00705 return ((pesdata()[9] <<24) | (pesdata()[10]<<16) | 00706 (pesdata()[11]<< 8) | pesdata()[12]); 00707 } 00708 QDateTime SystemTimeGPS(void) const 00709 { 00710 QDateTime dt; 00711 dt.setTime_t(GPS_EPOCH + GPSRaw()); 00712 return dt; 00713 } 00714 time_t GPSUnix(void) const 00715 { return GPS_EPOCH + GPSRaw(); } 00716 time_t UTCUnix(void) const 00717 { return GPSUnix() - GPSOffset(); } 00718 00719 // GPS_UTC_offset 8 13.0 00720 uint GPSOffset() const { return pesdata()[13]; } 00721 // daylight_savings 16 14.0 00722 // DS_status 1 14.0 00723 // reserved 2 14.1 3 00724 // DS_day_of_month 5 14.3 00725 // DS_hour 8 15.0 00726 bool InDaylightSavingsTime() const { return pesdata()[14]&0x80; } 00727 uint DayDaylightSavingsStarts() const { return pesdata()[14]&0x1f; } 00728 uint HourDaylightSavingsStarts() const { return pesdata()[15]; } 00729 // for (I = 0;I< N;I++) { descriptor() } 00730 // CRC_32 32 00731 00732 QString toString(void) const; 00733 QString toStringXML(uint indent_level) const; 00734 }; 00735 00739 class MTV_PUBLIC RatingRegionTable : public PSIPTable 00740 { 00741 public: 00742 RatingRegionTable(const RatingRegionTable &table) : PSIPTable(table) 00743 { 00744 assert(TableID::RRT == TableID()); 00745 } 00746 RatingRegionTable(const PSIPTable &table) : PSIPTable(table) 00747 { 00748 assert(TableID::RRT == TableID()); 00749 } 00750 }; 00751 00755 class MTV_PUBLIC DirectedChannelChangeTable : public PSIPTable 00756 { 00757 public: 00758 DirectedChannelChangeTable(const DirectedChannelChangeTable &table) 00759 : PSIPTable(table) 00760 { 00761 assert(TableID::DCCT == TableID()); 00762 } 00763 DirectedChannelChangeTable(const PSIPTable &table) : PSIPTable(table) 00764 { 00765 assert(TableID::DCCT == TableID()); 00766 } 00767 }; 00768 00772 class MTV_PUBLIC DirectedChannelChangeSelectionCodeTable : public PSIPTable 00773 { 00774 public: 00775 DirectedChannelChangeSelectionCodeTable( 00776 const DirectedChannelChangeSelectionCodeTable &table) 00777 : PSIPTable(table) 00778 { 00779 assert(TableID::DCCSCT == TableID()); 00780 } 00781 DirectedChannelChangeSelectionCodeTable(const PSIPTable &table) 00782 : PSIPTable(table) 00783 { 00784 assert(TableID::DCCSCT == TableID()); 00785 } 00786 }; 00787 00789 class MTV_PUBLIC AggregateEventInformationTable : public PSIPTable 00790 { 00791 public: 00792 AggregateEventInformationTable( 00793 const AggregateEventInformationTable &table) : PSIPTable(table) 00794 { 00795 assert(TableID::AEIT == TableID()); 00796 } 00797 AggregateEventInformationTable(const PSIPTable &table) : PSIPTable(table) 00798 { 00799 assert(TableID::AEIT == TableID()); 00800 } 00801 00802 QString toString(void) const 00803 { return "AggregateEventInformationTable\n"; } 00804 QString toStringXML(uint indent_level) const 00805 { return "<AggregateEventInformationTable />"; } 00806 }; 00807 00809 class MTV_PUBLIC AggregateExtendedTextTable : public PSIPTable 00810 { 00811 public: 00812 AggregateExtendedTextTable( 00813 const AggregateExtendedTextTable &table) : PSIPTable(table) 00814 { 00815 assert(TableID::AETT == TableID()); 00816 } 00817 AggregateExtendedTextTable(const PSIPTable &table) : PSIPTable(table) 00818 { 00819 assert(TableID::AETT == TableID()); 00820 } 00821 00822 QString toString(void) const 00823 { return "AggregateExtendedTextTable\n"; } 00824 QString toStringXML(uint indent_level) const 00825 { return "<AggregateExtendedTextTable />"; } 00826 }; 00827 00828 #endif // _ATSC_TABLES_H_
1.7.6.1