diff options
Diffstat (limited to 'gpr/source/lib/vc5_common/bitstream.h')
-rwxr-xr-x | gpr/source/lib/vc5_common/bitstream.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/gpr/source/lib/vc5_common/bitstream.h b/gpr/source/lib/vc5_common/bitstream.h new file mode 100755 index 0000000..85c2a25 --- /dev/null +++ b/gpr/source/lib/vc5_common/bitstream.h @@ -0,0 +1,135 @@ +/*! @file bitstream.h + * + * @brief Declaration of the bitstream data structure. + * + * @version 1.0.0 + * + * (C) Copyright 2018 GoPro Inc (http://gopro.com/). + * + * Licensed under either: + * - Apache License, Version 2.0, http://www.apache.org/licenses/LICENSE-2.0 + * - MIT license, http://opensource.org/licenses/MIT + * at your option. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BITSTREAM_H +#define BITSTREAM_H + +/*! + @brief Bitstream error codes + + The bitstream contains its own enumeration of error codes since this + module may be used in other applications. + */ +typedef enum _bitstream_error +{ + BITSTREAM_ERROR_OKAY = 0, //!< No error + BITSTREAM_ERROR_UNDERFLOW, //!< No unread bits remaining in the bitstream + BITSTREAM_ERROR_OVERFLOW, //!< No more bits can be written to the bitstream + BITSTREAM_ERROR_BADTAG, //!< Unexpected tag found in the bitstream + + //TODO: Add more bitstream errors + +} BITSTREAM_ERROR; + +typedef uint32_t BITWORD; //!< Data type of the internal bitstream buffer + +typedef uint_fast8_t BITCOUNT; //!< Number of bits in the bitsteam buffer + +//! Maximum number of bits in a bit word +static const BITCOUNT bit_word_count = 32; + +//! Maximum value of a bit word +#define BIT_WORD_MAX 0xFFFFFFFF + +//! Sample offset stack depth +#define MAX_SAMPLE_OFFSET_COUNT 8 + +/*! + @brief Declaration of the bitstream data structure + + The bitstream uses a byte stream to read bytes from a file or a buffer + in memory. This isolates that bitstream module from the type of byte + stream. + */ +typedef struct _bitstream +{ + BITSTREAM_ERROR error; //!< Error while processing the bitstream + struct _stream *stream; //!< Stream for reading bytes into the buffer + BITWORD buffer; //!< Internal buffer holds remaining bits + BITCOUNT count; //!< Number of bits remaining in the buffer + +#if VC5_ENABLED_PART(VC5_PART_SECTIONS) + /*! + The sample offset stack is used to record offsets to the start of nested + syntax structures. For example, a sample size segment is written into the + bitstream with a size of zero, since the size of the syntax element is not + known in advance. The offset to the sample size segment is pushed onto the + sample offset stack so that the location of the sample size segment can be + updated with the actual size of a syntax element after the complete element + is written into the bitstream. + + This data structure is called the ChunkSizeOffset in the current codec + implementation. + */ + uint32_t sample_offset_stack[MAX_SAMPLE_OFFSET_COUNT]; + + //! Number of entries in the sample offset stack + uint_fast8_t sample_offset_count; +#endif + +} BITSTREAM; + +#ifdef __cplusplus +extern "C" { +#endif + + BITWORD BitMask(int n); + + CODEC_ERROR CodecErrorBitstream(BITSTREAM_ERROR error); + + // Initialize a bitstream data structure + CODEC_ERROR InitBitstream(BITSTREAM *bitstream); + + // Bind the bitstream to a byte stream + CODEC_ERROR AttachBitstream(struct _bitstream *bitstream, struct _stream *stream); + + CODEC_ERROR ReleaseBitstream(BITSTREAM *stream); + + BITWORD GetBits(BITSTREAM *stream, BITCOUNT count); + + CODEC_ERROR PutBits(BITSTREAM *stream, BITWORD bits, BITCOUNT count); + + BITWORD AddBits(BITSTREAM *stream, BITWORD bits, BITCOUNT count); + + CODEC_ERROR GetBuffer(BITSTREAM *stream); + + CODEC_ERROR PutBuffer(BITSTREAM *stream); + + CODEC_ERROR PutLong(BITSTREAM *stream, BITWORD longword); + + // Rewind the bitstream and the associated byte stream + CODEC_ERROR RewindBitstream(BITSTREAM *bitstream); + + CODEC_ERROR BitstreamCodecError(BITSTREAM *bitstream); + + // Return the current position of the bitstream pointer in the sample + size_t GetBitstreamPosition(BITSTREAM *stream); + + CODEC_ERROR FlushBitstream(BITSTREAM *bitstream); + + CODEC_ERROR GetByteArray(BITSTREAM *bitstream, uint8_t *array, size_t size); + + CODEC_ERROR PutByteArray(BITSTREAM *bitstream, const uint8_t *block, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif // BITSTREAM_H |