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 typedef vector<const unsigned char*> desc_list_t;
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
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  t2_terrestrial_delivery_system = 0x7F,
139 
140  // ATSC
141  atsc_stuffing = 0x80,
142  ac3_audio_stream = 0x81, /* partial */
143  atsc_program_identifier = 0x85,
144  caption_service = 0x86, /* implemented */
145  content_advisory = 0x87,
146  atsc_ca_descriptor = 0x88,
147  atsc_descriptor_tag = 0x89,
148 
149  // SCTE
150  scte_frame_rate = 0x82, /* implemented, also ATSC */
151  scte_extended_video = 0x83, /* implemented, also ATSC */
152  scte_component_name = 0x84, /* implemented, also ATSC */
153  scte_cue_identifier = 0x8A, /* implemented */
154  scte_frequency_spec = 0x90, /* implemented */
155  scte_modulation_params = 0x91, /* implemented */
156  scte_transport_stream_id = 0x92, /* implemented */
157  scte_revision_detection = 0x93, /* implemented */
158 
159  // ATSC
160  extended_channel_name = 0xA0, /* implemented */
161  service_location = 0xA1,
162  atsc_time_shifted_service = 0xA2,
163  component_name = 0xA3, /* implemented */
164  atsc_data_service = 0xA4,
165  atsc_pid_count = 0xA5,
166  atsc_download = 0xA6,
167  multiprotocol_encapsulation = 0xA7,
168  dcc_departing_request = 0xA8,
169  dcc_arriving_request = 0xA9,
170  drm_control = 0xAA,
171  atsc_genre = 0xAB,
172  atsc_private_information = 0xAD,
173 
174  atsc_content_identifier = 0xB6, /* partial */
175  };
176 };
177 
179 {
180  public:
181  enum
182  {
183  // These can conflict and should only be used
184  // on these specific networks.
185 
186  // Private -- UK and NL
187  dvb_logical_channel_descriptor = 0x83, /* implemented */
188  dvb_simulcast_channel_descriptor = 0x88, /* implemented */
189 
190  // Private -- NL Casema
191  casema_video_on_demand = 0x87,
192 
193  // Private -- Dish Network
194  dish_event_rights = 0x87,
195  dish_event_mpaa = 0x89, /* implemented */
196  dish_event_name = 0x91, /* implemented */
197  dish_event_description = 0x92, /* implemented */
198  dish_event_properties = 0x94, /* implemented */
199  dish_event_vchip = 0x95, /* implemented */
200  dish_event_tags = 0x96, /* implemented */
201 
202  // Private -- CH UPC Cablecom
203  upc_event_episode_title = 0xA7,
204 
205  // Private -- BSkyB Astra-2 28.2E
206  bskyb_lcn_table = 0xb1, /* implemented */
207 
208  // Private -- FreeSat Astra-2 28.2E
209  freesat_lcn_table = 0xd3, /* implemented */
210  freesat_region_table = 0xd4, /* implemented */
211  freesat_chan_cat_mapping = 0xd5, /* todo */
212  freesat_d6_table = 0xd6, /* unknown */
213  freesat_d7_table = 0xd7, /* unknown */
214  freesat_category_table = 0xd8, /* todo */
215  freesat_callsign = 0xd9, /* partial */
216 
217  // Private -- premiere.de
218  premiere_content_order = 0xF0,
219  premiere_parental_information = 0xF1,
220  premiere_content_transmission = 0xF2,
221  };
222 };
223 
224 /*
225  * Private_Data_Specifier_ID from http://www.dvbservices.com/identifiers/private_data_spec_id
226  */
228 {
229  public:
230  enum
231  {
232  BSB1 = 0x00000002, // UK BSkyB on Astra 28.2E
233  CASEMA = 0x00000016, // NL Casema
234  EACEM = 0x00000028, // NL Ziggo
235  NORDIG = 0x00000029, // EU Nordig
236  UPC1 = 0x00000600, // UPC Cablecom
237  ITC = 0x0000233A, // Independent Television Commission
238  FSAT = 0x46534154, // UK BBC FreeSat on Astra 28.2E
239  };
240 };
241 
242 /*
243  * Original_Network_ID from http://www.dvbservices.com/identifiers/original_network_id
244  */
246 {
247  public:
248  enum
249  {
250  SES2 = 0x0002, // Société Européenne des Satellites
251  BBC = 0x003B, // BBC / Freesat
252  TELENOR = 0x0046, // Telenor Norway
253  NOZEMA = 0x2210, // Netherlands Digital Terrestrial Television
254  };
255 };
256 
258 {
259  public:
260  operator const unsigned char*() const { return _data; }
261 
262  MPEGDescriptor(const unsigned char *data, int len = 300) : _data(data)
263  {
264  if ((len < 2) || (int(DescriptorLength()) + 2) > len)
265  _data = nullptr;
266  }
267  MPEGDescriptor(const unsigned char *data,
268  int len, uint tag) : _data(data)
269  {
270  if ((len < 2) || (int(DescriptorLength()) + 2) > len)
271  _data = nullptr;
272  else if (DescriptorTag() != tag)
273  _data = nullptr;
274  }
275  MPEGDescriptor(const unsigned char *data,
276  int len, uint tag, uint req_desc_len) : _data(data)
277  {
278  if ((len < 2) || (int(DescriptorLength()) + 2) > len)
279  _data = nullptr;
280  else if (DescriptorTag() != tag)
281  _data = nullptr;
282  else if (DescriptorLength() != req_desc_len)
283  _data = nullptr;
284  }
285  virtual ~MPEGDescriptor() = default;
286 
287  bool IsValid(void) const { return _data; }
288  uint size(void) const { return DescriptorLength() + 2; }
289 
290  uint DescriptorTag(void) const { return _data[0]; }
291  QString DescriptorTagString(void) const;
292  uint DescriptorLength(void) const { return _data[1]; }
293 
294  virtual QString toString(void) const;
295  virtual QString toStringPD(uint priv_dsid) const;
296  virtual QString toStringXML(uint indent_level) const;
297 
298  static desc_list_t Parse(const unsigned char *data, uint len);
299  static desc_list_t ParseAndExclude(const unsigned char *data, uint len,
300  int excluded_descid);
301  static desc_list_t ParseOnlyInclude(const unsigned char *data, uint len,
302  int excluded_descid);
303 
304  static const unsigned char *Find(const desc_list_t &parsed, uint desc_tag);
305  static desc_list_t FindAll(const desc_list_t &parsed, uint desc_tag);
306 
307  static const unsigned char *FindBestMatch(
308  const desc_list_t &parsed, uint desc_tag, QMap<uint,uint> &langPref);
309  static desc_list_t FindBestMatches(
310  const desc_list_t &parsed, uint desc_tag, QMap<uint,uint> &langPref);
311 
312  protected:
313  const unsigned char *_data;
314 
315  public:
316  QString hexdump(void) const;
317  QString descrDump(QString name) const;
318 };
319 
320 // a_52a.pdf p119, Table A1
322 {
323  public:
324  RegistrationDescriptor(const unsigned char *data, int len = 300) :
325  MPEGDescriptor(data, len, DescriptorID::registration)
326  {
327  // The HD-PVR outputs a registration descriptor with a length
328  // of 8 rather than 4, so we accept any length >= 4, not just 4.
329  if (IsValid() && DescriptorLength() < 4)
330  _data = nullptr;
331  }
332 
333  uint FormatIdentifier(void) const
334  { return (_data[2]<<24) | (_data[3]<<16) | (_data[4]<<8) | _data[5]; }
335  QString FormatIdentifierString(void) const
336  {
337  return QString("") + QChar(_data[2]) + QChar(_data[3]) +
338  QChar(_data[4]) + QChar(_data[5]);
339  }
340  QString toString() const override; // MPEGDescriptor
341 
342  private:
343  static void InitializeDescriptionMap(void);
344  static QString GetDescription(const QString &fmt);
345 
346  private:
347  static QMutex description_map_lock;
349  static QMap<QString,QString> description_map;
350 };
351 
353 {
354  public:
355  ConditionalAccessDescriptor(const unsigned char *data, int len = 300) :
356  MPEGDescriptor(data, len, DescriptorID::conditional_access) { }
357 
358  uint SystemID(void) const { return _data[2] << 8 | _data[3]; }
359  uint PID(void) const { return (_data[4] & 0x1F) << 8 | _data[5]; }
360  uint DataSize(void) const { return DescriptorLength() - 4; }
361  const unsigned char *Data(void) const { return &_data[6]; }
362  QString toString() const override; // MPEGDescriptor
363 };
364 
366 {
367  public:
368  ISO639LanguageDescriptor(const unsigned char *data, int len = 300) :
369  MPEGDescriptor(data, len, DescriptorID::iso_639_language) { }
370 
371  const unsigned char* CodeRaw() const { return &_data[2]; }
372  uint AudioType() const { return _data[5]; }
373 
374  int LanguageKey(void) const
375  { return iso639_str3_to_key(&_data[2]); }
376  QString LanguageString(void) const
377  { return iso639_key_to_str3(LanguageKey()); }
378  int CanonicalLanguageKey(void) const
379  { return iso639_key_to_canonical_key(LanguageKey()); }
380  QString CanonicalLanguageString(void) const
381  { return iso639_key_to_str3(CanonicalLanguageKey()); }
382 
383  QString toString() const override; // MPEGDescriptor
384 };
385 
388 {
389  public:
390  AVCVideoDescriptor(const unsigned char *data, int len = 300) :
391  MPEGDescriptor(data, len, DescriptorID::avc_video) { }
392  // Name bits loc expected value
393  // descriptor_tag 8 0.0 0x
394  // descriptor_length 8 1.0
395  // profile_idc 8 2.0
396  uint ProfileIDC(void) const { return _data[2]; }
397  // constraint_set0_flag 1 3.0
398  bool ConstaintSet0(void) const { return ( _data[3]&0x80 ) != 0; }
399  // constraint_set1_flag 1 3.1
400  bool ConstaintSet1(void) const { return ( _data[3]&0x40 ) != 0; }
401  // constraint_set2_flag 1 3.2
402  bool ConstaintSet2(void) const { return ( _data[3]&0x20 ) != 0; }
403  // AVC_compatible_flags 5 3.3
404  uint AVCCompatible(void) const { return _data[3]&0x1f; }
405  // level_idc 8 4.0
406  uint LevelIDC(void) const { return _data[4]; }
407  // AVC_still_present 1 5.0
408  bool AVCStill(void) const { return ( _data[5]&0x80 ) != 0; }
409  // AVC_24_hour_picture_flag 1 5.1
410  bool AVC24HourPicture(void) const { return ( _data[5]&0x40 ) != 0; }
412  const { return ( _data[5]&0x20 ) != 0; }
413  // reserved 6 bslbf
414  QString toString() const override; // MPEGDescriptor
415 };
416 
419 {
420  public:
421  AVCTimingAndHRDDescriptor(const unsigned char *data, int len = 300) :
422  MPEGDescriptor(data, len, DescriptorID::avc_timing_and_hrd) { }
423  // Name bits loc expected value
424  // descriptor_tag 8 0.0 0x
425  // descriptor_length 8 1.0
426  // hrd_management_valid 1 2.0
427  bool HRDManagementValid(void) const { return ( _data[2]&0x80 ) != 0; }
428  // reserved 6 2.1
429  // picture_and_timing_info_present 1 2.7
430  bool HasPictureAndTimingInfo(void) const { return _data[2]&0x01;}
431  // if (picture_and_timing_info_present) {
432  // 90kHz_flag 1 3.0
433  // reserved 7 3.1
434  // if (90kHz_flag == '0') {
435  // N 32 4.0 uimsbf
436  // K 32 8.0 uimsbf
437  // }
438  // num_units_in_tick 32 (90khz)?4.0:12.0 uimsbf
439  // }
440  // fixed_frame_rate_flag 1 (pict_info)?((90khz)?8.0:16.0):3.0
441  // temporal_poc_flag 1 (pict_info)?((90khz)?8.1:16.1):3.1
442  // picture_to_display_conversion_flag 1 (pict_info)?((90khz)?8.2:16.2):3.2
443  // reserved 5 bslbf
444 };
445 
448 {
449  public:
450  HEVCVideoDescriptor(const unsigned char *data, int len = 300) :
451  MPEGDescriptor(data, len, DescriptorID::avc_video) { }
452  // Name bits loc expected value
453  // descriptor_tag 8 0.0 0x38
454  // descriptor_length 8 1.0
455 
456  // the encoding of the following is specified in Rec. ITU-T H.265 | ISO/IEC 23008-2
457  // profile_space 2 2.0
458  uint ProfileSpace(void) const { return _data[2]&0xC0 >> 6; }
459  // tier_flag 1 2.2
460  bool Tier(void) const { return ( _data[2]&0x20 ) != 0; }
461  // profile_idc 5 2.3
462  uint ProfileIDC(void) const { return _data[2] >> 3; }
463  // profile_compatibility_indication 32 3.0
464  // progressive_source_flag 1 7.0
465  // interlaced_source_flag 1 7.1
466  // non_packed_constraint_flag 1 7.2
467  // frame_only_constraint_flag 1 7.3
468  // reserved_zero_44bits 44 7.4
469  // level_idc 8 13.0
470 
471  // temporal_layer_subset_flag 1 14.0
472  // HEVC_still_present_flag 1 14.1
473  // HEVC_24hr_picture_present_flag 1 14.2
474  // reserved 5 14.3
475 
476  // if temporal_layer_subset_flag == true and
477  // descriptor_length == 17 instead of 15 then
478  // reserved 5 15.0
479  // temporal_id_min 3 15.5
480  // reserved 5 16.0
481  // temporal_id_max 3 16.5
482 
483  QString toString() const override; // MPEGDescriptor
484 };
485 
486 #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
unsigned int uint
Definition: compat.h:140
static int iso639_str3_to_key(const unsigned char *iso639_2)
Definition: iso639.h:63
vector< const unsigned char * > desc_list_t
static bool description_map_initialized
int iso639_key_to_canonical_key(int iso639_2)
Definition: iso639.cpp:121
AVCTimingAndHRDDescriptor(const unsigned char *data, int len=300)
uint size(void) const
const unsigned char * CodeRaw() const
uint AVCCompatible(void) const
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
ConditionalAccessDescriptor(const unsigned char *data, int len=300)
const char * name
Definition: ParseText.cpp:328
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
const unsigned char * _data
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