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