00001
00002
00003 #include "atsctables.h"
00004 #include "atscdescriptors.h"
00005 #include "qstring.h"
00006
00007 QString MasterGuideTable::TableClassString(uint i) const
00008 {
00009 static const QString tts[] = {
00010 QString("UNKNOWN"),
00011 QString("Terrestrial VCT with current()"),
00012 QString("Terrestrial VCT with !current()"),
00013 QString("Cable VCT with current()"),
00014 QString("Cable VCT with !current()"),
00015 QString("Channel ETT"),
00016 QString("DCCSCT"),
00017 QString("EIT + 0x100"),
00018 QString("Event ETT + 0x200"),
00019 QString("DCCT + 0x1400"),
00020 QString("RTT + 0x300")
00021 };
00022 int tt = TableClass(i) + 1;
00023 return tts[tt];
00024 }
00025
00026 int MasterGuideTable::TableClass(uint i) const
00027 {
00028 const int tt = TableType(i);
00029 if (tt < 6)
00030 {
00031 return tt;
00032 }
00033 else if (tt < 0x300)
00034 {
00035 if (tt < 0x200) return TableClass::EIT;
00036 return TableClass::ETTe;
00037 }
00038 else if (tt >= 0x1400 && tt < 0x1500)
00039 return TableClass::DCCT;
00040 else if (tt < 0x400)
00041 return TableClass::RRT;
00042 return TableClass::UNKNOWN;
00043 }
00044
00045 void MasterGuideTable::Parse(void) const
00046 {
00047 _ptrs.clear();
00048 _ptrs.push_back(const_cast<unsigned char*>(psipdata()) + 3);
00049 for (uint i = 0; i < TableCount(); i++)
00050 _ptrs.push_back(_ptrs[i] + 11 + TableDescriptorsLength(i));
00051 }
00052
00053
00054 void VirtualChannelTable::Parse(void) const
00055 {
00056 _ptrs.clear();
00057 _ptrs.push_back(const_cast<unsigned char*>(psipdata()) + 2);
00058 for (uint i = 0; i < ChannelCount(); i++)
00059 _ptrs.push_back(_ptrs[i] + 32 + DescriptorsLength(i));
00060 }
00061
00062 void EventInformationTable::Parse(void) const
00063 {
00064 _ptrs.clear();
00065 _ptrs.push_back(const_cast<unsigned char*>(psipdata()) + 2);
00066 for (uint i = 0; i < EventCount(); i++)
00067 _ptrs.push_back(_ptrs[i] + 12 + TitleLength(i) + DescriptorsLength(i));
00068 }
00069
00070 QString MasterGuideTable::toString(void) const
00071 {
00072 QString str;
00073 str.append(QString("MGT: tables(%1)\n").arg(TableCount()));
00074 for (uint i = 0; i < TableCount(); i++)
00075 {
00076 str.append(QString("Table #%1 ").arg(i, 2, 10));
00077 str.append(QString("pid(0x%1) ver(%2) ")
00078 .arg(TablePID(i), 0, 16).arg(TableVersion(i), 2, 10));
00079 str.append(QString("size(%1) desc_len(%2) type: %4 %3 \n")
00080 .arg(TableDescriptorsBytes(i), 4, 10)
00081 .arg(TableDescriptorsLength(i))
00082 .arg(TableClassString(i)).arg(TableType(i)));
00083 if (0 != TableDescriptorsLength(i))
00084 {
00085 vector<const unsigned char*> desc =
00086 MPEGDescriptor::Parse(TableDescriptors(i),
00087 TableDescriptorsLength(i));
00088 for (uint i = 0; i < desc.size(); i++)
00089 str.append(QString(" %1\n")
00090 .arg(MPEGDescriptor(desc[i]).toString()));
00091 }
00092 }
00093 if (0 != GlobalDescriptorsLength())
00094 {
00095 str.append(QString("Global descriptors length: %1\n")
00096 .arg(GlobalDescriptorsLength()));
00097 vector<const unsigned char*> desc =
00098 MPEGDescriptor::Parse(GlobalDescriptors(),
00099 GlobalDescriptorsLength());
00100 for (uint i = 0; i < desc.size(); i++)
00101 str.append(QString(" %1\n")
00102 .arg(MPEGDescriptor(desc[i]).toString()));
00103 }
00104 return str;
00105 }
00106
00107 QString TerrestrialVirtualChannelTable::toString(int chan) const
00108 {
00109 static QString modnames[6] =
00110 {
00111 QObject::tr("[Reserved]"), QObject::tr("Analog"),
00112 QObject::tr("SCTE mode 1"), QObject::tr("SCTE mode 2"),
00113 QObject::tr("ATSC 8-VSB"), QObject::tr("ATSC 16-VSB"),
00114 };
00115
00116 QString str;
00117 str.append(QString("Channel #%1 ").arg(chan));
00118 str.append(QString("name(%1) %2-%3 ").arg(ShortChannelName(chan))
00119 .arg(MajorChannel(chan)).arg(MinorChannel(chan)));
00120
00121 if (ModulationMode(chan) > 5)
00122 str.append(QString("mod(UNKNOWN %1) ").arg(ModulationMode(chan)));
00123 else
00124 str.append(QString("mod(%1) ")
00125 .arg(modnames[ModulationMode(chan)]));
00126
00127 str.append(QString("cTSID(0x%1)\n")
00128 .arg(ChannelTransportStreamID(chan), 0, 16));
00129 str.append(QString(" pnum(%1) ").arg(ProgramNumber(chan)));
00130 str.append(QString("ETM_loc(%1) ").arg(ETMlocation(chan)));
00131 str.append(QString("access_ctrl(%1) ").arg(IsAccessControlled(chan)));
00132 str.append(QString("hidden(%1) ").arg(IsHidden(chan)));
00133 str.append(QString("hide_guide(%1) ").arg(IsHiddenInGuide(chan)));
00134 str.append(QString("service_type(%1) ").arg(ServiceType(chan)));
00135 str.append(QString("source_id(%1)\n").arg(SourceID(chan)));
00136 if (0!=DescriptorsLength(chan))
00137 {
00138 str.append(QString(" descriptors length(%1) ")
00139 .arg(DescriptorsLength(chan)));
00140 vector<const unsigned char*> desc =
00141 MPEGDescriptor::Parse(Descriptors(chan), DescriptorsLength(chan));
00142 str.append(QString("count(%1)\n").arg(desc.size()));
00143 for (uint i = 0; i < desc.size(); i++)
00144 str.append(QString(" %1\n")
00145 .arg(MPEGDescriptor(desc[i]).toString()));
00146 }
00147 return str;
00148 }
00149
00150 QString TerrestrialVirtualChannelTable::toString(void) const
00151 {
00152 QString str;
00153 str.append(QString("VCT Terra: channels(%1) tsid(0x%2) ")
00154 .arg(ChannelCount()).arg(TransportStreamID(), 0, 16));
00155 str.append(QString("seclength(%3)\n").arg(Length()));
00156 for (uint i = 0; i < ChannelCount(); i++)
00157 {
00158 str.append(toString(i)).append("\n");
00159 }
00160 if (0!=GlobalDescriptorsLength())
00161 {
00162 str.append(QString("global descriptors length: %1\n")
00163 .arg(GlobalDescriptorsLength()));
00164 vector<const unsigned char*> desc =
00165 MPEGDescriptor::Parse(GlobalDescriptors(),
00166 GlobalDescriptorsLength());
00167 str.append(QString("global descriptors count: %1\n").arg(desc.size()));
00168 for (uint i = 0; i < desc.size(); i++)
00169 str.append(QString(" %1\n")
00170 .arg(MPEGDescriptor(desc[i]).toString()));
00171 }
00172 return str;
00173 }
00174
00175 QString CableVirtualChannelTable::toString(int chan) const
00176 {
00177 static QString modnames[6] =
00178 {
00179 QObject::tr("[Reserved]"), QObject::tr("Analog"),
00180 QObject::tr("SCTE mode 1"), QObject::tr("SCTE mode 2"),
00181 QObject::tr("ATSC 8-VSB"), QObject::tr("ATSC 16-VSB"),
00182 };
00183
00184 QString str;
00185 str.append(QString("Channel #%1 ").arg(chan));
00186 str.append(QString("name(%1) %2-%3 ").arg(ShortChannelName(chan))
00187 .arg(MajorChannel(chan)).arg(MinorChannel(chan)));
00188
00189 if (ModulationMode(chan) > 5)
00190 str.append(QString("mod(UNKNOWN %1) ").arg(ModulationMode(chan)));
00191 else
00192 str.append(QString("mod(%1) ").arg(modnames[ModulationMode(chan)]));
00193
00194 str.append(QString("cTSID(0x%1)\n")
00195 .arg(ChannelTransportStreamID(chan), 0, 16));
00196 str.append(QString(" pnum(%1) ").arg(ProgramNumber(chan)));
00197 str.append(QString("ETM_loc(%1) ").arg(ETMlocation(chan)));
00198 str.append(QString("access_ctrl(%1) ").arg(IsAccessControlled(chan)));
00199 str.append(QString("hidden(%1)\n").arg(IsHidden(chan)));
00200
00201 str.append(QString("path_select(%1) ").arg(IsPathSelect(chan)));
00202 str.append(QString("out_of_band(%1) ").arg(IsOutOfBand(chan)));
00203
00204 str.append(QString("hide_guide(%1) ").arg(IsHiddenInGuide(chan)));
00205 str.append(QString("service_type(%1) ").arg(ServiceType(chan)));
00206 str.append(QString("source_id(%1)\n").arg(SourceID(chan)));
00207 if (0 != DescriptorsLength(chan))
00208 {
00209 str.append(QString(" descriptors length(%1) ")
00210 .arg(DescriptorsLength(chan)));
00211 vector<const unsigned char*> desc =
00212 MPEGDescriptor::Parse(Descriptors(chan), DescriptorsLength(chan));
00213 str.append(QString("count(%1)\n").arg(desc.size()));
00214 for (uint i = 0; i < desc.size(); i++)
00215 str.append(QString(" %1\n")
00216 .arg(MPEGDescriptor(desc[i]).toString()));
00217 }
00218 return str;
00219 }
00220
00221 QString CableVirtualChannelTable::toString(void) const
00222 {
00223 QString str;
00224 str.append(QString("VCT Cable: channels(%1) tsid(0x%2) ")
00225 .arg(ChannelCount()).arg(TransportStreamID(), 0, 16));
00226 str.append(QString("seclength(%3)\n").arg(Length()));
00227 for (uint i = 0; i < ChannelCount(); i++)
00228 {
00229 str.append(toString(i)).append("\n");
00230 }
00231 if (0 != GlobalDescriptorsLength())
00232 {
00233 str.append(QString("global descriptors length: %1\n")
00234 .arg(GlobalDescriptorsLength()));
00235 vector<const unsigned char*> desc =
00236 MPEGDescriptor::Parse(GlobalDescriptors(),
00237 GlobalDescriptorsLength());
00238 str.append(QString("global descriptors count: %1\n").arg(desc.size()));
00239 for (uint i = 0; i < desc.size(); i++)
00240 {
00241 str.append(QString(" %1\n")
00242 .arg(MPEGDescriptor(desc[i]).toString()));
00243 }
00244 }
00245 return str;
00246 }
00247
00248 QString EventInformationTable::toString(void) const
00249 {
00250 QString str;
00251 str.append(QString("Event Information Table\n"));
00252 str.append(((PSIPTable*)(this))->toString());
00253 str.append(QString(" pid(0x%1) sourceID(%2) eventCount(%3)\n")
00254 .arg(tsheader()->PID()).arg(SourceID()).arg(EventCount()));
00255 for (uint i = 0; i < EventCount(); i++)
00256 {
00257 str.append(QString(" Event #%1 ID(%2) start_time(%3) length(%4 sec)\n")
00258 .arg(i,2,10).arg(EventID(i))
00259 .arg(StartTimeGPS(i).toString(Qt::LocalDate))
00260 .arg(LengthInSeconds(i)));
00261 str.append(QString(" ETM_loc(%1) Title(%2)\n").
00262 arg(ETMLocation(i)).arg(title(i).toString()));
00263 if (0 != DescriptorsLength(i))
00264 {
00265 vector<const unsigned char*> desc =
00266 MPEGDescriptor::Parse(Descriptors(i), DescriptorsLength(i));
00267 for (uint j=0; j<desc.size(); j++)
00268 str.append(QString("%1\n")
00269 .arg(MPEGDescriptor(desc[j]).toString()));
00270 }
00271 }
00272 return str;
00273 }
00274
00275 QString ExtendedTextTable::toString(void) const
00276 {
00277 QString str =
00278 QString("Extended Text Table -- sourceID(%1) eventID(%2) "
00279 "ettID(%3) isChannelETM(%4) isEventETM(%5)\n%6")
00280 .arg(SourceID()).arg(EventID()).arg(ExtendedTextTableID())
00281 .arg(IsChannelETM()).arg(IsEventETM())
00282 .arg(ExtendedTextMessage().toString());
00283 return str;
00284 }
00285
00286 int VirtualChannelTable::Find(int major, int minor) const
00287 {
00288 if (major>0)
00289 {
00290 for (uint i = 0; i < ChannelCount(); i++)
00291 {
00292 if ((MajorChannel(i) == (uint)major) &&
00293 (MinorChannel(i) == (uint)minor))
00294 return (int)i;
00295 }
00296 }
00297 else if (minor>0)
00298 {
00299 for (uint i = 0; i < ChannelCount(); i++)
00300 {
00301 if (MinorChannel(i) == (uint)minor)
00302 return (int)i;
00303 }
00304 }
00305 return -1;
00306 }
00307
00308 QString VirtualChannelTable::GetExtendedChannelName(uint i) const
00309 {
00310 if ((i >= ChannelCount()) || DescriptorsLength(i) == 0)
00311 return QString::null;
00312
00313 vector<const unsigned char*> parsed =
00314 MPEGDescriptor::Parse(Descriptors(i), DescriptorsLength(i));
00315
00316 const unsigned char* desc =
00317 MPEGDescriptor::Find(parsed, DescriptorID::extended_channel_name);
00318
00319 if (!desc)
00320 return QString::null;
00321
00322 return ExtendedChannelNameDescriptor(desc).LongChannelNameString();
00323 }