00001
00002
00003 #ifndef _DVB_DESCRIPTORS_H_
00004 #define _DVB_DESCRIPTORS_H_
00005
00006 #include <QMutex>
00007 #include <QString>
00008
00009 #include "mythtvexp.h"
00010 #include "mpegdescriptors.h"
00011 #include "programinfo.h"
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 static QString coderate_inner(uint coderate);
00037
00038 extern QString dvb_decode_text(const unsigned char *src, uint length,
00039 const unsigned char *encoding_override,
00040 uint encoding_override_length);
00041
00042 inline QString dvb_decode_text(const unsigned char *src, uint length)
00043 {
00044 return dvb_decode_text(src, length, NULL, 0);
00045 }
00046
00047 QString dvb_decode_short_name(const unsigned char *src, uint raw_length);
00048
00049 #define byteBCDH2int(i) (i >> 4)
00050 #define byteBCDL2int(i) (i & 0x0f)
00051 #define byteBCD2int(i) (byteBCDH2int(i) * 10 + byteBCDL2int(i))
00052 #define byte2BCD2int(i, j) \
00053 (byteBCDH2int(i) * 1000 + byteBCDL2int(i) * 100 + \
00054 byteBCDH2int(j) * 10 + byteBCDL2int(j))
00055 #define byte3BCD2int(i, j, k) \
00056 (byteBCDH2int(i) * 100000 + byteBCDL2int(i) * 10000 + \
00057 byteBCDH2int(j) * 1000 + byteBCDL2int(j) * 100 + \
00058 byteBCDH2int(k) * 10 + byteBCDL2int(k))
00059 #define byte4BCD2int(i, j, k, l) \
00060 (byteBCDH2int(i) * 10000000LL + byteBCDL2int(i) * 1000000 + \
00061 byteBCDH2int(j) * 100000 + byteBCDL2int(j) * 10000 + \
00062 byteBCDH2int(k) * 1000 + byteBCDL2int(k) * 100 + \
00063 byteBCDH2int(l) * 10 + byteBCDL2int(l))
00064
00065
00066 class NetworkNameDescriptor : public MPEGDescriptor
00067 {
00068 public:
00069 NetworkNameDescriptor(const unsigned char *data, int len = 300) :
00070 MPEGDescriptor(data, len, DescriptorID::network_name) { }
00071
00072
00073
00074
00075 QString Name(void) const
00076 { return dvb_decode_text(_data+2, DescriptorLength()); }
00077 QString ShortName(void) const
00078 { return dvb_decode_short_name(_data+2, DescriptorLength()); }
00079 QString toString(void) const
00080 { return QString("NetworkNameDescriptor: ")+Name(); }
00081 };
00082
00083
00084 class LinkageDescriptor : public MPEGDescriptor
00085 {
00086 public:
00087 LinkageDescriptor(const unsigned char *data, int len = 300) :
00088 MPEGDescriptor(data, len, DescriptorID::linkage)
00089 {
00090 if (!_data)
00091 return;
00092 if (DescriptorLength() < 7)
00093 {
00094 _data = NULL;
00095 }
00096 else if (kMobileHandOver == LinkageType())
00097 {
00098 uint end = 8;
00099 if (DescriptorLength() < end)
00100 {
00101 _data = NULL;
00102 return;
00103 }
00104 end += (HasMobileNetworkID()) ? 2 : 0;
00105 end += (HasMobileInitialServiceID()) ? 2 : 0;
00106 if (DescriptorLength() < end)
00107 _data = NULL;
00108 m_offset = end + 2;
00109 }
00110 else if (kEventLinkage == LinkageType())
00111 {
00112 if (DescriptorLength() < 10)
00113 _data = NULL;
00114 m_offset = 12;
00115 }
00116 }
00117
00118
00119
00120
00121 uint TSID(void) const { return (_data[2]<<8) | _data[3]; }
00122
00123 uint OriginalNetworkID() const { return (_data[4]<<8) | _data[5]; }
00124
00125 uint ServiceID(void) const { return (_data[6]<<8) | _data[7]; }
00126
00127 enum
00128 {
00129 kInformationService = 0x01,
00130 kEPGService = 0x02,
00131 kCAReplacementService = 0x03,
00132 kTSContainingCompleteNetworkBouquetSI = 0x04,
00133 kServiceReplacementService = 0x05,
00134 kDataBroadcastService = 0x06,
00135 kRCSMap = 0x07,
00136 kMobileHandOver = 0x08,
00137 kSystemSoftwareUpdateService = 0x09,
00138 kTSContaining_SSU_BAT_NIT = 0x0A,
00139 kIP_MACNotificationService = 0x0B,
00140 kTSContaining_INT_BAT_NIT = 0x0C,
00141 kEventLinkage = 0x0D,
00142 };
00143 uint LinkageType(void) const { return _data[8]; }
00144 QString LinkageTypeString(void) const;
00145
00146
00147
00148
00149 enum
00150 {
00151 kHandOverIdentical = 0x01,
00152 kHandOverLocalVariation = 0x02,
00153 kHandOverAssociatedService = 0x03,
00154 };
00155 uint MobileHandOverType(void) const { return _data[9]>>4; }
00156 QString MobileHandOverTypeString(void) const;
00157
00158
00159 enum
00160 {
00161 kOriginNIT = 0x0,
00162 kOriginSDT = 0x1,
00163 };
00164 uint MobileOriginType(void) const { return _data[9]&0x1; }
00165 QString MobileOriginTypeString(void) const;
00166
00167
00168
00169 bool HasMobileNetworkID(void) const
00170 { return bool(MobileHandOverType() & 0x3); }
00171 uint MobileNetworkID(void) const { return (_data[10]<<8) | _data[11]; }
00172
00173
00174 bool HasMobileInitialServiceID(void) const
00175 { return kOriginNIT == MobileOriginType(); }
00176 uint MobileInitialServiceID(void) const
00177 {
00178 return HasMobileNetworkID() ?
00179 ((_data[12]<<8) | _data[13]) : ((_data[10]<<8) | _data[11]);
00180 }
00181
00182
00183
00184
00185 uint TargetEventID(void) const { return (_data[9]<<8) | _data[10]; }
00186
00187 bool IsTargetListed(void) const { return _data[11]&0x80; }
00188
00189 bool IsEventSimulcast(void) const { return _data[11]&0x40; }
00190
00191
00192
00193
00194 const unsigned char *PrivateData(void) const
00195 { return _data + m_offset; }
00196 uint PrivateDataLength(void) const
00197 { return DescriptorLength() + 2 - m_offset; }
00198
00199 private:
00200 uint m_offset;
00201 };
00202
00203
00204 class AdaptationFieldDataDescriptor : public MPEGDescriptor
00205 {
00206 public:
00207 AdaptationFieldDataDescriptor(const unsigned char *data, int len = 300) :
00208 MPEGDescriptor(data, len, DescriptorID::adaptation_field_data, 1) { }
00209
00210
00211
00212
00213 uint AdaptationFieldDataID(void) const { return _data[2]; }
00214 QString toString(void) const
00215 {
00216 return QString("AdaptationFieldDataDescriptor "
00217 "adaptation_field_data_identifier(%1)")
00218 .arg(AdaptationFieldDataID());
00219 }
00220 };
00221
00222
00223 class AncillaryDataDescriptor : public MPEGDescriptor
00224 {
00225 public:
00226 AncillaryDataDescriptor(const unsigned char *data, int len = 300) :
00227 MPEGDescriptor(data, len, DescriptorID::ancillary_data, 1) { }
00228
00229
00230
00231
00232 uint AncillaryDataID(void) const { return _data[2]; }
00233 QString toString(void) const
00234 {
00235 return QString("AncillaryDataDescriptor "
00236 "ancillary_data_identifier(%1)")
00237 .arg(AncillaryDataID());
00238 }
00239 };
00240
00241
00242 class AnnouncementSupportDescriptor : public MPEGDescriptor
00243 {
00244 public:
00245 AnnouncementSupportDescriptor(const unsigned char *data, int len = 300) :
00246 MPEGDescriptor(data, len, DescriptorID::announcement_support) { }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 };
00265
00266
00267 class BouquetNameDescriptor : public MPEGDescriptor
00268 {
00269 public:
00270 BouquetNameDescriptor(const unsigned char *data, int len = 300) :
00271 MPEGDescriptor(data, len, DescriptorID::bouquet_name) { }
00272
00273
00274
00275
00276 QString BouquetName(void) const
00277 { return dvb_decode_text(_data+2, _data[1]); }
00278 QString BouquetShortName(void) const
00279 { return dvb_decode_short_name(_data+2, _data[1]); }
00280
00281 QString toString(void) const
00282 {
00283 return QString("BouquetNameDescriptor: Bouquet Name(%1)")
00284 .arg(BouquetName());
00285 }
00286 };
00287
00288
00289 class CAIdentifierDescriptor : public MPEGDescriptor
00290 {
00291 public:
00292 CAIdentifierDescriptor(const unsigned char *data, int len = 300) :
00293 MPEGDescriptor(data, len, DescriptorID::ca_identifier) { }
00294
00295
00296
00297
00298 uint CASystemCount(void) const { return DescriptorLength() >> 1; }
00299
00300
00301 int CASystemId(uint i) const
00302 { return (_data[2 + i*2] << 8) | _data[3 + i*2]; }
00303 QString toString(void) const;
00304 };
00305
00306
00307 class CellFrequencyLinkDescriptor : public MPEGDescriptor
00308 {
00309 public:
00310 CellFrequencyLinkDescriptor(const unsigned char *data, int len = 300) :
00311 MPEGDescriptor(data, len, DescriptorID::cell_frequency_link) { }
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326 };
00327
00328
00329 class CellListDescriptor : public MPEGDescriptor
00330 {
00331 public:
00332 CellListDescriptor(const unsigned char *data, int len = 300) :
00333 MPEGDescriptor(data, len, DescriptorID::cell_list) { }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 };
00355
00356
00357 class ComponentDescriptor : public MPEGDescriptor
00358 {
00359 public:
00360 ComponentDescriptor(const unsigned char *data, int len = 300) :
00361 MPEGDescriptor(data, len, DescriptorID::component) { }
00362
00363
00364
00365
00366
00367 uint StreamContent(void) const { return _data[2] & 0xf; }
00368
00369 uint ComponentType(void) const { return _data[3]; }
00370
00371 uint ComponentTag(void) const { return _data[4]; }
00372
00373 int LanguageKey(void) const
00374 { return iso639_str3_to_key(&_data[5]); }
00375 QString LanguageString(void) const
00376 { return iso639_key_to_str3(LanguageKey()); }
00377 int CanonicalLanguageKey(void) const
00378 { return iso639_key_to_canonical_key(LanguageKey()); }
00379 QString CanonicalLanguageString(void) const
00380 { return iso639_key_to_str3(CanonicalLanguageKey()); }
00381
00382
00383
00384 bool IsVideo(void) const
00385 {
00386 return 0x1 == StreamContent() ||
00387 0x5 == StreamContent();
00388 }
00389 bool IsAudio(void) const
00390 {
00391 switch(StreamContent())
00392 {
00393 case 0x02:
00394 case 0x04:
00395 case 0x06:
00396 case 0x07:
00397 return true;
00398 default:
00399 return false;
00400 }
00401 }
00402 bool IsSubtitle(void) const { return 0x3 == StreamContent(); }
00403
00404 unsigned char VideoProperties(void) const
00405 {
00406 if (0x1 == StreamContent())
00407 return MPEG2Properties();
00408 if (0x5 == StreamContent())
00409 return VID_AVC | AVCProperties();
00410
00411 return VID_UNKNOWN;
00412 }
00413
00414 unsigned char MPEG2Properties(void) const
00415 {
00416 switch(ComponentType())
00417 {
00418 case 0x2: case 0x3: case 0x4:
00419 case 0x6: case 0x7: case 0x8:
00420 return VID_WIDESCREEN;
00421 case 0x09:
00422 case 0x0D:
00423 return VID_HDTV;
00424 case 0x0A: case 0x0B: case 0x0C:
00425 case 0x0E: case 0x0F: case 0x10:
00426 return VID_WIDESCREEN | VID_HDTV;
00427 default:
00428 return VID_UNKNOWN;
00429 }
00430 }
00431
00432 unsigned char AVCProperties(void) const
00433 {
00434 switch(ComponentType())
00435 {
00436 case 0x3: case 0x4:
00437 case 0x7: case 0x8:
00438 return VID_WIDESCREEN;
00439 case 0x0B: case 0x0C:
00440 case 0x0F: case 0x10:
00441 return VID_WIDESCREEN | VID_HDTV;
00442 default:
00443 return VID_UNKNOWN;
00444 }
00445 }
00446
00447 unsigned char AudioProperties(void) const
00448 {
00449 switch (StreamContent())
00450 {
00451 case 0x2:
00452 return MP2Properties();
00453 case 0x04:
00454 return AC3Properties();
00455 case 0x06:
00456 return HEAACProperties();
00457 default:
00458 return AUD_UNKNOWN;
00459 }
00460 }
00461
00462 unsigned char MP2Properties(void) const
00463 {
00464 switch (ComponentType())
00465 {
00466 case 0x1:
00467 return AUD_MONO;
00468 case 0x3:
00469 return AUD_STEREO;
00470 case 0x5:
00471 return AUD_SURROUND;
00472 case 0x40:
00473 return AUD_VISUALIMPAIR;
00474 case 0x41:
00475 return AUD_HARDHEAR;
00476 default:
00477 return AUD_UNKNOWN;
00478 }
00479 }
00480
00481 unsigned char AC3Properties(void) const
00482 {
00483 unsigned char properties = AUD_UNKNOWN;
00484
00485 switch (ComponentType() & 0x7)
00486 {
00487 case 0x0:
00488 properties |= AUD_MONO;
00489 break;
00490 case 0x2:
00491 properties |= AUD_STEREO;
00492 break;
00493 case 0x3:
00494 properties |= AUD_DOLBY;
00495 break;
00496 case 0x4: case 0x5:
00497 properties |= AUD_SURROUND;
00498 break;
00499 }
00500
00501 if (((ComponentType() >> 3) & 0x7) == 0x2)
00502 properties |= AUD_VISUALIMPAIR;
00503
00504 if (((ComponentType() >> 3) & 0x7) == 0x3)
00505 properties |= AUD_HARDHEAR;
00506
00507 return properties;
00508 }
00509
00510 unsigned char HEAACProperties(void) const
00511 {
00512 switch (ComponentType())
00513 {
00514 case 0x1:
00515 return AUD_MONO;
00516 case 0x3:
00517 case 0x43:
00518 return AUD_STEREO;
00519 case 0x5:
00520 return AUD_SURROUND;
00521 case 0x40:
00522 case 0x44:
00523 return AUD_VISUALIMPAIR;
00524 case 0x41:
00525 case 0x45:
00526 return AUD_HARDHEAR;
00527 default:
00528 return AUD_UNKNOWN;
00529 }
00530 }
00531
00532 unsigned char SubtitleType(void) const
00533 {
00534 if (!IsSubtitle())
00535 return SUB_UNKNOWN;
00536
00537 switch (ComponentType())
00538 {
00539 case 0x1:
00540 case 0x3:
00541 case 0x10: case 0x11: case 0x12: case 0x13:
00542 return SUB_NORMAL;
00543 case 0x20: case 0x21: case 0x22: case 0x23:
00544 return SUB_HARDHEAR;
00545 default:
00546 return SUB_UNKNOWN;
00547 }
00548 }
00549
00550 QString toString(void) const
00551 {
00552 return QString("ComponentDescriptor(stream_content: 0x%1, "
00553 "component_type: 0x%2)").arg(StreamContent(), 0, 16)
00554 .arg(ComponentType(), 0, 16);
00555 }
00556 };
00557
00558 typedef enum
00559 {
00560 kCategoryNone = 0,
00561 kCategoryMovie,
00562 kCategorySeries,
00563 kCategorySports,
00564 kCategoryTVShow,
00565 kCategoryLast,
00566 } MythCategoryType;
00567
00568 MTV_PUBLIC QString myth_category_type_to_string(uint category_type);
00569 MTV_PUBLIC MythCategoryType string_to_myth_category_type(const QString &type);
00570
00571
00572 class ContentDescriptor : public MPEGDescriptor
00573 {
00574 public:
00575 ContentDescriptor(const unsigned char *data, int len = 300) :
00576 MPEGDescriptor(data, len, DescriptorID::content) { }
00577
00578
00579
00580
00581 uint Count(void) const { return DescriptorLength() >> 1; }
00582
00583
00584
00585 uint Nibble1(uint i) const { return _data[2 + (i<<1)] >> 4; }
00586
00587 uint Nibble2(uint i) const { return _data[2 + (i<<1)] & 0xf; }
00588
00589 uint Nibble(uint i) const { return _data[2 + (i<<1)]; }
00590
00591
00592 uint UserNibble1(uint i) const { return _data[3 + (i<<1)] >> 4; }
00593
00594 uint UserNibble2(uint i) const { return _data[3 + (i<<1)] & 0xf; }
00595 uint UserNibble(uint i) const { return _data[3 + (i<<1)]; }
00596
00597
00598 MythCategoryType GetMythCategory(uint i) const;
00599 QString GetDescription(uint i) const;
00600 QString toString(void) const;
00601
00602 protected:
00603 static void Init(void);
00604
00605 protected:
00606 static QMutex categoryLock;
00607 static QMap<uint,QString> categoryDesc;
00608 static volatile bool categoryDescExists;
00609 };
00610
00611
00612 class CountryAvailabilityDescriptor : public MPEGDescriptor
00613 {
00614 public:
00615 CountryAvailabilityDescriptor(const unsigned char *data, int len = 300) :
00616 MPEGDescriptor(data, len, DescriptorID::country_availability) { }
00617
00618
00619
00620
00621 uint CountryCount(void) const { return ((DescriptorLength() - 1) / 3); }
00622
00623
00624 bool IsAvailable(void) const { return (_data[2] & 0x1); }
00625
00626
00627
00628
00629 QString CountryNames(void) const
00630 {
00631 QString countries="";
00632 for (uint i=0; i<CountryCount(); i++)
00633 {
00634 if (i!=0) countries.append(" ");
00635 countries.append(QString::fromAscii(
00636 (const char *)_data+(3*(i+1)), 3));
00637 };
00638 return countries;
00639 }
00640
00641 QString toString(void) const
00642 {
00643 return QString("CountryAvailabilityDescriptor: Available(%1) in (%2)")
00644 .arg(IsAvailable()).arg(CountryNames());
00645 }
00646 };
00647
00648
00649 class DataBroadcastDescriptor : public MPEGDescriptor
00650 {
00651 public:
00652 DataBroadcastDescriptor(const unsigned char *data, int len = 300) :
00653 MPEGDescriptor(data, len, DescriptorID::data_broadcast) { }
00654
00655
00656
00657
00658
00659 uint DataBroadcastId(void) const { return _data[2] << 8 | _data[3]; }
00660
00661 uint DataComponentTag(void) const { return _data[4]; }
00662
00663 uint SelectorLength(void) const { return _data[5]; }
00664
00665
00666
00667 const unsigned char *Selector(void) const { return _data + 6; }
00668
00669
00670 int LanguageKey(void) const
00671 { return iso639_str3_to_key(&_data[6 + SelectorLength()]); }
00672 QString LanguageString(void) const
00673 { return iso639_key_to_str3(LanguageKey()); }
00674 int CanonicalLanguageKey(void) const
00675 { return iso639_key_to_canonical_key(LanguageKey()); }
00676 QString CanonicalLanguageString(void) const
00677 { return iso639_key_to_str3(CanonicalLanguageKey()); }
00678
00679 uint TextLength(void) const { return _data[6 + SelectorLength() + 3]; }
00680
00681 QString Text(void) const
00682 {
00683 return dvb_decode_text(&_data[6 + SelectorLength() + 4], TextLength());
00684 }
00685
00686 QString toString(void) const;
00687 };
00688
00689
00690 class DataBroadcastIdDescriptor : public MPEGDescriptor
00691 {
00692 public:
00693 DataBroadcastIdDescriptor(const unsigned char *data, int len = 300) :
00694 MPEGDescriptor(data, len, DescriptorID::data_broadcast_id) { }
00695
00696
00697
00698
00699
00700 uint DataBroadCastId(void) const { return _data[2] << 8 | _data[3]; }
00701
00702
00703 };
00704
00705
00706 class CableDeliverySystemDescriptor : public MPEGDescriptor
00707 {
00708 public:
00709 CableDeliverySystemDescriptor(const unsigned char *data, int len = 300) :
00710 MPEGDescriptor(data, len, DescriptorID::cable_delivery_system) { }
00711
00712
00713
00714
00715
00716 uint FrequencyRaw(void) const
00717 {
00718 return ((_data[2]<<24) | (_data[3]<<16) |
00719 (_data[4]<<8) | (_data[5]));
00720 }
00721 unsigned long long FrequencyHz(void) const
00722 {
00723 return byte4BCD2int(_data[2], _data[3], _data[4], _data[5]) * 100;
00724 }
00725
00726
00727 enum
00728 {
00729 kOuterFEC_None = 0x1,
00730 kOuterFEC_RS204_RS188 = 0x2,
00731 };
00732 uint FECOuter(void) const { return _data[7] & 0xf; }
00733 QString FECOuterString(void) const
00734 {
00735 return (FECOuter() == kOuterFEC_None) ? "None" :
00736 ((FECOuter() == kOuterFEC_RS204_RS188) ? "RS(204/188)" : "unknown");
00737 }
00738
00739 enum
00740 {
00741 kModulationQAM16 = 0x01,
00742 kModulationQAM32 = 0x02,
00743 kModulationQAM64 = 0x03,
00744 kModulationQAM128 = 0x04,
00745 kModulationQAM256 = 0x05,
00746 };
00747 uint Modulation(void) const { return _data[8]; }
00748 QString ModulationString(void) const
00749 {
00750 static QString ms[] =
00751 { "auto", "qam_16", "qam_32", "qam_64", "qam_128", "qam_256" };
00752 return (Modulation() <= kModulationQAM256) ?
00753 ms[Modulation()] : QString("auto");
00754 }
00755
00756 uint SymbolRateRaw(void) const
00757 {
00758 return ((_data[9]<<20) | (_data[10]<<12) |
00759 (_data[11]<<4) | (_data[12]>>4));
00760 }
00761 uint SymbolRateHz(void) const
00762 {
00763 return ((byte3BCD2int(_data[9], _data[10], _data[11]) * 1000) +
00764 (byteBCDH2int(_data[12]) * 100));
00765 }
00766
00767 enum
00768 {
00769 kInnerFEC_1_2_ConvolutionCodeRate = 0x1,
00770 kInnerFEC_2_3_ConvolutionCodeRate = 0x2,
00771 kInnerFEC_3_4_ConvolutionCodeRate = 0x3,
00772 kInnerFEC_5_6_ConvolutionCodeRate = 0x4,
00773 kInnerFEC_7_8_ConvolutionCodeRate = 0x5,
00774 kInnerFEC_8_9_ConvolutionCodeRate = 0x6,
00775 kInnerFEC_None = 0xF,
00776 };
00777 uint FECInner(void) const { return _data[12] & 0xf; }
00778 QString FECInnerString(void) const { return coderate_inner(FECInner()); }
00779 QString toString(void) const;
00780 };
00781
00782
00783 class SatelliteDeliverySystemDescriptor : public MPEGDescriptor
00784 {
00785 public:
00786 SatelliteDeliverySystemDescriptor(
00787 const unsigned char *data, int len = 300) :
00788 MPEGDescriptor(data, len, DescriptorID::satellite_delivery_system) { }
00789
00790
00791
00792
00794 uint FrequencyRaw(void) const
00795 {
00796 return ((_data[2]<<24) | (_data[3]<<16) |
00797 (_data[4]<<8) | (_data[5]));
00798 }
00799 unsigned long long FrequencyHz(void) const
00800 {
00801 return byte4BCD2int(_data[2], _data[3], _data[4], _data[5]) * 10;
00802 }
00804 uint OrbitalPosition(void) const
00805 { return byte2BCD2int(_data[6], _data[7]); }
00806 QString OrbitalPositionString(void) const
00807 {
00808 uint num = OrbitalPosition();
00809 return QString("%1.%2 %3").arg(num / 10).arg(num % 10)
00810 .arg((IsEast()) ? "East" : "West");
00811 }
00812 double OrbitalPositionFloat() const
00813 { return ((double) OrbitalPosition()) / 10.0; }
00815 bool IsEast(void) const { return (_data[8]&0x80); }
00816 bool IsWest(void) const { return !IsEast(); }
00817
00818 uint Polarization(void) const { return (_data[8]>>5)&0x3; }
00819 QString PolarizationString() const
00820 {
00821 static QString ps[] = { "h", "v", "l", "r" };
00822 return ps[Polarization()];
00823 }
00824 bool IsCircularPolarization(void) const { return (_data[8]>>6)&0x1; }
00825 bool IsLinearPolarization(void) const { return !((_data[8]>>6)&0x1); }
00826 bool IsHorizontalLeftPolarization(void) const { return (_data[8]>>5)&0x1; }
00827 bool IsVerticalRightPolarization(void) const
00828 { return !((_data[8]>>5)&0x1); }
00829
00830 enum
00831 {
00832 kRollOff_35,
00833 kRollOff_20,
00834 kRollOff_25,
00835 kRollOff_Auto,
00836 };
00837 uint RollOff(void) const { return (_data[8]>>3)&0x3; }
00838 QString RollOffString(void) const
00839 {
00840 static QString ro[] = { "0.35", "0.20", "0.25", "auto" };
00841 return ro[RollOff()];
00842 }
00843
00844 uint ModulationSystem(void) const { return (_data[8]>>2)&0x1; }
00845 QString ModulationSystemString(void) const
00846 {
00847 return ModulationSystem() ? "DVB-S2" : "DVB-S";
00848 }
00849
00850 enum
00851 {
00852 kModulationQPSK_NS = 0x0,
00853
00854 kModulationQPSK = 0x1,
00855 kModulation8PSK = 0x2,
00856 kModulationQAM16 = 0x3,
00857 };
00858 uint Modulation(void) const { return _data[8]&0x03; }
00859 QString ModulationString(void) const
00860 {
00861 static QString ms[] = { "qpsk", "qpsk", "8psk", "qam_16" };
00862 return ms[Modulation()];
00863 }
00864
00865 uint SymbolRate(void) const
00866 {
00867 return ((_data[9]<<20) | (_data[10]<<12) |
00868 (_data[11]<<4) | (_data[12]>>4));
00869 }
00870 uint SymbolRateHz(void) const
00871 {
00872 return ((byte3BCD2int(_data[9], _data[10], _data[11]) * 1000) +
00873 (byteBCDH2int(_data[12]) * 100));
00874 }
00875
00876 enum
00877 {
00878 kInnerFEC_1_2_ConvolutionCodeRate = 0x1,
00879 kInnerFEC_2_3_ConvolutionCodeRate = 0x2,
00880 kInnerFEC_3_4_ConvolutionCodeRate = 0x3,
00881 kInnerFEC_5_6_ConvolutionCodeRate = 0x4,
00882 kInnerFEC_7_8_ConvolutionCodeRate = 0x5,
00883 kInnerFEC_8_9_ConvolutionCodeRate = 0x6,
00884 kInnerFEC_None = 0xF,
00885 };
00886 uint FECInner(void) const { return _data[12] & 0xf; }
00887 QString FECInnerString(void) const { return coderate_inner(FECInner()); }
00888
00889 QString toString(void) const;
00890 };
00891
00892
00893 class TerrestrialDeliverySystemDescriptor : public MPEGDescriptor
00894 {
00895 public:
00896 TerrestrialDeliverySystemDescriptor(
00897 const unsigned char *data, int len = 300) :
00898 MPEGDescriptor(data, len, DescriptorID::terrestrial_delivery_system) { }
00899
00900
00901
00902
00903
00904 uint Frequency(void) const
00905 {
00906 return ((_data[2]<<24) | (_data[3]<<16) |
00907 (_data[4]<<8) | (_data[5]));
00908 }
00909 uint64_t FrequencyHz(void) const { return uint64_t(Frequency()) * 10ULL; }
00910
00911
00912 enum
00913 {
00914 kBandwidth8Mhz = 0x0,
00915 kBandwidth7Mhz = 0x1,
00916 kBandwidth6Mhz = 0x2,
00917 kBandwidth5Mhz = 0x3,
00918 };
00919 uint Bandwidth(void) const { return _data[6]>>5; }
00920 uint BandwidthHz(void) const { return (8 - Bandwidth()) * 1000000; }
00921 QString BandwidthString(void) const
00922 {
00923 static QString bs[] = { "8", "7", "6", "5" };
00924 return (Bandwidth() <= kBandwidth5Mhz) ? bs[Bandwidth()] : "auto";
00925 }
00926
00927 bool HighPriority(void) const { return _data[6] & 0x10; }
00928
00929 bool IsTimeSlicingIndicatorUsed(void) const { return !(_data[6] & 0x08); }
00930
00931 bool IsMPE_FECUsed(void) const { return !(_data[6] & 0x04); }
00932
00933
00934 enum
00935 {
00936 kConstellationQPSK = 0x0,
00937 kConstellationQAM16 = 0x1,
00938 kConstellationQAM64 = 0x2,
00939 };
00940 uint Constellation(void) const { return _data[7]>>6; }
00941 QString ConstellationString(void) const
00942 {
00943 static QString cs[] = { "qpsk", "qam_16", "qam_64" };
00944 return (Constellation() <= kConstellationQAM64) ?
00945 cs[Constellation()] : "auto";
00946 }
00947
00948 enum
00949 {
00950 kHierarchyInfoNonHierarchicalNativeInterleaver = 0x0,
00951 kHierarchyInfoAlpha1NativeInterleaver = 0x1,
00952 kHierarchyInfoAlpha2NativeInterleaver = 0x2,
00953 kHierarchyInfoAlpha4NativeInterleaver = 0x3,
00954 kHierarchyInfoNonHierarchicalInDepthInterleaver = 0x4,
00955 kHierarchyInfoAlpha1InDepthInterleaver = 0x5,
00956 kHierarchyInfoAlpha2InDepthInterleaver = 0x6,
00957 kHierarchyInfoAlpha4InDepthInterleaver = 0x7,
00958 };
00959 uint Hierarchy(void) const { return (_data[7]>>3) & 0x7; }
00960
00962 QString HierarchyString(void) const
00963 {
00964 static QString hs[] = { "n", "1", "2", "4", "a", "a", "a", "a" };
00965 return hs[Hierarchy()];
00966 }
00967 bool NativeInterleaver(void) const { return _data[7] & 0x20; }
00968 uint Alpha(void) const
00969 {
00970 uint i = (_data[7]>>3) & 0x3;
00971 return (0x2 == i) ? 4 : i;
00972 }
00973
00974 enum
00975 {
00976 kCodeRate_1_2 = 0x0,
00977 kCodeRate_2_3 = 0x1,
00978 kCodeRate_3_4 = 0x2,
00979 kCodeRate_5_6 = 0x3,
00980 kCodeRate_7_8 = 0x4,
00981 };
00982 uint CodeRateHP(void) const { return _data[7] & 0x7; }
00983 QString CodeRateHPString(void) const
00984 {
00985 static QString cr[] = {
00986 "1/2", "2/3", "3/4", "5/6", "7/8", "auto", "auto", "auto"
00987 };
00988 return cr[CodeRateHP()];
00989 }
00990
00991 uint CodeRateLP(void) const { return (_data[8]>>5) & 0x7; }
00992 QString CodeRateLPString(void) const
00993 {
00994 static QString cr[] = {
00995 "1/2", "2/3", "3/4", "5/6", "7/8", "auto", "auto", "auto"
00996 };
00997 return cr[CodeRateLP()];
00998 }
00999
01000 enum
01001 {
01002 kGuardInterval_1_32 = 0x0,
01003 kGuardInterval_1_16 = 0x1,
01004 kGuardInterval_1_8 = 0x2,
01005 kGuardInterval_1_4 = 0x3,
01006 };
01007 uint GuardInterval(void) const { return (_data[8]>>3) & 0x3; }
01008 QString GuardIntervalString(void) const
01009 {
01010 static QString gi[] = { "1/32", "1/16", "1/8", "1/4" };
01011 return gi[GuardInterval()];
01012 }
01013
01014 enum
01015 {
01016 kTransmissionMode2k = 0x00,
01017 kTransmissionMode8k = 0x01,
01018 kTransmissionMode4k = 0x02,
01019 };
01020 uint TransmissionMode(void) const { return (_data[8]>>1) & 0x3; }
01021 QString TransmissionModeString(void) const
01022 {
01023 static QString tm[] = { "2", "8", "4", "auto" };
01024 return tm[TransmissionMode()];
01025 }
01026
01027 bool OtherFrequencyInUse(void) const { return _data[8] & 0x1; }
01028
01029
01030 QString toString(void) const;
01031 };
01032
01033
01034 class DSNGDescriptor : public MPEGDescriptor
01035 {
01036 public:
01037 DSNGDescriptor(const unsigned char *data, int len = 300) :
01038 MPEGDescriptor(data, len, DescriptorID::dsng) { }
01039
01040
01041
01042
01043 };
01044
01045
01046 class ExtendedEventDescriptor : public MPEGDescriptor
01047 {
01048 public:
01049 ExtendedEventDescriptor(const unsigned char *data, int len = 300) :
01050 MPEGDescriptor(data, len, DescriptorID::extended_event) { }
01051
01052
01053
01054
01055
01056 uint DescriptorNumber(void) const { return _data[2] >> 4; }
01057
01058 uint LastNumber(void) const { return _data[2] & 0xf; }
01059
01060 int LanguageKey(void) const
01061 { return iso639_str3_to_key(&_data[3]); }
01062 QString LanguageString(void) const
01063 { return iso639_key_to_str3(LanguageKey()); }
01064 int CanonicalLanguageKey(void) const
01065 { return iso639_key_to_canonical_key(LanguageKey()); }
01066 QString CanonicalLanguageString(void) const
01067 { return iso639_key_to_str3(CanonicalLanguageKey()); }
01068
01069 uint LengthOfItems(void) const { return _data[6]; }
01070
01071
01072
01073
01074
01075
01076
01077
01078 uint TextLength(void) const { return _data[7 + _data[6]]; }
01079
01080 QString Text(void) const
01081 { return dvb_decode_text(&_data[8 + _data[6]], TextLength()); }
01082
01083
01084 QString Text(const unsigned char *encoding_override,
01085 uint encoding_length) const
01086 {
01087 return dvb_decode_text(&_data[8 + _data[6]], TextLength(),
01088 encoding_override, encoding_length);
01089 }
01090
01091 };
01092
01093
01094 class FrequencyListDescriptor : public MPEGDescriptor
01095 {
01096 public:
01097 FrequencyListDescriptor(const unsigned char *data, int len = 300) :
01098 MPEGDescriptor(data, len, DescriptorID::frequency_list) { }
01099
01100
01101
01102
01103
01104
01105 enum
01106 {
01107 kCodingTypeNotDefined = 0x0,
01108 kCodingTypeSatellite = 0x1,
01109 kCodingTypeCable = 0x2,
01110 kCodingTypeTerrestrial = 0x3,
01111 };
01112 uint CodingType(void) const { return _data[2] & 0x3; }
01113
01114
01115
01116
01117 uint FrequencyCount() const { return DescriptorLength()>>2; }
01118 unsigned long long Frequency(uint i) const
01119 {
01120 if (kCodingTypeTerrestrial == CodingType())
01121 return ((_data[3 + (i<<2)]<<24) | (_data[4 + (i<<2)]<<16) |
01122 (_data[5 + (i<<2)]<<8) | (_data[6 + (i<<2)]));
01123 else
01124 return byte4BCD2int(_data[3 + (i<<2)], _data[4 + (i<<2)],
01125 _data[5 + (i<<2)], _data[6 + (i<<2)]);
01126 }
01127 unsigned long long FrequencyHz(uint i) const
01128 {
01129 return Frequency(i) *
01130 ((kCodingTypeTerrestrial == CodingType()) ? 10 : 100);
01131 }
01132
01133 QString toString(void) const;
01134 };
01135
01136
01137
01138 class LocalTimeOffsetDescriptor : public MPEGDescriptor
01139 {
01140 public:
01141 LocalTimeOffsetDescriptor(const unsigned char *data, int len = 300) :
01142 MPEGDescriptor(data, len, DescriptorID::local_time_offset) { }
01143
01144
01145
01146 uint Count(void) const { return DescriptorLength() / 13; }
01147
01148
01149
01150 uint CountryCode(uint i) const
01151 {
01152 int o = 2 + i*13;
01153 return ((_data[o] << 16) | (_data[o+1] << 8) | _data[o+2]);
01154 }
01155 QString CountryCodeString(uint i) const
01156 {
01157 int o = 2 + i*13;
01158 return QString(_data[o]) + QChar(_data[o+1]) + QChar(_data[o+2]);
01159 }
01160
01161 uint CountryRegionId(uint i) const { return _data[2 + i*13 + 3] >> 2; }
01162
01163
01165 bool LocalTimeOffsetPolarity(uint i) const
01166 { return _data[2 + i*13 + 3] & 0x01; }
01167
01168 uint LocalTimeOffset(uint i) const
01169 { return (_data[2 + i*13 + 4] << 8) | _data[2 + i*13 + 5]; }
01170 int LocalTimeOffsetWithPolarity(uint i) const
01171 { return (LocalTimeOffsetPolarity(i) ? -1 : +1) * LocalTimeOffset(i); }
01172
01173
01174
01175 uint NextTimeOffset(uint i) const
01176 { return (_data[2 + i*13 + 11]<<8) | _data[2 + i*13 + 12]; }
01177
01178 QString toString(void) const;
01179 };
01180
01181
01182 class MosaicDescriptor : public MPEGDescriptor
01183 {
01184 public:
01185 MosaicDescriptor(const unsigned char *data, int len = 300) :
01186 MPEGDescriptor(data, len, DescriptorID::mosaic) { }
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231 };
01232
01233
01234 class MultilingualBouquetNameDescriptor : public MPEGDescriptor
01235 {
01236 public:
01237 MultilingualBouquetNameDescriptor(
01238 const unsigned char *data, int len = 300) :
01239 MPEGDescriptor(data, len, DescriptorID::multilingual_bouquet_name) { }
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250 };
01251
01252
01253 class MultilingualNetworkNameDescriptor : public MPEGDescriptor
01254 {
01255 public:
01256 MultilingualNetworkNameDescriptor(
01257 const unsigned char *data, int len = 300) :
01258 MPEGDescriptor(data, len, DescriptorID::multilingual_network_name)
01259 {
01260
01261
01262
01263 }
01264
01265
01266
01267
01268
01269
01270
01271 };
01272
01273
01274 class MultilingualServiceNameDescriptor : public MPEGDescriptor
01275 {
01276 public:
01277 MultilingualServiceNameDescriptor(
01278 const unsigned char *data, int len = 300) :
01279 MPEGDescriptor(data, len, DescriptorID::multilingual_service_name) { }
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292 };
01293
01294
01295 class NVODReferenceDescriptor : public MPEGDescriptor
01296 {
01297 public:
01298 NVODReferenceDescriptor(const unsigned char *data, int len = 300) :
01299 MPEGDescriptor(data, len, DescriptorID::nvod_reference) { }
01300
01301
01302
01303 uint Count(void) const { return DescriptorLength() / 6; }
01304
01305
01306
01307
01308 uint TransportStreamId(uint i) const
01309 { return (_data[i * 6 + 2] << 8) | _data[i * 6 + 3]; }
01310
01311 uint OriginalNetworkId(uint i) const
01312 { return (_data[i * 6 + 4] << 8) | _data[i * 6 + 5]; }
01313
01314 uint ServiceId(uint i) const
01315 { return (_data[i * 6 + 6] << 8) | _data[i * 6 + 7]; }
01316
01317 QString toString(void) const;
01318 };
01319
01320
01321 class ParentalRatingDescriptor : public MPEGDescriptor
01322 {
01323 public:
01324 ParentalRatingDescriptor(const unsigned char *data, int len = 300) :
01325 MPEGDescriptor(data, len, DescriptorID::parental_rating) { }
01326
01327
01328
01329 uint Count(void) const { return DescriptorLength() / 4; }
01330
01331
01332
01333
01334
01335
01336 };
01337
01338
01339 class PDCDescriptor : public MPEGDescriptor
01340 {
01341 public:
01342 PDCDescriptor(const unsigned char *data, int len = 300) :
01343 MPEGDescriptor(data, len, DescriptorID::pdc, 3) { }
01344
01345
01346
01347
01348
01349
01350 uint ProgramIdLabel(void) const
01351 { return (_data[2] & 0x0F) << 16 | _data[3] << 8 | _data[4]; }
01352 QString toString(void) const
01353 {
01354 return QString("PDCDescriptor program_id_label(%1)")
01355 .arg(ProgramIdLabel());
01356 }
01357 };
01358
01359
01360 class PrivateDataSpecifierDescriptor : public MPEGDescriptor
01361 {
01362 public:
01363 PrivateDataSpecifierDescriptor(const unsigned char *data, int len = 300) :
01364 MPEGDescriptor(data, len, DescriptorID::private_data_specifier) { }
01365
01366
01367
01368
01369
01370 };
01371
01372
01373 class ScramblingDescriptor : public MPEGDescriptor
01374 {
01375 public:
01376 ScramblingDescriptor(const unsigned char *data, int len = 300) :
01377 MPEGDescriptor(data, len, DescriptorID::scrambling, 1) { }
01378
01379
01380
01381
01382
01383 uint ScramblingMode(void) const { return _data[2]; }
01384 QString toString(void) const
01385 {
01386 return QString("ScramblingDescriptor scrambling_mode(%1)")
01387 .arg(ScramblingMode());
01388 }
01389 };
01390
01391
01392 class ServiceDescriptorMapping
01393 {
01394 public:
01395 ServiceDescriptorMapping(const uint serviceid) { m_serviceid = serviceid; }
01396 enum
01397 {
01398 kServiceTypeDigitalTelevision = 0x01,
01399 kServiceTypeDigitalRadioSound = 0x02,
01400 kServiceTypeTeletext = 0x03,
01401 kServiceTypeNVODReference = 0x04,
01402 kServiceTypeNVODTimeShifted = 0x05,
01403 kServiceTypeMosaic = 0x06,
01404 kServiceTypePALCodedSignal = 0x07,
01405 kServiceTypeSECAMCodedSignal = 0x08,
01406 kServiceTypeD_D2_MAC = 0x09,
01407 kServiceTypeAdvancedCodecDigitalRadioSound = 0x0A,
01408 kServiceTypeNTSCCodedSignal = 0x0B,
01409 kServiceTypeDataBroadcast = 0x0C,
01410 kServiceTypeCommonInterface = 0x0D,
01411 kServiceTypeRCS_Map = 0x0E,
01412 kServiceTypeRCS_FLS = 0x0F,
01413 kServiceTypeDVB_MHP = 0x10,
01414 kServiceTypeHDTV = 0x11,
01415 kServiceTypeAdvancedCodecSDDigitalTelevision = 0x16,
01416 kServiceTypeAdvancedCodecHDDigitalTelevision = 0x19,
01417 kServiceTypeAdvancedCodecFrameCompatiblePlanoStereoscopicHDTelevisionService = 0x1c,
01418 kServiceTypeEchoStarTV1 = 0x91,
01419 kServiceTypeEchoStarTV2 = 0x9a,
01420 kServiceTypeEchoStarTV3 = 0xa4,
01421 kServiceTypeEchoStarTV4 = 0xa6,
01422 kServiceTypeNimiqTV1 = 0x81,
01423 kServiceTypeNimiqTV2 = 0x85,
01424 kServiceTypeNimiqTV3 = 0x86,
01425 kServiceTypeNimiqTV4 = 0x89,
01426 kServiceTypeNimiqTV5 = 0x8a,
01427 kServiceTypeNimiqTV6 = 0x8d,
01428 kServiceTypeNimiqTV7 = 0x8f,
01429 kServiceTypeNimiqTV8 = 0x90,
01430 kServiceTypeNimiqTV9 = 0x96,
01431
01432 };
01433 uint ServiceType(void) const { return m_serviceid; }
01434 bool IsDTV(void) const
01435 {
01436 return ((ServiceType() == kServiceTypeDigitalTelevision) ||
01437 (ServiceType() ==
01438 kServiceTypeAdvancedCodecSDDigitalTelevision) ||
01439 IsHDTV() ||
01440 (ServiceType() == kServiceTypeEchoStarTV1) ||
01441 (ServiceType() == kServiceTypeEchoStarTV2) ||
01442 (ServiceType() == kServiceTypeEchoStarTV3) ||
01443 (ServiceType() == kServiceTypeEchoStarTV4) ||
01444 (ServiceType() == kServiceTypeNimiqTV1) ||
01445 (ServiceType() == kServiceTypeNimiqTV2) ||
01446 (ServiceType() == kServiceTypeNimiqTV3) ||
01447 (ServiceType() == kServiceTypeNimiqTV4) ||
01448 (ServiceType() == kServiceTypeNimiqTV5) ||
01449 (ServiceType() == kServiceTypeNimiqTV6) ||
01450 (ServiceType() == kServiceTypeNimiqTV7) ||
01451 (ServiceType() == kServiceTypeNimiqTV8) ||
01452 (ServiceType() == kServiceTypeNimiqTV9));
01453 }
01454 bool IsDigitalAudio(void) const
01455 {
01456 return ((ServiceType() == kServiceTypeDigitalRadioSound) ||
01457 (ServiceType() == kServiceTypeAdvancedCodecDigitalRadioSound));
01458 }
01459 bool IsHDTV(void) const
01460 {
01461 return
01462 (ServiceType() == kServiceTypeHDTV) ||
01463 (ServiceType() == kServiceTypeAdvancedCodecHDDigitalTelevision) ||
01464 (ServiceType() == kServiceTypeAdvancedCodecFrameCompatiblePlanoStereoscopicHDTelevisionService);
01465 }
01466 bool IsTeletext(void) const
01467 {
01468 return ServiceType() == kServiceTypeDataBroadcast;
01469 }
01470 QString toString(void) const;
01471
01472 private:
01473 uint m_serviceid;
01474 };
01475
01476
01477 class ServiceDescriptor : public MPEGDescriptor
01478 {
01479 public:
01480 ServiceDescriptor(const unsigned char *data, int len = 300) :
01481 MPEGDescriptor(data, len, DescriptorID::service) { }
01482
01483
01484
01485
01486
01487 uint ServiceType(void) const { return _data[2]; }
01488
01489 uint ServiceProviderNameLength(void) const { return _data[3]; }
01490
01491 QString ServiceProviderName(void) const
01492 { return dvb_decode_text(_data + 4, ServiceProviderNameLength()); }
01493 QString ServiceProviderShortName(void) const
01494 {
01495 return dvb_decode_short_name(_data + 4, ServiceProviderNameLength());
01496 }
01497
01498 uint ServiceNameLength(void) const
01499 { return _data[4 + ServiceProviderNameLength()]; }
01500
01501 QString ServiceName(void) const
01502 {
01503 return dvb_decode_text(_data + 5 + ServiceProviderNameLength(),
01504 ServiceNameLength());
01505 }
01506 QString ServiceShortName(void) const
01507 {
01508 return dvb_decode_short_name(_data + 5 + ServiceProviderNameLength(),
01509 ServiceNameLength());
01510 }
01511 bool IsDTV(void) const
01512 { return ServiceDescriptorMapping(ServiceType()).IsDTV(); }
01513 bool IsDigitalAudio(void) const
01514 { return ServiceDescriptorMapping(ServiceType()).IsDigitalAudio(); }
01515 bool IsHDTV(void) const
01516 { return ServiceDescriptorMapping(ServiceType()).IsHDTV(); }
01517 bool IsTeletext(void) const
01518 { return ServiceDescriptorMapping(ServiceType()).IsTeletext(); }
01519
01520 QString toString(void) const
01521 {
01522 return QString("ServiceDescriptor: %1 %2").arg(ServiceName())
01523 .arg(ServiceDescriptorMapping(ServiceType()).toString());
01524 }
01525 };
01526
01527
01528 class ServiceAvailabilityDescriptor : public MPEGDescriptor
01529 {
01530 public:
01531 ServiceAvailabilityDescriptor(const unsigned char *data, int len = 300) :
01532 MPEGDescriptor(data, len, DescriptorID::service_availability) { }
01533
01534
01535
01536
01537
01538
01539
01540 };
01541
01542
01543 class ServiceListDescriptor : public MPEGDescriptor
01544 {
01545 public:
01546 ServiceListDescriptor(const unsigned char *data, int len = 300) :
01547 MPEGDescriptor(data, len, DescriptorID::service_list) { }
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557 uint ServiceCount(void) const { return DescriptorLength() / 3; }
01558
01559 uint ServiceID(uint i) const
01560 { return (_data[2+i*3] << 8) | _data[3+i*3]; }
01561
01562 uint ServiceType(uint i) const { return _data[4+i*3]; }
01563
01564 QString toString(void) const
01565 {
01566 QString str = QString("ServiceListDescriptor: %1 Services\n")
01567 .arg(ServiceCount());
01568 for (uint i=0; i<ServiceCount(); i++)
01569 {
01570 if (i!=0) str.append("\n");
01571 str.append(QString(" Service (%1) Type%2").arg(ServiceID(i))
01572 .arg(ServiceDescriptorMapping(ServiceType(i)).toString()));
01573 }
01574 return str;
01575 }
01576 };
01577
01578
01579 class ServiceMoveDescriptor : public MPEGDescriptor
01580 {
01581 public:
01582 ServiceMoveDescriptor(const unsigned char *data, int len = 300) :
01583 MPEGDescriptor(data, len, DescriptorID::service_move) { }
01584
01585
01586
01587
01588
01589
01590
01591 };
01592
01593
01594 class ShortEventDescriptor : public MPEGDescriptor
01595 {
01596 public:
01597 ShortEventDescriptor(const unsigned char *data, int len = 300) :
01598 MPEGDescriptor(data, len, DescriptorID::short_event) { }
01599
01600
01601
01602
01603
01604 int LanguageKey(void) const
01605 { return iso639_str3_to_key(&_data[2]); }
01606 QString LanguageString(void) const
01607 { return iso639_key_to_str3(LanguageKey()); }
01608 int CanonicalLanguageKey(void) const
01609 { return iso639_key_to_canonical_key(LanguageKey()); }
01610 QString CanonicalLanguageString(void) const
01611 { return iso639_key_to_str3(CanonicalLanguageKey()); }
01612
01613 uint EventNameLength(void) const { return _data[5]; }
01614
01615 QString EventName(void) const
01616 { return dvb_decode_text(&_data[6], _data[5]); }
01617 QString EventShortName(void) const
01618 { return dvb_decode_short_name(&_data[6], _data[5]); }
01619
01620 uint TextLength(void) const { return _data[6 + _data[5]]; }
01621
01622 QString Text(void) const
01623 { return dvb_decode_text(&_data[7 + _data[5]], TextLength()); }
01624
01625
01626 QString EventName(const unsigned char *encoding_override,
01627 uint encoding_length) const
01628 {
01629 return dvb_decode_text(&_data[6], _data[5],
01630 encoding_override, encoding_length);
01631 }
01632
01633 QString Text(const unsigned char *encoding_override,
01634 uint encoding_length) const
01635 {
01636 return dvb_decode_text(&_data[7 + _data[5]], TextLength(),
01637 encoding_override, encoding_length);
01638 }
01639
01640
01641 QString toString(void) const
01642 { return LanguageString() + " : " + EventName() + " : " + Text(); }
01643 };
01644
01645
01646 class ShortSmoothingBufferDescriptor : public MPEGDescriptor
01647 {
01648 public:
01649 ShortSmoothingBufferDescriptor(const unsigned char *data, int len = 300) :
01650 MPEGDescriptor(data, len, DescriptorID::short_smoothing_buffer) { }
01651
01652
01653
01654
01655
01656
01657
01658
01659 };
01660
01661
01664 class StreamIdentifierDescriptor : public MPEGDescriptor
01665 {
01666 public:
01667 StreamIdentifierDescriptor(const unsigned char *data, int len = 300) :
01668 MPEGDescriptor(data, len, DescriptorID::stream_identifier, 1) { }
01669
01670
01671
01672
01673
01674 uint ComponentTag(void) const { return _data[2]; }
01675 QString toString(void) const
01676 {
01677 return QString("Stream Identifier Descriptor (0x52): ComponentTag=0x%1")
01678 .arg(ComponentTag(),1,16);
01679 }
01680 };
01681
01682
01683 class StuffingDescriptor : public MPEGDescriptor
01684 {
01685 public:
01686 StuffingDescriptor(const unsigned char *data, int len = 300) :
01687 MPEGDescriptor(data, len, DescriptorID::dvb_stuffing) { }
01688
01689
01690
01691
01692 QString toString(void) const
01693 {
01694 return QString("Stuffing Descriptor (0x42) length(%1)")
01695 .arg(DescriptorLength());
01696 }
01697 };
01698
01699
01700 class SubtitlingDescriptor : public MPEGDescriptor
01701 {
01702 public:
01703 SubtitlingDescriptor(const unsigned char *data, int len = 300) :
01704 MPEGDescriptor(data, len, DescriptorID::subtitling) { }
01705
01706
01707
01708
01709 uint StreamCount(void) const { return DescriptorLength() >> 3; }
01710
01711
01712
01713 int LanguageKey(uint i) const
01714 { return iso639_str3_to_key(&_data[2 + (i<<3)]); }
01715 QString LanguageString(uint i) const
01716 { return iso639_key_to_str3(LanguageKey(i)); }
01717 int CanonicalLanguageKey(uint i) const
01718 { return iso639_key_to_canonical_key(LanguageKey(i)); }
01719 QString CanonicalLanguageString(uint i) const
01720 { return iso639_key_to_str3(CanonicalLanguageKey(i)); }
01721
01722
01723 uint SubtitleType(uint i) const
01724 { return _data[5 + (i<<3)]; }
01725
01726 uint CompositionPageID(uint i) const
01727 { return (_data[6 + (i<<3)] << 8) | _data[7 + (i<<3)]; }
01728
01729 uint AncillaryPageID(uint i) const
01730 { return (_data[8 + (i<<3)] << 8) | _data[9 + (i<<3)]; }
01731
01732 };
01733
01734
01735 class TelephoneDescriptor : public MPEGDescriptor
01736 {
01737 public:
01738 TelephoneDescriptor(const unsigned char *data, int len = 300) :
01739 MPEGDescriptor(data, len, DescriptorID::telephone) { }
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765 };
01766
01767
01768 class TeletextDescriptor : public MPEGDescriptor
01769 {
01770 public:
01771 TeletextDescriptor(const unsigned char *data, int len = 300) :
01772 MPEGDescriptor(data, len, DescriptorID::teletext) { }
01773
01774
01775
01776
01777 uint StreamCount(void) const { return DescriptorLength() / 5; }
01778
01779
01780
01781
01782 int LanguageKey(uint i) const
01783 { return iso639_str3_to_key(&_data[2 + (i*5)]); }
01784 QString LanguageString(uint i) const
01785 { return iso639_key_to_str3(LanguageKey(i)); }
01786 int CanonicalLanguageKey(uint i) const
01787 { return iso639_key_to_canonical_key(LanguageKey(i)); }
01788 QString CanonicalLanguageString(uint i) const
01789 { return iso639_key_to_str3(CanonicalLanguageKey(i)); }
01790
01791 uint TeletextType(uint i) const
01792 { return _data[5 + (i*5)] >> 3; }
01793
01794 uint TeletextMagazineNum(uint i) const
01795 { return _data[5 + (i*5)] & 0x7; }
01796
01797 uint TeletextPageNum(uint i) const
01798 { return _data[6 + (i*5)]; }
01799
01800 };
01801
01802
01803 class TimeShiftedEventDescriptor : public MPEGDescriptor
01804 {
01805 public:
01806 TimeShiftedEventDescriptor(const unsigned char *data, int len = 300) :
01807 MPEGDescriptor(data, len, DescriptorID::time_shifted_event) { }
01808
01809
01810
01811
01812
01813
01814 };
01815
01816
01817 class TimeShiftedServiceDescriptor : public MPEGDescriptor
01818 {
01819 public:
01820 TimeShiftedServiceDescriptor(const unsigned char *data, int len = 300) :
01821 MPEGDescriptor(data, len, DescriptorID::dvb_time_shifted_service) { }
01822
01823
01824
01825
01826
01827 };
01828
01829
01830 class TransportStreamDescriptor : public MPEGDescriptor
01831 {
01832 public:
01833 TransportStreamDescriptor(const unsigned char *data, int len = 300) :
01834 MPEGDescriptor(data, len, DescriptorID::transport_stream) { }
01835
01836
01837
01838
01839
01840 QString Data(void) const
01841 { return dvb_decode_text(&_data[2], DescriptorLength()); }
01842 QString toString(void) const
01843 { return QString("TransportStreamDescriptor data(%1)").arg(Data()); }
01844 };
01845
01846
01847 class VBIDataDescriptor : public MPEGDescriptor
01848 {
01849 public:
01850 VBIDataDescriptor(const unsigned char *data, int len = 300) :
01851 MPEGDescriptor(data, len, DescriptorID::vbi_data) { }
01852
01853
01854
01855
01856
01857
01858
01859
01860
01861
01862
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874 };
01875
01876
01877 class VBITeletextDescriptor : public MPEGDescriptor
01878 {
01879 public:
01880 VBITeletextDescriptor(const unsigned char *data, int len = 300) :
01881 MPEGDescriptor(data, len, DescriptorID::vbi_teletext) { }
01882
01883
01884
01885
01886
01887
01888
01889
01890
01891
01892
01893 };
01894
01895
01896 class PartialTransportStreamDescriptor : public MPEGDescriptor
01897 {
01898 public:
01899 PartialTransportStreamDescriptor(const unsigned char *data, int len = 300) :
01900 MPEGDescriptor(data, len, DescriptorID::partial_transport_stream) { }
01901
01902
01903
01904
01905
01906
01907 uint PeakRate(void) const
01908 { return (_data[2] & 0x3f) << 16 | _data[3] | _data[4]; }
01909
01910
01911 uint SmoothRate(void) const
01912 { return (_data[5] & 0x3f) << 16 | _data[6] | _data[7]; }
01913
01914
01915 uint SmoothBuf(void) const { return ((_data[8] & 0x3f) << 8) | _data[9]; }
01916 QString toString(void) const;
01917 };
01918
01919
01920
01921 class AC3Descriptor : public MPEGDescriptor
01922 {
01923 public:
01924 AC3Descriptor(const unsigned char *data, int len = 300) :
01925 MPEGDescriptor(data, len, DescriptorID::ac3) { }
01926
01927
01928
01929
01930
01931 bool HasComponentType(void) const { return _data[2] & 0x80; }
01932
01933 bool HasBSID(void) const { return _data[2] & 0x40; }
01934
01935 bool HasMainID(void) const { return _data[2] & 0x20; }
01936
01937 bool HasASVC(void) const { return _data[2] & 0x10; }
01938
01939
01940
01941 uint ComponentType(void) const { return _data[3]; }
01942
01943
01944 uint BSID(void) const
01945 { return (HasComponentType()) ? _data[4] : _data[3]; }
01946
01947
01948 uint MainID(void) const
01949 {
01950 int offset = 3;
01951 offset += (HasComponentType()) ? 1 : 0;
01952 offset += (HasBSID()) ? 1 : 0;
01953 return _data[offset];
01954 }
01955
01956
01957 uint ASVC(void) const
01958 {
01959 int offset = 3;
01960 offset += (HasComponentType()) ? 1 : 0;
01961 offset += (HasBSID()) ? 1 : 0;
01962 offset += (HasMainID()) ? 1 : 0;
01963 return _data[offset];
01964 }
01965
01966
01967
01968 QString toString(void) const;
01969 };
01970
01971 static QString coderate_inner(uint cr)
01972 {
01973 switch (cr)
01974 {
01975 case 0x0: return "auto";
01976 case 0x1: return "1/2";
01977 case 0x2: return "2/3";
01978 case 0x3: return "3/4";
01979 case 0x4: return "5/6";
01980 case 0x5: return "7/8";
01981 case 0x8: return "8/9";
01982 case 0xf: return "none";
01983 default: return "auto";
01984 }
01985 }
01986
01987 class UKChannelListDescriptor : public MPEGDescriptor
01988 {
01989 public:
01990 UKChannelListDescriptor(const unsigned char *data, int len = 300) :
01991 MPEGDescriptor(data, len, PrivateDescriptorID::dvb_uk_channel_list) { }
01992
01993
01994
01995
01996 uint ChannelCount(void) const { return DescriptorLength() >> 2; }
01997
01998 uint ServiceID(uint i) const
01999 { return (_data[2 + (i<<2)] << 8) | _data[3 + (i<<2)]; }
02000
02001 uint ChannelNumber(uint i) const
02002 { return ((_data[4 + (i<<2)] << 8) | _data[5 + (i<<2)]) & 0x3ff; }
02003
02004 QString toString(void) const;
02005 };
02006
02007
02008 class DVBContentIdentifierDescriptor : public MPEGDescriptor
02009 {
02010 public:
02011 DVBContentIdentifierDescriptor(const unsigned char *data, int len = 300) :
02012 MPEGDescriptor(data, len, DescriptorID::dvb_content_identifier) { }
02013
02014
02015
02016
02017 uint ContentType(void) const { return _data[2] >> 2; }
02018
02019 uint ContentEncoding(void) const { return _data[2] & 0x03; }
02020
02021
02022 QString ContentId(void) const
02023 {
02024 return QString::fromAscii((const char *)_data+4, _data[3]);
02025 }
02026 };
02027
02028
02029 class DefaultAuthorityDescriptor : public MPEGDescriptor
02030 {
02031 public:
02032 DefaultAuthorityDescriptor(const unsigned char *data, int len = 300) :
02033 MPEGDescriptor(data, len, DescriptorID::default_authority) { }
02034
02035
02036
02037
02038 QString DefaultAuthority(void) const
02039 {
02040 return QString::fromAscii((const char *)_data+2, _data[1]);
02041 }
02042
02043 QString toString(void) const
02044 {
02045 return QString("DefaultAuthorityDescriptor: Authority(%1)")
02046 .arg(DefaultAuthority());
02047 }
02048 };
02049
02050 #endif