00001 // -*- Mode: c++ -*- 00002 // Copyright (c) 2005, Daniel Thor Kristjansson 00003 #ifndef _DVB_TABLES_H_ 00004 #define _DVB_TABLES_H_ 00005 00006 #include <qstring.h> 00007 #include <stdint.h> // uint32_t 00008 #include "mpegtables.h" 00009 #include "dvbdescriptors.h" 00010 00011 QDateTime dvbdate2qt(const unsigned char*); 00012 time_t dvbdate2unix(const unsigned char*); 00013 uint32_t dvbdate2key(const unsigned char*); 00014 00019 class NetworkInformationTable : public PSIPTable 00020 { 00021 public: 00022 NetworkInformationTable(const NetworkInformationTable& table) 00023 : PSIPTable(table), _cached_network_name(QString::null) 00024 { 00025 assert(TableID::NIT == TableID() || TableID::NITo == TableID()); 00026 Parse(); 00027 } 00028 NetworkInformationTable(const PSIPTable& table) 00029 : PSIPTable(table), _cached_network_name(QString::null) 00030 { 00031 assert(TableID::NIT == TableID() || TableID::NITo == TableID()); 00032 Parse(); 00033 } 00034 ~NetworkInformationTable() { ; } 00035 00036 // table_id 8 0.0 0x40/0x41 00037 // section_syntax_indicator 1 1.0 1 00038 // reserved_future_use 1 1.1 1 00039 // reserved 2 1.2 3 00040 // section_length 12 1.4 0 00041 // reserved 2 5.0 3 00042 // version_number 5 5.2 0 00043 // current_next_indicator 1 5.7 1 00044 // section_number 8 6.0 0x00 00045 // last_section_number 8 7.0 0x00 00046 00048 uint NetworkID(void) const { return TableIDExtension(); } 00049 00050 // reserved_future_use 4 8.0 0xf 00052 uint NetworkDescriptorsLength(void) const 00053 { return ((psipdata()[0]<<8) | psipdata()[1]) & 0xfff; } 00054 00057 const unsigned char* NetworkDescriptors(void) const 00058 { return psipdata() + 2; } 00059 00060 // reserved_future_use 4 0.0+ndl 0xf 00062 uint TransportStreamDataLength(void) const 00063 { return ((_tsc_ptr[0]<<8) | _tsc_ptr[1]) & 0xfff; } 00064 uint TransportStreamCount(void) const 00065 { return _ptrs.size() - 1; } 00066 // for(i=0; i<N; i++) { 00068 uint TSID(uint i) const { return (_ptrs[i][0]<<8) | _ptrs[i][1]; } 00070 uint OriginalNetworkID(uint i) const 00071 { return (_ptrs[i][2]<<8) | _ptrs[i][3]; } 00072 // reserved_future_use 4 4.0+p 00074 uint TransportDescriptorsLength(uint i) const 00075 { return ((_ptrs[i][4]<<8) | _ptrs[i][5]) & 0xfff; } 00078 const unsigned char* TransportDescriptors(uint i) const 00079 { return _ptrs[i]+6; } 00080 // } 00081 00082 void Parse(void) const; 00083 QString toString(void) const; 00084 QString NetworkName(void) const; 00085 00086 private: 00087 mutable QString _cached_network_name; 00088 mutable const unsigned char* _tsc_ptr; 00089 mutable vector<const unsigned char*> _ptrs; // used to parse 00090 }; 00091 00096 class ServiceDescriptionTable : public PSIPTable 00097 { 00098 public: 00099 ServiceDescriptionTable(const ServiceDescriptionTable& table) 00100 : PSIPTable(table) 00101 { 00102 assert(TableID::SDT == TableID() || TableID::SDTo == TableID()); 00103 Parse(); 00104 } 00105 ServiceDescriptionTable(const PSIPTable& table) : PSIPTable(table) 00106 { 00107 assert(TableID::SDT == TableID() || TableID::SDTo == TableID()); 00108 Parse(); 00109 } 00110 ~ServiceDescriptionTable() { ; } 00111 00112 // table_id 8 0.0 0x42/0x46 00113 // section_syntax_indicator 1 1.0 1 00114 // reserved_future_use 1 1.1 1 00115 // reserved 2 1.2 3 00116 // section_length 12 1.4 0 00117 // reserved 2 5.0 3 00118 // version_number 5 5.2 0 00119 // current_next_indicator 1 5.7 1 00120 // section_number 8 6.0 0x00 00121 // last_section_number 8 7.0 0x00 00122 00124 uint TSID() const { return TableIDExtension(); } 00125 00127 uint OriginalNetworkID() const 00128 { return (psipdata()[0]<<8) | psipdata()[1]; } 00129 00131 uint ServiceCount() const { return _ptrs.size()-1; } 00132 00133 // reserved_future_use 8 10.0 00134 // for (i=0;i<N;i++) { 00136 uint ServiceID(uint i) const { return (_ptrs[i][0]<<8) | (_ptrs[i][1]); } 00137 // reserved_future_use 6 2.0+p 00138 // EIT_schedule_flag 1 2.6+p 00139 bool HasEITSchedule(uint i) const { return bool(_ptrs[i][2] & 0x2); } 00140 // EIT_present_following 1 2.7+p 00141 bool HasEITPresentFollowing(uint i) const 00142 { return bool(_ptrs[i][2] & 0x1); } 00144 uint RunningStatus(uint i) const { return (_ptrs[i][3] & 0xE0) >> 5; } 00146 bool IsEncrypted(uint i) const { return bool(_ptrs[i][3] & 0x10); } 00148 uint ServiceDescriptorsLength(uint i) const 00149 { return ((_ptrs[i][3]<<8) | (_ptrs[i][4])) & 0xfff; } 00152 const unsigned char* ServiceDescriptors(uint i) const 00153 { return _ptrs[i]+5; } 00154 // } 00155 ServiceDescriptor *GetServiceDescriptor(uint i) const; 00156 00158 bool Mutate(void); 00159 00160 void Parse(void) const; 00161 QString toString(void) const; 00162 00163 private: 00164 mutable vector<const unsigned char*> _ptrs; // used to parse 00165 }; 00166 00167 class DiscontinuityInformationTable : public PSIPTable 00168 { 00169 DiscontinuityInformationTable(const PSIPTable& table) : PSIPTable(table) 00170 { ; } 00171 // table_id 8 00172 // section_syntax_indicator 1 00173 // reserved_future_use 1 00174 // reserved 2 00175 // section_length 12 00176 // transition_flag 1 00177 // reserved_future_use 7 00178 }; 00179 00180 class SelectionInformationTable : public PSIPTable 00181 { 00182 SelectionInformationTable(const PSIPTable& table) : PSIPTable(table) 00183 { ; } 00184 // table_id 8 00185 // section_syntax_indicator 1 00186 // DVB_reserved_future_use 1 00187 // ISO_reserved 2 00188 // section_length 12 00189 // DVB_reserved_future_use 16 00190 // ISO_reserved 2 00191 // version_number 5 00192 // current_next_indicator 1 00193 // section_number 8 00194 // last_section_number 8 00195 // DVB_reserved_for_future_use 4 00196 // transmission_info_loop_length 12 00197 // for (i =0;i<N;i++) { descriptor() } 00198 // for (i=0;i<N;i++) 00199 // { 00200 // service_id 16 00201 // DVB_reserved_future_use 1 00202 // running_status 3 00203 // service_loop_length 12 00204 // for(j=0;j<N;j++) { descriptor() } 00205 // } 00206 // CRC_32 32 rpchof 00207 }; 00208 00209 class DVBEventInformationTable : public PSIPTable 00210 { 00211 public: 00212 DVBEventInformationTable(const PSIPTable& table) : PSIPTable(table) 00213 { 00214 // table_id 8 0.0 0xC7 00215 assert(IsEIT(TableID())); 00216 // section_syntax_indicator 1 1.0 1 00217 // private_indicator 1 1.1 1 00218 // reserved 2 1.2 3 00219 // section_length 12 1.4 00220 // reserved 2 5.0 3 00221 // version_number 5 5.2 00222 // current_next_indicator 1 5.7 1 00223 // section_number 8 6.0 00224 // last_section_number 8 7.0 00225 Parse(); 00226 } 00227 00228 // service_id 16 3.0 00229 uint ServiceID(void) const { return TableIDExtension(); } 00230 00231 // transport_stream_id 16 8.0 00232 uint TSID(void) const 00233 { return (psipdata()[0]<<8) | psipdata()[1]; } 00234 00235 // original_network_id 16 10.0 00236 uint OriginalNetworkID(void) const 00237 { return (psipdata()[2]<<8) | psipdata()[3]; } 00238 00239 // segment_last_section_num 8 12.0 00240 uint SegmentLastSectionNumber(void) const 00241 { return psipdata()[4]; } 00242 // last_table_id 8 13.0 00243 uint LastTableID(void) const 00244 { return psipdata()[5]; } 00245 00246 uint EventCount() const { return _ptrs.size()-1; } 00247 00248 // for(i=0;i<N;i++) { 00249 // event_id 16 0.0+x 00250 uint EventID(uint i) const 00251 { return (_ptrs[i][0]<<8) | _ptrs[i][1]; } 00252 // start_time 40 2.0+x 00253 const unsigned char *StartTime(uint i) const 00254 { return _ptrs[i]+2; } 00255 QDateTime StartTimeUTC(uint i) const 00256 { return dvbdate2qt(StartTime(i)); } 00257 time_t StartTimeUnixUTC(uint i) const 00258 { return dvbdate2unix(StartTime(i)); } 00259 time_t EndTimeUnixUTC(uint i) const 00260 { return StartTimeUnixUTC(i) + DurationInSeconds(i); } 00261 uint32_t StartTimeKey(uint i) const 00262 { return dvbdate2key(StartTime(i)); } 00263 // duration 24 7.0+x 00264 const unsigned char *Duration(uint i) const 00265 { return _ptrs[i]+7; } 00266 uint DurationInSeconds(uint i) const 00267 { 00268 return ((byteBCD2int(Duration(i)[0]) * 3600) + 00269 (byteBCD2int(Duration(i)[1]) * 60) + 00270 (byteBCD2int(Duration(i)[2]))); 00271 } 00272 // running_status 3 10.0+x 00273 uint RunningStatus(uint i) const { return _ptrs[i][10] >> 5; } 00274 // free_CA_mode 1 10.3+x 00275 bool IsScrambled(uint i) const { return bool(_ptrs[i][10] & 0x10); } 00276 // descriptors_loop_len 12 10.4+x 00277 uint DescriptorsLength(uint i) const 00278 { return ((_ptrs[i][10]<<8) | (_ptrs[i][11])) & 0xfff; } 00279 // for(i=0;i<N;i++) y 12.0+x 00280 // { descriptor() } 00281 const unsigned char* Descriptors(uint i) const 00282 { return _ptrs[i] + 12; } 00283 // } 00284 //CRC_32 32 rpchof 00285 00286 void Parse(void) const; 00287 00288 static bool IsEIT(uint table_id); 00289 00290 private: 00291 mutable vector<const unsigned char*> _ptrs; // used to parse 00292 }; 00293 00297 class TimeDateTable : public PSIPTable 00298 { 00299 public: 00300 TimeDateTable(const PSIPTable& table) 00301 : PSIPTable(table) 00302 { 00303 assert(TableID::TDT == TableID()); 00304 } 00305 ~TimeDateTable() { ; } 00306 00307 // table_id 8 0.0 0x70 00308 // section_syntax_indicator 1 1.0 0 00309 // reserved_future_use 1 1.1 1 00310 // reserved 2 1.2 3 00311 // section_length 12 1.4 40 00312 // UTC_time 40 3.0 0 00313 const unsigned char *UTCdata(void) const 00314 { return pesdata() + 3; } 00315 00316 QDateTime UTC(void) const { return dvbdate2qt(UTCdata()); } 00317 time_t UTCUnix(void) const { return dvbdate2unix(UTCdata()); } 00318 }; 00319 00320 #endif // _DVB_TABLES_H_
1.5.5