00001
00022 #include "sctetables.h"
00023 #include "mythmiscutil.h"
00024
00025 QString CarrierDefinitionSubtable::toString(void) const
00026 {
00027 return QString("CarrierDefinitionSubtable number_of_carriers(%1)")
00028 .arg(NumberOfCarriers()) +
00029 QString(" descriptors(%1)").arg(DescriptorsCount());
00030 }
00031
00032 QString CarrierDefinitionSubtable::toStringXML(uint indent_level) const
00033 {
00034 QString indent_0 = xml_indent(indent_level);
00035 QString indent_1 = xml_indent(indent_level + 1);
00036 QString str = indent_0 +
00037 QString("<CarrierDefinition descriptors_count=\"%2\" ")
00038 .arg(DescriptorsCount());
00039 str += QString("number_of_carriers=\"%1\"").arg(NumberOfCarriers());
00040 str += "\n" + indent_1;
00041 str += QString("spacing_unit=\"%1\" spacing_unit_hz=\"%2\"")
00042 .arg(SpacingUnit()).arg(SpacingUnitHz());
00043 str += "\n" + indent_1;
00044 str += QString("frequency_spacing=\"%1\" frequency_spacing_hz=\"%2\"")
00045 .arg(FrequencySpacing()).arg(FrequencySpacingHz());
00046 str += "\n" + indent_1;
00047 str += QString("frequency_unit=\"%1\" frequency_unit_hz=\"%2\"")
00048 .arg(FrequencyUnit()).arg(FrequencyUnitHz());
00049 str += "\n" + indent_1;
00050 str += QString("first_carrier_frequency=\"%1\" "
00051 "first_carrier_frequency_hz=\"%2\">\n")
00052 .arg(FirstCarrierFrequency())
00053 .arg(FirstCarrierFrequencyHz());
00054
00055 vector<const unsigned char*> desc =
00056 MPEGDescriptor::Parse(Descriptors(), DescriptorsLength());
00057 for (uint i = 0; i < desc.size(); i++)
00058 {
00059 str += MPEGDescriptor(desc[i], 300)
00060 .toStringXML(indent_level + 1) + "\n";
00061 }
00062 return str + indent_0 + "</CarrierDefinition>";
00063 }
00064
00065 QString ModulationModeSubtable::TransmissionSystemString(void) const
00066 {
00067 switch (TransmissionSystem())
00068 {
00069 case kTSUnknown: return "Unknown";
00070 case kTSITUAnnexA: return "Annex A (8 Mhz Global QAM)";
00071 case kTSITUAnnexB: return "Annex B (6 Mhz US QAM)";
00072 case kTSITUQPSK: return "ITU 1211 (QPSK Satelite)";
00073 case kTSATSC: return "ATSC";
00074 case kTSDigiCipher: return "DigiCipher II";
00075 default: return QString("Reserved(%1)").arg(TransmissionSystem());
00076 }
00077 }
00078
00079 QString ModulationModeSubtable::InnerCodingModeString(void) const
00080 {
00081 switch (InnerCodingMode())
00082 {
00083 case kRate5_11Coding: return "5/11";
00084 case kRate1_2Coding: return "1/2";
00085 case kRate3_5Coding: return "3/5";
00086 case kRate2_3Coding: return "2/3";
00087 case kRate3_4Coding: return "3/4";
00088 case kRate4_5Coding: return "4/5";
00089 case kRate5_6Coding: return "5/6";
00090 case kRate7_8Coding: return "7/8";
00091 case kNone: return "None";
00092 default: return QString("Reserved(%1)").arg(InnerCodingMode());
00093 }
00094 }
00095
00096 QString ModulationModeSubtable::ModulationFormatString(void) const
00097 {
00098 switch (ModulationFormat())
00099 {
00100 case kUnknown: return "Unknown";
00101 case kQPSK: return "QPSK";
00102 case kBPSK: return "BPSK";
00103 case kOQPSK: return "OQPSK";
00104 case kVSB8: return "8-VSB";
00105 case kVSB16: return "16-VSB";
00106 case kQAM16: return "QAM-16";
00107 case kQAM32: return "QAM-32";
00108 case kQAM64: return "QAM-64";
00109 case kQAM80: return "QAM-80";
00110 case kQAM96: return "QAM-96";
00111 case kQAM112: return "QAM-112";
00112 case kQAM128: return "QAM-128";
00113 case kQAM160: return "QAM-160";
00114 case kQAM192: return "QAM-192";
00115 case kQAM224: return "QAM-224";
00116 case kQAM256: return "QAM-256";
00117 case kQAM320: return "QAM-320";
00118 case kQAM384: return "QAM-384";
00119 case kQAM448: return "QAM-448";
00120 case kQAM512: return "QAM-512";
00121 case kQAM640: return "QAM-640";
00122 case kQAM768: return "QAM-768";
00123 case kQAM896: return "QAM-896";
00124 case kQAM1024: return "QAM-1024";
00125 default: return QString("Reserved(%1)").arg(ModulationFormat());
00126 }
00127 }
00128
00129 QString ModulationModeSubtable::toString(void) const
00130 {
00131 return "ModulationMode";
00132 }
00133
00134 QString ModulationModeSubtable::toStringXML(uint indent_level) const
00135 {
00136 QString indent_0 = xml_indent(indent_level);
00137 QString indent_1 = xml_indent(indent_level + 1);
00138 QString str = indent_0 +
00139 QString("<ModulationMode descriptors_count=\"%2\"")
00140 .arg(DescriptorsCount());
00141 str += "\n" + indent_1;
00142 str += QString("transmission_system=\"%1\" transmission_system_desc=\"%2\"")
00143 .arg(TransmissionSystem()).arg(TransmissionSystemString());
00144 str += "\n" + indent_1;
00145 str += QString("inner_coding_mode=\"%1\" inner_coding_mode_desc=\"%2\"")
00146 .arg(InnerCodingMode()).arg(InnerCodingModeString());
00147 str += "\n" + indent_1;
00148 str += QString("split_bitstream_mode=\"%1\" ")
00149 .arg(xml_bool_to_string(SplitBitstreamMode()));
00150 str += QString("symbol_rate=\"%1\"").arg(SymbolRate());
00151
00152 vector<const unsigned char*> desc =
00153 MPEGDescriptor::Parse(Descriptors(), DescriptorsLength());
00154
00155 if (desc.empty())
00156 return str + " />";
00157
00158 str += ">\n";
00159 for (uint i = 0; i < desc.size(); i++)
00160 {
00161 str += MPEGDescriptor(desc[i], 300)
00162 .toStringXML(indent_level + 1) + "\n";
00163 }
00164
00165 return str + indent_0 + "</ModulationMode>";
00166 }
00167
00168 bool SCTENetworkInformationTable::Parse(void)
00169 {
00170 _ptrs.clear();
00171
00172 if ((kCarrierDefinitionSubtable == TableSubtype()) ||
00173 (kModulationModeSubtable == TableSubtype()))
00174 {
00175 uint offset = (kCarrierDefinitionSubtable == TableSubtype()) ? 6 : 7;
00176 const unsigned char *next = pesdata() + 7;
00177 for (uint i = 0; i < NumberOfRecords(); i++)
00178 {
00179 _ptrs.push_back(next);
00180 uint desc_count = next[offset-1];
00181 next += offset;
00182 for (uint j = 0; j < desc_count; j++)
00183 {
00184 MPEGDescriptor desc(next);
00185 if (!desc.IsValid())
00186 {
00187 _ptrs.clear();
00188 return false;
00189 }
00190 next += desc.size();
00191 }
00192 }
00193 _ptrs.push_back(next);
00194 return true;
00195 }
00196
00197 return false;
00198 }
00199
00200 QString SCTENetworkInformationTable::toString(void) const
00201 {
00202 QString str = QString("Network Information Section (SCTE) crc(0x%1)\n")
00203 .arg(CRC(),8,16,QChar('0'));
00204 str += QString("first_index(%1) number_of_records(%2) table_subtype(%3)\n")
00205 .arg(FirstIndex()).arg(NumberOfRecords()).arg(TableSubtype());
00206 if (kCarrierDefinitionSubtable == TableSubtype())
00207 {
00208 for (uint i = 0; i < NumberOfRecords(); i++)
00209 str += CarrierDefinition(i).toString() + "\n";
00210 }
00211 else if (kModulationModeSubtable == TableSubtype())
00212 {
00213 for (uint i = 0; i < NumberOfRecords(); i++)
00214 str += ModulationMode(i).toString() + "\n";
00215 }
00216
00217 return str;
00218 }
00219
00220 QString SCTENetworkInformationTable::toStringXML(uint indent_level) const
00221 {
00222 QString indent_0 = xml_indent(indent_level);
00223 QString indent_1 = xml_indent(indent_level + 1);
00224
00225 QString str = indent_0 + "<SCTENetworkInformationSection psip=\"scte\" ";
00226 str += QString("transmission_medium=\"%1\" ").arg(TransmissionMedium());
00227 str += QString("first_index=\"%1\" ").arg(FirstIndex());
00228 str += "\n" + indent_1;
00229 str += QString("number_of_records=\"%1\" ").arg(NumberOfRecords());
00230 str += QString("table_subtype=\"%1\"").arg(TableSubtype());
00231 str += PSIPTable::XMLValues(indent_level + 1) + ">\n";
00232
00233 if (kCarrierDefinitionSubtable == TableSubtype())
00234 {
00235 for (uint i = 0; i < NumberOfRecords(); i++)
00236 str += CarrierDefinition(i).toStringXML(indent_level + 1) + "\n";
00237 }
00238 else if (kModulationModeSubtable == TableSubtype())
00239 {
00240 for (uint i = 0; i < NumberOfRecords(); i++)
00241 str += ModulationMode(i).toStringXML(indent_level + 1) + "\n";
00242 }
00243
00244 vector<const unsigned char*> desc =
00245 MPEGDescriptor::Parse(Descriptors(), DescriptorsLength());
00246 for (uint i = 0; i < desc.size(); i++)
00247 {
00248 str += MPEGDescriptor(desc[i], 300)
00249 .toStringXML(indent_level + 1) + "\n";
00250 }
00251
00252 return str + indent_0 + "</SCTENetworkInformationSection>";
00253 }
00254
00256
00257 void NetworkTextTable::Parse(void) const
00258 {
00259
00260 }
00261
00262 QString NetworkTextTable::toString(void) const
00263 {
00264
00265 return QString("Network Text Section crc(0x%1)\n")
00266 .arg(CRC(),8,16,QChar('0'));
00267 }
00268
00269 QString NetworkTextTable::toStringXML(uint indent_level) const
00270 {
00271 QString indent_0 = xml_indent(indent_level);
00272 QString indent_1 = xml_indent(indent_level + 1);
00273
00274 QString str = indent_0 + "<NetworkTextSection ";
00275 str += QString("iso_639_language_code=\"%1\" ").arg(LanguageString());
00276 str += QString("transmission_medium=\"%1\" ").arg(TransmissionMedium());
00277 str += QString("table_subtype=\"%1\"").arg(TableSubtype());
00278 return str + " />";
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 }
00293
00295
00296 bool ShortVirtualChannelTable::Parse(void)
00297 {
00298 _ptrs.clear();
00299
00300 if (kDefinedChannelsMap == TableSubtype())
00301 {
00302 _ptrs.push_back(pesdata() + DefinedChannelsMap().Size() + 7);
00303 }
00304 else if (kVirtualChannelMap == TableSubtype())
00305 {
00306 bool descriptors_included = pesdata()[7] & 0x20;
00307 uint number_of_vc_records = pesdata()[13];
00308 const unsigned char *next = pesdata() + 14;
00309 if (!descriptors_included)
00310 {
00311 for (uint i = 0; i < number_of_vc_records; i++)
00312 {
00313 _ptrs.push_back(next);
00314 next += 9;
00315 }
00316 _ptrs.push_back(next);
00317 }
00318 else
00319 {
00320 for (uint i = 0; i < number_of_vc_records; i++)
00321 {
00322 _ptrs.push_back(next);
00323 uint desc_count = next[10];
00324 next += 10;
00325 for (uint j = 0; j < desc_count; j++)
00326 {
00327 MPEGDescriptor desc(next);
00328 if (!desc.IsValid())
00329 {
00330 _ptrs.clear();
00331 return false;
00332 }
00333 next += desc.size();
00334 }
00335 }
00336 }
00337 _ptrs.push_back(next);
00338 }
00339 else if (kInverseChannelMap == TableSubtype())
00340 {
00341 _ptrs.push_back(pesdata() + InverseChannelMap().Size() + 7);
00342 }
00343 else
00344 {
00345 return false;
00346 }
00347
00348 return true;
00349 }
00350
00351 QString DefinedChannelsMapSubtable::toStringXML(uint indent_level) const
00352 {
00353 QString indent_0 = xml_indent(indent_level);
00354 QString indent_1 = xml_indent(indent_level + 1);
00355 QString str = indent_0 + "<DefinedChannelsMap ";
00356 str += QString("first_virtual_channel=\"%1\" ")
00357 .arg(FirstVirtualChannel());
00358 str += QString("dcm_data_length=\"%1\">\n")
00359 .arg(DCMDataLength());
00360
00361 for (uint i = 0; i < DCMDataLength(); i++)
00362 {
00363 str += indent_1 + QString("<Range range_defined=\"%1\"%2 "
00364 "channels_count=\"%3\" />\n")
00365 .arg(xml_bool_to_string(RangeDefined(i)))
00366 .arg(RangeDefined(i) ? " " : "")
00367 .arg(ChannelsCount(i));
00368 }
00369
00370 return str + indent_0 + "</DefinedChannelsMap>";
00371 }
00372
00373 QString VirtualChannelMapSubtable::VideoStandardString(uint i) const
00374 {
00375 switch (VideoStandard(i))
00376 {
00377 case kNTSC: return "NTSC";
00378 case kPAL625: return "PAL-625";
00379 case kPAL525: return "PAL-525";
00380 case kSECAM: return "SECAM";
00381 case kMAC: return "MAC";
00382 default: return QString("Reserved(%1)").arg(VideoStandard(i));
00383 }
00384 }
00385
00386 QString VirtualChannelMapSubtable::toStringXML(uint indent_level) const
00387 {
00388 QString indent_0 = xml_indent(indent_level);
00389 QString indent_1 = xml_indent(indent_level + 1);
00390 QString indent_2 = xml_indent(indent_level + 2);
00391 QString str = indent_0 + "<DefinedChannelsMap ";
00392 str += QString("number_of_vc_records=\"%1\"")
00393 .arg(NumberOfVCRecords());
00394 str += "\n" + indent_1;
00395 str += QString("descriptors_included=\"%1\" ")
00396 .arg(xml_bool_to_string(DescriptorsIncluded()));
00397 str += QString("splice=\"%1\" ")
00398 .arg(xml_bool_to_string(Splice()));
00399 str += "\n" + indent_1;
00400 str += QString("activation_time=\"%1\" actication_time_desc=\"%2\"")
00401 .arg(ActivationTimeRaw())
00402 .arg(ActivationTimeUTC().toString(Qt::ISODate));
00403 str += ">\n";
00404
00405 for (uint i = 0; i < NumberOfVCRecords(); i++)
00406 {
00407 str += indent_1 + "<Channel ";
00408 str += QString("virtual_channel_number=\"%1\" ")
00409 .arg(VirtualChannelNumber(i));
00410 str += "\n" + indent_2;
00411 str += QString("application_virtual_channel=\"%1\" ")
00412 .arg(xml_bool_to_string(ApplicationVirtualChannel(i)));
00413 str += QString("path_select=\"%1\" ").arg(PathSelect(i));
00414 str += "\n" + indent_2;
00415 str += QString("transport_type=\"%1\" transport_type_desc=\"%2\" ")
00416 .arg(TransportType(i)).arg(TransportTypeString(i));
00417 str += "\n" + indent_2;
00418 str += QString("channel_type=\"%1\" channel_type_desc=\"%2\" ")
00419 .arg(ChannelType(i)).arg(ChannelTypeString(i));
00420 if (ApplicationVirtualChannel(i))
00421 str += QString("application_id=\"%1\" ").arg(ApplicationID(i));
00422 else
00423 str += QString("source_id=\"%1\" ").arg(SourceID(i));
00424 str += "\n" + indent_2;
00425 if (kMPEG2Transport == TransportType(i))
00426 {
00427 str += QString("cds_reference=\"%1\" ").arg(CDSReference(i));
00428 str += QString("program_number=\"%1\" ").arg(ProgramNumber(i));
00429 str += QString("mms_reference=\"%1\" ").arg(MMSReference(i));
00430 }
00431 else
00432 {
00433 str += QString("cds_reference=\"%1\" ").arg(CDSReference(i));
00434 str += QString("scrampled=\"%1\" ").arg(Scrambled(i));
00435 str += "\n" + indent_2;
00436 str += QString("video_standard=\"%1\" video_standard_desc=\"%2\" ")
00437 .arg(VideoStandard(i)).arg(VideoStandardString(i));
00438 }
00439 if (!DescriptorsIncluded())
00440 {
00441 str += "/>\n";
00442 continue;
00443 }
00444
00445 str += "\n" + indent_2;
00446 str += QString("descriptors_count=\"%1\"").arg(DescriptorsCount(i));
00447 str += ">\n";
00448
00449 vector<const unsigned char*> desc =
00450 MPEGDescriptor::Parse(Descriptors(i), DescriptorsLength(i));
00451 for (uint i = 0; i < desc.size(); i++)
00452 {
00453 str += MPEGDescriptor(desc[i], 300)
00454 .toStringXML(indent_level + 2) + "\n";
00455 }
00456 str += indent_1 + "</Channel>";
00457 }
00458
00459 return str + indent_0 + "</DefinedChannelsMap>";
00460 }
00461
00462 QString InverseChannelMapSubtable::toStringXML(uint indent_level) const
00463 {
00464 QString indent_0 = xml_indent(indent_level);
00465 QString indent_1 = xml_indent(indent_level + 1);
00466 QString str = indent_0 + "<InverseChannelMap ";
00467 str += QString("first_map_index=\"%1\" ")
00468 .arg(FirstMapIndex());
00469 str += QString("record_count=\"%1\">\n")
00470 .arg(RecordCount());
00471
00472 for (uint i = 0; i < RecordCount(); i++)
00473 {
00474 str += indent_1 + QString("<Map source_id=\"%1\" "
00475 "virtual_channel_number=\"%2\" />\n")
00476 .arg(SourceID(i)).arg(VirtualChannelNumber(i));
00477 }
00478
00479 return str + indent_0 + "</InverseChannelMap>";
00480 }
00481
00482 QString ShortVirtualChannelTable::TableSubtypeString(void) const
00483 {
00484 switch (TableSubtype())
00485 {
00486 case kVirtualChannelMap: return "Virtual Channel Map";
00487 case kDefinedChannelsMap: return "Defined Channels Map";
00488 case kInverseChannelMap: return "Inverse Channel Map";
00489 default: return QString("Reserved(%1)").arg(TableSubtype());
00490 }
00491 }
00492
00493 QString ShortVirtualChannelTable::toString(void) const
00494 {
00495
00496 return QString("Short Virtual Channel Section ID(%1) crc(0x%2)\n")
00497 .arg(ID()).arg(CRC(),8,16,QChar('0'));
00498 }
00499
00500 QString ShortVirtualChannelTable::toStringXML(uint indent_level) const
00501 {
00502 QString indent_0 = xml_indent(indent_level);
00503 QString indent_1 = xml_indent(indent_level + 1);
00504 QString str = indent_0 +
00505 QString("<ShortVirtualChannelSection vct_id=\"%1\" ").arg(ID());
00506 str += QString("transmission_medium=\"%1\" ").arg(TransmissionMedium());
00507 str += "\n" + indent_1;
00508 str += QString("table_subtype=\"%1\" table_subtype_desc=\"%2\"")
00509 .arg(TableSubtype()).arg(TableSubtypeString());
00510 str += "\n" + indent_1 + PSIPTable::XMLValues(indent_level + 1) + ">\n";
00511
00512 if (kDefinedChannelsMap == TableSubtype())
00513 str += DefinedChannelsMap().toStringXML(indent_level + 1) + "\n";
00514 else if (kVirtualChannelMap == TableSubtype())
00515 str += VirtualChannelMap().toStringXML(indent_level + 1) + "\n";
00516 else if (kInverseChannelMap == TableSubtype())
00517 str += InverseChannelMap().toStringXML(indent_level + 1) + "\n";
00518
00519 vector<const unsigned char*> desc =
00520 MPEGDescriptor::Parse(Descriptors(), DescriptorsLength());
00521 for (uint i = 0; i < desc.size(); i++)
00522 {
00523 str += MPEGDescriptor(desc[i], 300)
00524 .toStringXML(indent_level + 1) + "\n";
00525 }
00526
00527 return str + indent_0 + "</ShortVirtualChannelSection>";
00528 }
00529
00531
00532 QString SCTESystemTimeTable::toString(void) const
00533 {
00534 QString str =
00535 QString("SystemTimeSection (SCTE) raw(%1) GPS_UTC_Offset(%2) utc(%3_")
00536 .arg(SystemTimeRaw()).arg(GPSUTCOffset())
00537 .arg(SystemTimeUTC().toString(Qt::ISODate));
00538 return str;
00539 }
00540
00541 QString SCTESystemTimeTable::toStringXML(uint indent_level) const
00542 {
00543 QString indent_0 = xml_indent(indent_level);
00544 QString indent_1 = xml_indent(indent_level + 1);
00545 QString str = indent_0 +
00546 QString("<SCTESystemTimeSection system_time=\"%1\" "
00547 "gps_utc_offset=\"%2\"\n%3utc_time_desc=\"%4\" psip=\"scte\"")
00548 .arg(SystemTimeRaw()).arg(GPSUTCOffset())
00549 .arg(indent_1)
00550 .arg(SystemTimeUTC().toString(Qt::ISODate));
00551
00552 if (!DescriptorsLength())
00553 return str + " />";
00554
00555 str += ">\n";
00556
00557 vector<const unsigned char*> desc =
00558 MPEGDescriptor::Parse(Descriptors(), DescriptorsLength());
00559 for (uint i = 0; i < desc.size(); i++)
00560 {
00561 str += MPEGDescriptor(desc[i], 300)
00562 .toStringXML(indent_level + 1) + "\n";
00563 }
00564
00565 return str + indent_0 + "</SCTESystemTimeSection>";
00566 }
00567
00569
00570 QString AggregateDataEventTable::toString(void) const
00571 {
00572
00573 return "Aggregate Data Event Section\n";
00574 }
00575
00576 QString AggregateDataEventTable::toStringXML(uint indent_level) const
00577 {
00578
00579 return "<AggregateDataEventSection />";
00580 }