Example #1
0
	/* 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;
				}
			}
Example #2
0
	/* 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