package org.jcodec.codecs.h264.io.write;
import org.jcodec.codecs.h264.io.model.NALUnit;
import org.jcodec.common.io.NIOUtils;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class NALUnitWriter {
private final WritableByteChannel to;
private static ByteBuffer _MARKER = ByteBuffer.allocate(4);
static {
_MARKER.putInt(1);
_MARKER.flip();
}
public NALUnitWriter(WritableByteChannel to) {
this.to = to;
}
public void writeUnit(NALUnit nal, ByteBuffer data) throws IOException {
ByteBuffer emprev = ByteBuffer.allocate(data.remaining() + 1024);
NIOUtils.write(emprev, _MARKER);
nal.write(emprev);
emprev(emprev, data);
emprev.flip();
to.write(emprev);
}
private void emprev(ByteBuffer emprev, ByteBuffer data) {
ByteBuffer dd = data.duplicate();
int prev1 = 1, prev2 = 1;
while (dd.hasRemaining()) {
byte b = dd.get();
if (prev1 == 0 && prev2 == 0 && ((b & 0x3) == b)) {
prev2 = prev1;
prev1 = 3;
emprev.put((byte) 3);
}
prev2 = prev1;
prev1 = b;
emprev.put((byte) b);
}
}
}