|
MythTV
0.26-pre
|
00001 // -*- Mode: c++ -*- 00022 #ifndef _SCTE_TABLES_H_ 00023 #define _SCTE_TABLES_H_ 00024 00025 #include <cassert> 00026 00027 // MythTV 00028 #include "mpegtables.h" 00029 #include "mythtvexp.h" 00030 #include "iso639.h" 00031 00032 // NOTE: MasterGuideTable defined in atsctables.h 00033 // NOTE: VirtualChannelTable defined in atsctables.h 00034 00035 // NOTE: Section 4.4.1 specifies that we should not attempt to 00036 // use tables carrying a protocol_version greater than 00037 // the one we are familiar with, as of the SCTE65-2002 00038 // standard 0 is the only recognized version. 00039 00040 class MTV_PUBLIC CarrierDefinitionSubtable 00041 { 00042 public: 00043 CarrierDefinitionSubtable( 00044 const unsigned char *beg, const unsigned char *end) : 00045 _beg(beg), _end(end) { } 00046 00047 // number_of_carriers 8 0.0+_beg 00048 uint NumberOfCarriers(void) const { return _beg[0]; } 00049 // spacing_unit 1 1.0+_beg 00050 enum // Table 5.4 Spacing Unit & Table 5.5 frequency unit 00051 { 00052 k10000Hz = 0x0, 00053 k125000Hz = 0x1, 00054 }; 00055 uint SpacingUnit(void) const { return _beg[1]>>7; } 00056 uint SpacingUnitHz(void) const { return SpacingUnit() ? 125000 : 1000; } 00057 // zero 1 1.1+_beg 00058 // frequency_spacing 14 1.2+_beg 00059 uint FrequencySpacing(void) const 00060 { return ((_beg[1] & 0x3) << 8) | _beg[2]; } 00061 uint FrequencySpacingHz(void) const 00062 { return FrequencySpacing() * SpacingUnitHz(); } 00063 // frequency_unit 1 3.0+_beg 00064 uint FrequencyUnit(void) const { return _beg[3]>>7; } 00065 uint FrequencyUnitHz(void) const { return FrequencyUnit() ? 125000 : 1000; } 00066 // first_carrier_frequency 15 3.1+_beg 00067 uint FirstCarrierFrequency(void) const 00068 { return ((_beg[3] & 0x3) << 8) | _beg[4]; } 00069 uint64_t FirstCarrierFrequencyHz(void) const 00070 { return (uint64_t)FirstCarrierFrequency() * FrequencyUnitHz(); } 00071 00072 // descriptors_count 8 5.0+_beg 00073 uint DescriptorsCount(void) const { return _beg[5]; } 00074 // for (i=0; i<descriptors_count; i++) { 00075 // descriptor() ? ?.0 00076 // } 00077 uint DescriptorsLength(void) const { return _end - _beg - 6; } 00078 const unsigned char *Descriptors(void) const { return _beg + 6; } 00079 00080 QString toString(void) const; 00081 QString toStringXML(uint indent_level) const; 00082 00083 private: 00084 const unsigned char *_beg; 00085 const unsigned char *_end; 00086 }; 00087 00088 class ModulationModeSubtable 00089 { 00090 public: 00091 ModulationModeSubtable(const unsigned char *beg, const unsigned char *end) : 00092 _beg(beg), _end(end) { } 00093 // transmission_system 4 0.0+_beg 00094 enum // Table 5.7 TransmissionSystem 00095 { 00096 kTSUnknown = 0, 00097 kTSITUAnnexA = 1, 00098 kTSITUAnnexB = 2, 00099 kTSITUQPSK = 3, 00100 kTSATSC = 4, 00101 kTSDigiCipher = 5, 00102 // all other values are reserved 00103 // ITU Rec. J.83 Annex A is the 8Mhz global standard, 00104 // Annex B is the 6Mhz North American standard and 00105 // Annex C is the 6Mhz Japanese standard. (QAM) 00106 }; 00107 uint TransmissionSystem(void) const { return _beg[0] >> 4; } 00108 QString TransmissionSystemString(void) const; 00109 // inner_coding_mode 4 0.4+_beg 00110 enum // Table 5.8 00111 { 00112 kRate5_11Coding = 0, 00113 kRate1_2Coding = 1, 00114 // reserved = 2, 00115 kRate3_5Coding = 3, 00116 // reserved = 4, 00117 kRate2_3Coding = 5, 00118 // reserved = 6, 00119 kRate3_4Coding = 7, 00120 kRate4_5Coding = 8, 00121 kRate5_6Coding = 9, 00122 // reserved = 10, 00123 kRate7_8Coding = 11, 00124 // reserved = 12, 00125 // reserved = 13, 00126 // reserved = 14, 00127 kNone = 15, 00128 // all other values are reserved 00129 }; 00130 uint InnerCodingMode(void) const { return _beg[0] & 0xf; } 00131 QString InnerCodingModeString(void) const; 00132 // split_bitstream_mode 1 1.0+_beg 00133 bool SplitBitstreamMode(void) const { return _beg[1] & 0x80; } 00134 // zero 2 1.1+_beg 00135 // modulation_format 5 1.3+_beg 00136 enum // Table 5.9 00137 { 00138 kUnknown = 0, 00139 kQPSK = 1, 00140 kBPSK = 2, 00141 kOQPSK = 3, 00142 kVSB8 = 4, 00143 kVSB16 = 5, 00144 kQAM16 = 6, 00145 kQAM32 = 7, 00146 kQAM64 = 8, 00147 kQAM80 = 9, // last modulation format that 65 & 57 agree on 00148 kQAM96 = 10, 00149 kQAM112 = 11, 00150 kQAM128 = 12, 00151 kQAM160 = 13, 00152 kQAM192 = 14, 00153 kQAM224 = 15, 00154 kQAM256 = 16, 00155 kQAM320 = 17, 00156 kQAM384 = 18, 00157 kQAM448 = 19, 00158 kQAM512 = 20, 00159 kQAM640 = 21, 00160 kQAM768 = 22, 00161 kQAM896 = 23, 00162 kQAM1024 = 24, 00163 // all other values are reserved 00164 }; 00165 uint ModulationFormat(void) const { return _beg[1] & 0x1f; } 00166 QString ModulationFormatString(void) const; 00167 // zero 4 2.0+_beg 00168 // symbol_rate 28 2.4+_beg 00169 uint SymbolRate(void) const 00170 { 00171 return (((_beg[2]&0xf)<<24) | (_beg[3]<<16) | 00172 (_beg[4]<<8) | (_beg[5])); 00173 } 00174 // descriptors_count 8 6.0+_beg 00175 uint DescriptorsCount(void) const { return _beg[6]; } 00176 // for (i=0; i<descriptors_count; i++) { 00177 // descriptor() ? ?.0 00178 // } 00179 uint DescriptorsLength(void) const { return _end - _beg - 7; } 00180 const unsigned char *Descriptors(void) const { return _beg + 7; } 00181 00182 QString toString(void) const; 00183 QString toStringXML(uint indent_level) const; 00184 00185 private: 00186 const unsigned char *_beg; 00187 const unsigned char *_end; 00188 }; 00189 00190 class MTV_PUBLIC SCTENetworkInformationTable : public PSIPTable 00191 { 00192 public: 00193 SCTENetworkInformationTable(const SCTENetworkInformationTable &table) : 00194 PSIPTable(table) 00195 { 00196 assert(TableID::NITscte == TableID()); 00197 Parse(); 00198 } 00199 SCTENetworkInformationTable(const PSIPTable &table) : PSIPTable(table) 00200 { 00201 assert(TableID::NITscte == TableID()); 00202 Parse(); 00203 } 00204 ~SCTENetworkInformationTable() { ; } 00205 // SCTE65-2002, page 15, Table 5.1 00206 // Name bits loc expected value 00207 // table_id 8 0.0 0xC2 00208 // zero 2 1.0 0 00209 // reserved 2 1.2 3 00210 // section_length 12 1.4 00211 // ^^^ All above this line provided by PSIPTable 00212 // zero 3 3.0 0 00213 // protocol_version 5 3.3 0 00214 // first_index 8 4.0 (value of 0 is illegal) 00215 uint FirstIndex(void) const { return pesdata()[4]; } 00216 // number_of_records 8 5.0 00217 uint NumberOfRecords(void) const { return pesdata()[5]; } 00218 // transmission_medium 4 6.0 0 00219 uint TransmissionMedium(void) const { return pesdata()[6] >> 4; } 00220 // table_subtype 4 6.4 00221 enum // Table 5.2 NIT Subtype 00222 { 00223 kInvalid = 0x0, 00224 kCarrierDefinitionSubtable = 0x1, 00225 kModulationModeSubtable = 0x2, 00226 // all other values are reserved 00227 }; 00228 uint TableSubtype(void) const { return pesdata()[6] & 0xf; } 00229 // for (i = 0; i < number_of_records; i++) { 00230 // if (kCarrierDefinitionSubtable == table_subtype) { 00231 CarrierDefinitionSubtable CarrierDefinition(uint i) const 00232 { return CarrierDefinitionSubtable(_ptrs[i], _ptrs[i+1]); } 00233 // if (kModulationModeSubtable == table_subtype) { 00234 ModulationModeSubtable ModulationMode(uint i) const 00235 { return ModulationModeSubtable(_ptrs[i], _ptrs[i+1]); } 00236 00237 // } 00238 // for (i=0; i<N; i++) 00239 // descriptor() ? ?.0 optional (determined by looking 00240 // at section_length) 00241 uint DescriptorsLength(void) const 00242 { return SectionLength() - (_ptrs.back() - pesdata()) - 4/*CRC*/; } 00243 const unsigned char * Descriptors(void) const { return _ptrs.back(); } 00244 // CRC_32 32 00245 00246 bool Parse(void); 00247 QString toString(void) const; 00248 QString toStringXML(uint indent_level) const; 00249 00250 private: 00251 vector<const unsigned char*> _ptrs; 00252 }; 00253 00254 class MTV_PUBLIC NetworkTextTable : public PSIPTable 00255 { 00256 public: 00257 NetworkTextTable(const NetworkTextTable &table) : 00258 PSIPTable(table) 00259 { 00260 assert(TableID::NTT == TableID()); 00261 Parse(); 00262 } 00263 NetworkTextTable(const PSIPTable &table) : PSIPTable(table) 00264 { 00265 assert(TableID::NTT == TableID()); 00266 Parse(); 00267 } 00268 ~NetworkTextTable() { ; } 00269 // SCTE65-2002, page 20, Table 5.10 00270 // Name bits loc expected value 00271 // table_id 8 0.0 0xC3 00272 // zero 2 1.0 0 00273 // reserved 2 1.2 3 00274 // section_length 12 1.4 00275 // ^^^ All above this line provided by PSIPTable 00276 // zero 3 3.0 0 00277 // protocol_version 5 3.3 0 00278 // iso_639_language_code 24 4.0 see ISO 639.2/B 00279 // * the value 0xFFFFFFFF shall match any language when text 00280 // is only available in one language 00281 int LanguageKey(void) const 00282 { return iso639_str3_to_key(pesdata() + 4); } 00283 QString LanguageString(void) const 00284 { return iso639_key_to_str3(LanguageKey()); } 00285 int CanonicalLanguageKey(void) const 00286 { return iso639_key_to_canonical_key(LanguageKey()); } 00287 QString CanonicalLanguageString(void) const 00288 { return iso639_key_to_str3(CanonicalLanguageKey()); } 00289 // transmission_medium 4 7.0 0 00290 uint TransmissionMedium(void) const { return pesdata()[7] >> 4; } 00291 // table_subtype 4 7.4 see Table 5.11 00292 enum 00293 { 00294 kInvalid = 0x0, 00295 kSourceNameSubtable = 0x6, 00296 // all other values are reserved 00297 }; 00298 uint TableSubtype(void) const { return pesdata()[7] & 0xf; } 00299 // if (kSourceNameSubtable == table_subtype) { 00300 // number_of_SNS_records 8 8.0 00301 // for (i=0; i<number_of_SNS_records; i++) { 00302 // application_type 1 0.0+_ptrs[i] 00303 // zero 7 0.1+_ptrs[i] 0 00304 // if (application_type) 00305 // application_id 16 1.0+_ptrs[i] 00306 // else 00307 // source_id 16 1.0+_ptrs[i] 00308 // name_length 8 3.0+_ptrs[i] 00309 // source_name() name_length*8 4.0+_ptrs[i] 00310 // sns_descriptors_count 8 4.0+ptrs[i]+name_length 00311 // for (i = 0; i < sns_descriptors_count; i++) 00312 // descriptor ? ?.0 00313 // } 00314 // } 00315 // for (i=0; i<N; i++) 00316 // descriptor() ? ?.0 optional (determined by looking 00317 // at section_length) 00318 // CRC_32 32 00319 00320 void Parse(void) const; 00321 QString toString(void) const; 00322 QString toStringXML(uint indent_level) const; 00323 }; 00324 00325 class MTV_PUBLIC DefinedChannelsMapSubtable 00326 { 00327 public: 00328 DefinedChannelsMapSubtable(const unsigned char *data) : _data(data) {} 00329 // zero 4 7.0 0 00330 // first_virtual_channel 12 7.4 00331 uint FirstVirtualChannel(void) const 00332 { return ((_data[7]<<8) | _data[8]) & 0xfff; } 00333 // zero 1 9.0 00334 // DCM_data_length 7 9.1 00335 uint DCMDataLength(void) const { return _data[9] & 0x7f; } 00336 // for (i=0; i<DCM_data_length; i++) { 00337 // range_defined 1 10.0+i 00338 bool RangeDefined(uint i) const { return _data[10+i] & 0x80; } 00339 // channels_count 7 10.1+i 00340 uint ChannelsCount(uint i) const { return _data[10+i] & 0x7f; } 00341 // } 00342 00343 QString toStringXML(uint indent_level) const; 00344 uint Size(void) const { return DCMDataLength() + 3; } 00345 00346 private: 00347 const unsigned char *_data; 00348 }; 00349 00350 class VirtualChannelMapSubtable 00351 { 00352 public: 00353 VirtualChannelMapSubtable( 00354 const unsigned char *data, const vector<const unsigned char*> &ptrs) : 00355 _data(data), _ptrs(ptrs) {} 00356 00357 // zero 2 7.0 00358 // descriptors_included 1 7.2 00359 bool DescriptorsIncluded(void) const { return _data[7] & 0x20; } 00360 // zero 5 7.3 00361 // splice 1 8.0 00362 bool Splice(void) const { return _data[8] & 0x80; } 00363 // zero 7 8.1 00364 // activation_time 32 9.0 00365 uint ActivationTimeRaw(void) const 00366 { 00367 return ((_data[9] << 24) | (_data[10] << 24) | 00368 (_data[11] << 24) | _data[12]); 00369 } 00373 QDateTime ActivationTimeUTC(uint offset = 0) const 00374 { 00375 QDateTime dt; 00376 dt.setTime_t(GPS_EPOCH + offset + ActivationTimeRaw()); 00377 return dt; 00378 } 00379 // number_of_VC_records 8 13.0 00380 uint NumberOfVCRecords(void) const { return _data[13]; } 00381 00382 // for (i = 0; i < number_of_VC_records; i++) { 00383 // zero 4 0.0+_ptrs[i] 00384 // virtual_channel_number 12 0.4+_ptrs[i] 00385 uint VirtualChannelNumber(uint i) const 00386 { return ((_ptrs[i][0]<<8) | _ptrs[i][1]) & 0xfff; } 00387 // application_virtual_channel 1 2.0+_ptrs[i] 00388 bool ApplicationVirtualChannel(uint i) const { return _ptrs[i][1] & 0x80; } 00389 // zero 1 2.1+_ptrs[i] 00390 // path_select 1 2.2+_ptrs[i] 00391 enum // Table 5.18 path select 00392 { 00393 kPath1 = 0x0, 00394 kPath2 = 0x1, 00395 }; 00396 uint PathSelect(uint i) const { return (_ptrs[i][2]>>5) & 0x1; } 00397 QString PathSelectString(uint i) const 00398 { return PathSelect(i) ? "Path 2" : "Path 1"; } 00399 // transport_type 1 2.3+_ptrs[i] 00400 enum // Table 5.19 transport type 00401 { 00402 kMPEG2Transport = 0x0, 00403 kNonMPEG2Transport = 0x1, 00404 }; 00405 uint TransportType(uint i) const { return (_ptrs[i][2]>>4) & 0x1; } 00406 QString TransportTypeString(uint i) const 00407 { return TransportType(i) ? "Non-MPEG-2" : "MPEG-2"; } 00408 // channel_type 4 2.4+_ptrs[i] 00409 enum // Table 5.20 channel type 00410 { 00411 kNormalChannel = 0x0, 00412 kHiddenChannel = 0x1, 00413 // all other values are reserved 00414 }; 00415 uint ChannelType(uint i) const { return _ptrs[i][2] & 0xf; } 00416 QString ChannelTypeString(uint i) const 00417 { return ChannelType(i) ? "Hidden" : "Normal"; } 00418 // if (application_virtual_channel) { 00419 // application_id 16 3.0+_ptrs[i] 00420 uint ApplicationID(uint i) const { return (_ptrs[i][3]<<8) | _ptrs[i][4]; } 00421 // } else { 00422 // source_id 16 3.0+_ptrs[i] 00423 uint SourceID(uint i) const { return (_ptrs[i][3]<<8) | _ptrs[i][4]; } 00424 // } 00425 // if (transport_type==MPEG_2) { 00426 // CDS_reference 8 5.0+_ptrs[i] 00427 uint CDSReference(uint i) const { return _ptrs[i][5]; } 00428 // program_number 16 6.0+_ptrs[i] 00429 uint ProgramNumber(uint i) const { return (_ptrs[i][6]<<8) | _ptrs[i][7]; } 00430 // MMS_reference 8 8.0+_ptrs[i] 00431 uint MMSReference(uint i) const { return _ptrs[i][8]; } 00432 // } else { 00433 // CDS_reference 8 5.0+_ptrs[i] 00434 // scrambled 1 6.0+_ptrs[i] 00435 bool Scrambled(uint i) const { return _ptrs[i][6] & 0x80; } 00436 // zero 3 6.1+_ptrs[i] 00437 // video_standard 4 6.4+_ptrs[i] 00438 enum // Table 5.21 video standard 00439 { 00440 kNTSC = 0x0, 00441 kPAL625 = 0x1, 00442 kPAL525 = 0x2, 00443 kSECAM = 0x3, 00444 kMAC = 0x4, 00445 // all other values are reserved 00446 }; 00447 uint VideoStandard(uint i) const { return _ptrs[i][6] & 0xf; } 00448 QString VideoStandardString(uint i) const; 00449 // zero 16 7.0+_ptrs[i] 0 00450 // } 00451 // if (descriptors_included) { 00452 // descriptors_count 8 9.0+_ptrs[i] 00453 uint DescriptorsCount(uint i) const { return _ptrs[i][9]; } 00454 // for (i = 0; i < descriptors_count; i++) 00455 // descriptor() 00456 uint DescriptorsLength(uint i) const { return _ptrs[i+1] - _ptrs[i] - 10; } 00457 const unsigned char *Descriptors(uint i) const { return _ptrs[i] + 10; } 00458 // } 00459 // } 00460 00461 QString toStringXML(uint indent_level) const; 00462 uint Size(void) const { return _ptrs.back() - _data; } 00463 00464 const unsigned char *_data; 00465 const vector<const unsigned char*> &_ptrs; 00466 }; 00467 00468 class MTV_PUBLIC InverseChannelMapSubtable 00469 { 00470 public: 00471 InverseChannelMapSubtable(const unsigned char *data) : _data(data) {} 00472 // zero 4 7.0 00473 // first_map_index 12 7.4 00474 uint FirstMapIndex(void) const { return ((_data[7]<<8)|_data[8]) & 0xfff; } 00475 // zero 1 9.0 00476 // record_count 7 9.1 00477 uint RecordCount(void) const { return _data[9] & 0x7f; } 00478 // for (i=0; i<record_count; i++) { 00479 // source_id 16 10.0+i*4 00480 uint SourceID(uint i) const { return (_data[10+i*4]<<8) | _data[11+i*4]; } 00481 // zero 4 12.0+i*4 00482 // virtual_channel_number 12 12.4+i*4 00483 uint VirtualChannelNumber(uint i) const 00484 { return ((_data[12+i*4]<<8) | _data[13+i*4]) & 0xfff; } 00485 // } 00486 00487 QString toStringXML(uint indent_level) const; 00488 uint Size(void) const { return RecordCount() * 4 + 3; } 00489 00490 private: 00491 const unsigned char *_data; 00492 }; 00493 00494 // AKA Short-form Virtual Channel Table 00495 class MTV_PUBLIC ShortVirtualChannelTable : public PSIPTable 00496 { 00497 public: 00498 ShortVirtualChannelTable(const ShortVirtualChannelTable &table) : 00499 PSIPTable(table) 00500 { 00501 assert(TableID::SVCTscte == TableID()); 00502 Parse(); 00503 } 00504 ShortVirtualChannelTable(const PSIPTable &table) : PSIPTable(table) 00505 { 00506 assert(TableID::SVCTscte == TableID()); 00507 Parse(); 00508 } 00509 ~ShortVirtualChannelTable() { ; } 00510 // Name bits loc expected value 00511 // table_id 8 0.0 0xC4 00512 // zero 2 1.0 0 00513 // reserved 2 1.2 3 00514 // section_length 12 1.4 00515 // ^^^ All above this line provided by PSIPTable 00516 // zero 3 3.0 0 00517 // protocol_version 5 3.3 0 00518 // transmission_medium 4 4.0 0 00519 uint TransmissionMedium(void) const { return pesdata()[4] >> 4; } 00520 // table_subtype 4 4.4 00521 enum // Table 5.14 Table Subtype 00522 { 00523 kVirtualChannelMap = 0x0, 00524 kDefinedChannelsMap = 0x1, 00525 kInverseChannelMap = 0x2, 00526 // all other values are reserved 00527 }; 00528 uint TableSubtype(void) const { return pesdata()[4] & 0xf; } 00529 QString TableSubtypeString(void) const; 00530 // vct_id 16 5.0 00531 uint ID(void) const { return (pesdata()[5]<<8) | pesdata()[6]; } 00532 // if (table_subtype==kDefinedChannelsMap) { 00533 DefinedChannelsMapSubtable DefinedChannelsMap(void) const 00534 { return DefinedChannelsMapSubtable(pesdata()); } 00535 // } 00536 // if (table_subtype==kVirtualChannelMap) { 00537 VirtualChannelMapSubtable VirtualChannelMap(void) const 00538 { return VirtualChannelMapSubtable(pesdata(), _ptrs); } 00539 // } 00540 // if (table_subtype==kInverseChannelMap) { 00541 InverseChannelMapSubtable InverseChannelMap(void) const 00542 { return InverseChannelMapSubtable(pesdata()); } 00543 // } 00544 // for (i=0; i<N; i++) 00545 // descriptor() ? ?.0 optional (determined by looking 00546 // at section_length) 00547 uint DescriptorsLength(void) const 00548 { return SectionLength() - (_ptrs.back() - pesdata()) - 4/*CRC*/; } 00549 const unsigned char * Descriptors(void) const { return _ptrs.back(); } 00550 // } 00551 // CRC_32 32 00552 00553 bool Parse(void); 00554 QString toString(void) const; 00555 QString toStringXML(uint indent_level) const; 00556 00557 private: 00558 vector<const unsigned char*> _ptrs; 00559 }; 00560 00564 class MTV_PUBLIC SCTESystemTimeTable : public PSIPTable 00565 { 00566 public: 00567 SCTESystemTimeTable(const SCTESystemTimeTable &table) : PSIPTable(table) 00568 { 00569 assert(TableID::STTscte == TableID()); 00570 } 00571 SCTESystemTimeTable(const PSIPTable &table) : PSIPTable(table) 00572 { 00573 assert(TableID::STTscte == TableID()); 00574 } 00575 00576 // Name bits loc expected value 00577 // table_id 8 0.0 0xC5 00578 // zero 2 1.0 0 00579 // reserved 2 1.2 3 00580 // section_length 12 1.4 00581 // ^^^ All above this line provided by PSIPTable 00582 // zero 3 3.0 0 00583 // protocol_version 5 3.3 0 00584 // zero 8 4.0 0 00585 // system_time 32 5.0 00586 uint32_t SystemTimeRaw(void) const 00587 { 00588 return ((pesdata()[5] <<24) | (pesdata()[6]<<16) | 00589 (pesdata()[7]<< 8) | pesdata()[8]); 00590 } 00591 QDateTime SystemTimeGPS(void) const 00592 { QDateTime dt; dt.setTime_t(GPSUnix()); return dt; } 00593 QDateTime SystemTimeUTC(void) const 00594 { QDateTime dt; dt.setTime_t(UTCUnix()); return dt; } 00595 time_t GPSUnix(void) const 00596 { return GPS_EPOCH + SystemTimeRaw(); } 00597 time_t UTCUnix(void) const 00598 { return GPSUnix() - GPSUTCOffset(); } 00599 // GPS_UTC_offset 8 9.0 (leap seconds since 1980) 00600 uint GPSUTCOffset(void) const { return pesdata()[9]; } 00601 // for (I = 0;I< N;I++) { descriptor() } 00602 uint DescriptorsLength(void) const 00603 { return SectionLength() - 10/*bytes before desc*/ - 4/*CRC*/; } 00604 const unsigned char * Descriptors(void) const { return pesdata() + 10; } 00605 00606 // CRC_32 32 00607 00608 QString toString(void) const; 00609 QString toStringXML(uint indent_level) const; 00610 }; 00611 00612 // PIM = 0xC0 -- Program Information Message (57 2003) PMT PID 00613 class MTV_PUBLIC ProgramInformationMessageTable : public PSIPTable 00614 { 00615 public: 00616 ProgramInformationMessageTable( 00617 const ProgramInformationMessageTable &table) : PSIPTable(table) 00618 { 00619 assert(TableID::PIM == TableID()); 00620 } 00621 ProgramInformationMessageTable(const PSIPTable &table) : PSIPTable(table) 00622 { 00623 assert(TableID::PIM == TableID()); 00624 } 00625 00626 QString toString(void) const 00627 { return "Program Information Message\n"; } 00628 QString toStringXML(uint indent_level) const 00629 { return "<ProgramInformationMessage />"; } 00630 }; 00631 00632 // PNM = 0xC1 -- Program Name Message (57 2003) PMT PID 00633 class MTV_PUBLIC ProgramNameMessageTable : public PSIPTable 00634 { 00635 public: 00636 ProgramNameMessageTable( 00637 const ProgramNameMessageTable &table) : PSIPTable(table) 00638 { 00639 assert(TableID::PNM == TableID()); 00640 } 00641 ProgramNameMessageTable(const PSIPTable &table) : PSIPTable(table) 00642 { 00643 assert(TableID::PNM == TableID()); 00644 } 00645 00646 QString toString(void) const 00647 { return "Program Name Message\n"; } 00648 QString toStringXML(uint indent_level) const 00649 { return "<ProgramNameMessage />"; } 00650 }; 00651 00652 // ADET = 0xD9 -- Aggregate Data Event Table (80 2002) 00653 class MTV_PUBLIC AggregateDataEventTable : public PSIPTable 00654 { 00655 public: 00656 AggregateDataEventTable( 00657 const AggregateDataEventTable &table) : PSIPTable(table) 00658 { 00659 assert(TableID::ADET == TableID()); 00660 } 00661 AggregateDataEventTable(const PSIPTable &table) : PSIPTable(table) 00662 { 00663 assert(TableID::ADET == TableID()); 00664 } 00665 00666 QString toString(void) const; 00667 QString toStringXML(uint indent_level) const; 00668 }; 00669 00670 00671 #endif // _SCTE_TABLES_H_
1.7.6.1