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)