00001
00022 #ifndef _SCTE_TABLES_H_
00023 #define _SCTE_TABLES_H_
00024
00025 #include <cassert>
00026
00027
00028 #include "mpegtables.h"
00029 #include "mythtvexp.h"
00030 #include "iso639.h"
00031
00032
00033
00034
00035
00036
00037
00038
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
00048 uint NumberOfCarriers(void) const { return _beg[0]; }
00049
00050 enum
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
00058
00059 uint FrequencySpacing(void) const
00060 { return ((_beg[1] & 0x3) << 8) | _beg[2]; }
00061 uint FrequencySpacingHz(void) const
00062 { return FrequencySpacing() * SpacingUnitHz(); }
00063
00064 uint FrequencyUnit(void) const { return _beg[3]>>7; }
00065 uint FrequencyUnitHz(void) const { return FrequencyUnit() ? 125000 : 1000; }
00066
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
00073 uint DescriptorsCount(void) const { return _beg[5]; }
00074
00075
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
00094 enum
00095 {
00096 kTSUnknown = 0,
00097 kTSITUAnnexA = 1,
00098 kTSITUAnnexB = 2,
00099 kTSITUQPSK = 3,
00100 kTSATSC = 4,
00101 kTSDigiCipher = 5,
00102
00103
00104
00105
00106 };
00107 uint TransmissionSystem(void) const { return _beg[0] >> 4; }
00108 QString TransmissionSystemString(void) const;
00109
00110 enum
00111 {
00112 kRate5_11Coding = 0,
00113 kRate1_2Coding = 1,
00114
00115 kRate3_5Coding = 3,
00116
00117 kRate2_3Coding = 5,
00118
00119 kRate3_4Coding = 7,
00120 kRate4_5Coding = 8,
00121 kRate5_6Coding = 9,
00122
00123 kRate7_8Coding = 11,
00124
00125
00126
00127 kNone = 15,
00128
00129 };
00130 uint InnerCodingMode(void) const { return _beg[0] & 0xf; }
00131 QString InnerCodingModeString(void) const;
00132
00133 bool SplitBitstreamMode(void) const { return _beg[1] & 0x80; }
00134
00135
00136 enum
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,
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
00164 };
00165 uint ModulationFormat(void) const { return _beg[1] & 0x1f; }
00166 QString ModulationFormatString(void) const;
00167
00168
00169 uint SymbolRate(void) const
00170 {
00171 return (((_beg[2]&0xf)<<24) | (_beg[3]<<16) |
00172 (_beg[4]<<8) | (_beg[5]));
00173 }
00174
00175 uint DescriptorsCount(void) const { return _beg[6]; }
00176
00177
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
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215 uint FirstIndex(void) const { return pesdata()[4]; }
00216
00217 uint NumberOfRecords(void) const { return pesdata()[5]; }
00218
00219 uint TransmissionMedium(void) const { return pesdata()[6] >> 4; }
00220
00221 enum
00222 {
00223 kInvalid = 0x0,
00224 kCarrierDefinitionSubtable = 0x1,
00225 kModulationModeSubtable = 0x2,
00226
00227 };
00228 uint TableSubtype(void) const { return pesdata()[6] & 0xf; }
00229
00230
00231 CarrierDefinitionSubtable CarrierDefinition(uint i) const
00232 { return CarrierDefinitionSubtable(_ptrs[i], _ptrs[i+1]); }
00233
00234 ModulationModeSubtable ModulationMode(uint i) const
00235 { return ModulationModeSubtable(_ptrs[i], _ptrs[i+1]); }
00236
00237
00238
00239
00240
00241 uint DescriptorsLength(void) const
00242 { return SectionLength() - (_ptrs.back() - pesdata()) - 4; }
00243 const unsigned char * Descriptors(void) const { return _ptrs.back(); }
00244
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
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
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
00290 uint TransmissionMedium(void) const { return pesdata()[7] >> 4; }
00291
00292 enum
00293 {
00294 kInvalid = 0x0,
00295 kSourceNameSubtable = 0x6,
00296
00297 };
00298 uint TableSubtype(void) const { return pesdata()[7] & 0xf; }
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
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
00330
00331 uint FirstVirtualChannel(void) const
00332 { return ((_data[7]<<8) | _data[8]) & 0xfff; }
00333
00334
00335 uint DCMDataLength(void) const { return _data[9] & 0x7f; }
00336
00337
00338 bool RangeDefined(uint i) const { return _data[10+i] & 0x80; }
00339
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
00358
00359 bool DescriptorsIncluded(void) const { return _data[7] & 0x20; }
00360
00361
00362 bool Splice(void) const { return _data[8] & 0x80; }
00363
00364
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
00380 uint NumberOfVCRecords(void) const { return _data[13]; }
00381
00382
00383
00384
00385 uint VirtualChannelNumber(uint i) const
00386 { return ((_ptrs[i][0]<<8) | _ptrs[i][1]) & 0xfff; }
00387
00388 bool ApplicationVirtualChannel(uint i) const { return _ptrs[i][1] & 0x80; }
00389
00390
00391 enum
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
00400 enum
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
00409 enum
00410 {
00411 kNormalChannel = 0x0,
00412 kHiddenChannel = 0x1,
00413
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
00419
00420 uint ApplicationID(uint i) const { return (_ptrs[i][3]<<8) | _ptrs[i][4]; }
00421
00422
00423 uint SourceID(uint i) const { return (_ptrs[i][3]<<8) | _ptrs[i][4]; }
00424
00425
00426
00427 uint CDSReference(uint i) const { return _ptrs[i][5]; }
00428
00429 uint ProgramNumber(uint i) const { return (_ptrs[i][6]<<8) | _ptrs[i][7]; }
00430
00431 uint MMSReference(uint i) const { return _ptrs[i][8]; }
00432
00433
00434
00435 bool Scrambled(uint i) const { return _ptrs[i][6] & 0x80; }
00436
00437
00438 enum
00439 {
00440 kNTSC = 0x0,
00441 kPAL625 = 0x1,
00442 kPAL525 = 0x2,
00443 kSECAM = 0x3,
00444 kMAC = 0x4,
00445
00446 };
00447 uint VideoStandard(uint i) const { return _ptrs[i][6] & 0xf; }
00448 QString VideoStandardString(uint i) const;
00449
00450
00451
00452
00453 uint DescriptorsCount(uint i) const { return _ptrs[i][9]; }
00454
00455
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
00473
00474 uint FirstMapIndex(void) const { return ((_data[7]<<8)|_data[8]) & 0xfff; }
00475
00476
00477 uint RecordCount(void) const { return _data[9] & 0x7f; }
00478
00479
00480 uint SourceID(uint i) const { return (_data[10+i*4]<<8) | _data[11+i*4]; }
00481
00482
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
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
00511
00512
00513
00514
00515
00516
00517
00518
00519 uint TransmissionMedium(void) const { return pesdata()[4] >> 4; }
00520
00521 enum
00522 {
00523 kVirtualChannelMap = 0x0,
00524 kDefinedChannelsMap = 0x1,
00525 kInverseChannelMap = 0x2,
00526
00527 };
00528 uint TableSubtype(void) const { return pesdata()[4] & 0xf; }
00529 QString TableSubtypeString(void) const;
00530
00531 uint ID(void) const { return (pesdata()[5]<<8) | pesdata()[6]; }
00532
00533 DefinedChannelsMapSubtable DefinedChannelsMap(void) const
00534 { return DefinedChannelsMapSubtable(pesdata()); }
00535
00536
00537 VirtualChannelMapSubtable VirtualChannelMap(void) const
00538 { return VirtualChannelMapSubtable(pesdata(), _ptrs); }
00539
00540
00541 InverseChannelMapSubtable InverseChannelMap(void) const
00542 { return InverseChannelMapSubtable(pesdata()); }
00543
00544
00545
00546
00547 uint DescriptorsLength(void) const
00548 { return SectionLength() - (_ptrs.back() - pesdata()) - 4; }
00549 const unsigned char * Descriptors(void) const { return _ptrs.back(); }
00550
00551
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
00577
00578
00579
00580
00581
00582
00583
00584
00585
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
00600 uint GPSUTCOffset(void) const { return pesdata()[9]; }
00601
00602 uint DescriptorsLength(void) const
00603 { return SectionLength() - 10 - 4; }
00604 const unsigned char * Descriptors(void) const { return pesdata() + 10; }
00605
00606
00607
00608 QString toString(void) const;
00609 QString toStringXML(uint indent_level) const;
00610 };
00611
00612
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
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
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_