MythTV  0.26-pre
dvbtables.h
Go to the documentation of this file.
00001 // -*- Mode: c++ -*-
00002 // Copyright (c) 2005, Daniel Thor Kristjansson
00003 #ifndef _DVB_TABLES_H_
00004 #define _DVB_TABLES_H_
00005 
00006 #include <QString>
00007 #include <stdint.h>  // uint32_t
00008 
00009 #include "dvbdescriptors.h"
00010 #include "mpegtables.h"
00011 #include "mythtvexp.h"
00012 
00013 QDateTime dvbdate2qt(const unsigned char*);
00014 time_t dvbdate2unix(const unsigned char*);
00015 uint32_t dvbdate2key(const unsigned char*);
00016 
00021 class MTV_PUBLIC NetworkInformationTable : public PSIPTable
00022 {
00023   public:
00024     NetworkInformationTable(const NetworkInformationTable& table)
00025         : PSIPTable(table), _cached_network_name(QString::null)
00026     {
00027         assert(TableID::NIT == TableID() || TableID::NITo == TableID());
00028         Parse();
00029     }
00030     NetworkInformationTable(const PSIPTable& table)
00031         : PSIPTable(table), _cached_network_name(QString::null)
00032     {
00033         assert(TableID::NIT == TableID() || TableID::NITo == TableID());
00034         Parse();
00035     }
00036     ~NetworkInformationTable() { ; }
00037 
00038     // table_id                 8   0.0       0x40/0x41
00039     // section_syntax_indicator 1   1.0          1
00040     // reserved_future_use      1   1.1          1
00041     // reserved                 2   1.2          3
00042     // section_length          12   1.4          0
00043     // reserved                 2   5.0          3
00044     // version_number           5   5.2          0
00045     // current_next_indicator   1   5.7          1
00046     // section_number           8   6.0       0x00
00047     // last_section_number      8   7.0       0x00
00048 
00050     uint NetworkID(void) const { return TableIDExtension(); }
00051 
00052     // reserved_future_use      4   8.0        0xf
00054     uint NetworkDescriptorsLength(void) const
00055         { return ((psipdata()[0]<<8) | psipdata()[1]) & 0xfff; }
00056 
00059     const unsigned char* NetworkDescriptors(void) const
00060         { return psipdata() + 2; }
00061 
00062     // reserved_future_use      4  0.0+ndl     0xf
00064     uint TransportStreamDataLength(void) const
00065         { return ((_tsc_ptr[0]<<8) | _tsc_ptr[1]) & 0xfff; }
00066     uint TransportStreamCount(void) const
00067         { return _ptrs.size() - 1; }
00068     // for(i=0; i<N; i++) {
00070     uint TSID(uint i) const { return (_ptrs[i][0]<<8) | _ptrs[i][1]; }
00072     uint OriginalNetworkID(uint i) const
00073         { return (_ptrs[i][2]<<8) | _ptrs[i][3]; }
00074     //   reserved_future_use    4  4.0+p
00076     uint TransportDescriptorsLength(uint i) const
00077         { return ((_ptrs[i][4]<<8) | _ptrs[i][5]) & 0xfff; }
00080     const unsigned char* TransportDescriptors(uint i) const
00081         { return _ptrs[i]+6; }
00082     // }
00083 
00084     void Parse(void) const;
00085     QString toString(void) const;
00086     QString NetworkName(void) const;
00087 
00088   private:
00089     mutable QString _cached_network_name;
00090     mutable const unsigned char* _tsc_ptr;
00091     mutable vector<const unsigned char*> _ptrs; // used to parse
00092 };
00093 
00098 class MTV_PUBLIC ServiceDescriptionTable : public PSIPTable
00099 {
00100   public:
00101     ServiceDescriptionTable(const ServiceDescriptionTable& table)
00102         : PSIPTable(table)
00103     {
00104         assert(TableID::SDT == TableID() || TableID::SDTo == TableID());
00105         Parse();
00106     }
00107     ServiceDescriptionTable(const PSIPTable& table) : PSIPTable(table)
00108     {
00109         assert(TableID::SDT == TableID() || TableID::SDTo == TableID());
00110         Parse();
00111     }
00112     ~ServiceDescriptionTable() { ; }
00113 
00114     // table_id                 8   0.0       0x42/0x46
00115     // section_syntax_indicator 1   1.0          1
00116     // reserved_future_use      1   1.1          1
00117     // reserved                 2   1.2          3
00118     // section_length          12   1.4          0
00119     // reserved                 2   5.0          3
00120     // version_number           5   5.2          0
00121     // current_next_indicator   1   5.7          1
00122     // section_number           8   6.0       0x00
00123     // last_section_number      8   7.0       0x00
00124 
00126     uint TSID() const { return TableIDExtension(); }
00127 
00129     uint OriginalNetworkID() const
00130         { return (psipdata()[0]<<8) | psipdata()[1]; }
00131 
00133     uint ServiceCount() const { return _ptrs.size()-1; }
00134 
00135     // reserved_future_use      8  10.0
00136     // for (i=0;i<N;i++) {
00138     uint ServiceID(uint i) const { return (_ptrs[i][0]<<8) | (_ptrs[i][1]); }
00139     //   reserved_future_use    6  2.0+p
00140     //   EIT_schedule_flag      1  2.6+p
00141     bool HasEITSchedule(uint i) const { return bool(_ptrs[i][2] & 0x2); }
00142     //   EIT_present_following  1  2.7+p
00143     bool HasEITPresentFollowing(uint i) const
00144         { return bool(_ptrs[i][2] & 0x1); }
00146     uint RunningStatus(uint i) const { return (_ptrs[i][3] & 0xE0) >> 5; }
00148     bool IsEncrypted(uint i) const { return bool(_ptrs[i][3] & 0x10); }
00150     uint ServiceDescriptorsLength(uint i) const
00151         { return ((_ptrs[i][3]<<8) | (_ptrs[i][4])) & 0xfff; }
00154     const unsigned char* ServiceDescriptors(uint i) const
00155         { return _ptrs[i]+5; }
00156     // }
00157     ServiceDescriptor *GetServiceDescriptor(uint i) const;
00158 
00160     bool Mutate(void);
00161 
00162     void Parse(void) const;
00163     QString toString(void) const;
00164 
00165   private:
00166     mutable vector<const unsigned char*> _ptrs; // used to parse
00167 };
00168 
00176 class MTV_PUBLIC BouquetAssociationTable : public PSIPTable
00177 {
00178   public:
00179     BouquetAssociationTable(const PSIPTable& table) : PSIPTable(table)
00180     {
00181        assert(TableID::BAT == TableID());
00182        Parse();
00183     }
00184     ~BouquetAssociationTable() { ; }
00185 
00186     // table_id                 8   0.0       0x4a
00187     // section_syntax_indicator 1   1.0          1
00188     // reserved_future_use      1   1.1          1
00189     // reserved                 2   1.2          3
00190     // section_length          12   1.4          0
00191     // Bouquet ID              16   3.0          0
00192     uint BouquetID() const { return TableIDExtension(); }
00193 
00194     // reserved                 2   5.0          3
00195     // version_number           5   5.2          0
00196     // current_next_indicator   1   5.7          1
00197     // section_number           8   6.0       0x00
00198     // last_section_number      8   7.0       0x00
00199     // reserved                 4   8         0x0d
00200     uint BouquetDescriptorsLength(void) const
00201         { return ((psipdata()[0]<<8) | psipdata()[1]) & 0xfff; }
00202 
00203     // Bouquet descriptors len 12   8.4
00204     // for (i=0;i<N;i++)
00205     // Descriptor();
00206     const unsigned char* BouquetDescriptors(void) const
00207         { return psipdata() + 2; }
00208     // reserved                4 10+N.0
00209 
00210     // Transport stream loop len 12
00211     uint TransportStreamDataLength(void) const
00212         { return ((_tsc_ptr[0]<<8) | _tsc_ptr[1]) & 0xfff; }
00213     uint TransportStreamCount(void) const
00214         { return _ptrs.size() - 1; }
00215 
00216     // for (i=0;i<N;i++) {
00217     //   transport_stream_id    16
00218     uint TSID(uint i) const { return (_ptrs[i][0] << 8) | _ptrs[i][1]; }
00219     //   original_network_id    16
00220     uint OriginalNetworkID(uint i) const
00221         { return (_ptrs[i][2] << 8) | _ptrs[i][3]; }
00222     //   reserved                4
00223     //   transport descriptor len 12
00224     uint TransportDescriptorsLength(uint i) const
00225         { return ((_ptrs[i][4]<<8) | _ptrs[i][5]) & 0xfff; }
00228     const unsigned char* TransportDescriptors(uint i) const
00229         { return _ptrs[i]+6; }
00230     // }
00231 
00232     void Parse(void) const;
00233     QString toString(void) const;
00234 
00235   private:
00236     mutable const unsigned char* _tsc_ptr;
00237     mutable vector<const unsigned char*> _ptrs;
00238 };
00239 
00240 class MTV_PUBLIC DiscontinuityInformationTable : public PSIPTable
00241 {
00242     DiscontinuityInformationTable(const PSIPTable& table) : PSIPTable(table)
00243         { ; }
00244     // table_id 8
00245     // section_syntax_indicator 1
00246     // reserved_future_use      1
00247     // reserved                 2
00248     // section_length          12
00249     // transition_flag          1
00250     // reserved_future_use      7
00251 };
00252 
00253 class MTV_PUBLIC SelectionInformationTable : public PSIPTable
00254 {
00255     SelectionInformationTable(const PSIPTable& table) : PSIPTable(table)
00256         { ; }
00257     // table_id 8
00258     // section_syntax_indicator 1
00259     // DVB_reserved_future_use  1
00260     // ISO_reserved             2
00261     // section_length          12
00262     // DVB_reserved_future_use 16
00263     // ISO_reserved             2
00264     // version_number           5
00265     // current_next_indicator   1
00266     // section_number           8
00267     // last_section_number      8
00268     // DVB_reserved_for_future_use 4
00269     // transmission_info_loop_length 12
00270     // for (i =0;i<N;i++) { descriptor() }
00271     // for (i=0;i<N;i++)
00272     // {
00273     //   service_id 16
00274     //   DVB_reserved_future_use  1
00275     //   running_status           3
00276     //   service_loop_length     12
00277     //   for(j=0;j<N;j++) { descriptor() }
00278     // }
00279     // CRC_32 32 rpchof
00280 };
00281 
00282 class MTV_PUBLIC DVBEventInformationTable : public PSIPTable
00283 {
00284   public:
00285     DVBEventInformationTable(const PSIPTable& table) : PSIPTable(table)
00286     {
00287     // table_id                 8   0.0       0xC7
00288         assert(IsEIT(TableID()));
00289     // section_syntax_indicator 1   1.0          1
00290     // private_indicator        1   1.1          1
00291     // reserved                 2   1.2          3
00292     // section_length          12   1.4
00293     // reserved                 2   5.0          3
00294     // version_number           5   5.2
00295     // current_next_indicator   1   5.7          1
00296     // section_number           8   6.0
00297     // last_section_number      8   7.0
00298         Parse();
00299     }
00300 
00301     // service_id              16   3.0
00302     uint ServiceID(void) const { return TableIDExtension(); }
00303 
00304     // transport_stream_id     16   8.0
00305     uint TSID(void) const
00306         { return (psipdata()[0]<<8) | psipdata()[1]; }
00307 
00308     // original_network_id     16  10.0
00309     uint OriginalNetworkID(void) const
00310         { return (psipdata()[2]<<8) | psipdata()[3]; }
00311 
00312     // segment_last_section_num 8  12.0
00313     uint SegmentLastSectionNumber(void) const
00314         { return psipdata()[4]; }
00315     // last_table_id            8  13.0
00316     uint LastTableID(void) const
00317         { return psipdata()[5]; }
00318 
00319     uint EventCount() const { return _ptrs.size()-1; }
00320 
00321     // for(i=0;i<N;i++) {
00322     //   event_id              16   0.0+x
00323     uint EventID(uint i) const
00324         { return (_ptrs[i][0]<<8) | _ptrs[i][1]; }
00325     //   start_time            40   2.0+x
00326     const unsigned char *StartTime(uint i) const
00327         { return _ptrs[i]+2; }
00328     QDateTime StartTimeUTC(uint i) const
00329         { return dvbdate2qt(StartTime(i)); }
00330     time_t StartTimeUnixUTC(uint i) const
00331         { return dvbdate2unix(StartTime(i)); }
00332     time_t EndTimeUnixUTC(uint i) const
00333         { return StartTimeUnixUTC(i) + DurationInSeconds(i); }
00334     uint32_t StartTimeKey(uint i) const
00335         { return dvbdate2key(StartTime(i)); }
00336     //   duration              24   7.0+x
00337     const unsigned char *Duration(uint i) const
00338         { return _ptrs[i]+7; }
00339     uint DurationInSeconds(uint i) const
00340     {
00341         return ((byteBCD2int(Duration(i)[0]) * 3600) +
00342                 (byteBCD2int(Duration(i)[1]) * 60) +
00343                 (byteBCD2int(Duration(i)[2])));
00344     }
00345     //   running_status         3  10.0+x
00346     uint RunningStatus(uint i) const { return _ptrs[i][10] >> 5; }
00347     //   free_CA_mode           1  10.3+x
00348     bool IsScrambled(uint i) const { return bool(_ptrs[i][10] & 0x10); }
00349     //   descriptors_loop_len  12  10.4+x
00350     uint DescriptorsLength(uint i) const
00351         { return ((_ptrs[i][10]<<8) | (_ptrs[i][11])) & 0xfff; }
00352     //   for(i=0;i<N;i++)       y  12.0+x
00353     //     { descriptor() }
00354     const unsigned char* Descriptors(uint i) const
00355         { return _ptrs[i] + 12; }
00356     //   }
00357     //CRC_32 32 rpchof
00358 
00359     void Parse(void) const;
00360 
00361     static bool IsEIT(uint table_id);
00362 
00363   private:
00364     mutable vector<const unsigned char*> _ptrs; // used to parse
00365 };
00366 
00370 class MTV_PUBLIC TimeDateTable : public PSIPTable
00371 {
00372   public:
00373     TimeDateTable(const PSIPTable& table)
00374         : PSIPTable(table)
00375     {
00376         assert(TableID::TDT == TableID());
00377     }
00378     ~TimeDateTable() { ; }
00379 
00380     // table_id                 8   0.0       0x70
00381     // section_syntax_indicator 1   1.0          0
00382     // reserved_future_use      1   1.1          1
00383     // reserved                 2   1.2          3
00384     // section_length          12   1.4         40
00385     // UTC_time                40   3.0          0
00386     const unsigned char *UTCdata(void) const
00387         { return pesdata() + 3; }
00388 
00389     QDateTime UTC(void)  const { return dvbdate2qt(UTCdata());   }
00390     time_t UTCUnix(void) const { return dvbdate2unix(UTCdata()); }
00391 };
00392 
00393 #endif // _DVB_TABLES_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends