void EventInformationTable::Parse(void) const { _ptrs.clear(); _ptrs.push_back(const_cast<unsigned char*>(psipdata()) + 2); for (uint i = 0; i < EventCount(); i++) _ptrs.push_back(_ptrs[i] + 12 + TitleLength(i) + DescriptorsLength(i)); }
void MasterGuideTable::Parse(void) const { _ptrs.clear(); _ptrs.push_back(const_cast<unsigned char*>(psipdata()) + 3); for (uint i = 0; i < TableCount(); i++) _ptrs.push_back(_ptrs[i] + 11 + TableDescriptorsLength(i)); }
void VirtualChannelTable::Parse(void) const { _ptrs.clear(); _ptrs.push_back(const_cast<unsigned char*>(psipdata()) + 2); for (uint i = 0; i < ChannelCount(); i++) _ptrs.push_back(_ptrs[i] + 32 + DescriptorsLength(i)); }
bool PSIPTable::VerifyPSIP(bool verify_crc) const { if (verify_crc && (CalcCRC() != CRC())) { LOG(VB_SIPARSER, LOG_ERR, QString("PSIPTable: Failed CRC check 0x%1 != 0x%2 " "for StreamID = 0x%3") .arg(CRC(),0,16).arg(CalcCRC(),0,16).arg(StreamID(),0,16)); return false; } unsigned char *bufend = _fullbuffer + _allocSize; if ((_pesdata + 2) >= bufend) return false; // can't query length if (psipdata() >= bufend) return false; // data outside buffer if (TableID::PAT == TableID()) { uint pcnt = (SectionLength() - PSIP_OFFSET - 2) >> 2; bool ok = (psipdata() + (pcnt << 2) + 3 < bufend); if (!ok) { LOG(VB_SIPARSER, LOG_ERR, "PSIPTable: PAT: program list extends past end of buffer"); return false; } if ((Length() == 0xfff) && (TableIDExtension() == 0xffff) && (Section() == 0xff) && (LastSection() == 0xff)) { LOG(VB_SIPARSER, LOG_ERR, "PSIPTable: PAT: All values at maximums"); return false; } return true; }