/// <summary> /// Finds the next file marker within the byte stream. /// </summary> /// <param name="marker">The buffer to read file markers to</param> /// <param name="stream">The input stream</param> /// <returns>The <see cref="JpegFileMarker"/></returns> public static JpegFileMarker FindNextFileMarker(byte[] marker, DoubleBufferedStreamReader stream) { int value = stream.Read(marker, 0, 2); if (value == 0) { return(new JpegFileMarker(JpegConstants.Markers.EOI, stream.Length - 2)); } if (marker[0] == JpegConstants.Markers.XFF) { // According to Section B.1.1.2: // "Any marker may optionally be preceded by any number of fill bytes, which are bytes assigned code 0xFF." int m = marker[1]; while (m == JpegConstants.Markers.XFF) { int suffix = stream.ReadByte(); if (suffix == -1) { return(new JpegFileMarker(JpegConstants.Markers.EOI, stream.Length - 2)); } m = suffix; } return(new JpegFileMarker((byte)m, stream.Position - 2)); } return(new JpegFileMarker(marker[1], stream.Position - 2, true)); }
public void DoubleBufferedStreamReaderCanReadSubsequentMultipleByteCorrectly() { using (MemoryStream stream = this.CreateTestStream()) { var buffer = new byte[2]; byte[] expected = stream.ToArray(); var reader = new DoubleBufferedStreamReader(this.allocator, stream); for (int i = 0, o = 0; i < expected.Length / 2; i++, o += 2) { Assert.Equal(2, reader.Read(buffer, 0, 2)); Assert.Equal(expected[o], buffer[0]); Assert.Equal(expected[o + 1], buffer[1]); Assert.Equal(o + 2, reader.Position); int offset = i * 2; if (offset < DoubleBufferedStreamReader.ChunkLength) { Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength); } else if (offset >= DoubleBufferedStreamReader.ChunkLength && offset < DoubleBufferedStreamReader.ChunkLength * 2) { // We should have advanced to the second chunk now. Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength * 2); } else { // We should have advanced to the third chunk now. Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength * 3); } } } }
public int DoubleBufferedStreamRead() { int r = 0; DoubleBufferedStreamReader reader = this.reader2; byte[] b = this.chunk2; for (int i = 0; i < reader.Length / 2; i++) { r += reader.Read(b, 0, 2); } return(r); }
public void DoubleBufferedStreamReaderCanReadMultipleBytesFromOrigin() { using (MemoryStream stream = this.CreateTestStream()) { var buffer = new byte[2]; byte[] expected = stream.ToArray(); var reader = new DoubleBufferedStreamReader(this.allocator, stream); Assert.Equal(2, reader.Read(buffer, 0, 2)); Assert.Equal(expected[0], buffer[0]); Assert.Equal(expected[1], buffer[1]); // We've read a whole chunk but increment by the buffer length in our reader. Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength); Assert.Equal(buffer.Length, reader.Position); } }