/src/FreeRDP/winpr/include/winpr/bitstream.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * WinPR: Windows Portable Runtime |
3 | | * BitStream Utils |
4 | | * |
5 | | * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> |
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 WINPR_UTILS_BITSTREAM_H |
21 | | #define WINPR_UTILS_BITSTREAM_H |
22 | | |
23 | | #include <winpr/assert.h> |
24 | | #include <winpr/winpr.h> |
25 | | #include <winpr/wtypes.h> |
26 | | |
27 | | #include <winpr/crt.h> |
28 | | #include <winpr/wlog.h> |
29 | | |
30 | | typedef struct |
31 | | { |
32 | | const BYTE* buffer; |
33 | | BYTE* pointer; |
34 | | UINT32 position; |
35 | | UINT32 length; |
36 | | UINT32 capacity; |
37 | | UINT32 mask; |
38 | | UINT32 offset; |
39 | | UINT32 prefetch; |
40 | | UINT32 accumulator; |
41 | | } wBitStream; |
42 | | |
43 | 0 | #define BITDUMP_MSB_FIRST 0x00000001 |
44 | | #define BITDUMP_STDERR 0x00000002 |
45 | | |
46 | | #ifdef __cplusplus |
47 | | extern "C" |
48 | | { |
49 | | #endif |
50 | | |
51 | | static INLINE void BitStream_Prefetch(wBitStream* _bs) |
52 | 0 | { |
53 | 0 | WINPR_ASSERT(_bs); |
54 | | |
55 | 0 | (_bs->prefetch) = 0; |
56 | |
|
57 | 0 | const intptr_t diff = _bs->pointer - _bs->buffer; |
58 | 0 | if ((diff + 4) < (intptr_t)_bs->capacity) |
59 | 0 | (_bs->prefetch) |= ((UINT32)_bs->pointer[4] << 24); |
60 | 0 | if ((diff + 5) < (intptr_t)_bs->capacity) |
61 | 0 | (_bs->prefetch) |= ((UINT32)_bs->pointer[5] << 16); |
62 | 0 | if ((diff + 6) < (intptr_t)_bs->capacity) |
63 | 0 | (_bs->prefetch) |= ((UINT32)_bs->pointer[6] << 8); |
64 | 0 | if ((diff + 7) < (intptr_t)_bs->capacity) |
65 | 0 | (_bs->prefetch) |= ((UINT32)_bs->pointer[7] << 0); |
66 | 0 | } Unexecuted instantiation: bulk.c:BitStream_Prefetch Unexecuted instantiation: ncrush.c:BitStream_Prefetch Unexecuted instantiation: xcrush.c:BitStream_Prefetch Unexecuted instantiation: mppc.c:BitStream_Prefetch Unexecuted instantiation: progressive.c:BitStream_Prefetch Unexecuted instantiation: clear.c:BitStream_Prefetch Unexecuted instantiation: rfx_rlgr.c:BitStream_Prefetch Unexecuted instantiation: BitStream.c:BitStream_Prefetch |
67 | | |
68 | | static INLINE void BitStream_Fetch(wBitStream* _bs) |
69 | 0 | { |
70 | 0 | WINPR_ASSERT(_bs); |
71 | 0 | (_bs->accumulator) = 0; |
72 | |
|
73 | 0 | const intptr_t diff = _bs->pointer - _bs->buffer; |
74 | 0 | if ((diff + 0) < (intptr_t)_bs->capacity) |
75 | 0 | (_bs->accumulator) |= ((UINT32)_bs->pointer[0] << 24); |
76 | 0 | if ((diff + 1) < (intptr_t)_bs->capacity) |
77 | 0 | (_bs->accumulator) |= ((UINT32)_bs->pointer[1] << 16); |
78 | 0 | if ((diff + 2) < (intptr_t)_bs->capacity) |
79 | 0 | (_bs->accumulator) |= ((UINT32)_bs->pointer[2] << 8); |
80 | 0 | if ((diff + 3) < (intptr_t)_bs->capacity) |
81 | 0 | (_bs->accumulator) |= ((UINT32)_bs->pointer[3] << 0); |
82 | 0 | BitStream_Prefetch(_bs); |
83 | 0 | } Unexecuted instantiation: bulk.c:BitStream_Fetch Unexecuted instantiation: ncrush.c:BitStream_Fetch Unexecuted instantiation: xcrush.c:BitStream_Fetch Unexecuted instantiation: mppc.c:BitStream_Fetch Unexecuted instantiation: progressive.c:BitStream_Fetch Unexecuted instantiation: clear.c:BitStream_Fetch Unexecuted instantiation: rfx_rlgr.c:BitStream_Fetch Unexecuted instantiation: BitStream.c:BitStream_Fetch |
84 | | |
85 | | static INLINE void BitStream_Flush(wBitStream* _bs) |
86 | 0 | { |
87 | 0 | WINPR_ASSERT(_bs); |
88 | 0 | const intptr_t diff = _bs->pointer - _bs->buffer; |
89 | 0 | if ((diff + 0) < (intptr_t)_bs->capacity) |
90 | 0 | _bs->pointer[0] = (_bs->accumulator >> 24) & 0xFF; |
91 | 0 | if ((diff + 1) < (intptr_t)_bs->capacity) |
92 | 0 | _bs->pointer[1] = (_bs->accumulator >> 16) & 0xFF; |
93 | 0 | if ((diff + 2) < (intptr_t)_bs->capacity) |
94 | 0 | _bs->pointer[2] = (_bs->accumulator >> 8) & 0xFF; |
95 | 0 | if ((diff + 3) < (intptr_t)_bs->capacity) |
96 | 0 | _bs->pointer[3] = (_bs->accumulator >> 0) & 0xFF; |
97 | 0 | } Unexecuted instantiation: bulk.c:BitStream_Flush Unexecuted instantiation: ncrush.c:BitStream_Flush Unexecuted instantiation: xcrush.c:BitStream_Flush Unexecuted instantiation: mppc.c:BitStream_Flush Unexecuted instantiation: progressive.c:BitStream_Flush Unexecuted instantiation: clear.c:BitStream_Flush Unexecuted instantiation: rfx_rlgr.c:BitStream_Flush Unexecuted instantiation: BitStream.c:BitStream_Flush |
98 | | |
99 | | static INLINE void BitStream_Shift(wBitStream* _bs, UINT32 _nbits) |
100 | 0 | { |
101 | 0 | WINPR_ASSERT(_bs); |
102 | 0 | if (_nbits == 0) |
103 | 0 | { |
104 | 0 | } |
105 | 0 | else if ((_nbits > 0) && (_nbits < 32)) |
106 | 0 | { |
107 | 0 | _bs->accumulator <<= _nbits; |
108 | 0 | _bs->position += _nbits; |
109 | 0 | _bs->offset += _nbits; |
110 | 0 | if (_bs->offset < 32) |
111 | 0 | { |
112 | 0 | _bs->mask = (UINT32)((1UL << _nbits) - 1UL); |
113 | 0 | _bs->accumulator |= ((_bs->prefetch >> (32 - _nbits)) & _bs->mask); |
114 | 0 | _bs->prefetch <<= _nbits; |
115 | 0 | } |
116 | 0 | else |
117 | 0 | { |
118 | 0 | _bs->mask = (UINT32)((1UL << _nbits) - 1UL); |
119 | 0 | _bs->accumulator |= ((_bs->prefetch >> (32 - _nbits)) & _bs->mask); |
120 | 0 | _bs->prefetch <<= _nbits; |
121 | 0 | _bs->offset -= 32; |
122 | 0 | _bs->pointer += 4; |
123 | 0 | BitStream_Prefetch(_bs); |
124 | 0 | if (_bs->offset) |
125 | 0 | { |
126 | 0 | _bs->mask = (UINT32)((1UL << _bs->offset) - 1UL); |
127 | 0 | _bs->accumulator |= ((_bs->prefetch >> (32 - _bs->offset)) & _bs->mask); |
128 | 0 | _bs->prefetch <<= _bs->offset; |
129 | 0 | } |
130 | 0 | } |
131 | 0 | } |
132 | 0 | else |
133 | 0 | { |
134 | 0 | WLog_WARN("com.winpr.bitstream", "warning: BitStream_Shift(%u)", (unsigned)_nbits); |
135 | 0 | } |
136 | 0 | } Unexecuted instantiation: bulk.c:BitStream_Shift Unexecuted instantiation: ncrush.c:BitStream_Shift Unexecuted instantiation: xcrush.c:BitStream_Shift Unexecuted instantiation: mppc.c:BitStream_Shift Unexecuted instantiation: progressive.c:BitStream_Shift Unexecuted instantiation: clear.c:BitStream_Shift Unexecuted instantiation: rfx_rlgr.c:BitStream_Shift Unexecuted instantiation: BitStream.c:BitStream_Shift |
137 | | |
138 | | static INLINE void BitStream_Shift32(wBitStream* _bs) |
139 | 0 | { |
140 | 0 | WINPR_ASSERT(_bs); |
141 | 0 | BitStream_Shift(_bs, 16); |
142 | 0 | BitStream_Shift(_bs, 16); |
143 | 0 | } Unexecuted instantiation: bulk.c:BitStream_Shift32 Unexecuted instantiation: ncrush.c:BitStream_Shift32 Unexecuted instantiation: xcrush.c:BitStream_Shift32 Unexecuted instantiation: mppc.c:BitStream_Shift32 Unexecuted instantiation: progressive.c:BitStream_Shift32 Unexecuted instantiation: clear.c:BitStream_Shift32 Unexecuted instantiation: rfx_rlgr.c:BitStream_Shift32 Unexecuted instantiation: BitStream.c:BitStream_Shift32 |
144 | | |
145 | | static INLINE void BitStream_Write_Bits(wBitStream* _bs, UINT32 _bits, UINT32 _nbits) |
146 | 0 | { |
147 | 0 | WINPR_ASSERT(_bs); |
148 | 0 | _bs->position += _nbits; |
149 | 0 | _bs->offset += _nbits; |
150 | 0 | if (_bs->offset < 32) |
151 | 0 | { |
152 | 0 | _bs->accumulator |= (_bits << (32 - _bs->offset)); |
153 | 0 | } |
154 | 0 | else |
155 | 0 | { |
156 | 0 | _bs->offset -= 32; |
157 | 0 | _bs->mask = ((1 << (_nbits - _bs->offset)) - 1); |
158 | 0 | _bs->accumulator |= ((_bits >> _bs->offset) & _bs->mask); |
159 | 0 | BitStream_Flush(_bs); |
160 | 0 | _bs->accumulator = 0; |
161 | 0 | _bs->pointer += 4; |
162 | 0 | if (_bs->offset) |
163 | 0 | { |
164 | 0 | _bs->mask = (UINT32)((1UL << _bs->offset) - 1); |
165 | 0 | _bs->accumulator |= ((_bits & _bs->mask) << (32 - _bs->offset)); |
166 | 0 | } |
167 | 0 | } |
168 | 0 | } Unexecuted instantiation: bulk.c:BitStream_Write_Bits Unexecuted instantiation: ncrush.c:BitStream_Write_Bits Unexecuted instantiation: xcrush.c:BitStream_Write_Bits Unexecuted instantiation: mppc.c:BitStream_Write_Bits Unexecuted instantiation: progressive.c:BitStream_Write_Bits Unexecuted instantiation: clear.c:BitStream_Write_Bits Unexecuted instantiation: rfx_rlgr.c:BitStream_Write_Bits Unexecuted instantiation: BitStream.c:BitStream_Write_Bits |
169 | | |
170 | | static INLINE size_t BitStream_GetRemainingLength(wBitStream* _bs) |
171 | 0 | { |
172 | 0 | WINPR_ASSERT(_bs); |
173 | 0 | return (_bs->length - _bs->position); |
174 | 0 | } Unexecuted instantiation: bulk.c:BitStream_GetRemainingLength Unexecuted instantiation: ncrush.c:BitStream_GetRemainingLength Unexecuted instantiation: xcrush.c:BitStream_GetRemainingLength Unexecuted instantiation: mppc.c:BitStream_GetRemainingLength Unexecuted instantiation: progressive.c:BitStream_GetRemainingLength Unexecuted instantiation: clear.c:BitStream_GetRemainingLength Unexecuted instantiation: rfx_rlgr.c:BitStream_GetRemainingLength Unexecuted instantiation: BitStream.c:BitStream_GetRemainingLength |
175 | | |
176 | | WINPR_API void BitDump(const char* tag, UINT32 level, const BYTE* buffer, UINT32 length, |
177 | | UINT32 flags); |
178 | | WINPR_API UINT32 ReverseBits32(UINT32 bits, UINT32 nbits); |
179 | | |
180 | | WINPR_API void BitStream_Attach(wBitStream* bs, const BYTE* buffer, UINT32 capacity); |
181 | | |
182 | | WINPR_API void BitStream_Free(wBitStream* bs); |
183 | | |
184 | | WINPR_ATTR_MALLOC(BitStream_Free, 1) |
185 | | WINPR_API wBitStream* BitStream_New(void); |
186 | | |
187 | | #ifdef __cplusplus |
188 | | } |
189 | | #endif |
190 | | |
191 | | #endif /* WINPR_UTILS_BITSTREAM_H */ |