00001
00002
00003
00004 #include <cmath>
00005
00006 #include "dvbtables.h"
00007 #include "dvbdescriptors.h"
00008
00009 void NetworkInformationTable::Parse(void) const
00010 {
00011 _tsc_ptr = pesdata() + 10 + NetworkDescriptorsLength();
00012
00013 _ptrs.clear();
00014 _ptrs.push_back(_tsc_ptr + 2);
00015 for (uint i=0; _ptrs[i] + 6 <= _ptrs[0] + TransportStreamDataLength(); i++)
00016 _ptrs.push_back(_ptrs[i] + 6 + TransportDescriptorsLength(i));
00017 }
00018
00019 QString NetworkInformationTable::toString(void) const
00020 {
00021 QString str = QString("NIT: NetID(%1) tranports(%2)\n")
00022 .arg(NetworkID()).arg(TransportStreamCount());
00023 str.append(QString("Section (%1) Last Section (%2) IsCurrent (%3)\n")
00024 .arg(Section()).arg(LastSection()).arg(IsCurrent()));
00025
00026 if (0 != NetworkDescriptorsLength())
00027 {
00028 str.append(QString("Network descriptors length: %1\n")
00029 .arg(NetworkDescriptorsLength()));
00030 vector<const unsigned char*> desc =
00031 MPEGDescriptor::Parse(NetworkDescriptors(),
00032 NetworkDescriptorsLength());
00033 for (uint i = 0; i < desc.size(); i++)
00034 str.append(QString(" %1\n")
00035 .arg(MPEGDescriptor(desc[i]).toString()));
00036 }
00037
00038 for (uint i = 0; i < TransportStreamCount(); i++)
00039 {
00040 str.append(QString(" Transport #%1 TSID(0x%2) ")
00041 .arg(i, 2, 10).arg(TSID(i), 0, 16));
00042 str.append(QString("original_network_id(0x%2) desc_len(%3)\n")
00043 .arg(OriginalNetworkID(i), 0, 16)
00044 .arg(TransportDescriptorsLength(i)));
00045
00046 if (0 != TransportDescriptorsLength(i))
00047 {
00048 str.append(QString(" Transport descriptors length: %1\n")
00049 .arg(TransportDescriptorsLength(i)));
00050 vector<const unsigned char*> desc =
00051 MPEGDescriptor::Parse(TransportDescriptors(i),
00052 TransportDescriptorsLength(i));
00053 for (uint i = 0; i < desc.size(); i++)
00054 str.append(QString(" %1\n")
00055 .arg(MPEGDescriptor(desc[i]).toString()));
00056 }
00057 }
00058 return str;
00059 }
00060
00061 QString NetworkInformationTable::NetworkName() const
00062 {
00063 if (_cached_network_name == QString::null)
00064 {
00065 desc_list_t parsed =
00066 MPEGDescriptor::Parse(NetworkDescriptors(),
00067 NetworkDescriptorsLength());
00068
00069 const unsigned char *desc =
00070 MPEGDescriptor::Find(parsed, DescriptorID::network_name);
00071
00072 if (desc)
00073 _cached_network_name = NetworkNameDescriptor(desc).Name();
00074 else
00075 _cached_network_name = QString("Net ID 0x%1")
00076 .arg(NetworkID(), 0, 16);
00077 }
00078 return _cached_network_name;
00079 }
00080
00081
00082 void ServiceDescriptionTable::Parse(void) const
00083 {
00084 _ptrs.clear();
00085 _ptrs.push_back(pesdata() + 11);
00086 uint i = 0;
00087 while ((_ptrs[i] + 5) < (pesdata() + Length()))
00088 {
00089 _ptrs.push_back(_ptrs[i] + 5 + ServiceDescriptorsLength(i));
00090 i++;
00091 }
00092 }
00093
00094 QString ServiceDescriptionTable::toString(void) const
00095 {
00096 QString str =
00097 QString("SDT: TSID(0x%1) original_network_id(0x%2) services(%3)\n")
00098 .arg(TSID(), 0, 16).arg(OriginalNetworkID(), 0, 16)
00099 .arg(ServiceCount());
00100
00101 for (uint i = 0; i < ServiceCount(); i++)
00102 {
00103 str.append(QString(" Service #%1 SID(0x%2) ")
00104 .arg(i, 2, 10).arg(ServiceID(i), 0, 16));
00105 str.append(QString("eit_schd(%1) eit_pf(%2) encrypted(%3)\n")
00106 .arg(HasEITSchedule(i) ? "t" : "f")
00107 .arg(HasEITPresentFollowing(i) ? "t" : "f")
00108 .arg(IsEncrypted(i) ? "t" : "f"));
00109
00110 if (0 != ServiceDescriptorsLength(i))
00111 {
00112 str.append(QString(" Service descriptors length: %1\n")
00113 .arg(ServiceDescriptorsLength(i)));
00114 vector<const unsigned char*> desc =
00115 MPEGDescriptor::Parse(ServiceDescriptors(i),
00116 ServiceDescriptorsLength(i));
00117 for (uint i = 0; i < desc.size(); i++)
00118 str.append(QString(" %1\n")
00119 .arg(MPEGDescriptor(desc[i]).toString()));
00120 }
00121 }
00122 return str;
00123 }
00124
00125 ServiceDescriptor *ServiceDescriptionTable::GetServiceDescriptor(uint i) const
00126 {
00127 desc_list_t parsed =
00128 MPEGDescriptor::Parse(ServiceDescriptors(i),
00129 ServiceDescriptorsLength(i));
00130
00131 const unsigned char *desc =
00132 MPEGDescriptor::Find(parsed, DescriptorID::service);
00133
00134 if (desc)
00135 return new ServiceDescriptor(desc);
00136
00137 return NULL;
00138 }
00139
00140 bool ServiceDescriptionTable::Mutate(void)
00141 {
00142 if (VerifyCRC())
00143 {
00144 SetTableID((TableID() == TableID::SDTo) ? TableID::SDT : TableID::SDTo);
00145 SetCRC(CalcCRC());
00146 return true;
00147 }
00148 else
00149 return false;
00150 }
00151
00152 void BouquetAssociationTable::Parse(void) const
00153 {
00154 _tsc_ptr = pesdata() + 10 + BouquetDescriptorsLength();
00155
00156 _ptrs.clear();
00157 _ptrs.push_back(_tsc_ptr + 2);
00158 for (uint i=0; _ptrs[i] + 6 <= _ptrs[0] + TransportStreamDataLength(); i++)
00159 _ptrs.push_back(_ptrs[i] + 6 + TransportDescriptorsLength(i));
00160 }
00161
00162 QString BouquetAssociationTable::toString(void) const
00163 {
00164 QString str =
00165 QString("BAT: BouquetID(0x%1) transports(%2)\n")
00166 .arg(BouquetID(), 0, 16).arg(TransportStreamCount());
00167
00168 if (0 != BouquetDescriptorsLength())
00169 {
00170 str.append(QString("Bouquet descriptors length: %1\n")
00171 .arg(BouquetDescriptorsLength()));
00172 vector<const unsigned char*> desc =
00173 MPEGDescriptor::Parse(BouquetDescriptors(),
00174 BouquetDescriptorsLength());
00175 for (uint i = 0; i < desc.size(); i++)
00176 str.append(QString(" %1\n")
00177 .arg(MPEGDescriptor(desc[i]).toString()));
00178 }
00179
00180 for (uint i = 0; i < TransportStreamCount(); i++)
00181 {
00182 str.append(QString(" Transport #%1 TSID(0x%2) ")
00183 .arg(i, 2, 10).arg(TSID(i), 0, 16));
00184 str.append(QString("original_network_id(0x%2) desc_len(%3)\n")
00185 .arg(OriginalNetworkID(i), 0, 16)
00186 .arg(TransportDescriptorsLength(i)));
00187
00188 if (0 != TransportDescriptorsLength(i))
00189 {
00190 str.append(QString(" Transport descriptors length: %1\n")
00191 .arg(TransportDescriptorsLength(i)));
00192 vector<const unsigned char*> desc =
00193 MPEGDescriptor::Parse(TransportDescriptors(i),
00194 TransportDescriptorsLength(i));
00195 for (uint i = 0; i < desc.size(); i++)
00196 str.append(QString(" %1\n")
00197 .arg(MPEGDescriptor(desc[i]).toString()));
00198 }
00199 }
00200 return str;
00201 }
00202
00203 void DVBEventInformationTable::Parse(void) const
00204 {
00205 _ptrs.clear();
00206 _ptrs.push_back(psipdata() + 6);
00207 uint i = 0;
00208 while ((_ptrs[i] + 12) < (pesdata() + Length()))
00209 {
00210 _ptrs.push_back(_ptrs[i] + 12 + DescriptorsLength(i));
00211 i++;
00212 }
00213 }
00214
00215 bool DVBEventInformationTable::IsEIT(uint table_id)
00216 {
00217 bool is_eit = false;
00218
00219
00220 is_eit |= TableID::PF_EIT == table_id;
00221
00222 is_eit |= TableID::PF_EITo == table_id;
00223
00224 is_eit |= (TableID::SC_EITbeg <= table_id &&
00225 TableID::SC_EITend >= table_id);
00226
00227 is_eit |= (TableID::SC_EITbego <= table_id &&
00228 TableID::SC_EITendo >= table_id);
00229
00230 is_eit |= (TableID::DN_EITbego <= table_id &&
00231 TableID::DN_EITendo >= table_id);
00232
00233 return is_eit;
00234 }
00235
00239 QDateTime dvbdate2qt(const unsigned char *buf)
00240 {
00241 uint mjd = (buf[0] << 8) | buf[1];
00242 if (mjd >= 40587)
00243 {
00244 QDateTime result;
00245 result.setTimeSpec(Qt::UTC);
00246
00247
00248 uint secsSince1970 = (mjd - 40587) * 86400;
00249 secsSince1970 += byteBCD2int(buf[2]) * 3600;
00250 secsSince1970 += byteBCD2int(buf[3]) * 60;
00251 secsSince1970 += byteBCD2int(buf[4]);
00252 result.setTime_t(secsSince1970);
00253 return result;
00254 }
00255
00256
00257
00258
00259
00260
00261 const float tmpA = 1.0 / 365.25;
00262 const float tmpB = 1.0 / 30.6001;
00263
00264 float mjdf = mjd;
00265 int year = (int) truncf((mjdf - 15078.2f) * tmpA);
00266 int month = (int) truncf(
00267 (mjdf - 14956.1f - truncf(year * 365.25f)) * tmpB);
00268 int day = (int) truncf(
00269 (mjdf - 14956.0f - truncf(year * 365.25f) - truncf(month * 30.6001f)));
00270 int i = (month == 14 || month == 15) ? 1 : 0;
00271
00272 QDate date(1900 + year + i, month - 1 - i * 12, day);
00273 QTime time(byteBCD2int(buf[2]), byteBCD2int(buf[3]),
00274 byteBCD2int(buf[4]));
00275
00276 return QDateTime(date, time, Qt::UTC);
00277 }
00278
00282 time_t dvbdate2unix(const unsigned char *buf)
00283 {
00284
00285
00286 uint mjd = (buf[0] << 8) | buf[1];
00287 if (mjd < 40587)
00288 return 0;
00289
00290 uint secsSince1970 = (mjd - 40587) * 86400;
00291 secsSince1970 += byteBCD2int(buf[2]) * 3600;
00292 secsSince1970 += byteBCD2int(buf[3]) * 60;
00293 secsSince1970 += byteBCD2int(buf[4]);
00294 return secsSince1970;
00295 }
00296
00300 uint32_t dvbdate2key(const unsigned char *buf)
00301 {
00302 uint dt = (((uint)buf[0]) << 24) | (((uint)buf[1]) << 16);
00303 uint tm = ((byteBCD2int(buf[2]) * 3600) +
00304 (byteBCD2int(buf[3]) * 60) +
00305 (byteBCD2int(buf[4])));
00306 return (dt | (tm>>1)) ^ ((tm & 1)<<31);
00307 }