private PictureHeader readHeader(MemoryStream buffer) { PictureHeader ph = null; MemoryStream segment; MemoryStream fork = buffer.duplicate(); while ((segment = MPEGUtil.nextSegment(fork)) != null) { int code = segment.getInt() & 0xff; if (code == MPEGConst.SEQUENCE_HEADER_CODE) { SequenceHeader newSh = SequenceHeader.read(segment); if (sh != null) { newSh.copyExtensions(sh); } sh = newSh; } else if (code == MPEGConst.GROUP_START_CODE) { gh = GOPHeader.read(segment); } else if (code == MPEGConst.PICTURE_START_CODE) { ph = PictureHeader.read(segment); } else if (code == MPEGConst.EXTENSION_START_CODE) { int extType = segment.get(4) >> 4; if (extType == SequenceHeader.Sequence_Extension || extType == SequenceHeader.Sequence_Scalable_Extension || extType == SequenceHeader.Sequence_Display_Extension) { SequenceHeader.readExtension(segment, sh); } else { PictureHeader.readExtension(segment, ph, sh); } } else if (code == MPEGConst.USER_DATA_START_CODE) { // do nothing } else { break; } buffer.position(fork.position()); } return(ph); }
private static SequenceHeader getSequenceHeader(MemoryStream data) { MemoryStream segment = MPEGUtil.nextSegment(data); while (segment != null) { int marker = segment.getInt(); if (marker == (0x100 | MPEGConst.SEQUENCE_HEADER_CODE)) { return(SequenceHeader.read(segment)); } segment = MPEGUtil.nextSegment(data); } return(null); }