00001
00002
00003 #ifndef _ATSC_TABLES_H_
00004 #define _ATSC_TABLES_H_
00005
00006 #include <stdint.h>
00007 #include <QString>
00008
00009 #include "atscdescriptors.h"
00010 #include "mpegtables.h"
00011 #include "mythtvexp.h"
00012
00013
00014
00015
00016
00017
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
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 uint SCTEMapId() const
00101 {
00102 return (pesdata()[3]<<8) | pesdata()[4];
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112 uint TableCount() const
00113 {
00114 return (pesdata()[9]<<8) | pesdata()[10];
00115 }
00116
00117
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
00125
00126 uint TablePID(uint i) const
00127 {
00128 return ((_ptrs[i][2]<<8) | (_ptrs[i][3])) & 0x1fff;
00129 }
00130
00131
00132 uint TableVersion(uint i) const
00133 {
00134 return (_ptrs[i][4]) & 0x1f;
00135 }
00136
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
00143
00144 uint TableDescriptorsLength(uint i) const
00145 {
00146 return ((_ptrs[i][9]<<8) | (_ptrs[i][10])) & 0xfff;
00147 }
00148
00149
00150
00151
00152
00153 const unsigned char* TableDescriptors(uint i) const
00154 {
00155 return _ptrs[i]+11;
00156 }
00157
00158
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
00170
00171
00172
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;
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
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 uint TransportStreamID() const { return TableIDExtension(); }
00217
00218
00219 uint ChannelCount() const { return pesdata()[9]; }
00220
00221
00222
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
00236
00237
00238
00239
00240 uint MajorChannel(uint i) const
00241 {
00242 return (((_ptrs[i][14])<<6)&0x3c0) | (_ptrs[i][15]>>2);
00243 }
00244
00245 uint MinorChannel(uint i) const
00246 {
00247 return (((_ptrs[i][15])<<8)&0x300) | _ptrs[i][16];
00248 }
00249
00250 uint ModulationMode(uint i) const
00251 {
00252 return _ptrs[i][17];
00253 }
00254 QString ModulationModeString(uint i) const;
00255
00256
00257 uint ChannelTransportStreamID(uint i) const
00258 {
00259 return ((_ptrs[i][22]<<8) | _ptrs[i][23]);
00260 }
00261
00262 uint ProgramNumber(uint i) const
00263 {
00264 return ((_ptrs[i][24]<<8) | _ptrs[i][25]);
00265 }
00266
00267 uint ETMlocation(uint i) const
00268 {
00269 return (_ptrs[i][26]>>6) & 0x03;
00270 }
00271
00272 bool IsAccessControlled(uint i) const
00273 {
00274 return bool(_ptrs[i][26] & 0x20);
00275 }
00276
00277 bool IsHidden(uint i) const
00278 {
00279 return bool(_ptrs[i][26] & 0x10);
00280 }
00281
00282
00283 bool IsHiddenInGuide(uint i) const
00284 {
00285 return bool(_ptrs[i][26] & 0x2);
00286 }
00287
00288
00289 uint ServiceType(uint i) const
00290 {
00291 return _ptrs[i][27] & 0x3f;
00292 }
00293 QString ServiceTypeString(uint i) const;
00294
00295 uint SourceID(uint i) const
00296 {
00297 return ((_ptrs[i][28]<<8) | _ptrs[i][29]);
00298 }
00299
00300
00301 uint DescriptorsLength(uint i) const
00302 {
00303 return ((_ptrs[i][30]<<8) | _ptrs[i][31]) & 0x03ff;
00304 }
00305
00306 const unsigned char* Descriptors(uint i) const
00307 {
00308 return _ptrs[i]+32;
00309 }
00310
00311
00312
00313 uint GlobalDescriptorsLength() const
00314 {
00315 uint i = ChannelCount();
00316 return ((_ptrs[i][0]<<8) | _ptrs[i][1]) & 0x03ff;
00317 }
00318
00319 const unsigned char* GlobalDescriptors() const
00320 {
00321 return _ptrs[ChannelCount()]+2;
00322 }
00323
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
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
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
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439 uint SCTEMapId() const
00440 {
00441 return (pesdata()[3]<<8) | pesdata()[4];
00442 }
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
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
00469
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
00479
00480
00481
00482
00483
00484
00485
00486 bool IsPathSelect(uint i) const
00487 {
00488 return bool(_ptrs[i][26] & 0x8);
00489 }
00490
00491 bool IsOutOfBand(uint i) const
00492 {
00493 return bool(_ptrs[i][26] & 0x4);
00494 }
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
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
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545 uint SourceID() const { return TableIDExtension(); }
00546
00547
00548 uint EventCount() const { return psipdata()[1]; }
00549
00550
00551
00552
00553 uint EventID(uint i) const
00554 {
00555 return ((_ptrs[i][0]<<8) | _ptrs[i][1])&0x3fff;
00556 }
00557
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
00566 QDateTime dt;
00567 dt.setTime_t(GPS_EPOCH + StartTimeRaw(i));
00568 return dt;
00569 }
00570
00571
00572 uint ETMLocation(uint i) const
00573 {
00574 return (_ptrs[i][6]>>4)&3;
00575 }
00576
00577 uint LengthInSeconds(uint i) const
00578 {
00579 return ((_ptrs[i][6]<<16) | (_ptrs[i][7]<<8) |
00580 (_ptrs[i][8])) & 0xfffff;
00581 }
00582
00583 uint TitleLength(uint i) const
00584 { return _ptrs[i][9]; }
00585
00586 MultipleStringStructure title(int i) const
00587 {
00588 return MultipleStringStructure(_ptrs[i]+10);
00589 }
00590
00591
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
00598
00599
00600 const unsigned char* Descriptors(uint i) const
00601 {
00602 return _ptrs[i]+12+TitleLength(i);
00603 }
00604
00605
00606
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
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 uint ExtendedTextTableID() const { return TableIDExtension(); }
00645 void SetExtendedTextTableID(uint id)
00646 { SetTableIDExtension(id); }
00647
00648
00649
00650
00651
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
00660 const MultipleStringStructure ExtendedTextMessage() const
00661 {
00662 return MultipleStringStructure(psipdata() + 5);
00663 }
00664
00665 QString toString() const;
00666
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
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
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
00720 uint GPSOffset() const { return pesdata()[13]; }
00721
00722
00723
00724
00725
00726 bool InDaylightSavingsTime() const { return pesdata()[14]&0x80; }
00727 uint DayDaylightSavingsStarts() const { return pesdata()[14]&0x1f; }
00728 uint HourDaylightSavingsStarts() const { return pesdata()[15]; }
00729
00730
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_