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