jcodec: BufferOverflowException with random pixel colors

JCodec version: most recent commit (790187004ba801a98743a52fb40e02b8a22be712)

Minimal (non)working example:

import java.io.File;
import java.io.IOException;
import java.util.Random;

import org.jcodec.api.SequenceEncoder8Bit;
import org.jcodec.common.model.ColorSpace;
import org.jcodec.common.model.Picture8Bit;


public class CrashTest
{
    public static void main(String[] args) throws IOException
    {
        final SequenceEncoder8Bit seqEncoder = SequenceEncoder8Bit
                .createSequenceEncoder8Bit(new File("out.mp4"), 30);

        final Picture8Bit pic = Picture8Bit.create(1920, 1080, ColorSpace.RGB);

        byte[] picData = pic.getPlaneData(0);
        new Random().nextBytes(picData);

        seqEncoder.encodeNativeFrame(pic);

        seqEncoder.finish();
    }
}

Which results in:

Exception in thread "main" java.nio.BufferOverflowException
	at java.nio.Buffer.nextPutIndex(Buffer.java:521)
	at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:169)
	at org.jcodec.common.io.BitWriter.putInt(BitWriter.java:43)
	at org.jcodec.common.io.BitWriter.writeNBit(BitWriter.java:66)
	at org.jcodec.codecs.h264.io.CAVLC.writeLevels(CAVLC.java:125)
	at org.jcodec.codecs.h264.io.CAVLC.writeBlockGen(CAVLC.java:100)
	at org.jcodec.codecs.h264.io.CAVLC.writeACBlock(CAVLC.java:52)
	at org.jcodec.codecs.h264.encode.MBEncoderI16x16.writeAC(MBEncoderI16x16.java:157)
	at org.jcodec.codecs.h264.encode.MBEncoderI16x16.chromaResidual(MBEncoderI16x16.java:88)
	at org.jcodec.codecs.h264.encode.MBEncoderI16x16.chroma(MBEncoderI16x16.java:69)
	at org.jcodec.codecs.h264.encode.MBEncoderI16x16.encodeMacroblock(MBEncoderI16x16.java:49)
	at org.jcodec.codecs.h264.H264Encoder.encodeMacroblock(H264Encoder.java:295)
	at org.jcodec.codecs.h264.H264Encoder.encodeSlice(H264Encoder.java:276)
	at org.jcodec.codecs.h264.H264Encoder.doEncodeFrame8Bit(H264Encoder.java:167)
	at org.jcodec.codecs.h264.H264Encoder.encodeFrame8Bit(H264Encoder.java:103)
	at org.jcodec.api.SequenceEncoder8Bit.encodeNativeFrame(SequenceEncoder8Bit.java:101)
	at CrashTest.main(CrashTest.java:22)

About this issue

  • Original URL
  • State: open
  • Created 7 years ago
  • Comments: 19 (5 by maintainers)

Most upvoted comments

Fixed in cfcc80f1744f6f43033eb8a99ffa64d832a3ce5d

I managed to fix the problem. https://github.com/jcodec/jcodec/blob/master/src/main/java/org/jcodec/codecs/h264/H264Encoder.java#L241 I increased the buffer size by a factor of four works just fine now.