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); } } }
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; }