bool ShortVirtualChannelTable::Parse(void) { _ptrs.clear(); if (kDefinedChannelsMap == TableSubtype()) { _ptrs.push_back(pesdata() + DefinedChannelsMap().Size() + 7); } else if (kVirtualChannelMap == TableSubtype()) { bool descriptors_included = pesdata()[7] & 0x20; uint number_of_vc_records = pesdata()[13]; const unsigned char *next = pesdata() + 14; if (!descriptors_included) { for (uint i = 0; i < number_of_vc_records; i++) { _ptrs.push_back(next); next += 9; } _ptrs.push_back(next); } else { for (uint i = 0; i < number_of_vc_records; i++) { _ptrs.push_back(next); uint desc_count = next[10]; next += 10; for (uint j = 0; j < desc_count; j++) { MPEGDescriptor desc(next); if (!desc.IsValid()) { _ptrs.clear(); return false; } next += desc.size(); } } } _ptrs.push_back(next); } else if (kInverseChannelMap == TableSubtype()) { _ptrs.push_back(pesdata() + InverseChannelMap().Size() + 7); } else { return false; } return true; }
bool SCTENetworkInformationTable::Parse(void) { _ptrs.clear(); if ((kCarrierDefinitionSubtable == TableSubtype()) || (kModulationModeSubtable == TableSubtype())) { uint offset = (kCarrierDefinitionSubtable == TableSubtype()) ? 6 : 7; const unsigned char *next = pesdata() + 7; for (uint i = 0; i < NumberOfRecords(); i++) { _ptrs.push_back(next); uint desc_count = next[offset-1]; next += offset; for (uint j = 0; j < desc_count; j++) { MPEGDescriptor desc(next); if (!desc.IsValid()) { _ptrs.clear(); return false; } next += desc.size(); } } _ptrs.push_back(next); return true; } return false; }
QString VirtualChannelTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString indent_2 = xml_indent(indent_level + 2); QString section_name = QString("%1VirtualChannelSection") .arg((TableID::TVCT == TableID()) ? "Terrestrial" : "Cable"); QString mapid; if (TableID::CVCT == TableID()) { uint sctemapid = (pesdata()[3]<<8) | pesdata()[4]; mapid = QString(" mapid=\"0x%1\"").arg(sctemapid,4,16,QChar('0')); } QString str = QString("%1<%2 tsid=\"0x%3\" channel_count=\"%4\"" "\n%5global_descriptors_length=\"%6\"%7" "\n%8%9>\n") .arg(indent_0) .arg(section_name) .arg(TransportStreamID(),4,16,QChar('0')) .arg(ChannelCount()) .arg(indent_1) .arg(GlobalDescriptorsLength()) .arg(mapid) .arg(indent_1) .arg(PSIPTable::XMLValues(indent_level + 1)); vector<const unsigned char*> gdesc = MPEGDescriptor::Parse(GlobalDescriptors(), GlobalDescriptorsLength()); for (uint i = 0; i < gdesc.size(); i++) { str += MPEGDescriptor(gdesc[i], 300) .toStringXML(indent_level + 1) + "\n"; } for (uint i = 0; i < ChannelCount(); i++) str += ChannelStringXML(indent_level + 1, i) + "\n"; return str + indent_0 + QString("</%1>").arg(section_name); }
QString VirtualChannelTable::toString(void) const { QString str; str.append(QString("%1 Virtual Channel Section\n%2" " channel_count(%3) tsid(0x%4)") .arg((TableID::TVCT == TableID()) ? "Terrestrial":"Cable") .arg(PSIPTable::toString()) .arg(ChannelCount()) .arg(TransportStreamID(),4,16,QChar('0'))); if (TableID::CVCT == TableID()) { uint sctemapid = (pesdata()[3]<<8) | pesdata()[4]; str.append(QString(" mapid(0x%1)").arg(sctemapid,0,16)); } str.append("\n"); for (uint i = 0; i < ChannelCount(); i++) str.append(ChannelString(i)); if (0 != GlobalDescriptorsLength()) { str.append(QString("global descriptors length(%1) ") .arg(GlobalDescriptorsLength())); vector<const unsigned char*> desc = MPEGDescriptor::Parse(GlobalDescriptors(), GlobalDescriptorsLength()); str.append(QString("count: %1\n").arg(desc.size())); for (uint i = 0; i < desc.size(); i++) { str.append(QString(" %1\n") .arg(MPEGDescriptor(desc[i]).toString())); } } return str; }