BitWriterBuffer.java revision dd9eb897ee7c7b507cbdcf80263bb4b5de6966bf
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)package com.googlecode.mp4parser.boxes.mp4.objectdescriptors; 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)import java.nio.ByteBuffer; 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)public class BitWriterBuffer { 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private ByteBuffer buffer; 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int initialPos; 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int position = 0; 100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch public BitWriterBuffer(ByteBuffer buffer) { 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch this.buffer = buffer; 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) this.initialPos = buffer.position(); 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public void writeBits(int i, int numBits) { 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) assert i <= ((1 << numBits)-1): String.format("Trying to write a value bigger (%s) than the number bits (%s) allows. " + 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Please mask the value before writing it and make your code is really working as intended.", i, (1<<numBits)-1); 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int left = 8 - position % 8; 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (numBits <= left) { 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int current = (buffer.get(initialPos + position / 8)); 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current = current < 0 ? current + 256 : current; 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current += i << (left - numBits); 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) buffer.put(initialPos + position / 8, (byte) (current > 127 ? current - 256 : current)); 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) position += numBits; 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int bitsSecondWrite = numBits - left; 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) writeBits(i >> bitsSecondWrite, left); 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) writeBits(i & (1 << bitsSecondWrite) - 1, bitsSecondWrite); 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch buffer.position(initialPos + position / 8 + ((position % 8 > 0) ? 1 : 0)); 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)