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