diff options
Diffstat (limited to 'isoparser/src/main/java/com/googlecode/mp4parser/boxes/mp4/objectdescriptors/BitReaderBuffer.java')
-rw-r--r-- | isoparser/src/main/java/com/googlecode/mp4parser/boxes/mp4/objectdescriptors/BitReaderBuffer.java | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/googlecode/mp4parser/boxes/mp4/objectdescriptors/BitReaderBuffer.java b/isoparser/src/main/java/com/googlecode/mp4parser/boxes/mp4/objectdescriptors/BitReaderBuffer.java new file mode 100644 index 0000000..7221503 --- /dev/null +++ b/isoparser/src/main/java/com/googlecode/mp4parser/boxes/mp4/objectdescriptors/BitReaderBuffer.java @@ -0,0 +1,51 @@ +package com.googlecode.mp4parser.boxes.mp4.objectdescriptors; + +import java.nio.ByteBuffer; + +public class BitReaderBuffer { + + private ByteBuffer buffer; + int initialPos; + int position; + + public BitReaderBuffer(ByteBuffer buffer) { + this.buffer = buffer; + initialPos = buffer.position(); + } + + public int readBits(int i) { + byte b = buffer.get(initialPos + position / 8); + int v = b < 0 ? b + 256 : b; + int left = 8 - position % 8; + int rc; + if (i <= left) { + rc = (v << (position % 8) & 0xFF) >> ((position % 8) + (left - i)); + position += i; + } else { + int now = left; + int then = i - left; + rc = readBits(now); + rc = rc << then; + rc += readBits(then); + } + buffer.position(initialPos + (int) Math.ceil((double) position / 8)); + return rc; + } + + public int getPosition() { + return position; + } + + public int byteSync() { + int left = 8 - position % 8; + if (left == 8) { + left = 0; + } + readBits(left); + return left; + } + + public int remainingBits() { + return buffer.limit() * 8 - position; + } +} |