47 const QString &sistandard)
73 if ((reg ==
"DTS1") || (reg ==
"DTS2") || (reg ==
"DTS3"))
240 LOG(VB_SIPARSER, LOG_ERR,
241 QString(
"PSIPTable: Failed CRC check 0x%1 != 0x%2 " 242 "for StreamID = 0x%3")
258 bool ok = (
psipdata() + (pcnt << 2) + 3 < bufend);
261 LOG(VB_SIPARSER, LOG_ERR,
262 "PSIPTable: PAT: program list extends past end of buffer");
269 LOG(VB_SIPARSER, LOG_ERR,
"PSIPTable: PAT: All values at maximums");
280 LOG(VB_SIPARSER, LOG_ERR,
281 "PSIPTable: PMT: can't query program info length");
287 LOG(VB_SIPARSER, LOG_ERR,
288 "PSIPTable: PMT: reported length too large");
293 const unsigned char *proginfo =
psipdata() + 4;
294 const unsigned char *cpos = proginfo + proginfolen;
297 LOG(VB_SIPARSER, LOG_ERR,
298 "PSIPTable: PMT: program info extends past end of buffer");
302 const unsigned char *pos = cpos;
306 const unsigned char *ptr = pos;
307 if (pos + 4 > bufend)
309 LOG(VB_SIPARSER, LOG_ERR,
310 QString(
"PSIPTable: PMT: stream info %1 extends " 311 "past end of buffer").arg(i));
314 pos += 5 + (((ptr[3] << 8) | ptr[4]) & 0x0fff);
318 LOG(VB_SIPARSER, LOG_ERR,
319 QString(
"PSIPTable: PMT: last stream info %1 extends " 320 "past end of buffer").arg(i));
348 const vector<uint>& pnum,
const vector<uint>& pid)
350 const uint count = min(pnum.size(), pid.size());
352 pat->SetVersionNumber(
version);
353 pat->SetTranportStreamID(tsid);
359 LOG(VB_GENERAL, LOG_ERR,
360 "PAT::Create: Error, old PAT size exceeds maximum PAT size.");
366 for (
uint i = 0; i < count; i++)
369 pat->pesdata()[offset++] = pnum[i]>>8;
370 pat->pesdata()[offset++] = pnum[i] & 0xff;
372 pat->pesdata()[offset++] = ((pid[i]>>8) & 0x1f) | 0xe0;
373 pat->pesdata()[offset++] = pid[i] & 0xff;
408 vector<uint> pids, vector<uint> types)
410 const uint count = min(pids.size(), types.size());
412 pmt->tsheader()->SetPID(basepid);
414 pmt->RemoveAllStreams();
415 pmt->SetProgramNumber(programNumber);
416 pmt->SetPCRPID(pcrpid);
417 pmt->SetVersionNumber(
version);
419 for (
uint i=0; i<count; i++)
420 pmt->AppendStream(pids[i], types[i]);
429 const vector<uint> &pids,
430 const vector<uint> &types,
431 const vector<desc_list_t> &prog_desc)
433 const uint count = min(pids.size(), types.size());
435 pmt->tsheader()->SetPID(basepid);
437 pmt->RemoveAllStreams();
438 pmt->SetProgramNumber(programNumber);
439 pmt->SetPCRPID(pcrpid);
440 pmt->SetVersionNumber(
version);
442 vector<unsigned char> gdesc;
443 for (
uint i=0; i<global_desc.size(); i++)
445 uint len = global_desc[i][1] + 2;
446 gdesc.insert(gdesc.end(), global_desc[i], global_desc[i] + len);
448 pmt->SetProgramInfo(gdesc.data(), gdesc.size());
450 for (
uint i = 0; i < count; i++)
452 vector<unsigned char> pdesc;
453 for (
uint j = 0; j < prog_desc[i].size(); j++)
455 uint len = prog_desc[i][j][1] + 2;
456 pdesc.insert(pdesc.end(),
457 prog_desc[i][j], prog_desc[i][j] + len);
460 pmt->AppendStream(pids[i], types[i], pdesc.data(), pdesc.size());
464 LOG(VB_SIPARSER, LOG_INFO,
"Created PMT \n" + pmt->toString());
473 unsigned char *pos = const_cast<unsigned char*>(cpos);
476 _ptrs.push_back(pos);
479 LOG(VB_SIPARSER, LOG_DEBUG, QString(
"Parsing PMT(0x%1) i(%2) len(%3)")
483 _ptrs.push_back(pos);
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 (
uint i = 0; i < descs.size(); i++)
582 LOG(VB_GENERAL, LOG_INFO,
"DTVsm: " + cad.
toString());
586 return encrypted != 0;
600 QMap<uint,uint> encryption_system;
601 for (
uint j = 0; j < descs.size(); j++)
608 LOG(VB_GENERAL, LOG_INFO,
"DTVsm: " + cad.
toString());
612 return encrypted != 0;
617 static const unsigned char STILL_PICTURE_FLAG = 0x01;
641 const QString &sistandard)
const 678 const QString &sistandard,
679 bool normalize)
const 681 uint pids_start = pids.size();
714 for (
uint i = pids_start; i < pids.size(); i++)
730 uint pid = desired_pid;
757 str.append(QString(
" PSIP tableID(0x%1) length(%2) extension(0x%3)\n")
760 str.append(QString(
" version(%1) current(%2) " 761 "section(%3) last_section(%4)\n")
766 str.append(QString(
" atsc_protocol_version(%1)\n")
782 QString str = QString(
783 "table_id=\"0x%1\" length=\"%2\"")
784 .arg(
TableID(), 2, 16, QChar(
'0'))
789 str += QString(
" section=\"%4\" last_section=\"%5\"")
795 str += QString(
"\n%1version=\"%2\" current=\"%3\" " 796 "protocol_version=\"%4\" extension=\"0x%5\"")
809 str.append(QString(
"Program Association Section\n"));
812 str.append(QString(
"programCount(%1)\n").arg(
ProgramCount()));
814 uint cnt0 = 0, cnt1fff = 0;
829 str += QString(
" program number %1 has PID 0x%2\n")
836 str.append(QString(
" also contains %1 dummy programs\n")
837 .arg(cnt0 + cnt1fff));
846 QString indent_1 =
xml_indent(indent_level + 1);
848 QString str = QString(
849 "%1<ProgramAssociationSection tsid=\"0x%2\" program_count=\"%3\"" 860 str += QString(
"%1<Program number=\"%2\" pid=\"0x%3\" %4/>\n")
864 .arg(dummy ?
"comment=\"Dummy Program\" " :
"");
867 return str + indent_0 +
"</ProgramAssociationSection>";
873 QString(
"Program Map Section" 875 " pnum(%2) pid(0x%3) pcrpid(%4)\n")
881 vector<const unsigned char*> desc =
883 for (
uint i = 0; i < desc.size(); i++)
885 str.append(QString(
" %1\n")
891 str.append(QString(
" Stream #%1 pid(0x%2) type(0x%3 %4)\n")
896 for (
uint j = 0; j < desc.size(); j++)
898 str.append(QString(
" %1\n")
908 QString indent_1 =
xml_indent(indent_level + 1);
910 QString str = QString(
911 "%1<ProgramMapSection pcr_pid=\"0x%2\" program_number=\"%3\"\n" 912 "%4program_info_length=\"%5\" stream_count=\"%7\"%8>\n")
921 vector<const unsigned char*> gdesc =
923 for (
uint i = 0; i < gdesc.size(); i++)
931 str += QString(
"%1<Stream pid=\"0x%2\" type=\"0x%3\" " 932 "type_desc=\"%4\" stream_info_length=\"%5\"")
938 vector<const unsigned char*> ldesc =
940 str += (ldesc.empty()) ?
" />\n" :
">\n";
941 for (
uint j = 0; j < ldesc.size(); j++)
947 str += indent_1 +
"</Stream>\n";
950 return str + indent_0 +
"</ProgramMapSection>";
959 return "video-mpeg2";
961 return "video-mpeg1";
963 return "video-mpeg4";
969 return "video-opencable";
977 return "audio-mp2-layer[1,2,3]";
979 return "audio-mp1-layer[1,2,3]";
981 return "audio-aac-latm";
989 return "private-sec";
991 return "private-data";
995 return "dsmcc-a encap";
997 return "dsmcc-b std data";
999 return "dsmcc-c NPD data";
1001 return "dsmcc-d data";
1012 return "extended channel name";
1014 return "service location";
1016 return "time-shifted service";
1018 return "component name";
1030 return "11172-2 MPEG-1 Video";
1032 return "13818-2 MPEG-2 Video";
1034 return "14492-2 MPEG-4 Video";
1036 return "H.264 Video";
1038 return "H.265 Video";
1040 return "OpenCable Video";
1042 return "VC-1 Video";
1046 return "11172-2 MPEG-1 Audio";
1048 return "13818-3 MPEG-2 Audio";
1050 return "13818-7 AAC MPEG-2 Audio";
1052 return "13818-3 AAC LATM MPEG-2 Audio";
1056 return "E-AC3 Audio";
1062 return "13818-1 DSM-CC";
1064 return "13818-6 DSM-CC Type A";
1066 return "13818-6 DSM-CC Type B";
1068 return "13818-6 DSM-CC Type C";
1070 return "13818-6 DSM-CC Type D";
1072 return "13818-6 Download";
1074 return "13818-6 Metadata in PES";
1076 return "13818-6 Metadata in Sections";
1078 return "13818-6 Metadata in Data Carousel";
1080 return "13818-6 Metadata in Obj Carousel";
1082 return "13818-6 Metadata in Download";
1086 return "13818-1 Private Sections";
1088 return "13818-3 Private Data";
1090 return "13522 MHEG";
1092 return "ITU H.222.1";
1094 return "13818-1 Aux & ITU H.222.0";
1096 return "14496-1 SL/FlexMux in PES";
1098 return "14496-1 SL/FlexMux in Sections";
1100 return "13818-10 IPMP";
1102 return "13818-10 IPMP2";
1104 case AnyMask:
return QString();
1156 if (!lang.isEmpty())
1157 desc += QString(
" (%1)").arg(lang);
1165 QString(
"Condiditional Access Section %1")
1168 vector<const unsigned char*> gdesc =
1170 for (
uint i = 0; i < gdesc.size(); i++)
1183 QString(
"%1<ConditionalAccessSection %3")
1187 vector<const unsigned char*> gdesc =
1189 str += (gdesc.empty()) ?
" />\n" :
">\n";
1190 for (
uint i = 0; i < gdesc.size(); i++)
1196 str += indent_0 +
"</ConditionalAccessSection>\n";
1204 return QString(
"splice_time(N/A)");
1206 int64_t abs_pts_time =
PTSTime();
1207 if ((first > 0) && (
last > 0))
1209 int64_t elapsed = abs_pts_time - first;
1210 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1211 QTime abs = QTime(0,0,0,0).addMSecs(elapsed/90);
1213 elapsed = abs_pts_time -
last;
1214 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1215 QTime rel = QTime(0,0,0,0).addMSecs(elapsed/90);
1217 return QString(
"splice_time(pts: %1 abs: %2, rel: +%3)")
1219 .arg(abs.toString(
"hh:mm:ss.zzz"))
1220 .arg(rel.toString(
"hh:mm:ss.zzz"));
1223 return QString(
"splice_time(pts: %1)").arg(abs_pts_time);
1227 uint indent_level, int64_t first, int64_t
last)
const 1232 return indent +
"<SpliceTime />";
1234 int64_t abs_pts_time =
PTSTime();
1239 int64_t elapsed = abs_pts_time - first;
1240 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1241 QTime abs = QTime(0,0,0,0).addMSecs(elapsed/90);
1242 abs_str = QString(
"absolute=\"%1\" ")
1243 .arg(abs.toString(
"hh:mm:ss.zzz"));
1249 int64_t elapsed = abs_pts_time -
last;
1250 elapsed = (elapsed < 0) ? elapsed + 0x1000000000LL : elapsed;
1251 QTime rel = QTime(0,0,0,0).addMSecs(elapsed/90);
1252 rel_str = QString(
"relative=\"+%1\" ")
1253 .arg(rel.toString(
"hh:mm:ss.zzz"));
1256 return QString(
"%1<SpliceTime pts=\"%2\" %3%4/>")
1257 .arg(
indent).arg(abs_pts_time).arg(abs_str).arg(rel_str);
1262 const QString &)
const 1295 const unsigned char *cur =
pesdata() + 15;
1296 for (
uint i = 0; i < splice_count; i++)
1299 bool event_cancel = cur[4] & 0x80;
1302 _ptrs1.push_back(
nullptr);
1306 bool program_slice = cur[5] & 0x40;
1307 uint component_count = cur[6];
1308 _ptrs1.push_back(cur + (program_slice ? 10 : 7 * component_count));
1312 bool duration =
_ptrs0.back()[5] & 0x2;
1323 bool splice_cancel =
pesdata()[18] & 0x80;
1330 bool program_splice =
pesdata()[19] & 0x40;
1331 bool duration =
pesdata()[19] & 0x20;
1332 bool splice_immediate =
pesdata()[19] & 0x10;
1333 const unsigned char *cur =
pesdata() + 20;
1334 if (program_splice && !splice_immediate)
1338 else if (!program_splice)
1342 for (
uint i = 0; i < component_count; i++)
1345 cur += (splice_immediate) ?
1350 _ptrs1.push_back(cur + (duration ? 5 : 0));
1367 case kECB:
return "DES-ECB";
1368 case kCBC:
return "DES-CBC";
1369 case k3DES:
return "3DES";
1371 return QString((alg<32) ?
"Reserved(%1)" :
"Private(%1)").arg(alg);
1383 return "SpliceSchedule";
1385 return "SpliceInsert";
1387 return "TimeSignal";
1389 return "BandwidthReservation";
1393 return QString(
"Reserved(%1)").arg(
type);
1400 QString(
"SpliceInformationSection enc_alg(%1) pts_adj(%2)")
1404 str += QString(
" command_len(%1) command_type(%2) scte_pid(0x%3)")
1431 QString(
"eventid(0x%1) cancel(%2) " 1432 "out_of_network(%3) program_splice(%4) " 1433 "duration(%5) immediate(%6)\n ")
1444 str += QString(
" unique_program_id(%1)")
1447 str += QString(
" avail(%1/%2)")
1454 uint indent_level, int64_t first, int64_t
last)
const 1458 QString cap_time =
"";
1461 cap_time = QString(
"pts=\"%1\" ").arg(first);
1464 QTime abs = QTime(0,0,0,0).addMSecs((
last - first)/90);
1465 cap_time += QString(
"capture_time=\"%1\" ")
1466 .arg(abs.toString(
"hh:mm:ss.zzz"));
1470 QString str = QString(
1471 "%1<SpliceInformationSection %2 encryption_algorithm=\"%3\" " 1472 "pts_adjustment=\"%4\" code_word_index=\"%5\" command_type=\"%6\" scte_pid=\"0x%7\" >\n")
1482 return str +
indent +
"</SpliceInformationSection>";
1498 str +=
indent +
"</SpliceInformationSection>";
1503 uint indent_level, int64_t first, int64_t
last)
const 1506 QString indent_1 =
xml_indent(indent_level + 1);
1507 QString str = QString(
1508 "%1<SpliceInsert eventid=\"0x%2\" cancel=\"%3\"\n")
1514 "%1out_of_network=\"%2\" program_splice=\"%3\" duration=\"%4\"\n")
1521 "%1immediate=\"%2\" unique_program_id=\"%3\"\n" 1522 "%4avail_num=\"%5\" avails_expected=\"%6\">\n")
1535 str += indent_0 +
"</SpliceInsert>";
const unsigned char DEFAULT_PMT_HEADER[12]
uint SpliceEventID(void) const
Used to access the data of a Transport Stream packet.
uint AvailNum(void) const
const unsigned char * pesdata() const
static uint Normalize(uint stream_id, const desc_list_t &desc, const QString &sistandard)
const unsigned char * psipdata(void) const
const TSHeader * tsheader() const
const unsigned char DEFAULT_PAT_HEADER[8]
bool IsStillPicture(QString sistandard) const
Returns true iff PMT contains a still-picture video stream.
ISO 13818-3/AMD-1 Audio using LATM syntax.
static TSPacket * CreatePayloadOnlyPacket()
ProgramMapTable(const ProgramMapTable &table)
uint ProgramCount(void) const
static const PSIPTable View(const TSPacket &tspacket)
static desc_list_t ParseOnlyInclude(const unsigned char *data, uint len, int descriptorid)
ISO 13818-1 auxiliary & ITU H.222.0.
uint FindUnusedPID(uint desired_pid=0x20)
ProgramAssociationTable(const ProgramAssociationTable &table)
QString toString() const override
unsigned char * _fullbuffer
Pointer to allocated data.
Meta data in PES packets.
uint TableIDExtension(void) const
QString CanonicalLanguageString(void) const
unsigned char * _pesdata
Pointer to PES data in full buffer.
uint SectionLength(void) const
QString toString(void) const override
uint AvailsExpected(void) const
bool IsOutOfNetwork(void) const
static bool IsAudio(uint type)
Returns true iff audio is MPEG1/2, AAC, AC3 or DTS audio stream.
void SetStreamType(uint i, uint type)
uint ProgramNumber(uint i) const
uint LastSection(void) const
ISO 13818-7 Audio w/ADTS syntax.
static const uint PSIP_OFFSET
ISO 13818-1 private tables & ITU H.222.0.
virtual QString toString(void) const
ISO 13818-6 type C NPT DSMCC Data.
const unsigned char * Descriptors(void) const
bool IsAudio(uint i, QString sistandard) const
Returns true iff the stream at index i is an audio stream.
vector< const unsigned char * > desc_list_t
virtual QString toString(int64_t first, int64_t last) const
bool IsCurrent(void) const
uint PCRPID(void) const
stream that contrains program clock reference.
ISO 14496-1 SL/FlexMux in PES packets.
vector< unsigned char * > _ptrs
bool IsSpliceEventCancel(void) const
QString GetLanguage(uint i) const
Returns the cannonical language if we find the iso639 descriptor.
static const unsigned int kPayloadSize
static const uint pmt_header
uint UniqueProgramID(void) const
static bool IsVideo(uint type)
Returns true iff video is an MPEG1/2/3, H264 or open cable video stream.
Meta data in metadata_section's.
uint StreamInfoLength(uint i) const
uint StreamType(uint i) const
static ProgramAssociationTable * Create(uint tsid, uint version, const vector< uint > &pnum, const vector< uint > &pid)
void SetTotalLength(uint len)
static ProgramMapTable * Create(uint programNumber, uint basepid, uint pcrpid, uint version, vector< uint > pids, vector< uint > types)
A PSIP table is a variant of a PES packet containing an MPEG, ATSC or DVB table.
ISO 13818-1 PES private data & ITU H.222.0.
uint StreamPID(uint i) const
bool IsProgramSplice(void) const
QString toStringXML(uint indent_level) const override
ISO 13818-6 Metadata in Download Protocol.
virtual QString toStringXML(uint indent_level, int64_t first, int64_t last) const
uint StreamCount(void) const
const unsigned char * StreamInfo(uint i) const
SpliceTimeView SpliceTime(void) const
SMPTE 421M video codec (aka VC1) in Blu-Ray.
static const uint16_t * d
QString toStringXML(uint indent_level) const override
static ProgramAssociationTable * CreateBlank(bool smallPacket=true)
ISO 23008-2 & ITU H.265 (aka HEVC, Ultra HD)
uint _allocSize
Total number of bytes we allocated.
static const uint len_for_alloc[]
uint SystemID(void) const
uint GetAudioType(uint i) const
Returns the audio type from the iso 639 descriptor.
uint FindPIDs(uint type, vector< uint > &pids, const QString &sistandard) const
Finds all pids matching type.
uint DescriptorsLength(void) const
ISO 14496-1 SL/FlexMux in 14496_sections.
static QString indent(uint level)
ISO 13818-10 Digital Restrictions Mangment.
void SetStreamProgramInfo(uint i, unsigned char *streamInfo, uint infoLength)
bool IsTimeSpecified(void) const
The Program Association Table lists all the programs in a stream, and is always found on PID 0.
static const unsigned char * Find(const desc_list_t &parsed, uint desc_tag)
uint TransportStreamID(void) const
ISO 13818-6 type D Any DSMCC Data.
QString toString(void) const override
void SetStreamPID(uint i, uint pid)
bool IsDuration(void) const
QString StreamTypeString(uint i) const
Returns a string representation of type at stream index i.
QString FormatIdentifierString(void) const
ISO 13818-6 Metadata in Object Carousel.
ISO 14492-10 & ITU H.264 (aka MPEG-4-AVC)
ISO 13818-6 Download Protocol.
#define LOG(_MASK_, _LEVEL_, _STRING_)
virtual QString toString(int64_t first, int64_t last) const
int FindPID(uint pid) const
Locates stream index of pid.
bool VerifyPSIP(bool verify_crc) const
QString toString(void) const override
static QString GetDescription(uint streamID)
static ProgramMapTable * CreateBlank(bool smallPacket=true)
QString XMLValues(uint indent_level) const
uint ProgramNumber(void) const
ISO 13818-1 Annex A DSM-CC & ITU H.222.0.
ISO 13818-6 Metadata in Data Carousel.
uint ProgramInfoLength(void) const
static const char * toString(uint streamID)
bool IsSpliceImmediate(void) const
virtual QString toString(void) const
bool IsEncrypted(QString sistandard) const
Returns true iff PMT contains CA descriptor for a vid/aud stream.
QString StreamDescription(uint i, QString sistandard) const
Returns a better (and more expensive) string representation of type at stream index i than StreamType...
uint64_t PTSTime(void) const
ISO 13818-10 Digital Restrictions Mangment.
static QString xml_bool_to_string(bool val)
bool HasSectionNumber(void) const
The all-ones PID value 0x1FFF indicates a Null TS Packet introduced to maintain a constant bit rate o...
QString LanguageString(void) const
uint ATSCProtocolVersion(void) const
void AppendStream(uint pid, uint type, unsigned char *si=nullptr, uint il=0)
ISO 13818-2 & ITU H.262 (aka MPEG-2)
virtual QString toStringXML(uint indent_level) const
Returns XML representation of string the TS Reader XML format.
ISO 13818-6 type A Multi-protocol Encap.
bool HasCRC(void) const override
1 bit Cyclic Redundancy Check present
virtual QString toStringXML(uint indent_level) const
A PMT table maps a program described in the ProgramAssociationTable to various PID's which describe t...
static desc_list_t Parse(const unsigned char *data, uint len)
bool IsVideo(uint i, QString sistandard) const
Returns true iff the stream at index i is a video stream.
bool IsStreamEncrypted(uint pid) const
Returns true iff PMT contains CA descriptor.
const unsigned char * ProgramInfo(void) const
QString toStringXML(uint indent_level) const override
ISO 13818-6 type B Std DSMCC Data.
QString xml_indent(uint level)
virtual QString toStringXML(uint indent_level, int64_t first, int64_t last) const
bool IsProgramEncrypted(void) const
Returns true iff PMT's ProgramInfo contains CA descriptor.
uint ProgramPID(uint i) const