1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/* 2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License. 6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at 7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and 14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License. 15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */ 16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 17cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "ABitReader.h" 18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h> 20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberABitReader::ABitReader(const uint8_t *data, size_t size) 24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber : mData(data), 25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mSize(size), 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mReservoir(0), 27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mNumBitsLeft(0) { 28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ABitReader::fillReservoir() { 31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GT(mSize, 0u); 32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mReservoir = 0; 34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t i; 35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (i = 0; mSize > 0 && i < 4; ++i) { 36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mReservoir = (mReservoir << 8) | *mData; 37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ++mData; 39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber --mSize; 40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mNumBitsLeft = 8 * i; 43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mReservoir <<= 32 - mNumBitsLeft; 44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 45cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberuint32_t ABitReader::getBits(size_t n) { 47cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_LE(n, 32u); 48cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint32_t result = 0; 50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (n > 0) { 51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mNumBitsLeft == 0) { 52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber fillReservoir(); 53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t m = n; 56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (m > mNumBitsLeft) { 57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber m = mNumBitsLeft; 58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 59cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber result = (result << m) | (mReservoir >> (32 - m)); 61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mReservoir <<= m; 62cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mNumBitsLeft -= m; 63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 64cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber n -= m; 65cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 66cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 67cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return result; 68cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 70cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ABitReader::skipBits(size_t n) { 71cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (n > 32) { 72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber getBits(32); 73cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber n -= 32; 74cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 75cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 76cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (n > 0) { 77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber getBits(n); 78cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 80cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 81cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ABitReader::putBits(uint32_t x, size_t n) { 821906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber CHECK_LE(n, 32u); 831906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber 841906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber while (mNumBitsLeft + n > 32) { 851906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber mNumBitsLeft -= 8; 861906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber --mData; 871906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber ++mSize; 881906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber } 89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mReservoir = (mReservoir >> n) | (x << (32 - n)); 91cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mNumBitsLeft += n; 92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 94cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersize_t ABitReader::numBitsLeft() const { 95cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mSize * 8 + mNumBitsLeft; 96cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberconst uint8_t *ABitReader::data() const { 9955e26193c885b7d5acdae9978848e6587987790fAndreas Huber return mData - (mNumBitsLeft + 7) / 8; 100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 103