Go to the documentation of this file.
48 const QString &sistandard)
74 if ((reg ==
"DTS1") || (reg ==
"DTS2") || (reg ==
"DTS3"))
241 LOG(VB_SIPARSER, LOG_ERR,
242 QString(
"PSIPTable: Failed CRC check 0x%1 != 0x%2 "
243 "for TableID = 0x%3")
259 bool ok = (
psipdata() + (pcnt << 2) + 3 < bufend);
262 LOG(VB_SIPARSER, LOG_ERR,
263 "PSIPTable: PAT: program list extends past end of buffer");
270 LOG(VB_SIPARSER, LOG_ERR,
"PSIPTable: PAT: All values at maximums");
281 LOG(VB_SIPARSER, LOG_ERR,
282 "PSIPTable: PMT: can't query program info length");
288 LOG(VB_SIPARSER, LOG_ERR,
289 "PSIPTable: PMT: reported length too large");
294 const unsigned char *proginfo =
psipdata() + 4;
295 const unsigned char *cpos = proginfo + proginfolen;
298 LOG(VB_SIPARSER, LOG_ERR,
299 "PSIPTable: PMT: program info extends past end of buffer");
303 const unsigned char *pos = cpos;
307 const unsigned char *ptr = pos;
308 if (pos + 4 > bufend)
310 LOG(VB_SIPARSER, LOG_ERR,
311 QString(
"PSIPTable: PMT: stream info %1 extends "
312 "past end of buffer").arg(i));
315 pos += 5 + (((ptr[3] << 8) | ptr[4]) & 0x0fff);
319 LOG(VB_SIPARSER, LOG_ERR,
320 QString(
"PSIPTable: PMT: last stream info %1 extends "
321 "past end of buffer").arg(i));
349 const std::vector<uint>& pnum,
const std::vector<uint>& pid)
351 const uint count = std::min(pnum.size(), pid.size());
360 LOG(VB_GENERAL, LOG_ERR,
361 "PAT::Create: Error, old PAT size exceeds maximum PAT size.");
367 for (
uint i = 0; i < count; i++)
370 pat->
pesdata()[offset++] = pnum[i]>>8;
371 pat->
pesdata()[offset++] = pnum[i] & 0xff;
373 pat->
pesdata()[offset++] = ((pid[i]>>8) & 0x1f) | 0xe0;
374 pat->
pesdata()[offset++] = pid[i] & 0xff;
409 std::vector<uint> pids, std::vector<uint>
types)
411 const uint count = std::min(pids.size(),
types.size());
420 for (
uint i=0; i<count; i++)
430 const std::vector<uint> &pids,
431 const std::vector<uint> &
types,
432 const std::vector<desc_list_t> &prog_desc)
434 const uint count = std::min(pids.size(),
types.size());
443 std::vector<unsigned char> gdesc;
444 for (
const auto *gd : global_desc)
446 uint len = gd[1] + 2;
447 gdesc.insert(gdesc.end(), gd, gd + len);
451 for (
uint i = 0; i < count; i++)
453 std::vector<unsigned char> pdesc;
454 for (
const auto *pd : prog_desc[i])
456 uint len = pd[1] + 2;
457 pdesc.insert(pdesc.end(), pd, pd + len);
464 LOG(VB_SIPARSER, LOG_INFO,
"Created PMT \n" + pmt->
toString());
473 auto *pos =
const_cast<unsigned char*
>(cpos);
479 LOG(VB_SIPARSER, LOG_DEBUG, QString(
"Parsing PMT(0x%1) i(%2) len(%3)")
485 LOG(VB_SIPARSER, LOG_DEBUG, QString(
"Parsed PMT(0x%1)\n%2")
486 .arg((uint64_t)
this, 0, 16) .arg(
toString()));
492 unsigned char* streamInfo,
uint infoLength)
574 QMap<uint,uint> encryption_system;
575 for (
auto & desc : descs)
584 LOG(VB_GENERAL, LOG_INFO,
"DTVsm: " + cad.
toString());
588 return encrypted != 0;
602 QMap<uint,uint> encryption_system;
603 for (
auto & desc : descs)
611 LOG(VB_GENERAL, LOG_INFO,
"DTVsm: " + cad.
toString());
615 return encrypted != 0;
620 static constexpr
unsigned char kStillPictureFlag = 0x01;
628 ((
StreamInfo(i)[2] & kStillPictureFlag) != 0);
644 std::vector<uint> &pids,
645 const QString &sistandard)
const
680 std::vector<uint> &pids,
681 std::vector<uint> &
types,
682 const QString &sistandard,
683 bool normalize)
const
685 uint pids_start = pids.size();
724 for (
size_t i = pids_start; i < pids.size(); i++)
740 uint pid = desired_pid;
767 str.append(QString(
" PSIP tableID(0x%1) length(%2) extension(0x%3)\n")
770 str.append(QString(
" version(%1) current(%2) "
771 "section(%3) last_section(%4)\n")
776 str.append(QString(
" atsc_protocol_version(%1)\n")
792 QString str = QString(
793 R
"(table_id="0x%1" length="%2")")
794 .arg(TableID(), 2, 16, QChar('0'))
799 str += QString(R
"( section="%4" last_section="%5")")
805 str += QString(
"\n%1version=\"%2\" current=\"%3\" "
806 "protocol_version=\"%4\" extension=\"0x%5\"")
819 str.append(QString(
"Program Association Section\n"));
822 str.append(QString(
"programCount(%1)\n").arg(
ProgramCount()));
840 str += QString(
" program number %1 has PID 0x%2\n")
847 str.append(QString(
" also contains %1 dummy programs\n")
848 .arg(cnt0 + cnt1fff));
859 QString str = QString(
860 "%1<ProgramAssociationSection tsid=\"0x%2\" program_count=\"%3\""
871 str += QString(
"%1<Program number=\"%2\" pid=\"0x%3\" %4/>\n")
875 .arg(dummy ?
"comment=\"Dummy Program\" " :
"");
878 return str + indent_0 +
"</ProgramAssociationSection>";
884 QString(
"Program Map Section"
886 " pnum(%2) pid(0x%3) pcrpid(0x%4)")
892 std::vector<const unsigned char*> desc =
894 for (
auto &
d : desc)
896 str.append(QString(
"\n %1")
902 str.append(QString(
"\n Stream #%1 pid(0x%2) type(0x%3 %4)")
907 for (
auto &
d : desc)
909 str.append(QString(
"\n %1")
921 QString str = QString(
922 "%1<ProgramMapSection pcr_pid=\"0x%2\" program_number=\"%3\"\n"
923 "%4program_info_length=\"%5\" stream_count=\"%7\"%8>\n")
932 std::vector<const unsigned char*> gdesc =
934 for (
auto & gd : gdesc)
942 str += QString(
"%1<Stream pid=\"0x%2\" type=\"0x%3\" "
943 "type_desc=\"%4\" stream_info_length=\"%5\"")
949 std::vector<const unsigned char*> ldesc =
951 str += (ldesc.empty()) ?
" />\n" :
">\n";
952 for (
auto & ld : ldesc)
958 str += indent_1 +
"</Stream>\n";
961 return str + indent_0 +
"</ProgramMapSection>";
970 return "video-mpeg2";
972 return "video-mpeg1";
974 return "video-mpeg4";
980 return "video-opencable";
988 return "audio-mp2-layer[1,2,3]";
990 return "audio-mp1-layer[1,2,3]";
992 return "audio-aac-latm";
1000 return "private-sec";
1002 return "private-data";
1006 return "dsmcc-a encap";
1008 return "dsmcc-b std data";
1010 return "dsmcc-c NPD data";
1012 return "dsmcc-d data";
1023 return "extended channel name";
1025 return "service location";
1027 return "time-shifted service";
1029 return "component name";
1041 return "11172-2 MPEG-1 Video";
1043 return "13818-2 MPEG-2 Video";
1045 return "14492-2 MPEG-4 Video";
1047 return "H.264 Video";
1049 return "H.265 Video";
1051 return "OpenCable Video";
1053 return "VC-1 Video";
1057 return "11172-2 MPEG-1 Audio";
1059 return "13818-3 MPEG-2 Audio";
1061 return "13818-7 AAC MPEG-2 Audio";
1063 return "13818-3 AAC LATM MPEG-2 Audio";
1067 return "E-AC3 Audio";
1073 return "13818-1 DSM-CC";
1075 return "13818-6 DSM-CC Type A";
1077 return "13818-6 DSM-CC Type B";
1079 return "13818-6 DSM-CC Type C";
1081 return "13818-6 DSM-CC Type D";
1083 return "13818-6 Download";
1085 return "13818-6 Metadata in PES";
1087 return "13818-6 Metadata in Sections";
1089 return "13818-6 Metadata in Data Carousel";
1091 return "13818-6 Metadata in Obj Carousel";
1093 return "13818-6 Metadata in Download";
1097 return "13818-1 Private Sections";
1099 return "13818-3 Private Data";
1101 return "13522 MHEG";
1103 return "ITU H.222.1";
1105 return "13818-1 Aux & ITU H.222.0";
1107 return "14496-1 SL/FlexMux in PES";
1109 return "14496-1 SL/FlexMux in Sections";
1111 return "13818-10 IPMP";
1113 return "13818-10 IPMP2";
1171 if (!lang.isEmpty())
1172 desc += QString(
" (%1)").arg(lang);
1180 QString(
"Conditional Access Section %1")
1183 std::vector<const unsigned char*> gdesc =
1185 for (
auto & gd : gdesc)
1196 QString(
"%1<ConditionalAccessSection %3")
1200 std::vector<const unsigned char*> gdesc =
1202 str += (gdesc.empty()) ?
" />\n" :
">\n";
1203 for (
auto & gd : gdesc)
1209 str += indent_0 +
"</ConditionalAccessSection>\n";
1217 return {
"splice_time(N/A)"};
1219 int64_t abs_pts_time =
PTSTime();
1220 if ((first > 0) && (last > 0))
1222 int64_t elapsed = abs_pts_time - first;
1223 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1224 QTime abs = QTime(0,0,0,0).addMSecs(elapsed/90);
1226 elapsed = abs_pts_time - last;
1227 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1228 QTime rel = QTime(0,0,0,0).addMSecs(elapsed/90);
1230 return QString(
"splice_time(pts: %1 abs: %2, rel: +%3)")
1231 .arg(QString::number(abs_pts_time),
1232 abs.toString(
"hh:mm:ss.zzz"),
1233 rel.toString(
"hh:mm:ss.zzz"));
1236 return QString(
"splice_time(pts: %1)").arg(abs_pts_time);
1240 uint indent_level, int64_t first, int64_t last)
const
1245 return indent +
"<SpliceTime />";
1247 int64_t abs_pts_time =
PTSTime();
1252 int64_t elapsed = abs_pts_time - first;
1253 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1254 QTime abs = QTime(0,0,0,0).addMSecs(elapsed/90);
1255 abs_str = QString(
"absolute=\"%1\" ")
1256 .arg(abs.toString(
"hh:mm:ss.zzz"));
1262 int64_t elapsed = abs_pts_time - last;
1263 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1264 QTime rel = QTime(0,0,0,0).addMSecs(elapsed/90);
1265 rel_str = QString(
"relative=\"+%1\" ")
1266 .arg(rel.toString(
"hh:mm:ss.zzz"));
1269 return QString(
"%1<SpliceTime pts=\"%2\" %3%4/>")
1270 .arg(
indent,QString::number(abs_pts_time),abs_str,rel_str);
1308 const unsigned char *cur =
pesdata() + 15;
1309 for (
uint i = 0; i < splice_count; i++)
1312 bool event_cancel = (cur[4] & 0x80) != 0;
1319 bool program_slice = (cur[5] & 0x40) != 0;
1320 uint component_count = cur[6];
1321 m_ptrs1.push_back(cur + (program_slice ? 10 : 7 * component_count));
1325 bool duration = (
m_ptrs0.back()[5] & 0x2) != 0;
1336 bool splice_cancel = (
pesdata()[18] & 0x80) != 0;
1343 bool program_splice = (
pesdata()[19] & 0x40) != 0;
1344 bool duration = (
pesdata()[19] & 0x20) != 0;
1345 bool splice_immediate = (
pesdata()[19] & 0x10) != 0;
1346 const unsigned char *cur =
pesdata() + 20;
1347 if (program_splice && !splice_immediate)
1351 else if (!program_splice)
1355 for (
uint i = 0; i < component_count; i++)
1358 cur += (splice_immediate) ?
1363 m_ptrs1.push_back(cur + (duration ? 5 : 0));
1380 case kECB:
return "DES-ECB";
1381 case kCBC:
return "DES-CBC";
1382 case k3DES:
return "3DES";
1384 return QString((alg<32) ?
"Reserved(%1)" :
"Private(%1)").arg(alg);
1396 return "SpliceSchedule";
1398 return "SpliceInsert";
1400 return "TimeSignal";
1402 return "BandwidthReservation";
1406 return QString(
"Reserved(%1)").arg(
type);
1413 QString(
"SpliceInformationSection enc_alg(%1) pts_adj(%2)")
1417 str += QString(
" command_len(%1) command_type(%2) scte_pid(0x%3)")
1444 QString(
"eventid(0x%1) cancel(%2) "
1445 "out_of_network(%3) program_splice(%4) "
1446 "duration(%5) immediate(%6)\n ")
1457 str += QString(
" unique_program_id(%1)")
1460 str += QString(
" avail(%1/%2)")
1467 uint indent_level, int64_t first, int64_t last)
const
1471 QString cap_time =
"";
1474 cap_time = QString(
"pts=\"%1\" ").arg(first);
1477 QTime abs = QTime(0,0,0,0).addMSecs((last - first)/90);
1478 cap_time += QString(
"capture_time=\"%1\" ")
1479 .arg(abs.toString(
"hh:mm:ss.zzz"));
1483 QString str = QString(
1484 "%1<SpliceInformationSection %2 encryption_algorithm=\"%3\" "
1485 "pts_adjustment=\"%4\" code_word_index=\"%5\" command_type=\"%6\" scte_pid=\"0x%7\" >\n")
1495 return str +
indent +
"</SpliceInformationSection>";
1511 str +=
indent +
"</SpliceInformationSection>";
1516 uint indent_level, int64_t first, int64_t last)
const
1520 QString str = QString(
1521 "%1<SpliceInsert eventid=\"0x%2\" cancel=\"%3\"\n")
1527 "%1out_of_network=\"%2\" program_splice=\"%3\" duration=\"%4\"\n")
1534 "%1immediate=\"%2\" unique_program_id=\"%3\"\n"
1535 "%4avail_num=\"%5\" avails_expected=\"%6\">\n")
1548 str += indent_0 +
"</SpliceInsert>";
@ VC1Video
SMPTE 421M video codec (aka VC1) in Blu-Ray.
const unsigned char * ProgramInfo(void) const
virtual QString toString(void) const
unsigned char * m_pesData
Pointer to PES data in full buffer.
QString toStringXML(uint indent_level) const override
static const std::array< const uint, 4 > len_for_alloc
uint ProgramPID(uint i) const
uint UniqueProgramID(void) const
virtual QString toStringXML(uint indent_level, int64_t first, int64_t last) const
QString CanonicalLanguageString(void) const
@ MetaDataPES
Meta data in PES packets.
uint StreamCount(void) const
@ MPEG2Aux
ISO 13818-1 auxiliary & ITU H.222.0.
SpliceTimeView SpliceTime(void) const
static const uint kPmtHeaderMinOffset
const unsigned char * Descriptors(void) const
@ MPEG2AudioAmd1
ISO 13818-3/AMD-1 Audio using LATM syntax.
bool IsCurrent(void) const
void SetTotalLength(uint len)
void SetProgramInfo(unsigned char *streamInfo, uint infoLength)
const unsigned char * StreamInfo(uint i) const
@ MetaDataSec
Meta data in metadata_section's.
void SetTranportStreamID(uint gtsid)
const unsigned char * pesdata() const
@ MetaDataDL
ISO 13818-6 Metadata in Download Protocol.
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
const TSHeader * tsheader() const
@ DSMCC_C
ISO 13818-6 type C NPT DSMCC Data.
int FindPID(uint pid) const
Locates stream index of pid.
uint PCRPID(void) const
stream that contains program clock reference.
@ MPEG_NULL_PID
The all-ones PID value 0x1FFF indicates a Null TS Packet introduced to maintain a constant bit rate o...
@ DSMCC
ISO 13818-1 Annex A DSM-CC & ITU H.222.0.
bool IsVideo(uint i, const QString &sistandard) const
Returns true iff the stream at index i is a video stream.
uint m_allocSize
Total number of bytes we allocated.
static ProgramMapTable * CreateBlank(bool smallPacket=true)
static const struct wl_interface * types[]
uint ProgramNumber(void) const
QString indentSpaces(unsigned int level, unsigned int size=4)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
@ MPEG2Video
ISO 13818-2 & ITU H.262 (aka MPEG-2)
@ FlexMuxPES
ISO 14496-1 SL/FlexMux in PES packets.
uint ProgramCount(void) const
@ MPEG2IPMP
ISO 13818-10 Digital Restrictions Mangment.
uint ATSCProtocolVersion(void) const
void SetVersionNumber(uint ver)
bool IsEncrypted(const QString &sistandard) const
Returns true iff PMT contains CA descriptor for a vid/aud stream.
static const uint kPsipOffset
QString StreamTypeString(uint i) const
Returns a string representation of type at stream index i.
@ MetaDataOC
ISO 13818-6 Metadata in Object Carousel.
QString FormatIdentifierString(void) const
static bool IsVideo(uint type)
Returns true iff video is an MPEG1/2/3, H264 or open cable video stream.
@ H265Video
ISO 23008-2 & ITU H.265 (aka HEVC, Ultra HD)
uint DescriptorsLength(void) const
@ MPEG1Video
ISO 11172-2 (aka MPEG-1)
@ EAC3Audio
A/53 Part 3:2009 6.7.3.
uint SpliceEventID(void) const
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
static QString GetDescription(uint stream_id)
virtual QString toString(void) const
bool IsStreamEncrypted(uint pid) const
Returns true iff PMT contains CA descriptor.
void RemoveAllStreams(void)
QString StreamDescription(uint i, const QString &sistandard) const
Returns a better (and more expensive) string representation of type at stream index i than StreamType...
bool IsSpliceImmediate(void) const
virtual QString toStringXML(uint indent_level) const
Returns XML representation of string the TS Reader XML format.
uint TransportStreamID(void) const
uint ProgramNumber(uint i) const
static desc_list_t Parse(const unsigned char *data, uint len)
QString toString(void) const override
MBASE_PUBLIC long long copy(QFile &dst, QFile &src, uint block_size=0)
Copies src file to dst file.
uint SystemID(void) const
@ DSMCC_DL
ISO 13818-6 Download Protocol.
bool HasSectionNumber(void) const
static bool IsAudio(uint type)
Returns true iff audio is MPEG1/2, AAC, AC3 or DTS audio stream.
Used to access the data of a Transport Stream packet.
uint StreamType(uint i) const
@ MetaDataDC
ISO 13818-6 Metadata in Data Carousel.
QString toString(void) const override
std::vector< const unsigned char * > desc_list_t
static desc_list_t ParseOnlyInclude(const unsigned char *data, uint len, int excluded_descid)
@ PrivData
ISO 13818-1 PES private data & ITU H.222.0.
@ DSMCC_B
ISO 13818-6 type B Std DSMCC Data.
uint FindUnusedPID(uint desired_pid=0x20) const
QString toString(void) const override
static ProgramAssociationTable * CreateBlank(bool smallPacket=true)
uint AvailsExpected(void) const
virtual QString toStringXML(uint indent_level) const
bool IsOutOfNetwork(void) const
bool IsStillPicture(const QString &sistandard) const
Returns true iff PMT contains a still-picture video stream.
void SetStreamPID(uint i, uint pid)
Contains Packet Identifier numeric values.
@ AC3Audio
A/53 Part 3:2009 6.7.1.
@ MPEG4Video
ISO 14492-2 (aka MPEG-4)
@ H264Video
ISO 14492-10 & ITU H.264 (aka MPEG-4-AVC)
@ DSMCC_A
ISO 13818-6 type A Multi-protocol Encap.
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
static TSPacket * CreatePayloadOnlyPacket(void)
uint LastSection(void) const
uint FindPIDs(uint type, std::vector< uint > &pids, const QString &sistandard) const
Finds all pids matching type.
bool HasCRC(void) const override
1 bit Cyclic Redundancy Check present
bool IsSpliceEventCancel(void) const
bool IsAudio(uint i, const QString &sistandard) const
Returns true iff the stream at index i is an audio stream.
static constexpr unsigned int kPayloadSize
static ProgramMapTable * Create(uint programNumber, uint basepid, uint pcrpid, uint version, std::vector< uint > pids, std::vector< uint > types)
QString LanguageString(void) const
void AppendStream(uint pid, uint type, unsigned char *streamInfo=nullptr, uint infoLength=0)
void SetStreamProgramInfo(uint i, unsigned char *streamInfo, uint infoLength)
bool VerifyPSIP(bool verify_crc) const
uint SectionLength(void) const
uint ProgramInfoLength(void) const
static PSIPTable View(const TSPacket &tspacket)
bool IsProgramSplice(void) const
void SetProgramNumber(uint num)
virtual QString toStringXML(uint indent_level, int64_t first, int64_t last) const
@ MPEG2AACAudio
ISO 13818-7 Audio w/ADTS syntax.
static const char * toString(uint streamID)
ProgramAssociationTable(const ProgramAssociationTable &table)
uint AvailNum(void) const
uint TableIDExtension(void) const
@ Splice
ANSI/SCTE 35 2007.
const std::array< const uint8_t, 8 > DEFAULT_PAT_HEADER
uint64_t PTSTime(void) const
QString toStringXML(uint indent_level) const override
virtual QString toString(int64_t first, int64_t last) const
static ProgramAssociationTable * Create(uint tsid, uint version, const std::vector< uint > &pnum, const std::vector< uint > &pid)
void SetStreamType(uint i, uint type)
@ MPEG2IPMP2
ISO 13818-10 Digital Restrictions Mangment.
@ OpenCableVideo
Always MPEG-2??
QString toString() const override
QString XMLValues(uint indent_level) const
unsigned char * m_fullBuffer
Pointer to allocated data.
uint GetAudioType(uint i) const
Returns the audio type from the iso 639 descriptor.
static const iso6937table * d
std::vector< unsigned char * > m_ptrs
QString toStringXML(uint indent_level) const override
uint StreamInfoLength(uint i) const
static uint Normalize(uint stream_id, const desc_list_t &desc, const QString &sistandard)
static const unsigned char * Find(const desc_list_t &parsed, uint desc_tag)
QString GetLanguage(uint i) const
Returns the canonical language if we find the iso639 descriptor.
static QString indent(uint level)
bool IsTimeSpecified(void) const
QString bool_to_string(bool val)
This is equivalent to QVariant(bool).toString()
bool IsProgramEncrypted(void) const
Returns true iff PMT's ProgramInfo contains CA descriptor.
bool IsDuration(void) const
uint StreamPID(uint i) const
virtual QString toString(int64_t first, int64_t last) const
ProgramMapTable(const ProgramMapTable &table)
@ PrivSec
ISO 13818-1 private tables & ITU H.222.0.
@ FlexMuxSec
ISO 14496-1 SL/FlexMux in 14496_sections.
const std::array< const uint8_t, 12 > DEFAULT_PMT_HEADER
const unsigned char * psipdata(void) const
@ DSMCC_D
ISO 13818-6 type D Any DSMCC Data.