/* getPTS extracts a pts value from any PID at a given offset. */ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) { if (m_streaminfo.getPTS(offset, pts) == 0) return 0; // Okay, the cache had it if (m_streaminfo.hasStructure()) { off_t local_offset = offset; unsigned long long data; if (m_streaminfo.getStructureEntryFirst(local_offset, data) == 0) { for(int retries = 8; retries != 0; --retries) { if ((data & 0x1000000) != 0) { pts = data >> 31; if (pts == 0) { // obsolete data that happens to have a '1' there continue; } eDebug("eDVBTSTools::getPTS got it from sc file offset=%llu pts=%llu", local_offset, pts); if (fixed && fixupPTS(local_offset, pts)) { eDebug("But failed to fixup!"); break; } offset = local_offset; return 0; } else { eDebug("No PTS, try next"); } if (m_streaminfo.getStructureEntryNext(local_offset, data, 1) != 0) { eDebug("Cannot find next structure entry"); break; } }
/* getPTS extracts a pts value from any PID at a given offset. */ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) { if (m_use_streaminfo) return m_streaminfo.getPTS(offset, pts); if (!m_file.valid()) return -1; offset -= offset % 188; if (m_file.lseek(offset, SEEK_SET) < 0) { eDebug("lseek failed"); return -1; } int left = m_maxrange; while (left >= 188) { unsigned char packet[188]; if (m_file.read(packet, 188) != 188) { eDebug("read error"); break; } left -= 188; offset += 188; if (packet[0] != 0x47) { eDebug("resync"); int i = 0; while (i < 188) { if (packet[i] == 0x47) break; ++i; } offset = m_file.lseek(i - 188, SEEK_CUR); continue; } int pid = ((packet[1] << 8) | packet[2]) & 0x1FFF; int pusi = !!(packet[1] & 0x40); // printf("PID %04x, PUSI %d\n", pid, pusi); unsigned char *payload; /* check for adaption field */ if (packet[3] & 0x20) { if (packet[4] >= 183) continue; if (packet[4]) { if (packet[5] & 0x10) /* PCR present */ { pts = ((unsigned long long)(packet[ 6]&0xFF)) << 25; pts |= ((unsigned long long)(packet[ 7]&0xFF)) << 17; pts |= ((unsigned long long)(packet[ 8]&0xFE)) << 9; pts |= ((unsigned long long)(packet[ 9]&0xFF)) << 1; pts |= ((unsigned long long)(packet[10]&0x80)) >> 7; offset -= 188; eDebug("PCR found at %llx: %16llx", offset, pts); if (fixed && fixupPTS(offset, pts)) return -1; return 0; } } payload = packet + packet[4] + 4 + 1; } else