package org.jcodec.codecs.mpeg12; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import org.jcodec.codecs.mpeg12.SegmentReader.State; import org.junit.Assert; import org.junit.Test; public class SegmentReaderTest { @Test public void testToNextMarkerPartial1() throws IOException { byte[] bytes = new byte[] { 0, 0, 1, 42, 43, 44, 45, 46, 0, 0, 1, 43 }; for (int i = 0; i < bytes.length + 1; i++) { ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); byte[] outBytes = new byte[i]; SegmentReader reader = new SegmentReader(ch, 1); ByteBuffer out = ByteBuffer.wrap(outBytes); State state = reader.readToNextMarkerPartial(out); Assert.assertEquals(i >= 8 ? State.DONE : State.MORE_DATA, state); byte[] expected = new byte[i]; System.arraycopy(bytes, 0, expected, 0, Math.min(i, 8)); Assert.assertArrayEquals(expected, outBytes); } } @Test public void testToNextMarkerPartial2() throws IOException { byte[] bytes = new byte[] { 0, 0, 1, 42, 43, 44, 45, 46, 0, 0, 1, 43, 52, 54 }; for (int i = 0; i < bytes.length + 1; i++) { ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); byte[] outBytes = new byte[i]; SegmentReader reader = new SegmentReader(ch, 1); ByteBuffer out = ByteBuffer.wrap(outBytes); State state = reader.readToNextMarkerPartial(out); Assert.assertEquals(i >= 8 ? State.DONE : State.MORE_DATA, state); byte[] expected = new byte[i]; System.arraycopy(bytes, 0, expected, 0, Math.min(i, 8)); Assert.assertArrayEquals(expected, outBytes); } } @Test public void testToNextMarkerPartial3() throws IOException { byte[] bytes = new byte[] { 42, 43, 44, 45, 46, 0, 0, 1, 43, 52, 54 }; for (int i = 0; i < 6; i++) { ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); byte[] outBytes = new byte[i]; SegmentReader reader = new SegmentReader(ch, 1); ByteBuffer out = ByteBuffer.wrap(outBytes); State state = reader.readToNextMarkerPartial(out); Assert.assertEquals(i >= 5 ? State.DONE : State.MORE_DATA, state); byte[] expected = new byte[i]; System.arraycopy(bytes, 0, expected, 0, Math.min(i, 5)); Assert.assertArrayEquals(expected, outBytes); } } @Test public void testToNextMarkerPartial4() throws IOException { byte[] bytes = new byte[] { 0, 0, 1, 42, 43, 44, 45, 46, 0, 0, 1, 43, 52, 54 }; for (int i = 0; i < 7; i++) { ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); byte[] outBytes = new byte[i]; SegmentReader reader = new SegmentReader(ch, 1); ByteBuffer out = ByteBuffer.wrap(outBytes); State state = reader.readToNextMarkerPartial(ByteBuffer.allocate(128)); state = reader.readToNextMarkerPartial(out); Assert.assertEquals(i >= 6 ? State.STOP : State.MORE_DATA, state); byte[] expected = new byte[i]; System.arraycopy(bytes, 8, expected, 0, Math.min(i, 6)); Assert.assertArrayEquals(expected, outBytes); } } @Test public void testToNextMarkerPartial5() throws IOException { byte[] bytes = new byte[] { 0, 0, 1, 42, 43, 44, 45, 46, 0, 0, 1, 43, 52, 54, 0, 0, 1 }; for (int i = 0; i < 7; i++) { ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); byte[] outBytes = new byte[i]; SegmentReader reader = new SegmentReader(ch, 1); ByteBuffer out = ByteBuffer.wrap(outBytes); State state = reader.readToNextMarkerPartial(ByteBuffer.allocate(128)); state = reader.readToNextMarkerPartial(out); Assert.assertEquals(i >= 6 ? State.DONE : State.MORE_DATA, state); byte[] expected = new byte[i]; System.arraycopy(bytes, 8, expected, 0, Math.min(i, 6)); Assert.assertArrayEquals(expected, outBytes); } } @Test public void testToNextMarkerPartialVar1() throws IOException { byte[] bytes = new byte[] { 0, 0, 1, 42, 43, 44, 45, 46, 0, 0, 1, 43 }; ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); SegmentReader reader = new SegmentReader(ch, 1); reader.setBufferIncrement(1); ByteBuffer buf1 = reader.readToNextMarkerNewBuffer(); ByteBuffer buf2 = reader.readToNextMarkerNewBuffer(); ByteBuffer buf3 = reader.readToNextMarkerNewBuffer(); Assert.assertEquals(ByteBuffer.wrap(bytes, 0, 8), buf1); Assert.assertEquals(ByteBuffer.wrap(bytes, 8, 4), buf2); Assert.assertNull(buf3); } @Test public void testToNextMarkerPartialVar2() throws IOException { byte[] bytes = new byte[] { 0, 0, 1, 42, 43, 44, 45, 46, 0, 0, 1, 43, 52, 54 }; ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); SegmentReader reader = new SegmentReader(ch, 1); reader.setBufferIncrement(1); ByteBuffer buf1 = reader.readToNextMarkerNewBuffer(); ByteBuffer buf2 = reader.readToNextMarkerNewBuffer(); ByteBuffer buf3 = reader.readToNextMarkerNewBuffer(); Assert.assertEquals(ByteBuffer.wrap(bytes, 0, 8), buf1); Assert.assertEquals(ByteBuffer.wrap(bytes, 8, 6), buf2); Assert.assertNull(buf3); } @Test public void testToNextMarkerPartialVar3() throws IOException { byte[] bytes = new byte[] { 42, 43, 44, 45, 46, 0, 0, 1, 43, 52, 54 }; ReadableByteChannel ch = Channels.newChannel(new ByteArrayInputStream(bytes)); SegmentReader reader = new SegmentReader(ch, 1); reader.setBufferIncrement(1); ByteBuffer buf1 = reader.readToNextMarkerNewBuffer(); ByteBuffer buf2 = reader.readToNextMarkerNewBuffer(); ByteBuffer buf3 = reader.readToNextMarkerNewBuffer(); Assert.assertEquals(ByteBuffer.wrap(bytes, 0, 5), buf1); Assert.assertEquals(ByteBuffer.wrap(bytes, 5, 6), buf2); Assert.assertNull(buf3); } }