|
MythTV
0.26-pre
|
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_
1.7.6.1