示例#1
0
文件: cellDmux.cpp 项目: Aishou/rpcs3
PesHeader::PesHeader(DemuxerStream& stream)
	: pts(0xffffffffffffffffull)
	, dts(0xffffffffffffffffull)
	, size(0)
	, new_au(false)
{
	u16 header;
	stream.get(header);
	stream.get(size);
	if (size)
	{
		u8 empty = 0;
		u8 v;
		while (true)
		{
			stream.get(v);
			if (v != 0xFF) break; // skip padding bytes
			empty++;
			if (empty == size) return;
		};

		if ((v & 0xF0) == 0x20 && (size - empty) >= 5) // pts only
		{
			new_au = true;
			pts = stream.get_ts(v);
			stream.skip(size - empty - 5);
		}
		else
		{
			new_au = true;
			if ((v & 0xF0) != 0x30 || (size - empty) < 10)
			{
				cellDmux->Error("PesHeader(): pts not found");
				Emu.Pause();
			}
			pts = stream.get_ts(v);
			stream.get(v);
			if ((v & 0xF0) != 0x10)
			{
				cellDmux->Error("PesHeader(): dts not found");
				Emu.Pause();
			}
			dts = stream.get_ts(v);
			stream.skip(size - empty - 10);
		}
	}
}
示例#2
0
PesHeader::PesHeader(DemuxerStream& stream)
	: pts(CODEC_TS_INVALID)
	, dts(CODEC_TS_INVALID)
	, size(0)
	, has_ts(false)
	, is_ok(false)
{
	u16 header;
	if (!stream.get(header))
	{
		throw EXCEPTION("End of stream (header)");
	}
	if (!stream.get(size))
	{
		throw EXCEPTION("End of stream (size)");
	}
	if (!stream.check(size))
	{
		throw EXCEPTION("End of stream (size=%d)", size);
	}
	
	u8 pos = 0;
	while (pos++ < size)
	{
		u8 v;
		if (!stream.get(v))
		{
			return; // should never occur
		}

		if (v == 0xff) // skip padding bytes
		{
			continue;
		}

		if ((v & 0xf0) == 0x20 && (size - pos) >= 4) // pts only
		{
			pos += 4;
			pts = stream.get_ts(v);
			has_ts = true;
		}
		else if ((v & 0xf0) == 0x30 && (size - pos) >= 9) // pts and dts
		{
			pos += 5;
			pts = stream.get_ts(v);
			stream.get(v);
			has_ts = true;

			if ((v & 0xf0) != 0x10)
			{
				cellDmux.Error("PesHeader(): dts not found (v=0x%x, size=%d, pos=%d)", v, size, pos - 1);
				stream.skip(size - pos);
				return;
			}
			pos += 4;
			dts = stream.get_ts(v);
		}
		else
		{
			cellDmux.Warning("PesHeader(): unknown code (v=0x%x, size=%d, pos=%d)", v, size, pos - 1);
			stream.skip(size - pos);
			pos = size;
			break;
		}
	}

	is_ok = true;
}