package org.jcodec.codecs.h264.io.model; import static org.jcodec.codecs.h264.io.write.CAVLCWriter.writeTrailingBits; import org.jcodec.common.io.BitWriter; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * Supplementary Enhanced Information entity of H264 bitstream * * capable to serialize and deserialize with CAVLC bitstream * * @author The JCodec project * */ public class SEI { public static class SEIMessage { public int payloadType; public int payloadSize; public byte[] payload; public SEIMessage(int payloadType2, int payloadSize2, byte[] payload2) { this.payload = payload2; this.payloadType = payloadType2; this.payloadSize = payloadSize2; } } public SEIMessage[] messages; public SEI(SEIMessage[] messages) { this.messages = messages; } public static SEI read(ByteBuffer is) { List<SEIMessage> messages = new ArrayList<SEIMessage>(); SEIMessage msg; do { msg = sei_message(is); if (msg != null) messages.add(msg); } while (msg != null); return new SEI((SEIMessage[]) messages.toArray(new SEIMessage[] {})); } private static SEIMessage sei_message(ByteBuffer is) { int payloadType = 0; int b = 0; while (is.hasRemaining() && ( b = (is.get() & 0xff)) == 0xff) { payloadType += 255; } if (!is.hasRemaining()) return null; payloadType += b; int payloadSize = 0; while (is.hasRemaining() && (b = (is.get() & 0xff)) == 0xff) { payloadSize += 255; } if (!is.hasRemaining()) return null; payloadSize += b; byte[] payload = sei_payload(payloadType, payloadSize, is); if (payload.length != payloadSize) return null; return new SEIMessage(payloadType, payloadSize, payload); } private static byte[] sei_payload(int payloadType, int payloadSize, ByteBuffer is) { byte[] res = new byte[payloadSize]; is.get(res); return res; } public void write(ByteBuffer out) { BitWriter writer = new BitWriter(out); // TODO Auto-generated method stub writeTrailingBits(writer); } }