You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.7 KiB
122 lines
4.7 KiB
/******************************************************************************
|
|
*
|
|
* Copyright 2014 The Android Open Source Project
|
|
* Copyright 2003 - 2004 Open Interface North America, Inc. All rights
|
|
* reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* 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 _OI_BITSTREAM_H
|
|
#define _OI_BITSTREAM_H
|
|
|
|
/*******************************************************************************
|
|
$Revision: #1 $
|
|
******************************************************************************/
|
|
|
|
/**
|
|
@file
|
|
Function prototypes and macro definitions for manipulating input and output
|
|
bitstreams.
|
|
|
|
@ingroup codec_internal
|
|
*/
|
|
|
|
/**
|
|
@addtogroup codec_internal
|
|
@{
|
|
*/
|
|
|
|
#include "oi_codec_sbc_private.h"
|
|
#include "oi_stddefs.h"
|
|
|
|
INLINE void OI_BITSTREAM_ReadInit(OI_BITSTREAM* bs, const OI_BYTE* buffer);
|
|
|
|
INLINE void OI_BITSTREAM_WriteInit(OI_BITSTREAM* bs, OI_BYTE* buffer);
|
|
|
|
INLINE uint32_t OI_BITSTREAM_ReadUINT(OI_BITSTREAM* bs, OI_UINT bits);
|
|
|
|
INLINE uint8_t OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM* bs);
|
|
|
|
INLINE uint8_t OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM* bs);
|
|
|
|
INLINE void OI_BITSTREAM_WriteUINT(OI_BITSTREAM* bs, uint16_t value,
|
|
OI_UINT bits);
|
|
|
|
/*
|
|
* Use knowledge that the bitstream is aligned to optimize the write of a byte
|
|
*/
|
|
PRIVATE void OI_BITSTREAM_WriteUINT8Aligned(OI_BITSTREAM* bs, uint8_t datum);
|
|
|
|
/*
|
|
* Use knowledge that the bitstream is aligned to optimize the writing of a
|
|
* pair of nibbles.
|
|
*/
|
|
PRIVATE void OI_BITSTREAM_Write2xUINT4Aligned(OI_BITSTREAM* bs, uint8_t datum1,
|
|
uint8_t datum2);
|
|
|
|
/** Internally the bitstream looks ahead in the stream. When
|
|
* OI_SBC_ReadScalefactors() goes to temporarily break the abstraction, it will
|
|
* need to know where the "logical" pointer is in the stream.
|
|
*/
|
|
#define OI_BITSTREAM_GetWritePtr(bs) ((bs)->ptr.w - 3)
|
|
#define OI_BITSTREAM_GetReadPtr(bs) ((bs)->ptr.r - 3)
|
|
|
|
/** This is declared here as a macro because decoder.c breaks the bitsream
|
|
* encapsulation for efficiency reasons.
|
|
*/
|
|
#define OI_BITSTREAM_READUINT(result, bits, ptr, value, bitPtr) \
|
|
do { \
|
|
OI_ASSERT((bits) <= 16); \
|
|
OI_ASSERT((bitPtr) < 32); \
|
|
OI_ASSERT((bitPtr) >= 0); \
|
|
\
|
|
while ((bitPtr + bits) > 32) { \
|
|
(value) = ((value) << 8) | *(ptr)++; \
|
|
(bitPtr) -= 8; \
|
|
} \
|
|
\
|
|
(result) = (value) << (bitPtr); \
|
|
(result) >>= 32 - (bits); \
|
|
\
|
|
(bitPtr) += (bits); \
|
|
OI_ASSERT(((bits) == 0) || ((result) < (1u << (bits)))); \
|
|
} while (0)
|
|
|
|
#define OI_BITSTREAM_WRITEUINT(ptr, value, bitPtr, datum, bits) \
|
|
do { \
|
|
(bitPtr) -= (bits); \
|
|
(value) |= (datum) << (bitPtr); \
|
|
\
|
|
while ((bitPtr) <= 16) { \
|
|
(bitPtr) += 8; \
|
|
*(ptr)++ = (uint8_t)((value) >> 24); \
|
|
(value) <<= 8; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define OI_BITSTREAM_WRITEFLUSH(ptr, value, bitPtr) \
|
|
do { \
|
|
while ((bitPtr) < 32) { \
|
|
(bitPtr) += 8; \
|
|
*(ptr)++ = (uint8_t)((value) >> 24); \
|
|
(value) <<= 8; \
|
|
} \
|
|
} while (0)
|
|
|
|
/**
|
|
@}
|
|
*/
|
|
|
|
#endif /* _OI_BITSTREAM_H */
|