MythTV  master
mpegdescriptors.h
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
2 // Copyright (c) 2003-2004, Daniel Thor Kristjansson
3 #ifndef MPEG_DESCRIPTORS_H
4 #define MPEG_DESCRIPTORS_H
5 
6 // C++ headers
7 #include <vector>
8 using namespace std;
9 
10 // Qt headers
11 #include <QMutex>
12 #include <QString>
13 
14 // MythTV
15 #include "iso639.h"
16 #include "mythtvexp.h"
17 
18 using desc_list_t = vector<const unsigned char *>;
19 
21 {
22  public:
23  enum
24  {
25  // MPEG
26  video = 0x02,
27  audio = 0x03,
28  hierarchy = 0x04,
29  registration = 0x05, /* implemented */
30  data_stream_alignment = 0x06,
31  target_background_grid = 0x07,
32  video_window = 0x08,
33  conditional_access = 0x09, /* implemented */
34  iso_639_language = 0x0A, /* implemented */
35  system_clock = 0x0B,
36  multiplex_buffer_utilization= 0x0C,
37  copyright = 0x0D,
38  maximum_bitrate = 0x0E,
39  private_data_indicator = 0x0F,
40  smoothing_buffer = 0x10,
41  std = 0x11,
42  ibp = 0x12,
43  carousel_identifier = 0x13,
44  association_tag = 0x14,
45  deferred_association_tag = 0x15,
46  /* RESERVED = 0x16, */
47  npt_reference = 0x17,
48  npt_endpoint = 0x18,
49  stream_mode = 0x19,
50  stream_event = 0x1A,
51  mpeg4_video = 0x1B,
52  mpeg4_audio = 0x1C,
53  iod = 0x1D,
54  sl = 0x1E,
55  fmc = 0x1F,
56  external_es_id = 0x20,
57  mux_code = 0x21,
58  fmx_buffer_size = 0x22,
59  multiplex_buffer = 0x23,
60  content_labeling = 0x24,
61  metadata_pointer = 0x25,
62  metadata = 0x26,
63  metadata_std = 0x27,
64  avc_video = 0x28, /* implemented */
65  ipmp = 0x29,
66  avc_timing_and_hrd = 0x2A, /* partial */
67  mpeg2_aac_audio = 0x2B,
68  flex_mux_timing = 0x2C,
69  hevc_video = 0x38,
70 
71  // DVB Bluebook A038 (Feb 2019) p 36-38, Table 12
72  network_name = 0x40, /* implemented */
73  service_list = 0x41, /* implemented */
74  dvb_stuffing = 0x42, /* implemented */
75  satellite_delivery_system = 0x43, /* implemented */
76  cable_delivery_system = 0x44, /* implemented */
77  vbi_data = 0x45, /* partial */
78  vbi_teletext = 0x46, /* partial */
79  bouquet_name = 0x47, /* implemented */
80  service = 0x48, /* implemented, toString lacking */
81  country_availability = 0x49, /* implemented */
82  linkage = 0x4A, /* partial */
83  nvod_reference = 0x4B, /* partial */
84  dvb_time_shifted_service = 0x4C, /* partial */
85  short_event = 0x4D, /* implemented */
86  extended_event = 0x4E, /* implemented */
87  time_shifted_event = 0x4F, /* partial */
88 
89  component = 0x50, /* implemented, toString lacking */
90  mosaic = 0x51, /* partial */
91  stream_identifier = 0x52, /* implemented */
92  ca_identifier = 0x53, /* partial */
93  content = 0x54, /* implemented */
94  parental_rating = 0x55, /* partial */
95  teletext = 0x56, /* partial */
96  telephone = 0x57, /* partial */
97  local_time_offset = 0x58,
98  subtitling = 0x59, /* partial */
99  terrestrial_delivery_system = 0x5A, /* implemented */
100  multilingual_network_name = 0x5B, /* partial */
101  multilingual_bouquet_name = 0x5C, /* partial */
102  multilingual_service_name = 0x5D, /* partial */
103  multilingual_component = 0x5E,
104  private_data_specifier = 0x5F, /* partial */
105 
106  service_move = 0x60, /* partial */
107  short_smoothing_buffer = 0x61, /* partial */
108  frequency_list = 0x62, /* implemented */
109  partial_transport_stream = 0x63, /* partial */
110  data_broadcast = 0x64, /* partial */
111  scrambling = 0x65, /* partial */
112  data_broadcast_id = 0x66, /* partial */
113  transport_stream = 0x67, /* partial */
114  dsng = 0x68, /* partial */
115  pdc = 0x69, /* partial */
116  ac3 = 0x6A, /* partial */
117  ancillary_data = 0x6B, /* partial */
118  cell_list = 0x6C, /* partial */
119  cell_frequency_link = 0x6D, /* partial */
120  announcement_support = 0x6E, /* partial */
121  application_signalling = 0x6F,
122 
123  adaptation_field_data = 0x70, /* partial */
124  service_identifier = 0x71,
125  service_availability = 0x72, /* partial */
126  default_authority = 0x73, /* implemented */
127  related_content = 0x74,
128  tva_id = 0x75,
129  dvb_content_identifier = 0x76, /* partial */
130  time_slice_fec_identifier = 0x77,
131  ecm_repetition_rate = 0x78,
132  s2_satellite_delivery_system = 0x79,
133  eac3 = 0x7A,
134  dts = 0x7B,
135  aac = 0x7C,
136  xait_location = 0x7D,
137  fta_content_management = 0x7E,
138  extension = 0x7F,
139 
140  // DVB Bluebook A038 (Feb 2019) p 94, Table 109
141  //
142  // Extension descriptors
143  image_icon = 0x00,
144  t2_delivery_system = 0x04,
145  sh_delivery_system = 0x05,
146  supplementary_audio = 0x06,
147  network_change_notify = 0x07,
148  message = 0x08,
149  target_region = 0x09,
150  target_region_name = 0x0A,
151  service_relocated = 0x0B,
152  xait_pid = 0x0C,
153  c2_delivery_system = 0x0D,
154  uri_linkage = 0x13,
155  ci_ancillary_data = 0x14,
156  c2_bundle_delivery_system = 0x16,
157  s2x_satellite_delivery_system = 0x17,
158 
159  // ATSC
160  atsc_stuffing = 0x80,
161  ac3_audio_stream = 0x81, /* partial */
162  atsc_program_identifier = 0x85,
163  caption_service = 0x86, /* implemented */
164  content_advisory = 0x87,
165  atsc_ca_descriptor = 0x88,
166  atsc_descriptor_tag = 0x89,
167 
168  // SCTE
169  scte_frame_rate = 0x82, /* implemented, also ATSC */
170  scte_extended_video = 0x83, /* implemented, also ATSC */
171  scte_component_name = 0x84, /* implemented, also ATSC */
172  scte_cue_identifier = 0x8A, /* implemented */
173  scte_frequency_spec = 0x90, /* implemented */
174  scte_modulation_params = 0x91, /* implemented */
175  scte_transport_stream_id = 0x92, /* implemented */
176  scte_revision_detection = 0x93, /* implemented */
177 
178  // ATSC
179  extended_channel_name = 0xA0, /* implemented */
180  service_location = 0xA1,
181  atsc_time_shifted_service = 0xA2,
182  component_name = 0xA3, /* implemented */
183  atsc_data_service = 0xA4,
184  atsc_pid_count = 0xA5,
185  atsc_download = 0xA6,
186  multiprotocol_encapsulation = 0xA7,
187  dcc_departing_request = 0xA8,
188  dcc_arriving_request = 0xA9,
189  drm_control = 0xAA,
190  atsc_genre = 0xAB,
191  atsc_private_information = 0xAD,
192 
193  atsc_content_identifier = 0xB6, /* partial */
194  };
195 };
196 
198 {
199  public:
200  enum
201  {
202  // These can conflict and should only be used
203  // on these specific networks.
204 
205  // Private -- UK and NL
206  dvb_logical_channel_descriptor = 0x83, /* implemented */
207  dvb_simulcast_channel_descriptor = 0x88, /* implemented */
208 
209  // Private -- NL Casema
210  casema_video_on_demand = 0x87,
211 
212  // Private -- Dish Network
213  dish_event_rights = 0x87,
214  dish_event_mpaa = 0x89, /* implemented */
215  dish_event_name = 0x91, /* implemented */
216  dish_event_description = 0x92, /* implemented */
217  dish_event_properties = 0x94, /* implemented */
218  dish_event_vchip = 0x95, /* implemented */
219  dish_event_tags = 0x96, /* implemented */
220 
221  // Private -- CH UPC Cablecom
222  upc_event_episode_title = 0xA7,
223 
224  // Private -- Sky Astra-2 28.2E and other Sky satellites
225  sky_lcn_table = 0xb1, /* implemented */
226 
227  // Private -- FreeSat Astra-2 28.2E
228  freesat_lcn_table = 0xd3, /* implemented */
229  freesat_region_table = 0xd4, /* implemented */
230  freesat_chan_cat_mapping = 0xd5, /* todo */
231  freesat_d6_table = 0xd6, /* unknown */
232  freesat_d7_table = 0xd7, /* unknown */
233  freesat_category_table = 0xd8, /* todo */
234  freesat_callsign = 0xd9, /* partial */
235 
236  // Private -- premiere.de
237  premiere_content_order = 0xF0,
238  premiere_parental_information = 0xF1,
239  premiere_content_transmission = 0xF2,
240 
241  // Private -- OpenTV
242  opentv_titles_1 = 0xA0,
243  opentv_titles_2 = 0xA1,
244  opentv_titles_3 = 0xA2,
245  opentv_titles_4 = 0xA3,
246  opentv_summaries_1 = 0xA8,
247  opentv_summaries_2 = 0xA9,
248  opentv_summaries_3 = 0xAA,
249  opentv_summaries_4 = 0xAB,
250  opentv_channel_list = 0xB1, /* sky_lcn_table */
251  };
252 };
253 
254 /*
255  * Private_Data_Specifier_ID from http://www.dvbservices.com/identifiers/private_data_spec_id
256  */
258 {
259  public:
260  enum
261  {
262  BSB1 = 0x00000002, // UK Sky (Astra 28.2E), Sky New Zealand (Optus D1 160E0)
263  CASEMA = 0x00000016, // NL Casema
264  EACEM = 0x00000028, // NL Ziggo
265  NORDIG = 0x00000029, // EU Nordig
266  UPC1 = 0x00000600, // UPC Cablecom
267  ITC = 0x0000233A, // Independent Television Commission
268  FSAT = 0x46534154, // UK BBC FreeSat on Astra 28.2E
269  };
270 };
271 
272 /*
273  * Original_Network_ID from http://www.dvbservices.com/identifiers/original_network_id
274  */
276 {
277  public:
278  enum
279  {
280  SES2 = 0x0002, // Société Européenne des Satellites
281  BBC = 0x003B, // BBC / Freesat
282  TELENOR = 0x0046, // Telenor Norway
283  SKYNZ = 0x00A9, // Sky New Zealand / Sky Network Television Ltd (NDS)
284  NOZEMA = 0x2210, // Netherlands Digital Terrestrial Television
285  };
286 };
287 
289 {
290  public:
291  operator const unsigned char*() const { return m_data; }
292 
293  explicit MPEGDescriptor(const unsigned char *data, int len = 300) : m_data(data)
294  {
295  if ((len < 2) || (int(DescriptorLength()) + 2) > len)
296  m_data = nullptr;
297  }
298  MPEGDescriptor(const unsigned char *data,
299  int len, uint tag) : m_data(data)
300  {
301  if ((len < 2) || ((int(DescriptorLength()) + 2) > len)
302  || (DescriptorTag() != tag))
303  m_data = nullptr;
304  }
305  MPEGDescriptor(const unsigned char *data,
306  int len, uint tag, uint req_desc_len) : m_data(data)
307  {
308  if ((len < 2) || ((int(DescriptorLength()) + 2) > len)
309  || (DescriptorTag() != tag)
310  || (DescriptorLength() != req_desc_len))
311  m_data = nullptr;
312  }
313  virtual ~MPEGDescriptor() = default;
314 
315  bool IsValid(void) const { return m_data; }
316  uint size(void) const { return DescriptorLength() + 2; }
317 
318  uint DescriptorTag(void) const { return m_data[0]; }
319  uint DescriptorLength(void) const { return m_data[1]; }
320  uint DescriptorTagExtension(void) const { return m_data[2]; }
321  QString DescriptorTagString(void) const;
322 
323  virtual QString toString(void) const;
324  virtual QString toStringPD(uint priv_dsid) const;
325  virtual QString toStringXML(uint indent_level) const;
326 
327  static desc_list_t Parse(const unsigned char *data, uint len);
328  static desc_list_t ParseAndExclude(const unsigned char *data, uint len,
329  int excluded_descid);
330  static desc_list_t ParseOnlyInclude(const unsigned char *data, uint len,
331  int excluded_descid);
332 
333  static const unsigned char *Find(const desc_list_t &parsed, uint desc_tag);
334  static const unsigned char *FindExtension(const desc_list_t &parsed, uint desc_tag);
335  static desc_list_t FindAll(const desc_list_t &parsed, uint desc_tag);
336 
337  static const unsigned char *FindBestMatch(
338  const desc_list_t &parsed, uint desc_tag, QMap<uint,uint> &langPref);
339  static desc_list_t FindBestMatches(
340  const desc_list_t &parsed, uint desc_tag, QMap<uint,uint> &langPref);
341 
342  protected:
343  const unsigned char *m_data;
344 
345  public:
346  QString hexdump(void) const;
347  QString descrDump(const QString &name) const;
348 };
349 
350 // a_52a.pdf p119, Table A1
352 {
353  public:
354  explicit RegistrationDescriptor(const unsigned char *data, int len = 300) :
355  MPEGDescriptor(data, len, DescriptorID::registration)
356  {
357  // The HD-PVR outputs a registration descriptor with a length
358  // of 8 rather than 4, so we accept any length >= 4, not just 4.
359  if (IsValid() && DescriptorLength() < 4)
360  m_data = nullptr;
361  }
362 
363  uint FormatIdentifier(void) const
364  { return (m_data[2]<<24) | (m_data[3]<<16) | (m_data[4]<<8) | m_data[5]; }
365  QString FormatIdentifierString(void) const
366  {
367  return QString("") + QChar(m_data[2]) + QChar(m_data[3]) +
368  QChar(m_data[4]) + QChar(m_data[5]);
369  }
370  QString toString() const override; // MPEGDescriptor
371 
372  private:
373  static void InitializeDescriptionMap(void);
374  static QString GetDescription(const QString &fmt);
375 
376  private:
377  static QMutex description_map_lock;
379  static QMap<QString,QString> description_map;
380 };
381 
383 {
384  public:
385  explicit ConditionalAccessDescriptor(const unsigned char *data, int len = 300) :
386  MPEGDescriptor(data, len, DescriptorID::conditional_access) { }
387 
388  uint SystemID(void) const { return m_data[2] << 8 | m_data[3]; }
389  uint PID(void) const { return (m_data[4] & 0x1F) << 8 | m_data[5]; }
390  uint DataSize(void) const { return DescriptorLength() - 4; }
391  const unsigned char *Data(void) const { return &m_data[6]; }
392  QString toString() const override; // MPEGDescriptor
393 };
394 
396 {
397  public:
398  explicit ISO639LanguageDescriptor(const unsigned char *data, int len = 300) :
399  MPEGDescriptor(data, len, DescriptorID::iso_639_language) { }
400 
401  const unsigned char* CodeRaw() const { return &m_data[2]; }
402  uint AudioType() const { return m_data[5]; }
403 
404  int LanguageKey(void) const
405  { return iso639_str3_to_key(&m_data[2]); }
406  QString LanguageString(void) const
407  { return iso639_key_to_str3(LanguageKey()); }
408  int CanonicalLanguageKey(void) const
409  { return iso639_key_to_canonical_key(LanguageKey()); }
410  QString CanonicalLanguageString(void) const
411  { return iso639_key_to_str3(CanonicalLanguageKey()); }
412 
413  QString toString() const override; // MPEGDescriptor
414 };
415 
418 {
419  public:
420  explicit AVCVideoDescriptor(const unsigned char *data, int len = 300) :
421  MPEGDescriptor(data, len, DescriptorID::avc_video) { }
422  // Name bits loc expected value
423  // descriptor_tag 8 0.0 0x
424  // descriptor_length 8 1.0
425  // profile_idc 8 2.0
426  uint ProfileIDC(void) const { return m_data[2]; }
427  // constraint_set0_flag 1 3.0
428  bool ConstaintSet0(void) const { return ( m_data[3]&0x80 ) != 0; }
429  // constraint_set1_flag 1 3.1
430  bool ConstaintSet1(void) const { return ( m_data[3]&0x40 ) != 0; }
431  // constraint_set2_flag 1 3.2
432  bool ConstaintSet2(void) const { return ( m_data[3]&0x20 ) != 0; }
433  // AVC_compatible_flags 5 3.3
434  uint AVCCompatible(void) const { return m_data[3]&0x1f; }
435  // level_idc 8 4.0
436  uint LevelIDC(void) const { return m_data[4]; }
437  // AVC_still_present 1 5.0
438  bool AVCStill(void) const { return ( m_data[5]&0x80 ) != 0; }
439  // AVC_24_hour_picture_flag 1 5.1
440  bool AVC24HourPicture(void) const { return ( m_data[5]&0x40 ) != 0; }
442  const { return ( m_data[5]&0x20 ) != 0; }
443  // reserved 6 bslbf
444  QString toString() const override; // MPEGDescriptor
445 };
446 
449 {
450  public:
451  explicit AVCTimingAndHRDDescriptor(const unsigned char *data, int len = 300) :
452  MPEGDescriptor(data, len, DescriptorID::avc_timing_and_hrd) { }
453  // Name bits loc expected value
454  // descriptor_tag 8 0.0 0x
455  // descriptor_length 8 1.0
456  // hrd_management_valid 1 2.0
457  bool HRDManagementValid(void) const { return ( m_data[2]&0x80 ) != 0; }
458  // reserved 6 2.1
459  // picture_and_timing_info_present 1 2.7
460  bool HasPictureAndTimingInfo(void) const { return (m_data[2]&0x01) != 0;}
461  // if (picture_and_timing_info_present) {
462  // 90kHz_flag 1 3.0
463  // reserved 7 3.1
464  // if (90kHz_flag == '0') {
465  // N 32 4.0 uimsbf
466  // K 32 8.0 uimsbf
467  // }
468  // num_units_in_tick 32 (90khz)?4.0:12.0 uimsbf
469  // }
470  // fixed_frame_rate_flag 1 (pict_info)?((90khz)?8.0:16.0):3.0
471  // temporal_poc_flag 1 (pict_info)?((90khz)?8.1:16.1):3.1
472  // picture_to_display_conversion_flag 1 (pict_info)?((90khz)?8.2:16.2):3.2
473  // reserved 5 bslbf
474 };
475 
478 {
479  public:
480  explicit HEVCVideoDescriptor(const unsigned char *data, int len = 300) :
481  MPEGDescriptor(data, len, DescriptorID::avc_video) { }
482  // Name bits loc expected value
483  // descriptor_tag 8 0.0 0x38
484  // descriptor_length 8 1.0
485 
486  // the encoding of the following is specified in Rec. ITU-T H.265 | ISO/IEC 23008-2
487  // profile_space 2 2.0
488  uint ProfileSpace(void) const { return m_data[2]&0xC0 >> 6; }
489  // tier_flag 1 2.2
490  bool Tier(void) const { return ( m_data[2]&0x20 ) != 0; }
491  // profile_idc 5 2.3
492  uint ProfileIDC(void) const { return m_data[2] >> 3; }
493  // profile_compatibility_indication 32 3.0
494  // progressive_source_flag 1 7.0
495  // interlaced_source_flag 1 7.1
496  // non_packed_constraint_flag 1 7.2
497  // frame_only_constraint_flag 1 7.3
498  // reserved_zero_44bits 44 7.4
499  // level_idc 8 13.0
500 
501  // temporal_layer_subset_flag 1 14.0
502  // HEVC_still_present_flag 1 14.1
503  // HEVC_24hr_picture_present_flag 1 14.2
504  // reserved 5 14.3
505 
506  // if temporal_layer_subset_flag == true and
507  // descriptor_length == 17 instead of 15 then
508  // reserved 5 15.0
509  // temporal_id_min 3 15.5
510  // reserved 5 16.0
511  // temporal_id_max 3 16.5
512 
513  QString toString() const override; // MPEGDescriptor
514 };
515 
516 #endif // MPEG_DESCRIPTORS_H
uint FormatIdentifier(void) const
bool FramePackingSEINotPresentFlag(void) const
ISO 639-1 and ISO 639-2 support functions.
ISO 13818-1:2000/Amd.3:2004 page 12.
bool ConstaintSet0(void) const
QString toString(MarkTypes type)
QString CanonicalLanguageString(void) const
int LanguageKey(void) const
uint ProfileSpace(void) const
uint LevelIDC(void) const
bool AVCStill(void) const
uint DescriptorTag(void) const
bool HRDManagementValid(void) const
static int iso639_str3_to_key(const unsigned char *iso639_2)
Definition: iso639.h:63
static bool description_map_initialized
int iso639_key_to_canonical_key(int iso639_2)
Definition: iso639.cpp:120
AVCTimingAndHRDDescriptor(const unsigned char *data, int len=300)
uint size(void) const
const unsigned char * CodeRaw() const
vector< const unsigned char * > desc_list_t
uint AVCCompatible(void) const
const unsigned char * m_data
HEVCVideoDescriptor(const unsigned char *data, int len=300)
#define MTV_PUBLIC
Definition: mythtvexp.h:15
const unsigned char * Data(void) const
MPEGDescriptor(const unsigned char *data, int len=300)
ISO 13818-1:2000/Amd.3:2004 page 11.
static QMutex description_map_lock
bool HasPictureAndTimingInfo(void) const
unsigned int uint
Definition: compat.h:140
ConditionalAccessDescriptor(const unsigned char *data, int len=300)
uint ProfileIDC(void) const
MPEGDescriptor(const unsigned char *data, int len, uint tag)
static QMap< QString, QString > description_map
ISO639LanguageDescriptor(const unsigned char *data, int len=300)
uint DescriptorLength(void) const
int CanonicalLanguageKey(void) const
ISO 13818-1:2013/FDAM 3 (E) page 7.
QString FormatIdentifierString(void) const
bool AVC24HourPicture(void) const
bool Tier(void) const
uint DescriptorTagExtension(void) const
bool ConstaintSet1(void) const
RegistrationDescriptor(const unsigned char *data, int len=300)
static QString iso639_key_to_str3(int code)
Definition: iso639.h:46
MPEGDescriptor(const unsigned char *data, int len, uint tag, uint req_desc_len)
bool IsValid(void) const
bool ConstaintSet2(void) const
QString LanguageString(void) const
AVCVideoDescriptor(const unsigned char *data, int len=300)
uint ProfileIDC(void) const