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#ifndef A_BIT_READER_H_ 18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#define A_BIT_READER_H_ 20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABase.h> 22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <sys/types.h> 24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <stdint.h> 25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 28862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhangclass ABitReader { 29862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhangpublic: 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader(const uint8_t *data, size_t size); 31862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang virtual ~ABitReader(); 32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 333be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // Tries to get |n| bits. If not successful, returns |fallback|. Otherwise, returns result. 343be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // Reading 0 bits will always succeed and return 0. 353be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar uint32_t getBitsWithFallback(size_t n, uint32_t fallback); 363be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar 373be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // Tries to get |n| bits. If not successful, returns false. Otherwise, stores result in |out| 383be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // and returns true. Use !overRead() to determine if this call was successful. Reading 0 bits 393be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // will always succeed and write 0 in |out|. 403be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar bool getBitsGraceful(size_t n, uint32_t *out); 413be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar 423be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // Gets |n| bits and returns result. ABORTS if unsuccessful. Reading 0 bits will always 433be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // succeed. 44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint32_t getBits(size_t n); 45cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 463be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // Tries to skip |n| bits. Returns true iff successful. Skipping 0 bits will always succeed. 473be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar bool skipBits(size_t n); 483be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar 493be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // "Puts" |n| bits with the value |x| back virtually into the bit stream. The put-back bits 503be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // are not actually written into the data, but are tracked in a separate buffer that can 513be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // store at most 32 bits. This is a no-op if the stream has already been over-read. 5255e26193c885b7d5acdae9978848e6587987790fAndreas Huber void putBits(uint32_t x, size_t n); 5355e26193c885b7d5acdae9978848e6587987790fAndreas Huber 54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t numBitsLeft() const; 55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *data() const; 57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 583be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // Returns true iff the stream was over-read (e.g. any getBits operation has been unsuccessful 593be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar // due to overread (and not trying to read >32 bits).) 603be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar bool overRead() const { return mOverRead; } 613be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar 62862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhangprotected: 63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *mData; 64cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t mSize; 65cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 66cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint32_t mReservoir; // left-aligned bits 67cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t mNumBitsLeft; 683be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar bool mOverRead; 69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 703be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar virtual bool fillReservoir(); 71cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ABitReader); 73cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 74cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 75862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhangclass NALBitReader : public ABitReader { 76862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhangpublic: 77862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang NALBitReader(const uint8_t *data, size_t size); 78862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang 79862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang bool atLeastNumBitsLeft(size_t n) const; 80862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang 81862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhangprivate: 82862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang int32_t mNumZeros; 83862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang 843be85f905e5c63e1552554622a80fd8bee695044Lajos Molnar virtual bool fillReservoir(); 85862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang 86862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang DISALLOW_EVIL_CONSTRUCTORS(NALBitReader); 87862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang}; 88862f8455eaacc1ffb5d8911f0bc7ecc3cf7ec46cChong Zhang 89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 91cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif // A_BIT_READER_H_ 92