MythTV  0.26-pre
atsctables.h
Go to the documentation of this file.
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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends