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