Home | History | Annotate | Download | only in include
      1 /******************************************************************************
      2  *
      3  *  Copyright 2014 The Android Open Source Project
      4  *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights
      5  *                        reserved.
      6  *
      7  *  Licensed under the Apache License, Version 2.0 (the "License");
      8  *  you may not use this file except in compliance with the License.
      9  *  You may obtain a copy of the License at:
     10  *
     11  *  http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  *  Unless required by applicable law or agreed to in writing, software
     14  *  distributed under the License is distributed on an "AS IS" BASIS,
     15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  *  See the License for the specific language governing permissions and
     17  *  limitations under the License.
     18  *
     19  ******************************************************************************/
     20 #ifndef _OI_BITSTREAM_H
     21 #define _OI_BITSTREAM_H
     22 
     23 /*******************************************************************************
     24   $Revision: #1 $
     25  ******************************************************************************/
     26 
     27 /**
     28 @file
     29 Function prototypes and macro definitions for manipulating input and output
     30 bitstreams.
     31 
     32 @ingroup codec_internal
     33 */
     34 
     35 /**
     36 @addtogroup codec_internal
     37 @{
     38 */
     39 
     40 #include "oi_codec_sbc_private.h"
     41 #include "oi_stddefs.h"
     42 
     43 INLINE void OI_BITSTREAM_ReadInit(OI_BITSTREAM* bs, const OI_BYTE* buffer);
     44 
     45 INLINE void OI_BITSTREAM_WriteInit(OI_BITSTREAM* bs, OI_BYTE* buffer);
     46 
     47 INLINE uint32_t OI_BITSTREAM_ReadUINT(OI_BITSTREAM* bs, OI_UINT bits);
     48 
     49 INLINE uint8_t OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM* bs);
     50 
     51 INLINE uint8_t OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM* bs);
     52 
     53 INLINE void OI_BITSTREAM_WriteUINT(OI_BITSTREAM* bs, uint16_t value,
     54                                    OI_UINT bits);
     55 
     56 /*
     57  * Use knowledge that the bitstream is aligned to optimize the write of a byte
     58  */
     59 PRIVATE void OI_BITSTREAM_WriteUINT8Aligned(OI_BITSTREAM* bs, uint8_t datum);
     60 
     61 /*
     62  * Use knowledge that the bitstream is aligned to optimize the writing of a
     63  * pair of nibbles.
     64  */
     65 PRIVATE void OI_BITSTREAM_Write2xUINT4Aligned(OI_BITSTREAM* bs, uint8_t datum1,
     66                                               uint8_t datum2);
     67 
     68 /** Internally the bitstream looks ahead in the stream. When
     69  * OI_SBC_ReadScalefactors() goes to temporarily break the abstraction, it will
     70  * need to know where the "logical" pointer is in the stream.
     71  */
     72 #define OI_BITSTREAM_GetWritePtr(bs) ((bs)->ptr.w - 3)
     73 #define OI_BITSTREAM_GetReadPtr(bs) ((bs)->ptr.r - 3)
     74 
     75 /** This is declared here as a macro because decoder.c breaks the bitsream
     76  * encapsulation for efficiency reasons.
     77  */
     78 #define OI_BITSTREAM_READUINT(result, bits, ptr, value, bitPtr) \
     79   do {                                                          \
     80     OI_ASSERT((bits) <= 16);                                    \
     81     OI_ASSERT((bitPtr) < 16);                                   \
     82     OI_ASSERT((bitPtr) >= 8);                                   \
     83                                                                 \
     84     (result) = (value) << (bitPtr);                             \
     85     (result) >>= 32 - (bits);                                   \
     86                                                                 \
     87     (bitPtr) += (bits);                                         \
     88     while ((bitPtr) >= 16) {                                    \
     89       (value) = ((value) << 8) | *(ptr)++;                      \
     90       (bitPtr) -= 8;                                            \
     91     }                                                           \
     92     OI_ASSERT(((bits) == 0) || ((result) < (1u << (bits))));    \
     93   } while (0)
     94 
     95 #define OI_BITSTREAM_WRITEUINT(ptr, value, bitPtr, datum, bits) \
     96   do {                                                          \
     97     (bitPtr) -= (bits);                                         \
     98     (value) |= (datum) << (bitPtr);                             \
     99                                                                 \
    100     while ((bitPtr) <= 16) {                                    \
    101       (bitPtr) += 8;                                            \
    102       *(ptr)++ = (uint8_t)((value) >> 24);                      \
    103       (value) <<= 8;                                            \
    104     }                                                           \
    105   } while (0)
    106 
    107 #define OI_BITSTREAM_WRITEFLUSH(ptr, value, bitPtr) \
    108   do {                                              \
    109     while ((bitPtr) < 32) {                         \
    110       (bitPtr) += 8;                                \
    111       *(ptr)++ = (uint8_t)((value) >> 24);          \
    112       (value) <<= 8;                                \
    113     }                                               \
    114   } while (0)
    115 
    116 /**
    117 @}
    118 */
    119 
    120 #endif /* _OI_BITSTREAM_H */
    121