MythTV master
dvbdescriptors.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2// Copyright (c) 2003-2004, Daniel Thor Kristjansson
3#ifndef DVB_DESCRIPTORS_H
4#define DVB_DESCRIPTORS_H
5
6#include <cassert>
7#include <cstdint>
8#include <ctime>
9
10using uint = unsigned int;
11
12#include <QDateTime>
13#include <QMutex>
14#include <QString>
15
16#include "libmythbase/programinfo.h" // for subtitle types and audio and video properties
17#include "libmythtv/mythtvexp.h" // MTV_PUBLIC - Symbol Visibility
18#include "mpegdescriptors.h"
19
20MTV_PUBLIC QDateTime dvbdate2qt(const unsigned char *buf);
21MTV_PUBLIC time_t dvbdate2unix(const unsigned char *buf);
22
23/*
24// needed for scanning
25 conditional_access = 0x09, // maybe
26 satellite_delivery_system = 0x43,*
27 cable_delivery_system = 0x44,*
28 service = 0x48,*
29 terrestrial_delivery_system = 0x5A,*
30 frequency_list = 0x62,*
31
32// needed for captions
33 teletext = 0x56,
34 subtitling = 0x59,
35
36// needed for sound
37 registration = 0x05,
38 AC3 = 0x6A,
39
40// needed for eit
41 short_event = 0x4D,
42 extended_event = 0x4E,
43 content = 0x54,
44*/
45
46static QString coderate_inner(uint coderate);
47
48using enc_override = std::vector<uint8_t>;
49MTV_PUBLIC QString dvb_decode_text(const unsigned char *src, uint length,
50 const enc_override &encoding_override);
51
52inline QString dvb_decode_text(const unsigned char *src, uint length)
53{
54 return dvb_decode_text(src, length, {} );
55}
56
57MTV_PUBLIC QString dvb_decode_short_name(const unsigned char *src, uint raw_length);
58
59static constexpr uint8_t byteBCDH2int(uint8_t i) { return i >> 4; };
60static constexpr uint8_t byteBCDL2int(uint8_t i) { return i & 0x0f; };
61static constexpr uint8_t byteBCD2int(uint8_t i)
62{ return (byteBCDH2int(i) * 10) + byteBCDL2int(i); };
63static constexpr uint16_t byte2BCD2int(uint8_t i, uint8_t j)
64{ return ((byteBCDH2int(i) * 1000) + (byteBCDL2int(i) * 100) +
65 (byteBCDH2int(j) * 10) + byteBCDL2int(j)); };
66static constexpr uint32_t byte3BCD2int(uint8_t i, uint8_t j, uint8_t k)
67{ return ((byteBCDH2int(i) * 100000) + (byteBCDL2int(i) * 10000) +
68 (byteBCDH2int(j) * 1000) + (byteBCDL2int(j) * 100) +
69 (byteBCDH2int(k) * 10) + byteBCDL2int(k)); };
70static constexpr uint32_t byte4BCD2int(uint8_t i, uint8_t j, uint8_t k, uint8_t l)
71{ return ((byteBCDH2int(i) * 10000000) + (byteBCDL2int(i) * 1000000) +
72 (byteBCDH2int(j) * 100000) + (byteBCDL2int(j) * 10000) +
73 (byteBCDH2int(k) * 1000) + (byteBCDL2int(k) * 100) +
74 (byteBCDH2int(l) * 10) + byteBCDL2int(l)); };
75static constexpr uint64_t byte4BCD2int64(uint8_t i, uint8_t j, uint8_t k, uint8_t l)
76{ return static_cast<uint64_t>(byte4BCD2int(i, j, k, l)); }
77
78static_assert( byteBCD2int(0x98) == 98);
79static_assert(byte2BCD2int(0x98, 0x76) == 9876);
80static_assert(byte3BCD2int(0x98, 0x76, 0x54) == 987654);
81static_assert(byte4BCD2int(0x98, 0x76, 0x54, 0x32) == 98765432);
82static_assert(byte4BCD2int64(0x98, 0x76, 0x54, 0x32) == 98765432ULL);
83
84// DVB Bluebook A038 (Sept 2011) p 77
86{
87 public:
88 explicit NetworkNameDescriptor(const unsigned char *data, int len = 300) :
89 MPEGDescriptor(data, len, DescriptorID::network_name) { }
90 // Name bits loc expected value
91 // descriptor_tag 8 0.0 0x40
92 // descriptor_length 8 1.0
93 // for (i=0;i<N;i++){ char 8 uimsbf }
94 QString Name(void) const
96 QString ShortName(void) const
98 QString toString(void) const override // MPEGDescriptor
99 { return QString("NetworkNameDescriptor: ")+Name(); }
100};
101
102// DVB Bluebook A038 (Sept 2011) p 63
104{
105 public:
106 explicit LinkageDescriptor(const unsigned char *data, int len = 300) :
107 MPEGDescriptor(data, len, DescriptorID::linkage)
108 {
109 if (!m_data)
110 return;
111 if (DescriptorLength() < 7)
112 {
113 m_data = nullptr;
114 }
115 else if (kMobileHandOver == LinkageType())
116 {
117 uint end = 8;
118 if (DescriptorLength() < end)
119 {
120 m_data = nullptr;
121 return;
122 }
123 end += (HasMobileNetworkID()) ? 2 : 0;
124 end += (HasMobileInitialServiceID()) ? 2 : 0;
125 if (DescriptorLength() < end)
126 m_data = nullptr;
127 m_offset = end + 2;
128 }
129 else if (kEventLinkage == LinkageType())
130 {
131 if (DescriptorLength() < 10)
132 m_data = nullptr;
133 m_offset = 12;
134 }
135 }
136 // Name bits loc expected value
137 // descriptor_tag 8 0.0 0x4A
138 // descriptor_length 8 1.0
139 // transport_stream_id 16 2.0
140 uint TSID(void) const { return (m_data[2]<<8) | m_data[3]; }
141 // original_network_id 16 4.0
142 uint OriginalNetworkID() const { return (m_data[4]<<8) | m_data[5]; }
143 // service_id 16 6.0
144 uint ServiceID(void) const { return (m_data[6]<<8) | m_data[7]; }
145 // linkage_type 8 8.0
146 enum : std::uint8_t
147 {
154 kRCSMap = 0x07,
161 };
162 uint LinkageType(void) const { return m_data[8]; }
163 QString LinkageTypeString(void) const;
164
165 // if (linkage_type == 0x08)
166 // {
167 // hand-over_type 4 9.0
168 enum : std::uint8_t
169 {
173 };
174 uint MobileHandOverType(void) const { return m_data[9]>>4; }
175 QString MobileHandOverTypeString(void) const;
176 // reserved_future_use 3 9.4
177 // origin_type 1 9.7
178 enum : std::uint8_t
179 {
182 };
183 uint MobileOriginType(void) const { return m_data[9]&0x1; }
184 QString MobileOriginTypeString(void) const;
185 // if (hand-over_type == 0x01 || hand-over_type == 0x02 ||
186 // hand-over_type == 0x03)
187 // { network_id 16 10.0 }
188 bool HasMobileNetworkID(void) const
189 { return bool(MobileHandOverType() & 0x3); }
190 uint MobileNetworkID(void) const { return (m_data[10]<<8) | m_data[11]; }
191 // if (origin_type ==0x00)
192 // { initial_service_id 16 HasNetworkID()?10.0:12.0 }
194 { return kOriginNIT == MobileOriginType(); }
196 {
197 return HasMobileNetworkID() ?
198 ((m_data[12]<<8) | m_data[13]) : ((m_data[10]<<8) | m_data[11]);
199 }
200 // }
201 // if (linkage_type == 0x0D)
202 // {
203 // target_event_id 16 9.0
204 uint TargetEventID(void) const { return (m_data[9]<<8) | m_data[10]; }
205 // target_listed 1 11.0
206 bool IsTargetListed(void) const { return ( m_data[11]&0x80 ) != 0; }
207 // event_simulcast 1 11.1
208 bool IsEventSimulcast(void) const { return ( m_data[11]&0x40 ) != 0; }
209 // reserved 6 11.2
210 // }
211 // for (i=0;i<N;i++)
212 // { private_data_byte 8 bslbf }
213 const unsigned char *PrivateData(void) const
214 { return &m_data[m_offset]; }
216 { return DescriptorLength() + 2 - m_offset; }
217
218 private:
220};
221
222// ETSI TS 102 809 V1.3.1 (2017-06) p 36
224{
225 public:
226 explicit ApplicationSignallingDescriptor(const unsigned char *data, int len = 300) :
227 MPEGDescriptor(data, len, DescriptorID::application_signalling) { }
228 // Name bits loc expected value
229 // descriptor_tag 8 0.0 0x6F
230 // descriptor_length 8 1.0
231 // for( i=0; i<N; i++ ){
232 // reserved_future_use 1 2.0
233 // application_type 15 2.1
234 // reserved_future_use 3 4.0
235 // AIT_version_number 5 4.3
236 // }
237 uint Count() const { return DescriptorLength() / 3; }
239 { return (m_data[2 + (i*3)] & 0x7F) << 8 | m_data[2 + (i*3) + 1] ; }
241 { return m_data[2 + (i*3) + 2] & 0x1F ; }
242 QString toString(void) const override; // MPEGDescriptor
243};
244
245// DVB Bluebook A038 (Sept 2011) p 38
247{
248 public:
249 explicit AdaptationFieldDataDescriptor(const unsigned char *data, int len = 300) :
250 MPEGDescriptor(data, len, DescriptorID::adaptation_field_data, 1) { }
251 // Name bits loc expected value
252 // descriptor_tag 8 0.0 0x70
253 // descriptor_length 8 1.0
254 // adapt_field_data_id 8 2.0
255 uint AdaptationFieldDataID(void) const { return m_data[2]; }
256 QString toString(void) const override // MPEGDescriptor
257 {
258 return QString("AdaptationFieldDataDescriptor "
259 "adaptation_field_data_identifier(%1)")
260 .arg(AdaptationFieldDataID());
261 }
262};
263
264// DVB Bluebook A038 (Sept 2011) p 38
266{
267 public:
268 explicit AncillaryDataDescriptor(const unsigned char *data, int len = 300) :
269 MPEGDescriptor(data, len, DescriptorID::ancillary_data, 1) { }
270 // Name bits loc expected value
271 // descriptor_tag 8 0.0 0x6b
272 // descriptor_length 8 1.0
273 // ancillary_data_id 8 2.0
274 uint AncillaryDataID(void) const { return m_data[2]; }
275 QString toString(void) const override // MPEGDescriptor
276 {
277 return QString("AncillaryDataDescriptor "
278 "ancillary_data_identifier(%1)")
279 .arg(AncillaryDataID());
280 }
281};
282
283// DVB Bluebook A038 (Sept 2011) p 39
285{
286 public:
287 explicit AnnouncementSupportDescriptor(const unsigned char *data, int len = 300) :
288 MPEGDescriptor(data, len, DescriptorID::announcement_support) { }
289 // Name bits loc expected value
290 // descriptor_tag 8 0.0 0x6e
291 // descriptor_length 8 1.0
292 // announcmnt_supprt_indic 16 2.0
293 // for (i=0; i<N; i++)
294 // {
295 // announcement_type 4 0.0+p
296 // reserved_future_use 1 0.4+p
297 // reference_type 3 0.5+p
298 // if (reference_type & 0x3)
299 // {
300 // original_network_id 16 0.0+p
301 // transport_stream_id 16 2.0+p
302 // service_id 16 4.0+p
303 // component_tag 8 6.0+p
304 // } 7.0
305 // }
306};
307
308// DVB Bluebook A038 (Sept 2011) p 41
310{
311 public:
312 explicit BouquetNameDescriptor(const unsigned char *data, int len = 300) :
313 MPEGDescriptor(data, len, DescriptorID::bouquet_name) { }
314 // Name bits loc expected value
315 // descriptor_tag 8 0.0 0x47
316 // descriptor_length 8 1.0
317 // for(i=0;i<N;i++) { char 8 }
318 QString BouquetName(void) const
319 { return dvb_decode_text(m_data+2, m_data[1]); }
320 QString BouquetShortName(void) const
321 { return dvb_decode_short_name(m_data+2, m_data[1]); }
322
323 QString toString(void) const override // MPEGDescriptor
324 {
325 return QString("BouquetNameDescriptor: Bouquet Name(%1)")
326 .arg(BouquetName());
327 }
328};
329
330// DVB Bluebook A038 (Sept 2011) p 41
332{
333 public:
334 explicit CAIdentifierDescriptor(const unsigned char *data, int len = 300) :
335 MPEGDescriptor(data, len, DescriptorID::ca_identifier) { }
336 // Name bits loc expected value
337 // descriptor_tag 8 0.0 0x53
338 // descriptor_length 8 1.0
339 //
340 uint CASystemCount(void) const { return DescriptorLength() >> 1; }
341 // for (i=0; i<N; i++)
342 // { CA_system_id 16 }
343 int CASystemId(uint i) const
344 { return (m_data[2 + (i*2)] << 8) | m_data[3 + (i*2)]; }
345 QString toString(void) const override; // MPEGDescriptor
346};
347
348// DVB Bluebook A038 (Sept 2011) p 42
350{
351 public:
352 explicit CellFrequencyLinkDescriptor(const unsigned char *data, int len = 300) :
353 MPEGDescriptor(data, len, DescriptorID::cell_frequency_link) { }
354 // Name bits loc expected value
355 // descriptor_tag 8 0.0 0x6d
356 // descriptor_length 8 1.0
357 // for (i=0; i<N; i++)
358 // {
359 // cell_id 16 0.0+p
360 // frequency 32 2.0+p
361 // subcell_info_loop_len 8 6.0+p
362 // for (j=0;j<N;j++)
363 // {
364 // cell_id_extension 8 0.0+p2
365 // transposer_freq 32 1.0+p2
366 // } 5.0
367 // }
368};
369
370// DVB Bluebook A038 (Sept 2011) p 42
372{
373 public:
374 explicit CellListDescriptor(const unsigned char *data, int len = 300) :
375 MPEGDescriptor(data, len, DescriptorID::cell_list) { }
376 // Name bits loc expected value
377 // descriptor_tag 8 0.0 0x6c
378 // descriptor_length 8 1.0
379 // for (i=0; i<N; i++)
380 // {
381 // cell_id 16 0.0+p
382 // cell_latitude 16 2.0+p
383 // cell_longitude 16 4.0+p
384 // cell_extent_of_lat 12 6.0+p
385 // cell_extent_of_longit 12 7.4+p
386 // subcell_info_loop_len 8 9.0+p
387 // for (j=0;j<N;j++)
388 // {
389 // cell_id_extension 8 0.0+p2
390 // subcell_latitude 16 1.0+p2
391 // subcell_longitude 16 3.0+p2
392 // subcell_ext_of_lat 12 4.0+p2
393 // subcell_ext_of_long 12 5.4+p2
394 // } 7.0
395 // }
396};
397
398// DVB Bluebook A038 (Sept 2011) p 44
400{
401 public:
402 explicit ComponentDescriptor(const unsigned char *data, int len = 300) :
403 MPEGDescriptor(data, len, DescriptorID::component) { }
404 // Name bits loc expected value
405 // descriptor_tag 8 0.0 0x50
406 // descriptor_length 8 1.0
407 // reserved_future_use 4 2.0
408 // stream_content 4 2.4
409 uint StreamContent(void) const { return m_data[2] & 0xf; }
410 // component_type 8 3.0
411 uint ComponentType(void) const { return m_data[3]; }
412 // component_tag 8 4.0
413 uint ComponentTag(void) const { return m_data[4]; }
414 // ISO_639_language_code 24 5.0
415 int LanguageKey(void) const
416 { return iso639_str3_to_key(&m_data[5]); }
417 QString LanguageString(void) const
418 { return iso639_key_to_str3(LanguageKey()); }
419 int CanonicalLanguageKey(void) const
421 QString CanonicalLanguageString(void) const
423 //
424 // for (i=0; i<N; i++) { text_char 8 }
425
426 bool IsVideo(void) const
427 {
428 return 0x1 == StreamContent() || // MPEG-2
429 0x5 == StreamContent() || // H.264
430 0x9 == StreamContent(); // HEVC
431 }
432 bool IsAudio(void) const
433 {
434 switch(StreamContent())
435 {
436 case 0x02:
437 case 0x04:
438 case 0x06:
439 case 0x07:
440 return true;
441 default:
442 return false;
443 }
444 }
445 bool IsSubtitle(void) const { return 0x3 == StreamContent(); }
446
448 {
449 if (0x1 == StreamContent())
450 return MPEG2Properties();
451 if (0x5 == StreamContent())
452 return VID_AVC | AVCProperties();
453 if (0x9 == StreamContent())
454 return VID_HEVC | HEVCProperties();
455
456 return VID_UNKNOWN;
457 }
458
460 {
461 switch(ComponentType())
462 {
463 case 0x2: case 0x3: case 0x4:
464 case 0x6: case 0x7: case 0x8:
465 return VID_WIDESCREEN;
466 case 0x09:
467 case 0x0D:
468 return VID_HDTV;
469 case 0x0A: case 0x0B: case 0x0C:
470 case 0x0E: case 0x0F: case 0x10:
471 return VID_WIDESCREEN | VID_HDTV;
472 default:
473 return VID_UNKNOWN;
474 }
475 }
476
477 uint AVCProperties(void) const
478 {
479 switch(ComponentType())
480 {
481 case 0x3: case 0x4:
482 case 0x7: case 0x8:
483 return VID_WIDESCREEN;
484 case 0x0B: case 0x0C:
485 case 0x0F: case 0x10:
486 return VID_WIDESCREEN | VID_HDTV;
487 case 0x80: case 0x81:
488 case 0x82: case 0x83:
489 return VID_WIDESCREEN | VID_HDTV | VID_3DTV;
490 default:
491 return VID_UNKNOWN;
492 }
493 }
494
496 {
497 switch(ComponentType())
498 {
499 // NOLINTNEXTLINE(bugprone-branch-clone)
500 case 0x0: case 0x1:
501 case 0x2: case 0x3:
502 return VID_HDTV;
503 case 0x5:
504 return VID_HDTV; // | VID_UHDTV;
505 default:
506 return VID_UNKNOWN;
507 }
508 }
509
511 {
512 switch (StreamContent())
513 {
514 case 0x2:
515 return MP2Properties();
516 case 0x04:
517 return AC3Properties();
518 case 0x06:
519 return HEAACProperties();
520 default:
521 return AUD_UNKNOWN;
522 }
523 }
524
525 uint MP2Properties(void) const
526 {
527 switch (ComponentType())
528 {
529 case 0x1:
530 return AUD_MONO;
531 case 0x3:
532 return AUD_STEREO;
533 case 0x5:
534 return AUD_SURROUND;
535 case 0x40:
536 return AUD_VISUALIMPAIR;
537 case 0x41:
538 return AUD_HARDHEAR;
539 default:
540 return AUD_UNKNOWN;
541 }
542 }
543
544 uint AC3Properties(void) const
545 {
546 unsigned char properties = AUD_UNKNOWN;
547
548 switch (ComponentType() & 0x7)
549 {
550 case 0x0:
551 properties |= AUD_MONO;
552 break;
553 case 0x2:
554 properties |= AUD_STEREO;
555 break;
556 case 0x3:
557 properties |= AUD_DOLBY;
558 break;
559 case 0x4: case 0x5:
560 properties |= AUD_SURROUND;
561 break;
562 }
563
564 if (((ComponentType() >> 3) & 0x7) == 0x2)
565 properties |= AUD_VISUALIMPAIR;
566
567 if (((ComponentType() >> 3) & 0x7) == 0x3)
568 properties |= AUD_HARDHEAR;
569
570 return properties;
571 }
572
574 {
575 switch (ComponentType())
576 {
577 case 0x1:
578 return AUD_MONO;
579 case 0x3:
580 case 0x43:
581 return AUD_STEREO;
582 case 0x5:
583 return AUD_SURROUND;
584 case 0x40:
585 case 0x44:
586 return AUD_VISUALIMPAIR;
587 case 0x41:
588 case 0x45:
589 return AUD_HARDHEAR;
590 default:
591 return AUD_UNKNOWN;
592 }
593 }
594
595 uint SubtitleType(void) const
596 {
597 if (!IsSubtitle())
598 return SUB_UNKNOWN;
599
600 switch (ComponentType())
601 {
602 case 0x1:
603 case 0x3:
604 case 0x10: case 0x11: case 0x12: case 0x13:
605 return SUB_NORMAL;
606 case 0x20: case 0x21: case 0x22: case 0x23:
607 return SUB_HARDHEAR;
608 default:
609 return SUB_UNKNOWN;
610 }
611 }
612
613 QString toString(void) const override // MPEGDescriptor
614 {
615 return QString("ComponentDescriptor(stream_content: 0x%1, "
616 "component_type: 0x%2)").arg(StreamContent(), 0, 16)
617 .arg(ComponentType(), 0, 16);
618 }
619};
620
621// DVB Bluebook A038 (Sept 2011) p 46
623{
624 public:
625 explicit ContentDescriptor(const unsigned char *data, int len = 300) :
626 MPEGDescriptor(data, len, DescriptorID::content) { }
627 // Name bits loc expected value
628 // descriptor_tag 8 0.0 0x54
629 // descriptor_length 8 1.0
630
631 uint Count(void) const { return DescriptorLength() >> 1; }
632 // for (i=0;i<N;i++)
633 // {
634 // content_nibble_level_1 4 0.0+p
635 uint Nibble1(uint i) const { return m_data[2 + (i<<1)] >> 4; }
636 // content_nibble_level_2 4 0.4+p
637 uint Nibble2(uint i) const { return m_data[2 + (i<<1)] & 0xf; }
638
639 uint Nibble(uint i) const { return m_data[2 + (i<<1)]; }
640
641 // user_nibble 4 1.0+p
642 uint UserNibble1(uint i) const { return m_data[3 + (i<<1)] >> 4; }
643 // user_nibble 4 1.4+p
644 uint UserNibble2(uint i) const { return m_data[3 + (i<<1)] & 0xf; }
645 uint UserNibble(uint i) const { return m_data[3 + (i<<1)]; }
646 // } 2.0
647
649 QString GetDescription(uint i) const;
650 QString toString(void) const override; // MPEGDescriptor
651
652 protected:
653 static void Init(void);
654
655 protected:
656 static QMutex s_categoryLock;
657 static QMap<uint,QString> s_categoryDesc;
658 static volatile bool s_categoryDescExists;
659};
660
661// DVB Bluebook A038 (Sept 2011) p 49
663{
664 public:
665 explicit CountryAvailabilityDescriptor(const unsigned char *data, int len = 300) :
666 MPEGDescriptor(data, len, DescriptorID::country_availability) { }
667 // Name bits loc expected value
668 // descriptor_tag 8 0.0 0x49
669 // descriptor_length 8 1.0
670
671 uint CountryCount(void) const { return ((DescriptorLength() - 1) / 3); }
672
673 // country_avail_flag 1 2.0
674 bool IsAvailable(void) const { return (m_data[2] & 0x1) != 0; }
675 // reserved_future_use 7 2.1
676 //
677 // for (i=0; i<N; i++)
678 // { country_code 24 }
679 QString CountryNames(void) const
680 {
681 QString countries="";
682 for (size_t i=0; i<CountryCount(); i++)
683 {
684 if (i!=0) countries.append(" ");
685 countries.append(QString::fromLatin1(
686 (const char *)m_data+(3*(i+1)), 3));
687 };
688 return countries;
689 }
690
691 QString toString(void) const override // MPEGDescriptor
692 {
693 return QString("CountryAvailabilityDescriptor: Available(%1) in (%2)")
694 .arg(static_cast<int>(IsAvailable())).arg(CountryNames());
695 }
696};
697
698// DVB Bluebook A038 (Sept 2011) p 50
700{
701 public:
702 explicit DataBroadcastDescriptor(const unsigned char *data, int len = 300) :
703 MPEGDescriptor(data, len, DescriptorID::data_broadcast) { }
704 // Name bits loc expected value
705 // descriptor_tag 8 0.0 0x64
706 // descriptor_length 8 1.0
707
708 // data_broadcast_id 16 2.0
709 uint DataBroadcastId(void) const { return m_data[2] << 8 | m_data[3]; }
710 // component_tag 8 4.0
711 uint DataComponentTag(void) const { return m_data[4]; }
712 // selector_length 8 5.0
713 uint SelectorLength(void) const { return m_data[5]; }
714 // for (i=0; i<selector_length; i++)
715 // {
716 // selector_byte 8
717 const unsigned char *Selector(void) const { return &m_data[6]; }
718 // }
719 // ISO_639_language_code 24
720 int LanguageKey(void) const
721 { return iso639_str3_to_key(&m_data[6 + SelectorLength()]); }
722 QString LanguageString(void) const
723 { return iso639_key_to_str3(LanguageKey()); }
724 int CanonicalLanguageKey(void) const
726 QString CanonicalLanguageString(void) const
728 // text_length 8
729 uint TextLength(void) const { return m_data[6 + SelectorLength() + 3]; }
730 // for (i=0; i<text_length; i++) { text_char 8 }
731 QString Text(void) const
732 {
733 return dvb_decode_text(&m_data[6 + SelectorLength() + 4], TextLength());
734 }
735
736 QString toString(void) const override; // MPEGDescriptor
737};
738
739// DVB Bluebook A038 (Sept 2011) p 51
741{
742 public:
743 explicit DataBroadcastIdDescriptor(const unsigned char *data, int len = 300) :
744 MPEGDescriptor(data, len, DescriptorID::data_broadcast_id) { }
745 // Name bits loc expected value
746 // descriptor_tag 8 0.0 0x66
747 // descriptor_length 8 1.0
748
749 // data_broadcast_id 16 2.0
750 uint DataBroadCastId(void) const { return m_data[2] << 8 | m_data[3]; }
751 // for(i=0; i < N;i++ )
752 // { id_selector_byte 8 }
753};
754
755// DVB Bluebook A038 (Sept 2011) p 51
757{
758 public:
759 explicit CableDeliverySystemDescriptor(const unsigned char *data, int len = 300) :
760 MPEGDescriptor(data, len, DescriptorID::cable_delivery_system) { }
761 // Name bits loc expected value
762 // descriptor_tag 8 0.0 0x44
763 // descriptor_length 8 1.0
764
765 // frequency 32 2.0
766 uint FrequencyRaw(void) const
767 {
768 return ((m_data[2]<<24) | (m_data[3]<<16) |
769 (m_data[4]<<8) | (m_data[5]));
770 }
771 unsigned long long FrequencyHz(void) const
772 {
773 if (m_data == nullptr)
774 return 0;
775 return byte4BCD2int64(m_data[2], m_data[3], m_data[4], m_data[5]) * 100;
776 }
777 // reserved_future_use 12 6.0
778 // FEC_outer 4 7.4
779 enum : std::uint8_t
780 {
783 };
784 uint FECOuter(void) const { return m_data[7] & 0xf; }
785 QString FECOuterString(void) const
786 {
787 if (FECOuter() == kOuterFEC_None)
788 return "None";
790 return "RS(204/188)";
791 return "unknown";
792 }
793 // modulation 8 8.0
794 enum : std::uint8_t
795 {
801 };
802 uint Modulation(void) const { return m_data[8]; }
803 QString ModulationString(void) const
804 {
805 static std::array<QString,6> ms
806 { "auto", "qam_16", "qam_32", "qam_64", "qam_128", "qam_256" };
807 return (Modulation() <= kModulationQAM256) ?
808 ms[Modulation()] : QString("auto");
809 }
810 // symbol_rate 28 9.0
811 uint SymbolRateRaw(void) const
812 {
813 return ((m_data[9]<<20) | (m_data[10]<<12) |
814 (m_data[11]<<4) | (m_data[12]>>4));
815 }
816 uint SymbolRateHz(void) const
817 {
818 return ((byte3BCD2int(m_data[9], m_data[10], m_data[11]) * 1000) +
819 (byteBCDH2int(m_data[12]) * 100));
820 }
821 // FEC_inner 4 12.4
822 enum : std::uint8_t
823 {
831 };
832 uint FECInner(void) const { return m_data[12] & 0xf; }
833 QString FECInnerString(void) const { return coderate_inner(FECInner()); }
834 QString toString(void) const override; // MPEGDescriptor
835};
836
837// DVB Bluebook A038 (Feb 2019) p 58
839{
840 public:
842 const unsigned char *data, int len = 300) :
843 MPEGDescriptor(data, len, DescriptorID::satellite_delivery_system) { }
844 // Name bits loc expected value
845 // descriptor_tag 8 0.0 0x43
846 // descriptor_length 8 1.0
847
849 uint FrequencyRaw(void) const
850 {
851 return ((m_data[2]<<24) | (m_data[3]<<16) |
852 (m_data[4]<<8) | (m_data[5]));
853 }
854 uint64_t FrequencykHz(void) const
855 {
856 return byte4BCD2int64(m_data[2], m_data[3], m_data[4], m_data[5]) * 10;
857 }
860 { return byte2BCD2int(m_data[6], m_data[7]); }
861 QString OrbitalPositionString(void) const
862 {
863 uint num = OrbitalPosition();
864 return QString("%1.%2 %3").arg(num / 10).arg(num % 10)
865 .arg((IsEast()) ? "East" : "West");
866 }
867 double OrbitalPositionFloat() const
868 { return ((double) OrbitalPosition()) / 10.0; }
870 bool IsEast(void) const { return ( (m_data[8]&0x80) ) != 0; }
871 bool IsWest(void) const { return !IsEast(); }
872 // polarization 2 8.1
873 uint Polarization(void) const { return (m_data[8]>>5)&0x3; }
874 QString PolarizationString() const
875 {
876 static const std::array<const QString,4> ps { "h", "v", "l", "r" };
877 return ps[Polarization()];
878 }
879 bool IsCircularPolarization(void) const { return ((m_data[8]>>6)&0x1) != 0; }
880 bool IsLinearPolarization(void) const { return ((m_data[8]>>6)&0x1) == 0; }
881 bool IsHorizontalLeftPolarization(void) const { return ((m_data[8]>>5)&0x1) != 0; }
882 bool IsVerticalRightPolarization(void) const { return ((m_data[8]>>5)&0x1) == 0; }
883 // roll off 2 8.3
884 enum : std::uint8_t
885 {
890 };
891 uint RollOff(void) const { return (m_data[8]>>3)&0x3; }
892 QString RollOffString(void) const
893 {
894 static const std::array<const QString,4> ro { "0.35", "0.20", "0.25", "auto" };
895 return ro[RollOff()];
896 }
897 // modulation system 1 8.5
898 uint ModulationSystem(void) const { return (m_data[8]>>2)&0x1; }
899 QString ModulationSystemString(void) const
900 {
901 return ModulationSystem() ? "DVB-S2" : "DVB-S";
902 }
903 // modulation 2 8.6
904 enum : std::uint8_t
905 {
906 kModulationQPSK_NS = 0x0, // Non standard QPSK for Bell ExpressVu
907 // should be "auto" according to DVB SI standard
911 };
912 uint Modulation(void) const { return m_data[8]&0x03; }
913 QString ModulationString(void) const
914 {
915 static const std::array<const QString,4> ms { "qpsk", "qpsk", "8psk", "qam_16" };
916 return ms[Modulation()];
917 }
918 // symbol_rate 28 9.0
919 uint SymbolRate(void) const
920 {
921 return ((m_data[9]<<20) | (m_data[10]<<12) |
922 (m_data[11]<<4) | (m_data[12]>>4));
923 }
924 uint SymbolRateHz(void) const
925 {
926 return ((byte3BCD2int(m_data[9], m_data[10], m_data[11]) * 1000) +
927 (byteBCDH2int(m_data[12]) * 100));
928 }
929 // FEC_inner 4 12.4
930 enum : std::uint8_t
931 {
939 };
940 uint FECInner(void) const { return m_data[12] & 0xf; }
941 QString FECInnerString(void) const { return coderate_inner(FECInner()); }
942
943 QString toString(void) const override; // MPEGDescriptor
944};
945
946// DVB Bluebook A038 (Feb 2019) p 60
948{
949 public:
951 const unsigned char *data, int len = 300) :
952 MPEGDescriptor(data, len, DescriptorID::terrestrial_delivery_system) { }
953 // Name bits loc expected value
954 // descriptor_tag 8 0.0 0x5a
955 // descriptor_length 8 1.0
956
957 // centre_frequency 32 2.0
958 uint Frequency(void) const
959 {
960 return ((m_data[2]<<24) | (m_data[3]<<16) |
961 (m_data[4]<<8) | (m_data[5]));
962 }
963 uint64_t FrequencyHz(void) const { return uint64_t(Frequency()) * 10ULL; }
964
965 // bandwidth 3 6.0
966 enum : std::uint8_t
967 {
972 };
973 uint Bandwidth(void) const { return m_data[6]>>5; }
974 uint BandwidthHz(void) const { return (8 - Bandwidth()) * 1000000; }
975 QString BandwidthString(void) const
976 {
977 static std::array<QString,4> bs { "8", "7", "6", "5" };
978 return (Bandwidth() <= kBandwidth5Mhz) ? bs[Bandwidth()] : "auto";
979 }
980 // priority 1 6.3
981 bool HighPriority(void) const { return ( m_data[6] & 0x10 ) != 0; }
982 // time_slicing_indicator 1 6.4
983 bool IsTimeSlicingIndicatorUsed(void) const { return (m_data[6] & 0x08) == 0; }
984 // MPE-FEC_indicator 1 6.5
985 bool IsMPE_FECUsed(void) const { return (m_data[6] & 0x04) == 0; }
986 // reserved_future_use 2 6.6
987 // constellation 2 7.0
988 enum : std::uint8_t
989 {
994 };
995 uint Constellation(void) const { return m_data[7]>>6; }
996 QString ConstellationString(void) const
997 {
998 static std::array<QString,4> cs { "qpsk", "qam_16", "qam_64", "qam_256" };
999 return (Constellation() <= kConstellationQAM256) ?
1000 cs[Constellation()] : "auto";
1001 }
1002 // hierarchy_information 3 7.2
1003 enum : std::uint8_t
1004 {
1013 };
1014 uint Hierarchy(void) const { return (m_data[7]>>3) & 0x7; }
1015
1017 QString HierarchyString(void) const
1018 {
1019 static const std::array<const QString,8> hs { "n", "1", "2", "4", "a", "a", "a", "a" };
1020 return hs[Hierarchy()];
1021 }
1022 bool NativeInterleaver(void) const { return ( m_data[7] & 0x20 ) != 0; }
1023 uint Alpha(void) const
1024 {
1025 uint i = (m_data[7]>>3) & 0x3;
1026 return (0x2 == i) ? 4 : i;
1027 }
1028 // code_rate-HP_stream 3 7.5
1029 enum : std::uint8_t
1030 {
1036 };
1037 uint CodeRateHP(void) const { return m_data[7] & 0x7; }
1038 QString CodeRateHPString(void) const
1039 {
1040 static const std::array<const QString,8> cr {
1041 "1/2", "2/3", "3/4", "5/6", "7/8", "auto", "auto", "auto"
1042 };
1043 return cr[CodeRateHP()];
1044 }
1045 // code_rate-LP_stream 3 8.0
1046 uint CodeRateLP(void) const { return (m_data[8]>>5) & 0x7; }
1047 QString CodeRateLPString(void) const
1048 {
1049 static const std::array<const QString,8> cr {
1050 "1/2", "2/3", "3/4", "5/6", "7/8", "auto", "auto", "auto"
1051 };
1052 return cr[CodeRateLP()];
1053 }
1054 // guard_interval 2 8.3
1055 enum : std::uint8_t
1056 {
1061 };
1062 uint GuardInterval(void) const { return (m_data[8]>>3) & 0x3; }
1063 QString GuardIntervalString(void) const
1064 {
1065 static const std::array<const QString,4> gi { "1/32", "1/16", "1/8", "1/4" };
1066 return gi[GuardInterval()];
1067 }
1068 // transmission_mode 2 8.5
1069 enum : std::uint8_t
1070 {
1074 };
1075 uint TransmissionMode(void) const { return (m_data[8]>>1) & 0x3; }
1076 QString TransmissionModeString(void) const
1077 {
1078 static const std::array<const QString,4> tm { "2", "8", "4", "auto" };
1079 return tm[TransmissionMode()];
1080 }
1081 // other_frequency_flag 1 8.7
1082 bool OtherFrequencyInUse(void) const { return (m_data[8] & 0x1) != 0; }
1083 // reserved_future_use 32 9.0
1084
1085 QString toString(void) const override; // MPEGDescriptor
1086};
1087
1088// DVB Bluebook A038 (Feb 2019) p 110
1090{
1091 public:
1093 const unsigned char *data, int len = 300) :
1094 MPEGDescriptor(data, len, DescriptorID::extension)
1095 {
1097 {
1098 m_data = nullptr;
1099 }
1100 }
1101 // Name bits loc expected value
1102 // descriptor_tag 8 0.0 0x7f extension
1103 // descriptor_length 8 1.0
1104 // descriptor_tag_extension 8 2.0 0x00 image_icon
1105
1106 // descriptor_number 4 3.0
1108 {
1109 return m_data[3] >> 4;
1110 }
1111
1112 // last_descriptor_number 4 3.4
1114 {
1115 return m_data[3] & 0xF;
1116 }
1117
1118 // icon_id 3 4.5
1119 uint IconID(void) const
1120 {
1121 return m_data[4] & 0x7;
1122 }
1123
1124 //
1125 // TBD
1126 //
1127
1128 QString toString(void) const override; // MPEGDescriptor
1129};
1130
1131// DVB Bluebook A038 (Feb 2019) p 104 0x7f 0x04
1133{
1134 public:
1136 const unsigned char *data, int len = 300) :
1137 MPEGDescriptor(data, len, DescriptorID::extension)
1138 {
1139 if (IsValid())
1140 {
1142 m_data = nullptr;
1143 else
1144 Parse();
1145 }
1146 }
1147 // Name bits loc expected value
1148 // descriptor_tag 8 0.0 0x7f extension
1149 // descriptor_length 8 1.0
1150 // descriptor_tag_extension 8 2.0 0x04 t2_delivery_system
1151
1152 // plp_id 8 3.0
1153 uint PlpID(void) const
1154 {
1155 return m_data[3];
1156 }
1157
1158 // T2_system_id 16 4.0
1159 uint T2SystemID(void) const
1160 {
1161 return ((m_data[4]<<8) | (m_data[5]));
1162 }
1163
1164 // SISO/MISO 2 6.0
1165 uint SisoMiso(void) const { return (m_data[6] >> 6) & 0x3; }
1166 QString SisoMisoString(void) const
1167 {
1168 static const std::array<const QString,4> sm
1169 { "SISO", "MISO", "reserved", "reserved" };
1170 return sm[SisoMiso()];
1171 }
1172
1173 // bandwidth 4 6.2
1174 enum : std::uint8_t
1175 {
1182 };
1183 uint Bandwidth(void) const { return (m_data[6] >> 2) & 0xF; }
1184 uint BandwidthHz(void) const
1185 {
1186 static constexpr std::array<const uint,6> bw
1187 { 8000000, 7000000, 6000000, 5000000, 10000000, 1712000 };
1188 return (Bandwidth() <= kBandwidth1712kHz ? bw[Bandwidth()] : 0);
1189 }
1190 QString BandwidthString(void) const
1191 {
1192 static const std::array<const QString,6> bs
1193 { "8", "7", "6", "5", "10", "1.712" };
1194 return (Bandwidth() <= kBandwidth1712kHz) ? bs[Bandwidth()] : "0";
1195 }
1196
1197 // guard_interval 3 7.0
1198 enum : std::uint8_t
1199 {
1207 };
1208 uint GuardInterval(void) const { return (m_data[7]>>5) & 0x7; }
1209 QString GuardIntervalString(void) const
1210 {
1211 static const std::array<const QString,8> gi
1212 { "1/32", "1/16", "1/8", "1/4", "1/128", "19/128", "19/256", "reserved" };
1213 return gi[GuardInterval()];
1214 }
1215
1216 // transmission_mode 3 7.3
1217 enum : std::uint8_t
1218 {
1225 };
1226 uint TransmissionMode(void) const { return (m_data[7]>>2) & 0x7; }
1227 QString TransmissionModeString(void) const
1228 {
1229 static const std::array<const QString,8> tm
1230 { "2k", "8k", "4k", "1k", "16k", "32k", "reserved", "reserved" };
1231 return tm[TransmissionMode()];
1232 }
1233 uint OtherFrequencyFlag(void) const { return (m_data[7]>>1) & 0x1; }
1234 uint TFSFlag(void) const { return m_data[7] & 0x1; }
1235
1236 public:
1237 uint NumCells(void) const { return m_cellPtrs.size(); }
1238 uint CellID(uint i) const { return (m_cellPtrs[i][0] << 8) | m_cellPtrs[i][1]; }
1239 uint FrequencyLoopLength(uint i) const { return m_cellPtrs[i][2]; }
1240
1242 {
1243 return (m_cellPtrs[i][2] << 24) | (m_cellPtrs[i][3] << 16) | (m_cellPtrs[i][4] << 8) | m_cellPtrs[i][5];
1244 }
1245
1246 uint CentreFrequency(int i, int j) const
1247 {
1248 return (m_cellPtrs[i][3+(4*j)] << 24) | (m_cellPtrs[i][4+(4*j)] << 16) | (m_cellPtrs[i][5+(4*j)] << 8) | m_cellPtrs[i][6+(4*j)];
1249 }
1251 uint CellIDExtension(uint i, uint j) const { return m_subCellPtrs[i][1+(5*j)]; }
1253 {
1254 return (m_subCellPtrs[i][1+(5*j)] << 24) | (m_subCellPtrs[i][2+(5*j)] << 16) | (m_subCellPtrs[i][3+(5*j)] << 8) | m_cellPtrs[i][4+(5*j)];
1255 }
1256
1257 void Parse(void) const;
1258 QString toString(void) const override; // MPEGDescriptor
1259
1260 private:
1261 mutable std::vector<const unsigned char*> m_cellPtrs; // used to parse
1262 mutable std::vector<const unsigned char*> m_subCellPtrs; // used to parse
1263};
1264
1265// DVB Bluebook A038 (Feb 2019) p 100 0x7f 0x05
1267{
1268 public:
1270 const unsigned char *data, int len = 300) :
1271 MPEGDescriptor(data, len, DescriptorID::extension)
1272 {
1274 {
1275 m_data = nullptr;
1276 }
1277 }
1278 // Name bits loc expected value
1279 // descriptor_tag 8 0.0 0x7f extension
1280 // descriptor_length 8 1.0
1281 // descriptor_tag_extension 8 2.0 0x05 sh_delivery_system
1282
1283 //
1284 // TBD
1285 //
1286
1287 QString toString(void) const override; // MPEGDescriptor
1288};
1289
1290// DVB Bluebook A038 (Feb 2019) p 115 0x7F 0x06
1292{
1293 public:
1295 const unsigned char *data, int len = 300) :
1296 MPEGDescriptor(data, len, DescriptorID::extension)
1297 {
1299 {
1300 m_data = nullptr;
1301 }
1302 }
1303 // Name bits loc expected value
1304 // descriptor_tag 8 0.0 0x7f extension
1305 // descriptor_length 8 1.0
1306 // descriptor_tag_extension 8 2.0 0x06 supplementary_audio_descriptor
1307
1308 // mix_type 1 3.0
1309 uint MixType(void) const { return m_data[3] & 0x1; }
1310
1311 // editorial_classification 5 3.1
1312 uint EditorialClassification(void) const { return (m_data[3] >> 1 ) & 0x1F; }
1313
1314 // reserved_future_use 1 3.6
1315 uint ReservedFutureUse(void) const { return (m_data[3] >> 6 ) & 0x1; }
1316
1317 // language_code_present 1 3.7
1318 uint LanguageCodePresent(void) const { return (m_data[3] >> 7 ) & 0x1; }
1319
1320 // ISO_639_language_code 24 4.0
1321 int LanguageKey(void) const
1322 { return iso639_str3_to_key(&m_data[4]); }
1323 QString LanguageString(void) const
1324 { return iso639_key_to_str3(LanguageKey()); }
1325
1326 QString toString(void) const override; // MPEGDescriptor
1327};
1328
1329// DVB Bluebook A038 (Feb 2019) p 113 0x7F 0x07
1331{
1332 public:
1334 const unsigned char *data, int len = 300) :
1335 MPEGDescriptor(data, len, DescriptorID::extension)
1336 {
1338 {
1339 m_data = nullptr;
1340 }
1341 }
1342 // Name bits loc expected value
1343 // descriptor_tag 8 0.0 0x7f extension
1344 // descriptor_length 8 1.0
1345 // descriptor_tag_extension 8 2.0 0x07 network_change_notify_descriptor
1346
1347 QString toString(void) const override; // MPEGDescriptor
1348};
1349
1350// DVB Bluebook A038 (Feb 2019) p 112 0x7F 0x08
1352{
1353 public:
1355 const unsigned char *data, int len = 300) :
1356 MPEGDescriptor(data, len, DescriptorID::extension)
1357 {
1359 {
1360 m_data = nullptr;
1361 }
1362 }
1363 // Name bits loc expected value
1364 // descriptor_tag 8 0.0 0x7f extension
1365 // descriptor_length 8 1.0
1366 // descriptor_tag_extension 8 2.0 0x08 message_descriptor
1367
1368 // message_id 8 3.0
1369 uint MessageID(void) const { return m_data[3]; }
1370
1371 // ISO_639_language_code 24 4.0
1372 int LanguageKey(void) const
1373 { return iso639_str3_to_key(&m_data[4]); }
1374 QString LanguageString(void) const
1375 { return iso639_key_to_str3(LanguageKey()); }
1376
1377 // text_char 8 7.0
1378 QString Message(void) const
1379 { return dvb_decode_text(m_data+7, DescriptorLength()-5); }
1380
1381 QString toString(void) const override; // MPEGDescriptor
1382};
1383
1384// DVB Bluebook A038 (Feb 2019) p 117
1386{
1387 public:
1389 const unsigned char *data, int len = 300) :
1390 MPEGDescriptor(data, len, DescriptorID::extension)
1391 {
1393 {
1394 m_data = nullptr;
1395 }
1396 }
1397 // Name bits loc expected value
1398 // descriptor_tag 8 0.0 0x7f extension
1399 // descriptor_length 8 1.0 4 or more
1400 // descriptor_tag_extension 8 2.0 0x09 target_region
1401
1402 // country_code 24 3.0 e.g. "GBR"
1403 uint CountryCode(void) const
1404 {
1405 return ((m_data[3] << 16) | (m_data[4] << 8) | m_data[5]);
1406 }
1407 QString CountryCodeString(void) const
1408 {
1409 std::array<QChar,3> code
1410 { QChar(m_data[3]), QChar(m_data[4]), QChar(m_data[5]) };
1411 return QString(code.data(), 3);
1412 }
1413 //
1414 // TBD
1415 //
1416 QString toString(void) const override; // MPEGDescriptor
1417};
1418
1419// DVB Bluebook A038 (Feb 2019) p 118
1421{
1422 public:
1424 const unsigned char *data, int len = 300) :
1425 MPEGDescriptor(data, len, DescriptorID::extension)
1426 {
1428 {
1429 m_data = nullptr;
1430 }
1431 }
1432 // Name bits loc expected value
1433 // descriptor_tag 8 0.0 0x7f extension
1434 // descriptor_length 8 1.0 7 or more
1435 // descriptor_tag_extension 8 2.0 0x0A target_region_name
1436
1437 // country_code 24 3.0 e.g. "GBR"
1438 uint CountryCode(void) const
1439 {
1440 return ((m_data[3] << 16) | (m_data[4] << 8) | m_data[5]);
1441 }
1442 QString CountryCodeString(void) const
1443 {
1444 std::array<QChar,3> code
1445 { QChar(m_data[3]), QChar(m_data[4]), QChar(m_data[5]) };
1446 return QString(code.data(), 3);
1447 }
1448
1449 // ISO_639_language_code 24 6.0
1450 int LanguageKey(void) const
1451 { return iso639_str3_to_key(&m_data[6]); }
1452 QString LanguageString(void) const
1453 { return iso639_key_to_str3(LanguageKey()); }
1454
1455 //
1456 // TBD
1457 //
1458 QString toString(void) const override; // MPEGDescriptor
1459};
1460
1461// DVB Bluebook A038 (Feb 2019) p 115 0x7F 0x0B
1463{
1464 public:
1466 const unsigned char *data, int len = 300) :
1467 MPEGDescriptor(data, len, DescriptorID::extension)
1468 {
1470 {
1471 m_data = nullptr;
1472 }
1473 }
1474 // Name bits loc expected value
1475 // descriptor_tag 8 0.0 0x7f extension
1476 // descriptor_length 8 1.0 7
1477 // descriptor_tag_extension 8 2.0 0x0B service_relocated
1478
1479 // old_original_network_id 16 3.0
1480 // old_transport_stream_id 16 5.0
1481 // old_service_id 16 7.0
1482 uint OldOriginalNetworkID(void) const { return (m_data[3] << 8) | m_data[4]; }
1483 uint OldTransportID(void) const { return (m_data[5] << 8) | m_data[6]; }
1484 uint OldServiceID(void) const { return (m_data[7] << 8) | m_data[8]; }
1485
1486 QString toString(void) const override; // MPEGDescriptor
1487};
1488
1489// DVB Bluebook A038 (Feb 2019) p 98
1491{
1492 public:
1494 const unsigned char *data, int len = 300) :
1495 MPEGDescriptor(data, len, DescriptorID::extension)
1496 {
1498 {
1499 m_data = nullptr;
1500 }
1501 }
1502 // Name bits loc expected value
1503 // descriptor_tag 8 0.0 0x7f extension
1504 // descriptor_length 8 1.0 9
1505 // descriptor_tag_extension 8 2.0 0x0D c2_delivery_system
1506
1507 // plp_id 8 3.0
1508 uint PlpID(void) const
1509 {
1510 return m_data[3];
1511 }
1512
1513 // data_slice_id 8 4.0
1514 uint DataSliceID(void) const
1515 {
1516 return m_data[4];
1517 }
1518
1519 // C2_System_tuning_frequency 32 5.0
1520 uint Frequency(void) const
1521 {
1522 return ((m_data[5]<<24) | (m_data[6]<<16) |
1523 (m_data[7]<<8) | (m_data[8]));
1524 }
1525
1526 //
1527 // TBD
1528 //
1529
1530 QString toString(void) const override; // MPEGDescriptor
1531};
1532
1533// DVB Bluebook A038 (Feb 2019) p 108
1535{
1536 public:
1538 const unsigned char *data, int len = 300) :
1539 MPEGDescriptor(data, len, DescriptorID::extension)
1540 {
1542 {
1543 m_data = nullptr;
1544 }
1545 }
1546 // Name bits loc expected value
1547 // descriptor_tag 8 0.0 0x7f extension
1548 // descriptor_length 8 1.0
1549 // descriptor_tag_extension 8 2.0 0x17 s2x_delivery_system
1550
1551 //
1552 // TBD
1553 //
1554
1555 QString toString(void) const override; // MPEGDescriptor
1556};
1557
1558// DVB Bluebook A038 (Sept 2011) p 58
1560{
1561 public:
1562 explicit DSNGDescriptor(const unsigned char *data, int len = 300) :
1563 MPEGDescriptor(data, len, DescriptorID::dsng) { }
1564 // Name bits loc expected value
1565 // descriptor_tag 8 0.0 0x68
1566 // descriptor_length 8 1.0
1567 // for (i=0;i<N;i++) { byte 8 }
1568};
1569
1570// DVB Bluebook A038 (Sept 2011) p 58
1572{
1573 public:
1574 explicit ExtendedEventDescriptor(const unsigned char *data, int len = 300) :
1575 MPEGDescriptor(data, len, DescriptorID::extended_event) { }
1576 // Name bits loc expected value
1577 // descriptor_tag 8 0.0 0x4e
1578 // descriptor_length 8 1.0
1579
1580 // descriptor_number 4 2.0
1581 uint DescriptorNumber(void) const { return m_data[2] >> 4; }
1582 // last_number 4 2.4
1583 uint LastNumber(void) const { return m_data[2] & 0xf; }
1584 // ISO_639_language_code 24 3.0
1585 int LanguageKey(void) const
1586 { return iso639_str3_to_key(&m_data[3]); }
1587 QString LanguageString(void) const
1588 { return iso639_key_to_str3(LanguageKey()); }
1589 int CanonicalLanguageKey(void) const
1590 { return iso639_key_to_canonical_key(LanguageKey()); }
1591 QString CanonicalLanguageString(void) const
1592 { return iso639_key_to_str3(CanonicalLanguageKey()); }
1593 // length_of_items 8 6.0
1594 uint LengthOfItems(void) const { return m_data[6]; }
1595 // for ( i=0;i<N;i++)
1596 // {
1597 // item_description_len 8 0.0+p
1598 // for (j=0;j<N;j++) { item_desc_char 8 }
1599 // item_length 8 1.0+p2
1600 // for (j=0;j<N;j++) { item_char 8 }
1601 // }
1602 QMultiMap<QString,QString> Items(void) const;
1603 // text_length 8
1604 uint TextLength(void) const { return m_data[7 + LengthOfItems()]; }
1605 // for (i=0; i<N; i++) { text_char 8 }
1606 QString Text(void) const
1607 { return dvb_decode_text(&m_data[8 + LengthOfItems()], TextLength()); }
1608
1609 // HACK beg -- Pro7Sat is missing encoding
1610 QString Text(const enc_override &encoding_override) const
1611 {
1612 return dvb_decode_text(&m_data[8 + LengthOfItems()], TextLength(),
1613 encoding_override);
1614 }
1615 // HACK end -- Pro7Sat is missing encoding
1616};
1617
1618// DVB Bluebook A038 (Sept 2011) p 60
1620{
1621 public:
1622 explicit FrequencyListDescriptor(const unsigned char *data, int len = 300) :
1623 MPEGDescriptor(data, len, DescriptorID::frequency_list) { }
1624 // Name bits loc expected value
1625 // descriptor_tag 8 0.0 0x62
1626 // descriptor_length 8 1.0
1627
1628 // reserved_future_use 6 2.0
1629 // coding_type 2 2.6
1630 enum : std::uint8_t
1631 {
1636 };
1637 uint CodingType(void) const { return m_data[2] & 0x3; }
1638 // for (i=0;I<N;i++)
1639 // {
1640 // centre_frequency 32
1641 // }
1642 uint FrequencyCount() const { return DescriptorLength()>>2; }
1643 unsigned long long Frequency(uint i) const
1644 {
1646 {
1647 return (((unsigned long long)m_data[(i*4)+3]<<24) |
1648 (m_data[(i*4)+4]<<16) |
1649 (m_data[(i*4)+5]<<8) |
1650 (m_data[(i*4)+6]));
1651 }
1652 return byte4BCD2int(m_data[(i*4)+3], m_data[(i*4)+4],
1653 m_data[(i*4)+5], m_data[(i*4)+6]);
1654 }
1655 unsigned long long FrequencyHz(uint i) const
1656 {
1657 return Frequency(i) *
1658 ((kCodingTypeTerrestrial == CodingType()) ? 10 : 100);
1659 }
1660
1661 QString toString(void) const override; // MPEGDescriptor
1662};
1663
1664// DVB Bluebook A038 (Sept 2011) p 70
1665// ETSI EN 300 468 p 58
1667{
1668 public:
1669 explicit LocalTimeOffsetDescriptor(const unsigned char *data, int len = 300) :
1670 MPEGDescriptor(data, len, DescriptorID::local_time_offset) { }
1671 // Name bits loc expected value
1672 // descriptor_tag 8 0.0 0x58
1673 // descriptor_length 8 1.0
1674 uint Count(void) const { return DescriptorLength() / 13; }
1675 // for(i=0;i<N;i++)
1676 // {
1677 // country_code 24 0.0+p
1679 {
1680 int o = 2 + (i*13);
1681 return ((m_data[o] << 16) | (m_data[o+1] << 8) | m_data[o+2]);
1682 }
1683 QString CountryCodeString(uint i) const
1684 {
1685 int o = 2 + (i*13);
1686 std::array<QChar,3> code
1687 { QChar(m_data[o]), QChar(m_data[o+1]), QChar(m_data[o+2]) };
1688 return QString(code.data(), 3);
1689 }
1690 // country_region_id 6 3.0+p
1691 uint CountryRegionId(uint i) const { return m_data[2 + (i*13) + 3] >> 2; }
1692 // reserved 1 3.6+p
1693 // local_time_off_polarity 1 3.7+p
1696 { return (m_data[2 + (i*13) + 3] & 0x01) != 0; }
1697 // local_time_offset 16 4.0+p
1699 { return (byteBCD2int(m_data[2 + (i*13) + 4]) * 60) +
1700 byteBCD2int(m_data[2 + (i*13) + 5]); }
1702 { return (LocalTimeOffsetPolarity(i) ? -1 : +1) * LocalTimeOffset(i); }
1703 // time_of_change 40 6.0+p
1704 const unsigned char *TimeOfChangeData(uint i) const
1705 { return &m_data[2 + (i*13) + 6]; }
1706 QDateTime TimeOfChange(uint i) const
1707 { return dvbdate2qt(TimeOfChangeData(i)); }
1708 time_t TimeOfChangeUnix(uint i) const
1709 { return dvbdate2unix(TimeOfChangeData(i)); }
1710 // next_time_offset 16 11.0+p
1712 { return (byteBCD2int(m_data[2 + (i*13) + 11]) * 60) +
1713 byteBCD2int(m_data[2 + (i*13) + 12]); }
1714 // } 13.0
1715 QString toString(void) const override; // MPEGDescriptor
1716};
1717
1718// DVB Bluebook A038 (Sept 2011) p 71
1720{
1721 public:
1722 explicit MosaicDescriptor(const unsigned char *data, int len = 300) :
1723 MPEGDescriptor(data, len, DescriptorID::mosaic) { }
1724 // Name bits loc expected value
1725 // descriptor_tag 8 0.0 0x51
1726 // descriptor_length 8 1.0
1727
1728 // mosaic_entry_point 1 2.0
1729 // num_horiz_elem_cells 3 2.1
1730 // reserved_future_use 1 2.4
1731 // num_vert_elem_cells 3 2.5
1732 // for (i=0;i<N; i++)
1733 // {
1734 // logical_cell_id 6 0.0+p
1735 // reserved_future_use 7 0.6+p
1736 // logical_cell_pres_info 3 1.5+p
1737 // elem_cell_field_len 8 2.0+p
1738 // for (i=0; j<elementary_cell_field_length; j++)
1739 // {
1740 // reserved_future_use 2
1741 // elementary_cell_id 6
1742 // }
1743 // cell_linkage_info 8
1744 // if (cell_linkage_info == 0x01)
1745 // {
1746 // bouquet_id 16
1747 // }
1748 // if (cell_linkage_info == 0x02)
1749 // {
1750 // original_network_id 16
1751 // transport_stream_id 16
1752 // service_id 16
1753 // }
1754 // if (cell_linkage_info == 0x03)
1755 // {
1756 // original_network_id 16
1757 // transport_stream_id 16
1758 // service_id 16
1759 // }
1760 // if (cell_linkage_info == 0x04)
1761 // {
1762 // original_network_id 16
1763 // transport_stream_id 16
1764 // service_id 16
1765 // event_id 16
1766 // }
1767 // }
1768};
1769
1770// DVB Bluebook A038 (Sept 2011) p 74
1772{
1773 public:
1775 const unsigned char *data, int len = 300) :
1776 MPEGDescriptor(data, len, DescriptorID::multilingual_bouquet_name) { }
1777 // Name bits loc expected value
1778 // descriptor_tag 8 0.0 0x5c
1779 // descriptor_length 8 1.0
1780
1781 // for (i=0;i<N;i++)
1782 // {
1783 // ISO_639_language_code 24
1784 // bouquet_name_length 8
1785 // for (j=0;j<N;j++) { char 8 }
1786 // }
1787};
1788
1789// DVB Bluebook A038 (Sept 2011) p 75
1791{
1792 public:
1794 const unsigned char *data, int len = 300) :
1795 MPEGDescriptor(data, len, DescriptorID::multilingual_network_name) { }
1796 // Name bits loc expected value
1797 // descriptor_tag 8 0.0 0x5b
1798 // descriptor_length 8 1.0
1799
1800 // for (i=0;i<N;i++)
1801 // {
1802 // ISO_639_language_code 24
1803 // network_name_length 8
1804 // for (j=0;j<N;j++) { char 8 }
1805 // }
1806};
1807
1808// DVB Bluebook A038 (Sept 2011) p 76
1810{
1811 public:
1813 const unsigned char *data, int len = 300) :
1814 MPEGDescriptor(data, len, DescriptorID::multilingual_service_name) { }
1815 // Name bits loc expected value
1816 // descriptor_tag 8 0.0 0x5d
1817 // descriptor_length 8 1.0
1818
1819 // for (i=0;i<N;i++)
1820 // {
1821 // ISO_639_language_code 24
1822 // service_provider_name_length 8
1823 // for (j=0;j<N;j++) { char 8 }
1824 // service_name_length 8
1825 // for (j=0;j<N;j++) { char 8 }
1826 // }
1827};
1828
1829// DVB Bluebook A038 (Sept 2011) p 76
1831{
1832 public:
1833 explicit NVODReferenceDescriptor(const unsigned char *data, int len = 300) :
1834 MPEGDescriptor(data, len, DescriptorID::nvod_reference) { }
1835 // Name bits loc expected value
1836 // descriptor_tag 8 0.0 0x4b
1837 // descriptor_length 8 1.0
1838 uint Count(void) const { return DescriptorLength() / 6; }
1839
1840 // for (i=0;i<N;i++)
1841 // {
1842 // transport_stream_id 16
1844 { return (m_data[(i * 6) + 2] << 8) | m_data[(i * 6) + 3]; }
1845 // original_network_id 16
1847 { return (m_data[(i * 6) + 4] << 8) | m_data[(i * 6) + 5]; }
1848 // service_id 16
1850 { return (m_data[(i * 6) + 6] << 8) | m_data[(i * 6) + 7]; }
1851 // }
1852 QString toString(void) const override; // MPEGDescriptor
1853};
1854
1855// DVB Bluebook A038 (Sept 2011) p 78
1856// ETSI EN 300 468
1858{
1859 public:
1860 explicit ParentalRatingDescriptor(const unsigned char *data, int len = 300) :
1861 MPEGDescriptor(data, len, DescriptorID::parental_rating) { }
1862 explicit ParentalRatingDescriptor(const std::vector<uint8_t> &data) :
1863 MPEGDescriptor(data, DescriptorID::parental_rating) { }
1864 // Name bits loc expected value
1865 // descriptor_tag 8 0.0 0x55
1866 // descriptor_length 8 1.0
1867 uint Count(void) const { return DescriptorLength() / 4; }
1868
1869 // for (i=0; i<N; i++)
1870 // {
1871 // country_code 24
1872 // rating 8
1873 // }
1874 QString CountryCodeString(uint i) const
1875 {
1876 int o = 2 + (i*4);
1877 if (i >= Count())
1878 return {""};
1879 std::array<QChar,3> code
1880 { QChar(m_data[o]), QChar(m_data[o+1]), QChar(m_data[o+2]) };
1881 return QString(code.data(), 3);
1882 }
1883 int Rating(uint i) const
1884 {
1885 if (i >= Count())
1886 {
1887 return -1;
1888 }
1889
1890 unsigned char rawRating = m_data[2 + 3 + (i*4)];
1891 if (rawRating == 0)
1892 {
1893 // 0x00 - undefined
1894 return -1;
1895 }
1896 if (rawRating <= 0x0F)
1897 {
1898 // 0x01 to 0x0F - minumum age = rating + 3 years
1899 return rawRating + 3;
1900 }
1901
1902 // 0x10 to 0xFF - defined by the broadcaster
1903 return -1;
1904 }
1905};
1906
1907// DVB Bluebook A038 (Sept 2011) p 78 (see also ETSI EN 300 231 PDC)
1909{
1910 public:
1911 explicit PDCDescriptor(const unsigned char *data, int len = 300) :
1912 MPEGDescriptor(data, len, DescriptorID::pdc, 3) { }
1913 // Name bits loc expected value
1914 // descriptor_tag 8 0.0 0x69
1915 // descriptor_length 8 1.0
1916
1917 // reserved_future_use 4 2.0
1918 // program_id_label 20 2.4
1920 { return (m_data[2] & 0x0F) << 16 | m_data[3] << 8 | m_data[4]; }
1921 QString toString(void) const override // MPEGDescriptor
1922 {
1923 return QString("PDCDescriptor program_id_label(%1)")
1924 .arg(ProgramIdLabel());
1925 }
1926};
1927
1928// DVB Bluebook A038 (Sept 2011) p 79 (see also ETSI TS 101 162)
1930{
1931 public:
1932 explicit PrivateDataSpecifierDescriptor(const unsigned char *data, int len = 300) :
1933 MPEGDescriptor(data, len, DescriptorID::private_data_specifier) { }
1934 explicit PrivateDataSpecifierDescriptor(const std::vector<uint8_t> &data) :
1935 MPEGDescriptor(data, DescriptorID::private_data_specifier) { }
1936 // Name bits loc expected value
1937 // descriptor_tag 8 0.0 0x5f
1938 // descriptor_length 8 1.0
1939
1940 // private_data_specifier 32 2.0
1941 uint32_t PrivateDataSpecifier (void) const
1942 {
1943 return (m_data[2] << 24 | m_data[3] << 16 | m_data[4] << 8 | m_data[5]);
1944 }
1945};
1946
1947// DVB Bluebook A038 (Sept 2011) p 79
1949{
1950 public:
1951 explicit ScramblingDescriptor(const unsigned char *data, int len = 300) :
1952 MPEGDescriptor(data, len, DescriptorID::scrambling, 1) { }
1953 // Name bits loc expected value
1954 // descriptor_tag 8 0.0 0x65
1955 // descriptor_length 8 1.0
1956
1957 // scrambling_mode 8 2.0
1958 uint ScramblingMode(void) const { return m_data[2]; }
1959 QString toString(void) const override // MPEGDescriptor
1960 {
1961 return QString("ScramblingDescriptor scrambling_mode(%1)")
1962 .arg(ScramblingMode());
1963 }
1964};
1965
1966// DVB Bluebook A038 (Feb 2019) p 83, Table 89: Service type coding
1968{
1969 public:
1970 explicit ServiceDescriptorMapping(const uint service_type) : m_serviceType(service_type) {}
1971 enum : std::uint8_t
1972 {
1981 // reserved for future use = 0x09,
1990 // reserved for future use = 0x12 to 0x15
2002 // reserved for future use = 0x21 to 0x7F
2003 // user defined = 0x80 to 0xFE
2004 // reserved for future use = 0xFF
2005 // User Defined descriptors for Dish network
2019
2020 };
2021 uint ServiceType(void) const { return m_serviceType; }
2022 bool IsDTV(void) const
2023 {
2026 IsHDTV() ||
2027 IsUHDTV() ||
2041 }
2042 bool IsDigitalAudio(void) const
2043 {
2044 return
2047 }
2048 bool IsHDTV(void) const
2049 {
2050 return
2054 }
2055 bool IsUHDTV(void) const
2056 {
2057 return
2060 }
2061 bool IsTeletext(void) const
2062 {
2064 }
2065 QString toString(void) const;
2066
2067 private:
2069};
2070
2071// DVB Bluebook A038 (Feb 2019) p 82
2073{
2074 public:
2075 explicit ServiceDescriptor(const unsigned char *data, int len = 300) :
2076 MPEGDescriptor(data, len, DescriptorID::service) { }
2077 // Name bits loc expected value
2078 // descriptor_tag 8 0.0 0x48
2079 // descriptor_length 8 1.0
2080
2081 // service_type 8 2.0
2082 uint ServiceType(void) const { return m_data[2]; }
2083 // svc_provider_name_len 8 3.0
2084 uint ServiceProviderNameLength(void) const { return m_data[3]; }
2085 // for (i=0;i<N;I++) { char 8 }
2086 QString ServiceProviderName(void) const
2088 QString ServiceProviderShortName(void) const
2089 {
2091 }
2092 // service_name_length 8
2094 { return m_data[4 + ServiceProviderNameLength()]; }
2095 // for (i=0;i<N;I++) { char 8 }
2096 QString ServiceName(void) const
2097 {
2100 }
2101 QString ServiceShortName(void) const
2102 {
2105 }
2106 bool IsDTV(void) const
2108 bool IsDigitalAudio(void) const
2110 bool IsHDTV(void) const
2112 bool IsTeletext(void) const
2114
2115 QString toString(void) const override // MPEGDescriptor
2116 {
2117 return QString("ServiceDescriptor: %1 %2(0x%3)")
2118 .arg(ServiceName(),
2120 .arg(ServiceType(),2,16,QChar('0'));
2121 }
2122};
2123
2124// DVB Bluebook A038 (Feb 2019) p 84
2126{
2127 public:
2128 explicit ServiceAvailabilityDescriptor(const unsigned char *data, int len = 300) :
2129 MPEGDescriptor(data, len, DescriptorID::service_availability) { }
2130 // Name bits loc expected value
2131 // descriptor_tag 8 0.0 0x72
2132 // descriptor_length 8 1.0
2133
2134 // availability_flag 1 2.0
2135 // reserved 7 2.1
2136 // for (i=0;i<N;i++) { cell_id 16 }
2137};
2138
2139// DVB Bluebook A038 (Feb 2019) p 84
2141{
2142 public:
2143 explicit ServiceListDescriptor(const unsigned char *data, int len = 300) :
2144 MPEGDescriptor(data, len, DescriptorID::service_list) { }
2145 // Name bits loc expected value
2146 // descriptor_tag 8 0.0 0x41
2147 // descriptor_length 8 1.0
2148
2149 // for (i=0;i<N;I++)
2150 // {
2151 // service_id 16 0.0+p
2152 // service_type 8 2.0+p
2153 // }
2154 uint ServiceCount(void) const { return DescriptorLength() / 3; }
2155
2157 { return (m_data[2+(i*3)] << 8) | m_data[3+(i*3)]; }
2158
2159 uint ServiceType(uint i) const { return m_data[4+(i*3)]; }
2160
2161 QString toString(void) const override // MPEGDescriptor
2162 {
2163 QString str = QString("ServiceListDescriptor: %1 Services")
2164 .arg(ServiceCount());
2165 for (uint i=0; i<ServiceCount(); i++)
2166 {
2167 str.append("\n");
2168 str.append(QString(" Service (%1) Type%2 (0x%3)")
2169 .arg(ServiceID(i))
2171 .arg(ServiceType(i),2,16,QChar('0')));
2172 }
2173 return str;
2174 }
2175};
2176
2177// DVB Bluebook A038 (Sept 2011) p 82
2179{
2180 public:
2181 explicit ServiceMoveDescriptor(const unsigned char *data, int len = 300) :
2182 MPEGDescriptor(data, len, DescriptorID::service_move) { }
2183 // Name bits loc expected value
2184 // descriptor_tag 8 0.0 0x60
2185 // descriptor_length 8 1.0
2186
2187 // new_original_network_id 16 2.0
2188 // new_transport_stream_id 16 4.0
2189 // new_service_id 16 6.0
2190};
2191
2192// DVB Bluebook A038 (Sept 2011) p 83
2194{
2195 public:
2196 explicit ShortEventDescriptor(const unsigned char *data, int len = 300) :
2197 MPEGDescriptor(data, len, DescriptorID::short_event) { }
2198 // Name bits loc expected value
2199 // descriptor_tag 8 0.0 0x4d
2200 // descriptor_length 8 1.0
2201
2202 // ISO_639_language_code 24 2.0
2203 int LanguageKey(void) const
2204 { return iso639_str3_to_key(&m_data[2]); }
2205 QString LanguageString(void) const
2206 { return iso639_key_to_str3(LanguageKey()); }
2207 int CanonicalLanguageKey(void) const
2209 QString CanonicalLanguageString(void) const
2211 // event_name_length 8 5.0
2212 uint EventNameLength(void) const { return m_data[5]; }
2213 // for (i=0;i<event_name_length;i++) { event_name_char 8 }
2214 QString EventName(void) const
2215 { return dvb_decode_text(&m_data[6], m_data[5]); }
2216 QString EventShortName(void) const
2217 { return dvb_decode_short_name(&m_data[6], m_data[5]); }
2218 // text_length 8
2219 uint TextLength(void) const { return m_data[6 + m_data[5]]; }
2220 // for (i=0;i<text_length;i++) { text_char 8 }
2221 QString Text(void) const
2222 { return dvb_decode_text(&m_data[7 + m_data[5]], TextLength()); }
2223
2224 // HACK beg -- Pro7Sat is missing encoding
2225 QString EventName(const enc_override& encoding_override) const
2226 {
2227 return dvb_decode_text(&m_data[6], m_data[5],
2228 encoding_override);
2229 }
2230
2231 QString Text(const enc_override& encoding_override) const
2232 {
2233 return dvb_decode_text(&m_data[7 + m_data[5]], TextLength(),
2234 encoding_override);
2235 }
2236 // HACK end -- Pro7Sat is missing encoding
2237
2238 QString toString(void) const override // MPEGDescriptor
2239 { return LanguageString() + " : " + EventName() + " : " + Text(); }
2240};
2241
2242// DVB Bluebook A038 (Sept 2011) p 84
2244{
2245 public:
2246 explicit ShortSmoothingBufferDescriptor(const unsigned char *data, int len = 300) :
2247 MPEGDescriptor(data, len, DescriptorID::short_smoothing_buffer) { }
2248 // Name bits loc expected value
2249 // descriptor_tag 8 0.0 0x61
2250 // descriptor_length 8 1.0
2251
2252 // sb_size 2 2.0
2253 // sb_leak_rate 6 2.2
2254 // for (i=0; i<N; i++)
2255 // { DVB_reserved 8 }
2256};
2257
2258// DVB Bluebook A038 (Sept 2011) p 85
2262{
2263 public:
2264 explicit StreamIdentifierDescriptor(const unsigned char *data, int len = 300) :
2265 MPEGDescriptor(data, len, DescriptorID::stream_identifier, 1) { }
2266 // Name bits loc expected value
2267 // descriptor_tag 8 0.0 0x52
2268 // descriptor_length 8 1.0 0x01
2269
2270 // component_tag 8 2.0
2271 uint ComponentTag(void) const { return m_data[2]; }
2272 QString toString(void) const override // MPEGDescriptor
2273 {
2274 return QString("Stream Identifier Descriptor (0x52): ComponentTag=0x%1")
2275 .arg(ComponentTag(),1,16);
2276 }
2277};
2278
2279// DVB Bluebook A038 (Sept 2011) p 86
2281{
2282 public:
2283 explicit StuffingDescriptor(const unsigned char *data, int len = 300) :
2284 MPEGDescriptor(data, len, DescriptorID::dvb_stuffing) { }
2285 // Name bits loc expected value
2286 // descriptor_tag 8 0.0 0x42
2287 // descriptor_length 8 1.0
2288 // stuffing_byte * 2.0
2289 QString toString(void) const override // MPEGDescriptor
2290 {
2291 return QString("Stuffing Descriptor (0x42) length(%1)")
2292 .arg(DescriptorLength());
2293 }
2294};
2295
2296// DVB Bluebook A038 (Sept 2011) p 86
2298{
2299 public:
2300 explicit SubtitlingDescriptor(const unsigned char *data, int len = 300) :
2301 MPEGDescriptor(data, len, DescriptorID::subtitling) { }
2302 // Name bits loc expected value
2303 // descriptor_tag 8 0.0 0x59
2304 // descriptor_length 8 1.0
2305
2306 uint StreamCount(void) const { return DescriptorLength() >> 3; }
2307 // for (i= 0;i<N;I++)
2308 // {
2309 // ISO_639_language_code 24 0.0+(i*8)
2310 int LanguageKey(uint i) const
2311 { return iso639_str3_to_key(&m_data[2 + (i<<3)]); }
2312 QString LanguageString(uint i) const
2313 { return iso639_key_to_str3(LanguageKey(i)); }
2318
2319 // subtitling_type 8 3.0+(i*8)
2321 { return m_data[5 + (i<<3)]; }
2322 // composition_page_id 16 4.0+(i*8)
2324 { return (m_data[6 + (i<<3)] << 8) | m_data[7 + (i<<3)]; }
2325 // ancillary_page_id 16 6.0+(i*8)
2327 { return (m_data[8 + (i<<3)] << 8) | m_data[9 + (i<<3)]; }
2328 // } 8.0
2329 QString toString(void) const override; // MPEGDescriptor
2330};
2331
2332// DVB Bluebook A038 (Sept 2011) p 87
2334{
2335 public:
2336 explicit TelephoneDescriptor(const unsigned char *data, int len = 300) :
2337 MPEGDescriptor(data, len, DescriptorID::telephone) { }
2338 // Name bits loc expected value
2339 // descriptor_tag 8 0.0 0x57
2340 // descriptor_length 8 1.0
2341
2342 // reserved_future_use 2 2.0
2343 // foreign_availability 1 2.2
2344 // connection_type 5 2.3
2345 // reserved_future_use 1 3.0
2346 // country_prefix_length 2 3.1
2347 // i18n_area_code_len 3 3.4
2348 // operator_code_length 2 3.6
2349 // reserved_future_use 1 3.7
2350 // national_area_code_len 3 4.0
2351 // core_number_length 4 4.4
2352 //
2353 // for (i=0; i<N; i++)
2354 // { country_prefix_char 8 }
2355 // for (i=0; i<N; i++)
2356 // { international_area_code_char 8 }
2357 // for (i=0; i<N; i++)
2358 // { operator_code_char 8 }
2359 // for (i=0; i<N; i++)
2360 // { national_area_code_char 8 }
2361 // for (i=0; i<N; i++)
2362 // { core_number_char 8 }
2363};
2364
2365// DVB Bluebook A038 (Sept 2011) p 88
2367{
2368 public:
2369 explicit TeletextDescriptor(const unsigned char *data, int len = 300) :
2370 MPEGDescriptor(data, len, DescriptorID::teletext) { }
2371 // Name bits loc expected value
2372 // descriptor_tag 8 0.0 0x56
2373 // descriptor_length 8 1.0
2374
2375 uint StreamCount(void) const { return DescriptorLength() / 5; }
2376
2377 // for (i=0; i<N; i++)
2378 // {
2379 // ISO_639_language_code 24 0.0
2380 int LanguageKey(uint i) const
2381 { return iso639_str3_to_key(&m_data[2 + (i*5)]); }
2382 QString LanguageString(uint i) const
2383 { return iso639_key_to_str3(LanguageKey(i)); }
2388 // teletext_type 5 3.0
2390 { return m_data[5 + (i*5)] >> 3; }
2391 // teletext_magazine_num 3 3.5
2393 { return m_data[5 + (i*5)] & 0x7; }
2394 // teletext_page_num 8 4.0
2396 { return m_data[6 + (i*5)]; }
2397 // } 5.0
2398 QString toString(void) const override; // MPEGDescriptor
2399};
2400
2401// DVB Bluebook A038 (Sept 2011) p 89
2403{
2404 public:
2405 explicit TimeShiftedEventDescriptor(const unsigned char *data, int len = 300) :
2406 MPEGDescriptor(data, len, DescriptorID::time_shifted_event) { }
2407 // Name bits loc expected value
2408 // descriptor_tag 8 0.0 0x4f
2409 // descriptor_length 8 1.0
2410
2411 // reference_service_id 16 2.0
2412 // reference_event_id 16 4.0
2413};
2414
2415// DVB Bluebook A038 (Sept 2011) p 90
2417{
2418 public:
2419 explicit TimeShiftedServiceDescriptor(const unsigned char *data, int len = 300) :
2420 MPEGDescriptor(data, len, DescriptorID::dvb_time_shifted_service) { }
2421 // Name bits loc expected value
2422 // descriptor_tag 8 0.0 0x4c
2423 // descriptor_length 8 1.0
2424
2425 // reference_service_id 16 2.0
2426};
2427
2428// DVB Bluebook A038 (Sept 2011) p 90
2430{
2431 public:
2432 explicit TransportStreamDescriptor(const unsigned char *data, int len = 300) :
2433 MPEGDescriptor(data, len, DescriptorID::transport_stream) { }
2434 // Name bits loc expected value
2435 // descriptor_tag 8 0.0 0x67
2436 // descriptor_length 8 1.0
2437
2438 // for (i=0; i<N; i++) { byte 8 }
2439 QString Data(void) const
2440 { return dvb_decode_text(&m_data[2], DescriptorLength()); }
2441 QString toString(void) const override // MPEGDescriptor
2442 { return QString("TransportStreamDescriptor data(%1)").arg(Data()); }
2443};
2444
2445// DVB Bluebook A038 (Sept 2011) p 91
2447{
2448 public:
2449 explicit VBIDataDescriptor(const unsigned char *data, int len = 300) :
2450 MPEGDescriptor(data, len, DescriptorID::vbi_data) { }
2451 // Name bits loc expected value
2452 // descriptor_tag 8 0.0 0x45
2453 // descriptor_length 8 1.0
2454
2455 // for (i=0; i<N; i++)
2456 // {
2457 // data_service_id 8 0.0+p
2458 // data_service_length 8 1.0+p
2459 // if ((data_service_id&0x7) && data_service_id!=0x3))
2460 // {
2461 // for (i=0; i<N; i++)
2462 // {
2463 // reserved 2 2.0+p2
2464 // field_parity 1 2.2+p2
2465 // line_offset 5 2.3+p2
2466 // }
2467 // }
2468 // else
2469 // {
2470 // for (i=0; i<N; i++) { reserved 8 }
2471 // }
2472 // }
2473};
2474
2475// DVB Bluebook A038 (Sept 2011) p 92
2477{
2478 public:
2479 explicit VBITeletextDescriptor(const unsigned char *data, int len = 300) :
2480 MPEGDescriptor(data, len, DescriptorID::vbi_teletext) { }
2481 // Name bits loc expected value
2482 // descriptor_tag 8 0.0 0x46
2483 // descriptor_length 8 1.0
2484
2485 // for (i=0;i<N;i++)
2486 // {
2487 // ISO_639_language_code 24 0.0+p
2488 // teletext_type 5 3.0+p
2489 // teletext_magazine_num 3 3.5+p
2490 // teletext_page_num 8 4.0+p
2491 // } 5.0
2492};
2493
2494// DVB Bluebook A038 (Feb 2019) p 125
2496{
2497 public:
2498 explicit PartialTransportStreamDescriptor(const unsigned char *data, int len = 300) :
2499 MPEGDescriptor(data, len, DescriptorID::partial_transport_stream) { }
2500 // Name bits loc expected value
2501 // descriptor_tag 8 0.0 0x63
2502 // descriptor_length 8 1.0
2503
2504 // DVB_reserved_future_use 2 2.0
2505 // peak_rate 22 2.2
2506 uint PeakRate(void) const
2507 { return (m_data[2] & 0x3f) << 16 | m_data[3] << 8 | m_data[4]; }
2508 // DVB_reserved_future_use 2 5.0
2509 // minimum_overall_smoothing_rate 22 5.2
2510 uint SmoothRate(void) const
2511 { return (m_data[5] & 0x3f) << 16 | m_data[6] << 8 | m_data[7]; }
2512 // DVB_reserved_future_use 2 8.0
2513 // maximum_overall_smoothing_buffer 14 8.2
2514 uint SmoothBuf(void) const { return ((m_data[8] & 0x3f) << 8) | m_data[9]; }
2515 QString toString(void) const override; // MPEGDescriptor
2516};
2517
2518
2519// a_52a.pdf p125 Table A7 (for DVB)
2520// DVB Bluebook A038 (Feb 2019) p 145
2522{
2523 public:
2524 explicit AC3Descriptor(const unsigned char *data, int len = 300) :
2525 MPEGDescriptor(data, len, DescriptorID::ac3) { }
2526 // Name bits loc expected value
2527 // descriptor_tag 8 0.0 0x6A
2528 // descriptor_length 8 1.0
2529
2530 // component_type_flag 1 2.0
2531 bool HasComponentType(void) const { return ( m_data[2] & 0x80 ) != 0; }
2532 // bsid_flag 1 2.1
2533 bool HasBSID(void) const { return ( m_data[2] & 0x40 ) != 0; }
2534 // mainid_flag 1 2.2
2535 bool HasMainID(void) const { return ( m_data[2] & 0x20 ) != 0; }
2536 // asvc_flag 1 2.3
2537 bool HasASVC(void) const { return ( m_data[2] & 0x10 ) != 0; }
2538 // reserved_flags 4 2.4
2539 // if (component_type_flag == 1)
2540 // { component_type 8 uimsbf }
2541 uint ComponentType(void) const { return m_data[3]; }
2542 // if (bsid_flag == 1)
2543 // { bsid 8 uimsbf }
2544 uint BSID(void) const
2545 { return (HasComponentType()) ? m_data[4] : m_data[3]; }
2546 // if (mainid_flag == 1)
2547 // { mainid 8 uimsbf }
2548 uint MainID(void) const
2549 {
2550 int offset = 3;
2551 offset += (HasComponentType()) ? 1 : 0;
2552 offset += (HasBSID()) ? 1 : 0;
2553 return m_data[offset];
2554 }
2555 // if (asvc_flag==1)
2556 // { asvc 8 uimsbf }
2557 uint ASVC(void) const
2558 {
2559 int offset = 3;
2560 offset += (HasComponentType()) ? 1 : 0;
2561 offset += (HasBSID()) ? 1 : 0;
2562 offset += (HasMainID()) ? 1 : 0;
2563 return m_data[offset];
2564 }
2565 // for (I=0;I<N;I++)
2566 // { additional_info[i] N*8 uimsbf }
2567 //};
2568 QString toString(void) const override; // MPEGDescriptor
2569};
2570
2571static QString coderate_inner(uint coderate)
2572{
2573 switch (coderate)
2574 {
2575 case 0x0: return "auto"; // not actually defined in spec
2576 case 0x1: return "1/2";
2577 case 0x2: return "2/3";
2578 case 0x3: return "3/4";
2579 case 0x4: return "5/6";
2580 case 0x5: return "7/8";
2581 case 0x8: return "8/9";
2582 case 0xf: return "none";
2583 default: return "auto"; // not actually defined in spec
2584 }
2585}
2586
2596{
2597 public:
2598 explicit DVBLogicalChannelDescriptor(const unsigned char *data, int len = 300) :
2599 MPEGDescriptor(data, len, PrivateDescriptorID::dvb_logical_channel_descriptor) { }
2600 // Name bits loc expected value
2601 // descriptor_tag 8 0.0 0x83
2602 // descriptor_length 8 1.0
2603
2604 uint ChannelCount(void) const { return DescriptorLength() >> 2; }
2605
2607 { return (m_data[2 + (i<<2)] << 8) | m_data[3 + (i<<2)]; }
2608
2610 { return ((m_data[4 + (i<<2)] << 8) | m_data[5 + (i<<2)]) & 0x3ff; }
2611
2612 QString toString(void) const override; // MPEGDescriptor
2613};
2614
2624{
2625 public:
2626 explicit DVBSimulcastChannelDescriptor(const unsigned char *data, int len = 300) :
2627 MPEGDescriptor(data, len, PrivateDescriptorID::dvb_simulcast_channel_descriptor) { }
2628 // Name bits loc expected value
2629 // descriptor_tag 8 0.0 0x88
2630 // descriptor_length 8 1.0
2631
2632 uint ChannelCount(void) const { return DescriptorLength() >> 2; }
2633
2635 { return (m_data[2 + (i<<2)] << 8) | m_data[3 + (i<<2)]; }
2636
2638 { return ((m_data[4 + (i<<2)] << 8) | m_data[5 + (i<<2)]) & 0x3ff; }
2639
2640 QString toString(void) const override; // MPEGDescriptor
2641};
2642
2654{
2655 public:
2656 explicit FreesatLCNDescriptor(const unsigned char *data, int len = 300) :
2657 MPEGDescriptor(data, len, PrivateDescriptorID::freesat_lcn_table)
2658 {
2660 if (nullptr == m_data) // assert is disabled when NDEBUG is defined
2661 return;
2662
2663 const unsigned char *payload = &data[2];
2664
2665 size_t offset = 0;
2666 while ((offset + 5 < DescriptorLength()) &&
2667 (offset + 5 + payload[offset+4] <= DescriptorLength()))
2668 {
2669 m_entries.push_back(&payload[offset]);
2670 offset += 5 + payload[offset+4];
2671 }
2672 }
2673 // Name bits loc expected value
2674 // descriptor_tag 8 0.0 0xd3
2675 // descriptor_length 8 1.0
2676 // for (i=0;i<N;i++) {
2677 // service_id 16 0.0+p
2678 // chan_id 15 2.1+p
2679 // length 8 4.0+p
2680 // for (j=0;j<N;j++) {
2681 // unknown 4 0.0+p2
2682 // logical_channel_number 12 0.4+p2
2683 // region_id 16 2.0+p2
2684 // }
2685 // }
2686
2687 uint ServiceCount(void) const
2688 { return m_entries.size(); }
2689
2690 uint ServiceID(size_t i) const
2691 { return *m_entries[i] << 8 | *(m_entries[i]+1); }
2692
2693 uint ChanID(size_t i) const
2694 { return (*(m_entries[i] + 2) << 8 | *(m_entries[i] + 3)) & 0x7FFF; }
2695
2696 uint LCNCount(size_t i) const
2697 { return *(m_entries[i] + 4) / 4; }
2698
2699 uint LogicalChannelNumber(size_t i, size_t j) const
2700 { return (*(m_entries[i] + 5 + (j*4)) << 8 | *(m_entries[i] + 5 + (j*4) + 1)) & 0xFFF; }
2701
2702 uint RegionID(size_t i, size_t j) const
2703 { return *(m_entries[i] + 5 + (j*4) + 2) << 8 | *(m_entries[i] + 5 + (j*4) + 3); }
2704
2705 QString toString(void) const override; // MPEGDescriptor
2706
2707 private:
2709};
2710
2721{
2722 public:
2723 explicit FreesatRegionDescriptor(const unsigned char *data, int len = 300) :
2724 MPEGDescriptor(data, len, PrivateDescriptorID::freesat_region_table)
2725 {
2727 if (nullptr == m_data) // assert is disabled when NDEBUG is defined
2728 return;
2729
2730 const unsigned char *payload = &data[2];
2731
2732 uint offset = 0;
2733 while ((offset + 6 < DescriptorLength()) &&
2734 (offset + 6 + payload[offset+5] <= DescriptorLength()))
2735 {
2736 m_entries.push_back(&payload[offset]);
2737 offset += 6 + payload[offset+5];
2738 }
2739 }
2740 // Name bits loc expected value
2741 // descriptor_tag 8 0.0 0xd4
2742 // descriptor_length 8 1.0
2743 // for (i=0;i<N;i++) {
2744 // region_id 16 0.0+p
2745 // language_code 24 2.0+p eng
2746 // text_length 8 5.0+p
2747 // for (j=0;j<N;j++) {
2748 // text_char 8
2749 // }
2750 // }
2751
2752 uint RegionCount(void) const
2753 { return m_entries.size(); }
2754
2755 int RegionID(uint i) const
2756 { return *m_entries[i] << 8 | *(m_entries[i]+1); }
2757
2758 QString Language(uint i) const
2759 { return QString::fromLatin1((char *) m_entries[i] + 2, 3); }
2760
2761 QString RegionName(uint i) const
2762 { return QString::fromLatin1((char *) m_entries[i] + 6, *(m_entries[i] + 5)); }
2763
2764 QString toString(void) const override; // MPEGDescriptor
2765
2766 private:
2768};
2769
2778{
2779 public:
2780 explicit FreesatCallsignDescriptor(const unsigned char *data, int len = 300) :
2781 MPEGDescriptor(data, len, PrivateDescriptorID::freesat_callsign)
2782 {
2784 }
2785
2786 // Name bits loc expected value
2787 // descriptor_tag 8 0.0 0xd8
2788 // descriptor_length 8 1.0
2789
2790 // ISO_639_language_code 24 2.0
2791 // callsign_length 8 5.0
2792 // for (j=0;j<N;j++) {
2793 // callsign_char 8
2794
2795 QString Language(void) const
2796 { return QString::fromLatin1((char *) m_data +2, 3); }
2797
2798 QString Callsign(void) const
2799 { return dvb_decode_short_name(&m_data[6], m_data[5]); }
2800
2801 QString toString(void) const override; // MPEGDescriptor
2802};
2803
2816{
2817 public:
2818 explicit SkyLCNDescriptor(const unsigned char *data, int len = 300) :
2819 MPEGDescriptor(data, len, PrivateDescriptorID::sky_lcn_table)
2820 {
2822 }
2823 // Name bits loc expected value
2824 // descriptor_tag 8 0.0 0xd3
2825 // descriptor_length 8 1.0
2826 // region_id 16 2.0
2827 // for (i=0;i<N;i++) {
2828 // service_id 16 0.0+p
2829 // service_type 8 2.0+p
2830 // unknown 16 3.0+p
2831 // logical_channel_number 16 5.0+p2
2832 // unknown 16 7.0+p2
2833 // }
2834
2835 uint RegionID(void) const
2836 { return (*(m_data + 3) != 0xFF) ? *(m_data + 3) : 0xFFFF;}
2837
2838 uint RegionRaw(void) const
2839 { return *(m_data + 2) << 8 | *(m_data + 3);}
2840
2841 uint ServiceCount(void) const
2842 { return (DescriptorLength() - 2) / 9; }
2843
2844 uint ServiceID(size_t i) const
2845 { return *(m_data + 4 + (i*9)) << 8 | *(m_data + 5 + (i*9)); }
2846
2847 uint ServiceType(size_t i) const
2848 { return *(m_data + 6 + (i*9)); }
2849
2850 uint ChannelID(size_t i) const
2851 { return *(m_data + 7 + (i*9)) << 8 | *(m_data + 8 + (i*9)); }
2852
2854 { return *(m_data + 9 + (i*9)) << 8 | *(m_data + 10 + (i*9)); }
2855
2856 uint Flags(size_t i) const
2857 { return *(m_data + 11 + (i*9)) << 8 | *(m_data + 12 + (i*9)); }
2858
2859 QString toString(void) const override; // MPEGDescriptor
2860};
2861
2862// Descriptor layout similar to SkyLCNDescriptor
2864{
2865 public:
2866 explicit OpenTVChannelListDescriptor(const unsigned char *data, int len = 300) :
2867 MPEGDescriptor(data, len, PrivateDescriptorID::opentv_channel_list) { }
2868 // Name bits loc expected value
2869 // descriptor_tag 8 0.0 0xB1
2870 // descriptor_length 8 1.0
2871
2872 uint ChannelCount(void) const { return (DescriptorLength() - 2)/9; }
2873
2875 { return (m_data[2] << 8) | m_data[3]; }
2876
2878 { return (m_data[4 + 0 + (i*9)] << 8) | m_data[4 + 1 + (i*9)]; }
2879
2881 { return m_data[4 + 2 + (i*9)]; }
2882
2884 { return ((m_data[4 + 3 + (i*9)] << 8) | m_data[4 + 4 + (i*9)]); }
2885
2887 { return ((m_data[4 + 5 + (i*9)] << 8) | m_data[4 + 6 + (i*9)]); }
2888
2889 uint Flags(uint i) const
2890 { return ((m_data[4 + 7 + (i*9)] << 8) | m_data[4 + 8 + (i*9)]) & 0xf; }
2891
2892 QString toString(void) const override; // MPEGDescriptor
2893};
2894
2895// ETSI TS 102 323 (TV Anytime)
2897{
2898 public:
2899 explicit DVBContentIdentifierDescriptor(const unsigned char *data, int len = 300) :
2900 MPEGDescriptor(data, len, DescriptorID::dvb_content_identifier)
2901 {
2902 size_t count = 0;
2903
2904 m_crid.fill(nullptr);
2905
2906 if (IsValid())
2907 {
2908 uint8_t position = 2;
2909 while (m_data[1] >= position)
2910 {
2911 size_t length = m_data[position+1];
2912 m_crid[count] = &m_data[position];
2913 count++;
2914 position+=length+2;
2915 }
2916 }
2917 m_cridCount = count;
2918 }
2919 // Name bits loc expected value
2920 // descriptor_tag 8 0.0 0x76
2921 // descriptor_length 8 1.0
2922
2923 uint ContentType(size_t n=0) const { return m_crid[n][0] >> 2; }
2924
2925 uint ContentEncoding(size_t n=0) const { return m_crid[n][0] & 0x03; }
2926
2927 // A content identifier is a URI. It may contain UTF-8 encoded using %XX.
2928 QString ContentId(size_t n=0) const
2929 {
2930 // Access the array in two steps so cppcheck doesn't get confused.
2931 const uint8_t* cridN = m_crid[n];
2932 int length = cridN[1];
2933 int positionOfHash = length-1;
2934 while (positionOfHash >= 0) {
2935 if (cridN[2 + positionOfHash] == '#') {
2936 length = positionOfHash; /* remove the hash and the following IMI */
2937 break;
2938 }
2939 positionOfHash--;
2940 }
2941 return QString::fromLatin1((const char *)&m_crid[n][2], length);
2942 }
2943
2944 size_t CRIDCount() const
2945 {
2946 return m_cridCount;
2947 }
2948
2949 private:
2951 std::array<const uint8_t*,8> m_crid {};
2952};
2953
2954// ETSI TS 102 323 (TV Anytime)
2956{
2957 public:
2958 explicit DefaultAuthorityDescriptor(const unsigned char *data, int len = 300) :
2959 MPEGDescriptor(data, len, DescriptorID::default_authority) { }
2960 // Name bits loc expected value
2961 // descriptor_tag 8 0.0 0x73
2962 // descriptor_length 8 1.0
2963
2964 QString DefaultAuthority(void) const
2965 {
2966 return QString::fromLatin1((const char *)m_data+2, m_data[1]);
2967 }
2968
2969 QString toString(void) const override // MPEGDescriptor
2970 {
2971 return QString("DefaultAuthorityDescriptor: Authority(%1)")
2972 .arg(DefaultAuthority());
2973 }
2974};
2975
2976// Draft ETSI EN 300 468 V1.16.1 (2019-05)
2977// DVB Bluebook A038 (Feb 2019) p 59
2978// Table 42: S2 satellite delivery system descriptor
2979// 0x79
2981{
2982 public:
2984 const unsigned char *data, int len = 300) :
2985 MPEGDescriptor(data, len, DescriptorID::s2_satellite_delivery_system) { }
2986 // Name bits loc expected value
2987 // descriptor_tag 8 0.0 0x79
2988 // descriptor_length 8 1.0
2989 // scrambling_sequence_selector 1 2.0
2991 { return (m_data[2] >> 7) & 0x01; }
2992
2993 // multiple_input_stream_flag 1 2.1
2995 { return (m_data[2] >> 6) & 0x01; }
2996
2997 // reserved_zero_future_use 1 2.2
2998 // not_timeslice_flag 1 2.3
3000 { return (m_data[2] >> 4) & 0x01; }
3001
3002 // reserved_future_use 2 2.4
3003 // TS_GS_mode 2 2.6
3005 { return m_data[2] & 0x03; }
3006
3007 // if (scrambling_sequence_selector == 1){
3008 // reserved_future_use 6 3.0
3009 // scrambling_sequence_index 18 3.6
3010 // }
3011 // if (multiple_input_stream_flag == 1){
3012 // input_stream_identifier 8 6.0
3013 // }
3014 // if (not_timeslice_flag == 0){
3015 // timeslice_number 8 7.0
3016 // }
3017
3018 QString toString(void) const override; // MPEGDescriptor
3019};
3020
3021/*
3022 * private UPC Cablecom (Austria) episode descriptor for Horizon middleware
3023 */
3025{
3026 public:
3027 explicit PrivateUPCCablecomEpisodeTitleDescriptor(const unsigned char *data, int len = 300) :
3028 MPEGDescriptor(data, len, PrivateDescriptorID::upc_event_episode_title) { }
3029 explicit PrivateUPCCablecomEpisodeTitleDescriptor(const std::vector<uint8_t> &data) :
3030 MPEGDescriptor(data, PrivateDescriptorID::upc_event_episode_title) { }
3031 // Name bits loc expected value
3032 // descriptor_tag 8 0.0 0xa7
3033 // descriptor_length 8 1.0
3034
3035 // ISO_639_language_code 24 2.0
3036 int LanguageKey(void) const
3037 {
3038 return iso639_str3_to_key(&m_data[2]);
3039 }
3040 QString LanguageString(void) const
3041 {
3043 }
3044 int CanonicalLanguageKey(void) const
3045 {
3047 }
3048 QString CanonicalLanguageString(void) const
3049 {
3051 }
3052
3053 uint TextLength(void) const
3054 {
3055 return m_data[1] - 3;
3056 }
3057
3058 QString Text(void) const
3059 {
3060 return dvb_decode_text(&m_data[5], TextLength());
3061 }
3062};
3063
3064#endif // DVB_DESCRIPTORS_H
#define assert(x)
QString toString(void) const override
bool HasComponentType(void) const
bool HasBSID(void) const
bool HasMainID(void) const
uint BSID(void) const
uint ComponentType(void) const
uint MainID(void) const
uint ASVC(void) const
bool HasASVC(void) const
AC3Descriptor(const unsigned char *data, int len=300)
AdaptationFieldDataDescriptor(const unsigned char *data, int len=300)
uint AdaptationFieldDataID(void) const
QString toString(void) const override
uint AncillaryDataID(void) const
QString toString(void) const override
AncillaryDataDescriptor(const unsigned char *data, int len=300)
AnnouncementSupportDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
uint AITVersionNumber(uint i) const
ApplicationSignallingDescriptor(const unsigned char *data, int len=300)
uint ApplicationType(uint i) const
QString BouquetShortName(void) const
QString BouquetName(void) const
QString toString(void) const override
BouquetNameDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
uint DataSliceID(void) const
C2DeliverySystemDescriptor(const unsigned char *data, int len=300)
uint CASystemCount(void) const
QString toString(void) const override
int CASystemId(uint i) const
CAIdentifierDescriptor(const unsigned char *data, int len=300)
CableDeliverySystemDescriptor(const unsigned char *data, int len=300)
unsigned long long FrequencyHz(void) const
QString toString(void) const override
QString FECOuterString(void) const
QString ModulationString(void) const
QString FECInnerString(void) const
CellFrequencyLinkDescriptor(const unsigned char *data, int len=300)
CellListDescriptor(const unsigned char *data, int len=300)
uint StreamContent(void) const
QString CanonicalLanguageString(void) const
uint HEVCProperties(void) const
uint VideoProperties(void) const
uint MPEG2Properties(void) const
int CanonicalLanguageKey(void) const
ComponentDescriptor(const unsigned char *data, int len=300)
uint SubtitleType(void) const
QString LanguageString(void) const
bool IsVideo(void) const
uint ComponentType(void) const
QString toString(void) const override
uint AVCProperties(void) const
uint HEAACProperties(void) const
int LanguageKey(void) const
uint ComponentTag(void) const
uint AC3Properties(void) const
bool IsAudio(void) const
uint MP2Properties(void) const
uint AudioProperties(void) const
bool IsSubtitle(void) const
uint Count(void) const
static volatile bool s_categoryDescExists
ContentDescriptor(const unsigned char *data, int len=300)
uint Nibble(uint i) const
ProgramInfo::CategoryType GetMythCategory(uint i) const
uint UserNibble2(uint i) const
uint UserNibble1(uint i) const
uint Nibble2(uint i) const
static QMap< uint, QString > s_categoryDesc
static QMutex s_categoryLock
QString GetDescription(uint i) const
QString toString(void) const override
static void Init(void)
uint Nibble1(uint i) const
uint UserNibble(uint i) const
QString toString(void) const override
CountryAvailabilityDescriptor(const unsigned char *data, int len=300)
QString CountryNames(void) const
DSNGDescriptor(const unsigned char *data, int len=300)
uint ContentType(size_t n=0) const
DVBContentIdentifierDescriptor(const unsigned char *data, int len=300)
std::array< const uint8_t *, 8 > m_crid
QString ContentId(size_t n=0) const
uint ContentEncoding(size_t n=0) const
DVB Logical Channel Descriptor.
QString toString(void) const override
DVBLogicalChannelDescriptor(const unsigned char *data, int len=300)
uint ChannelNumber(uint i) const
uint ServiceID(uint i) const
DVB HD Simulcast Logical Channel Descriptor.
QString toString(void) const override
uint ChannelNumber(uint i) const
DVBSimulcastChannelDescriptor(const unsigned char *data, int len=300)
int CanonicalLanguageKey(void) const
uint TextLength(void) const
QString toString(void) const override
uint DataBroadcastId(void) const
int LanguageKey(void) const
QString LanguageString(void) const
const unsigned char * Selector(void) const
uint DataComponentTag(void) const
DataBroadcastDescriptor(const unsigned char *data, int len=300)
QString Text(void) const
QString CanonicalLanguageString(void) const
uint SelectorLength(void) const
uint DataBroadCastId(void) const
DataBroadcastIdDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
QString DefaultAuthority(void) const
DefaultAuthorityDescriptor(const unsigned char *data, int len=300)
@ s2x_satellite_delivery_system
QString Text(const enc_override &encoding_override) const
int LanguageKey(void) const
QString Text(void) const
ExtendedEventDescriptor(const unsigned char *data, int len=300)
uint LengthOfItems(void) const
int CanonicalLanguageKey(void) const
QString LanguageString(void) const
uint LastNumber(void) const
uint DescriptorNumber(void) const
QString CanonicalLanguageString(void) const
uint TextLength(void) const
Freesat Channel Callsign descriptor.
QString Callsign(void) const
FreesatCallsignDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
QString Language(void) const
Freesat Logical Channel Number descriptor.
uint ChanID(size_t i) const
uint LCNCount(size_t i) const
uint ServiceCount(void) const
QString toString(void) const override
uint ServiceID(size_t i) const
uint LogicalChannelNumber(size_t i, size_t j) const
uint RegionID(size_t i, size_t j) const
FreesatLCNDescriptor(const unsigned char *data, int len=300)
Freesat Region descriptor.
QString Language(uint i) const
QString RegionName(uint i) const
FreesatRegionDescriptor(const unsigned char *data, int len=300)
int RegionID(uint i) const
QString toString(void) const override
uint RegionCount(void) const
QString toString(void) const override
unsigned long long Frequency(uint i) const
FrequencyListDescriptor(const unsigned char *data, int len=300)
unsigned long long FrequencyHz(uint i) const
uint CodingType(void) const
uint IconID(void) const
QString toString(void) const override
uint LastDescriptorNumber(void) const
uint DescriptorNumber(void) const
ImageIconDescriptor(const unsigned char *data, int len=300)
uint ServiceID(void) const
uint MobileOriginType(void) const
uint TargetEventID(void) const
uint MobileInitialServiceID(void) const
uint LinkageType(void) const
QString LinkageTypeString(void) const
uint MobileNetworkID(void) const
QString MobileHandOverTypeString(void) const
bool HasMobileNetworkID(void) const
uint OriginalNetworkID() const
@ kTSContainingCompleteNetworkBouquetSI
bool IsEventSimulcast(void) const
bool IsTargetListed(void) const
LinkageDescriptor(const unsigned char *data, int len=300)
QString MobileOriginTypeString(void) const
uint PrivateDataLength(void) const
const unsigned char * PrivateData(void) const
uint TSID(void) const
uint MobileHandOverType(void) const
bool HasMobileInitialServiceID(void) const
int LocalTimeOffsetWithPolarity(uint i) const
time_t TimeOfChangeUnix(uint i) const
QString CountryCodeString(uint i) const
uint CountryRegionId(uint i) const
uint CountryCode(uint i) const
LocalTimeOffsetDescriptor(const unsigned char *data, int len=300)
uint NextTimeOffset(uint i) const
bool LocalTimeOffsetPolarity(uint i) const
-1 if true, +1 if false (behind utc, ahead of utc, resp).
uint LocalTimeOffset(uint i) const
const unsigned char * TimeOfChangeData(uint i) const
QDateTime TimeOfChange(uint i) const
uint DescriptorLength(void) const
uint DescriptorTag(void) const
bool IsValid(void) const
uint DescriptorTagExtension(void) const
virtual QString toString(void) const
const unsigned char * m_data
QString LanguageString(void) const
QString toString(void) const override
MessageDescriptor(const unsigned char *data, int len=300)
QString Message(void) const
int LanguageKey(void) const
uint MessageID(void) const
MosaicDescriptor(const unsigned char *data, int len=300)
MultilingualBouquetNameDescriptor(const unsigned char *data, int len=300)
MultilingualNetworkNameDescriptor(const unsigned char *data, int len=300)
MultilingualServiceNameDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
uint TransportStreamId(uint i) const
uint ServiceId(uint i) const
uint OriginalNetworkId(uint i) const
uint Count(void) const
NVODReferenceDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
NetworkChangeNotifyDescriptor(const unsigned char *data, int len=300)
QString Name(void) const
NetworkNameDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
QString ShortName(void) const
QString toString(void) const override
uint ChannelID(uint i) const
uint ServiceID(uint i) const
uint ChannelType(uint i) const
OpenTVChannelListDescriptor(const unsigned char *data, int len=300)
uint ChannelNumber(uint i) const
uint ProgramIdLabel(void) const
QString toString(void) const override
PDCDescriptor(const unsigned char *data, int len=300)
ParentalRatingDescriptor(const unsigned char *data, int len=300)
ParentalRatingDescriptor(const std::vector< uint8_t > &data)
int Rating(uint i) const
QString CountryCodeString(uint i) const
PartialTransportStreamDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
PrivateDataSpecifierDescriptor(const unsigned char *data, int len=300)
PrivateDataSpecifierDescriptor(const std::vector< uint8_t > &data)
uint32_t PrivateDataSpecifier(void) const
PrivateUPCCablecomEpisodeTitleDescriptor(const unsigned char *data, int len=300)
PrivateUPCCablecomEpisodeTitleDescriptor(const std::vector< uint8_t > &data)
S2SatelliteDeliverySystemDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
S2XSatelliteDeliverySystemDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
QString toString(void) const override
SHDeliverySystemDescriptor(const unsigned char *data, int len=300)
bool IsVerticalRightPolarization(void) const
uint64_t FrequencykHz(void) const
uint FrequencyRaw(void) const
frequency 32 2.0
QString toString(void) const override
bool IsHorizontalLeftPolarization(void) const
uint OrbitalPosition(void) const
orbital_position 16 6.0
SatelliteDeliverySystemDescriptor(const unsigned char *data, int len=300)
bool IsEast(void) const
west_east_flag 1 8.0
QString OrbitalPositionString(void) const
QString FECInnerString(void) const
QString ModulationString(void) const
QString ModulationSystemString(void) const
ScramblingDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
uint ScramblingMode(void) const
ServiceAvailabilityDescriptor(const unsigned char *data, int len=300)
uint ServiceType(void) const
bool IsDigitalAudio(void) const
@ kServiceTypeH264AVCFrameCompatiblePlanoStereoscopicHDNVODTimeShifted
@ kServiceTypeH264AVCFrameCompatiblePlanoStereoscopicHDNVODReference
@ kServiceTypeH264AVCFrameCompatiblePlanoStereoscopicHDDigitalTelevision
ServiceDescriptorMapping(const uint service_type)
bool IsTeletext(void) const
QString toString(void) const
bool IsUHDTV(void) const
QString ServiceShortName(void) const
QString toString(void) const override
uint ServiceProviderNameLength(void) const
QString ServiceProviderShortName(void) const
uint ServiceNameLength(void) const
ServiceDescriptor(const unsigned char *data, int len=300)
bool IsHDTV(void) const
uint ServiceType(void) const
bool IsTeletext(void) const
bool IsDTV(void) const
QString ServiceName(void) const
bool IsDigitalAudio(void) const
QString ServiceProviderName(void) const
QString toString(void) const override
uint ServiceID(uint i) const
uint ServiceType(uint i) const
ServiceListDescriptor(const unsigned char *data, int len=300)
uint ServiceCount(void) const
ServiceMoveDescriptor(const unsigned char *data, int len=300)
uint OldOriginalNetworkID(void) const
uint OldTransportID(void) const
uint OldServiceID(void) const
QString toString(void) const override
ServiceRelocatedDescriptor(const unsigned char *data, int len=300)
QString EventShortName(void) const
QString LanguageString(void) const
QString CanonicalLanguageString(void) const
QString toString(void) const override
ShortEventDescriptor(const unsigned char *data, int len=300)
int LanguageKey(void) const
uint TextLength(void) const
QString Text(void) const
int CanonicalLanguageKey(void) const
QString EventName(void) const
QString Text(const enc_override &encoding_override) const
uint EventNameLength(void) const
QString EventName(const enc_override &encoding_override) const
ShortSmoothingBufferDescriptor(const unsigned char *data, int len=300)
Sky Logical Channel Number descriptor.
uint ServiceType(size_t i) const
uint RegionRaw(void) const
uint Flags(size_t i) const
uint ChannelID(size_t i) const
QString toString(void) const override
uint RegionID(void) const
uint ServiceCount(void) const
uint LogicalChannelNumber(size_t i) const
uint ServiceID(size_t i) const
SkyLCNDescriptor(const unsigned char *data, int len=300)
This is used to label streams so the can be treated differently, for instance each stream may get it'...
uint ComponentTag(void) const
StreamIdentifierDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
QString toString(void) const override
StuffingDescriptor(const unsigned char *data, int len=300)
QString LanguageString(uint i) const
uint AncillaryPageID(uint i) const
uint SubtitleType(uint i) const
int LanguageKey(uint i) const
int CanonicalLanguageKey(uint i) const
SubtitlingDescriptor(const unsigned char *data, int len=300)
uint CompositionPageID(uint i) const
QString CanonicalLanguageString(uint i) const
QString toString(void) const override
uint StreamCount(void) const
SupplementaryAudioDescriptor(const unsigned char *data, int len=300)
QString LanguageString(void) const
uint ReservedFutureUse(void) const
uint EditorialClassification(void) const
QString toString(void) const override
uint LanguageCodePresent(void) const
QString toString(void) const override
uint TransposerFrequency(uint i, uint j) const
QString TransmissionModeString(void) const
uint CentreFrequency(int i, int j) const
uint TransmissionMode(void) const
std::vector< const unsigned char * > m_subCellPtrs
T2DeliverySystemDescriptor(const unsigned char *data, int len=300)
uint SubcellInfoLoopLength(uint i) const
uint BandwidthHz(void) const
QString GuardIntervalString(void) const
uint CellIDExtension(uint i, uint j) const
uint GuardInterval(void) const
QString SisoMisoString(void) const
std::vector< const unsigned char * > m_cellPtrs
uint OtherFrequencyFlag(void) const
QString BandwidthString(void) const
uint FrequencyLoopLength(uint i) const
uint CentreFrequency(uint i) const
uint CellID(uint i) const
TargetRegionDescriptor(const unsigned char *data, int len=300)
QString CountryCodeString(void) const
QString toString(void) const override
uint CountryCode(void) const
TargetRegionNameDescriptor(const unsigned char *data, int len=300)
uint CountryCode(void) const
QString toString(void) const override
QString LanguageString(void) const
QString CountryCodeString(void) const
TelephoneDescriptor(const unsigned char *data, int len=300)
uint TeletextPageNum(uint i) const
int LanguageKey(uint i) const
TeletextDescriptor(const unsigned char *data, int len=300)
uint StreamCount(void) const
uint TeletextMagazineNum(uint i) const
int CanonicalLanguageKey(uint i) const
QString toString(void) const override
QString LanguageString(uint i) const
uint TeletextType(uint i) const
QString CanonicalLanguageString(uint i) const
QString toString(void) const override
QString ConstellationString(void) const
TerrestrialDeliverySystemDescriptor(const unsigned char *data, int len=300)
QString TransmissionModeString(void) const
TimeShiftedEventDescriptor(const unsigned char *data, int len=300)
TimeShiftedServiceDescriptor(const unsigned char *data, int len=300)
TransportStreamDescriptor(const unsigned char *data, int len=300)
QString toString(void) const override
QString Data(void) const
VBIDataDescriptor(const unsigned char *data, int len=300)
VBITeletextDescriptor(const unsigned char *data, int len=300)
MTV_PUBLIC time_t dvbdate2unix(const unsigned char *buf)
Definition: dvbtables.cpp:351
MTV_PUBLIC QDateTime dvbdate2qt(const unsigned char *buf)
Definition: dvbtables.cpp:306
MTV_PUBLIC QString dvb_decode_text(const unsigned char *src, uint length, const enc_override &encoding_override)
static QString coderate_inner(uint coderate)
std::vector< uint8_t > enc_override
static constexpr uint8_t byteBCD2int(uint8_t i)
static constexpr uint64_t byte4BCD2int64(uint8_t i, uint8_t j, uint8_t k, uint8_t l)
static constexpr uint8_t byteBCDH2int(uint8_t i)
static constexpr uint32_t byte3BCD2int(uint8_t i, uint8_t j, uint8_t k)
static constexpr uint8_t byteBCDL2int(uint8_t i)
static constexpr uint32_t byte4BCD2int(uint8_t i, uint8_t j, uint8_t k, uint8_t l)
MTV_PUBLIC QString dvb_decode_short_name(const unsigned char *src, uint raw_length)
static constexpr uint16_t byte2BCD2int(uint8_t i, uint8_t j)
unsigned int uint
Definition: freesurround.h:24
int iso639_key_to_canonical_key(int iso639_2)
Definition: iso639.cpp:118
static QString iso639_key_to_str3(int code)
Definition: iso639.h:45
static int iso639_str3_to_key(const unsigned char *iso639_2)
Definition: iso639.h:60
unsigned short uint16_t
Definition: iso6937tables.h:3
std::vector< const unsigned char * > desc_list_t
#define MTV_PUBLIC
Definition: mythtvexp.h:15
bool
Definition: pxsup2dast.c:31