MythTV  master
dvbtables.cpp
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
2 // Copyright (c) 2005, Daniel Thor Kristjansson
3 
4 #include <cmath>
5 
6 #include "dvbtables.h"
7 #include "dvbdescriptors.h"
8 
10 {
12 
13  _ptrs.clear();
14  _ptrs.push_back(_tsc_ptr + 2);
15  for (uint i=0; _ptrs[i] + 6 <= _ptrs[0] + TransportStreamDataLength(); i++)
16  _ptrs.push_back(_ptrs[i] + 6 + TransportDescriptorsLength(i));
17 }
18 
20 {
21  QString str = QString("NIT: NetID(%1) transports(%2)\n")
22  .arg(NetworkID()).arg(TransportStreamCount());
23  str.append(QString("Section (%1) Last Section (%2) IsCurrent (%3)\n")
24  .arg(Section()).arg(LastSection()).arg(IsCurrent()));
25 
26  if (0 != NetworkDescriptorsLength())
27  {
28  str.append(QString("Network descriptors length: %1\n")
29  .arg(NetworkDescriptorsLength()));
30  vector<const unsigned char*> desc =
33  for (size_t i = 0; i < desc.size(); i++)
34  str.append(QString(" %1\n")
35  .arg(MPEGDescriptor(desc[i]).toString()));
36  }
37 
38  for (uint i = 0; i < TransportStreamCount(); i++)
39  {
40  str.append(QString(" Transport #%1 TSID(0x%2) ")
41  .arg(i, 2, 10).arg(TSID(i), 0, 16));
42  str.append(QString("original_network_id(0x%2) desc_len(%3)\n")
43  .arg(OriginalNetworkID(i), 0, 16)
45 
46  if (0 != TransportDescriptorsLength(i))
47  {
48  str.append(QString(" Transport descriptors length: %1\n")
50  vector<const unsigned char*> desc =
53  for (size_t j = 0; j < desc.size(); j++)
54  str.append(QString(" %1\n")
55  .arg(MPEGDescriptor(desc[j]).toString()));
56  }
57  }
58  return str;
59 }
60 
62 {
63  if (_cached_network_name.isEmpty())
64  {
65  desc_list_t parsed =
68 
69  const unsigned char *desc =
71 
72  if (desc)
73  {
74  auto nndesc = NetworkNameDescriptor(desc);
75  if (nndesc.IsValid())
76  _cached_network_name = nndesc.Name();
77  }
78  if (_cached_network_name.isEmpty())
79  _cached_network_name = QString("Net ID 0x%1")
80  .arg(NetworkID(), 0, 16);
81  }
82  return _cached_network_name;
83 }
84 
86 {
87  if (VerifyCRC())
88  {
90  SetCRC(CalcCRC());
91  return true;
92  }
93  return false;
94 }
95 
97 {
98  _ptrs.clear();
99  _ptrs.push_back(pesdata() + 11);
100  uint i = 0;
101  while ((_ptrs[i] + 5) < (pesdata() + Length()))
102  {
103  _ptrs.push_back(_ptrs[i] + 5 + ServiceDescriptorsLength(i));
104  i++;
105  }
106 }
107 
109 {
110  QString str =
111  QString("SDT: TSID(0x%1) original_network_id(0x%2) services(%3)\n")
112  .arg(TSID(), 0, 16).arg(OriginalNetworkID(), 0, 16)
113  .arg(ServiceCount());
114  str.append(QString("Section (%1) Last Section (%2) IsCurrent (%3)\n")
115  .arg(Section()).arg(LastSection()).arg(IsCurrent()));
116 
117  for (uint i = 0; i < ServiceCount(); i++)
118  {
119  str.append(QString(" Service #%1 SID(0x%2) ")
120  .arg(i, 2, 10).arg(ServiceID(i), 0, 16));
121  str.append(QString("eit_schd(%1) eit_pf(%2) encrypted(%3)\n")
122  .arg(HasEITSchedule(i) ? "t" : "f")
123  .arg(HasEITPresentFollowing(i) ? "t" : "f")
124  .arg(IsEncrypted(i) ? "t" : "f"));
125 
126  if (0 != ServiceDescriptorsLength(i))
127  {
128  str.append(QString(" Service descriptors length: %1\n")
129  .arg(ServiceDescriptorsLength(i)));
130  vector<const unsigned char*> desc =
133  for (size_t j = 0; j < desc.size(); j++)
134  {
135  // Descriptors 0x80 to 0xFE are user defined, see
136  // Final draft ETSI EN 300 468 v1.13.1 (2012-04)
137  // Table 12: "Possible location of descriptors", page 33)
138  if(MPEGDescriptor(desc[j]).DescriptorTag() < 0x80)
139  {
140  str.append(QString(" %1\n")
141  .arg(MPEGDescriptor(desc[j]).toString()));
142  }
143  else
144  {
145  QString udd = "Invalid Descriptor";
146  if (MPEGDescriptor(desc[j]).IsValid())
147  {
148  udd = QString("User Defined Descriptor (0x%1) length(%2). Dumping\n")
149  .arg(MPEGDescriptor(desc[j]).DescriptorTag(),2,16,QChar('0'))
150  .arg(MPEGDescriptor(desc[j]).DescriptorLength());
151  udd.append(MPEGDescriptor(desc[j]).hexdump());
152  }
153  str.append(QString(" %1\n").arg(udd));
154  }
155  }
156  }
157  }
158  return str;
159 }
160 
162 {
163  desc_list_t parsed =
166 
167  const unsigned char *desc =
169 
170  if (desc)
171  return new ServiceDescriptor(desc);
172 
173  return nullptr;
174 }
175 
177 {
178  if (VerifyCRC())
179  {
181  SetCRC(CalcCRC());
182  return true;
183  }
184  return false;
185 }
186 
188 {
190 
191  _ptrs.clear();
192  _ptrs.push_back(_tsc_ptr + 2);
193  for (uint i=0; _ptrs[i] + 6 <= _ptrs[0] + TransportStreamDataLength(); i++)
194  _ptrs.push_back(_ptrs[i] + 6 + TransportDescriptorsLength(i));
195 }
196 
198 {
199  QString str =
200  QString("BAT: BouquetID(0x%1) transports(%2)\n")
201  .arg(BouquetID(), 0, 16).arg(TransportStreamCount());
202 
203  str.append(QString("Section (%1) Last Section (%2) IsCurrent (%3)\n")
204  .arg(Section()).arg(LastSection()).arg(IsCurrent()));
205 
206  if (0 != BouquetDescriptorsLength())
207  {
208  str.append(QString("Bouquet descriptors length: %1\n")
209  .arg(BouquetDescriptorsLength()));
210  vector<const unsigned char*> desc =
213  for (size_t i = 0; i < desc.size(); i++)
214  str.append(QString(" %1\n")
215  .arg(MPEGDescriptor(desc[i]).toString()));
216  }
217 
218  for (uint i = 0; i < TransportStreamCount(); i++)
219  {
220  str.append(QString(" Transport #%1 TSID(0x%2) ")
221  .arg(i, 2, 10).arg(TSID(i), 0, 16));
222  str.append(QString("original_network_id(0x%2) desc_len(%3)\n")
223  .arg(OriginalNetworkID(i), 0, 16)
224  .arg(TransportDescriptorsLength(i)));
225 
226  if (0 != TransportDescriptorsLength(i))
227  {
228  str.append(QString(" Transport descriptors length: %1\n")
229  .arg(TransportDescriptorsLength(i)));
230  vector<const unsigned char*> desc =
233  for (size_t j = 0; j < desc.size(); j++)
234  str.append(QString(" %1\n")
235  .arg(MPEGDescriptor(desc[j]).toString()));
236  }
237  }
238  return str;
239 }
240 
242 {
243  _ptrs.clear();
244  _ptrs.push_back(psipdata() + 6);
245  uint i = 0;
246  while ((_ptrs[i] + 12) < (pesdata() + Length()))
247  {
248  _ptrs.push_back(_ptrs[i] + 12 + DescriptorsLength(i));
249  i++;
250  }
251 }
252 
254 {
255  bool is_eit = false;
256 
257  // Standard Now/Next Event Information Tables for this transport
258  is_eit |= TableID::PF_EIT == table_id;
259  // Standard Now/Next Event Information Tables for other transport
260  is_eit |= TableID::PF_EITo == table_id;
261  // Standard Future Event Information Tables for this transport
262  is_eit |= (TableID::SC_EITbeg <= table_id &&
263  TableID::SC_EITend >= table_id);
264  // Standard Future Event Information Tables for other transports
265  is_eit |= (TableID::SC_EITbego <= table_id &&
266  TableID::SC_EITendo >= table_id);
267  // Dish Network Long Term Future Event Information for all transports
268  is_eit |= (TableID::DN_EITbego <= table_id &&
269  TableID::DN_EITendo >= table_id);
270 
271  return is_eit;
272 }
273 
277 QDateTime dvbdate2qt(const unsigned char *buf)
278 {
279  /* FIXME what's wrong with QDate::fromJulianDay? */
280  uint mjd = (buf[0] << 8) | buf[1];
281  if (mjd >= 40587)
282  {
283  // Modified Julian date as number of days since 17th November 1858.
284  // 1st Jan 1970 was date 40587.
285  uint secsSince1970 = (mjd - 40587) * 86400;
286  secsSince1970 += byteBCD2int(buf[2]) * 3600;
287  secsSince1970 += byteBCD2int(buf[3]) * 60;
288  secsSince1970 += byteBCD2int(buf[4]);
289 #if QT_VERSION < QT_VERSION_CHECK(5,8,0)
290  return MythDate::fromTime_t(secsSince1970);
291 #else
292  return MythDate::fromSecsSinceEpoch(secsSince1970);
293 #endif
294  }
295 
296  // Original function taken from dvbdate.c in linuxtv-apps code
297  // Use the routine specified in ETSI EN 300 468 V1.4.1,
298  // "Specification for Service Information in Digital Video Broadcasting"
299  // to convert from Modified Julian Date to Year, Month, Day.
300 
301  const float tmpA = (float)(1.0 / 365.25);
302  const float tmpB = (float)(1.0 / 30.6001);
303 
304  float mjdf = mjd;
305  int year = (int) truncf((mjdf - 15078.2F) * tmpA);
306  int month = (int) truncf(
307  (mjdf - 14956.1F - truncf(year * 365.25F)) * tmpB);
308  int day = (int) truncf(
309  (mjdf - 14956.0F - truncf(year * 365.25F) - truncf(month * 30.6001F)));
310  int i = (month == 14 || month == 15) ? 1 : 0;
311 
312  QDate date(1900 + year + i, month - 1 - i * 12, day);
313  QTime time(byteBCD2int(buf[2]), byteBCD2int(buf[3]),
314  byteBCD2int(buf[4]));
315 
316  return QDateTime(date, time, Qt::UTC);
317 }
318 
322 time_t dvbdate2unix(const unsigned char *buf)
323 {
324  // Modified Julian date as number of days since 17th November 1858.
325  // The unix epoch, 1st Jan 1970, was day 40587.
326  uint mjd = (buf[0] << 8) | buf[1];
327  if (mjd < 40587)
328  return 0; // we don't handle pre-unix dates..
329 
330  uint secsSince1970 = (mjd - 40587) * 86400;
331  secsSince1970 += byteBCD2int(buf[2]) * 3600;
332  secsSince1970 += byteBCD2int(buf[3]) * 60;
333  secsSince1970 += byteBCD2int(buf[4]);
334  return secsSince1970;
335 }
336 
340 uint32_t dvbdate2key(const unsigned char *buf)
341 {
342  uint dt = (((uint)buf[0]) << 24) | (((uint)buf[1]) << 16); // 16 bits
343  uint tm = ((byteBCD2int(buf[2]) * 3600) +
344  (byteBCD2int(buf[3]) * 60) +
345  (byteBCD2int(buf[4]))); // 17 bits
346  return (dt | (tm>>1)) ^ ((tm & 1)<<31);
347 }
uint BouquetID() const
Definition: dvbtables.h:195
const unsigned char * pesdata() const
Definition: pespacket.h:163
const unsigned char * NetworkDescriptors(void) const
for(i=0; i<N; i++) x 10.0 { descriptor() }
Definition: dvbtables.h:59
const unsigned char * psipdata(void) const
Definition: mpegtables.h:522
const unsigned char * TransportDescriptors(uint i) const
for(j=0;j<N;j++) x 6.0+p { descriptor() }
Definition: dvbtables.h:231
bool Mutate(void)
mutates a SDTo into a SDTa (vice versa) and recalculates the CRC
Definition: dvbtables.cpp:176
QString toString(void) const override
Definition: dvbtables.cpp:108
uint Length() const
Definition: pespacket.h:98
void Parse(void) const
Definition: dvbtables.cpp:241
void Parse(void) const
Definition: dvbtables.cpp:96
uint TransportDescriptorsLength(uint i) const
Definition: dvbtables.h:227
bool HasEITPresentFollowing(uint i) const
Definition: dvbtables.h:146
bool IsEncrypted(uint i) const
free_CA_mode 1 3.3+p
Definition: dvbtables.h:151
time_t dvbdate2unix(const unsigned char *buf)
Definition: dvbtables.cpp:322
uint BouquetDescriptorsLength(void) const
Definition: dvbtables.h:203
void Parse(void) const
Definition: dvbtables.cpp:187
uint ServiceID(uint i) const
service_id 16 0.0+p
Definition: dvbtables.h:141
const unsigned char * _tsc_ptr
Definition: dvbtables.h:93
uint LastSection(void) const
Definition: mpegtables.h:515
vector< const unsigned char * > _ptrs
Definition: dvbtables.h:169
uint ServiceDescriptorsLength(uint i) const
desc_loop_length 12 3.4+p
Definition: dvbtables.h:153
uint DescriptorTag(void) const
bool Mutate(void)
mutates a NITo into a NITa (vice versa) and recalculates the CRC
Definition: dvbtables.cpp:85
uint TSID(uint i) const
Definition: dvbtables.h:221
unsigned int uint
Definition: compat.h:140
uint TSID() const
transport_stream_id 16 3.0 0x0000
Definition: dvbtables.h:129
uint NetworkID(void) const
network_id 16 3.0 0x0000
Definition: dvbtables.h:50
vector< const unsigned char * > desc_list_t
bool IsCurrent(void) const
Definition: mpegtables.h:509
const unsigned char * ServiceDescriptors(uint i) const
for (j=0;j<N;j++) x 5.0+p { descriptor() }
Definition: dvbtables.h:157
uint CalcCRC(void) const
Definition: pespacket.cpp:145
const unsigned char * TransportDescriptors(uint i) const
for(j=0;j<N;j++) x 6.0+p { descriptor() }
Definition: dvbtables.h:80
vector< const unsigned char * > _ptrs
Definition: dvbtables.h:240
uint Section(void) const
Definition: mpegtables.h:512
static bool IsEIT(uint table_id)
Definition: dvbtables.cpp:253
uint OriginalNetworkID() const
original_network_id 16 8.0
Definition: dvbtables.h:132
MBASE_PUBLIC QDateTime fromSecsSinceEpoch(uint seconds)
This function takes the number of seconds since the start of the epoch and returns a QDateTime with t...
Definition: mythdate.cpp:88
vector< const unsigned char * > _ptrs
Definition: dvbtables.h:367
const unsigned char * BouquetDescriptors(void) const
Definition: dvbtables.h:209
void Parse(void) const
Definition: dvbtables.cpp:9
uint DescriptorsLength(uint i) const
Definition: dvbtables.h:353
QString NetworkName(void) const
Definition: dvbtables.cpp:61
uint ServiceCount() const
Number of services.
Definition: dvbtables.h:136
uint TransportStreamDataLength(void) const
trans_stream_loop_len 12 0.4+ndl
Definition: dvbtables.h:64
vector< const unsigned char * > _ptrs
Definition: dvbtables.h:94
uint TransportStreamDataLength(void) const
Definition: dvbtables.h:214
uint OriginalNetworkID(uint i) const
Definition: dvbtables.h:223
bool HasEITSchedule(uint i) const
Definition: dvbtables.h:144
QString _cached_network_name
Definition: dvbtables.h:92
static const unsigned char * Find(const desc_list_t &parsed, uint desc_tag)
uint TransportStreamCount(void) const
Definition: dvbtables.h:216
uint TableID(void) const
Definition: mpegtables.h:479
void SetCRC(uint crc)
Definition: pespacket.h:199
ServiceDescriptor * GetServiceDescriptor(uint i) const
Definition: dvbtables.cpp:161
uint32_t dvbdate2key(const unsigned char *buf)
Definition: dvbtables.cpp:340
uint OriginalNetworkID(uint i) const
original_network_id 16 2.0+p
Definition: dvbtables.h:72
uint TransportStreamCount(void) const
Definition: dvbtables.h:66
QString toString(void) const override
Definition: dvbtables.cpp:19
const unsigned char * _tsc_ptr
Definition: dvbtables.h:239
uint TSID(uint i) const
transport_stream_id 16 0.0+p
Definition: dvbtables.h:70
uint NetworkDescriptorsLength(void) const
network_desc_length 12 8.4 0
Definition: dvbtables.h:54
QString toString(void) const override
Definition: dvbtables.cpp:197
uint TransportDescriptorsLength(uint i) const
trans_desc_length 12 4.4+p
Definition: dvbtables.h:76
bool VerifyCRC(void) const
Definition: pespacket.cpp:153
static desc_list_t Parse(const unsigned char *data, uint len)
QDateTime dvbdate2qt(const unsigned char *buf)
Definition: dvbtables.cpp:277
#define byteBCD2int(i)
void SetTableID(uint id)
Definition: mpegtables.h:528