Coverage Report

Created: 2024-09-08 06:16

/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
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 4) < (_bs->capacity))
57
0
      (_bs->prefetch) |= ((UINT32) * (_bs->pointer + 4) << 24);
58
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 5) < (_bs->capacity))
59
0
      (_bs->prefetch) |= ((UINT32) * (_bs->pointer + 5) << 16);
60
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 6) < (_bs->capacity))
61
0
      (_bs->prefetch) |= ((UINT32) * (_bs->pointer + 6) << 8);
62
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 7) < (_bs->capacity))
63
0
      (_bs->prefetch) |= ((UINT32) * (_bs->pointer + 7) << 0);
64
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
65
66
  static INLINE void BitStream_Fetch(wBitStream* _bs)
67
0
  {
68
0
    WINPR_ASSERT(_bs);
69
0
    (_bs->accumulator) = 0;
70
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 0) < (_bs->capacity))
71
0
      (_bs->accumulator) |= ((UINT32) * (_bs->pointer + 0) << 24);
72
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 1) < (_bs->capacity))
73
0
      (_bs->accumulator) |= ((UINT32) * (_bs->pointer + 1) << 16);
74
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 2) < (_bs->capacity))
75
0
      (_bs->accumulator) |= ((UINT32) * (_bs->pointer + 2) << 8);
76
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 3) < (_bs->capacity))
77
0
      (_bs->accumulator) |= ((UINT32) * (_bs->pointer + 3) << 0);
78
0
    BitStream_Prefetch(_bs);
79
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
80
81
  static INLINE void BitStream_Flush(wBitStream* _bs)
82
0
  {
83
0
    WINPR_ASSERT(_bs);
84
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 0) < (_bs->capacity))
85
0
      *(_bs->pointer + 0) = (BYTE)((UINT32)_bs->accumulator >> 24);
86
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 1) < (_bs->capacity))
87
0
      *(_bs->pointer + 1) = (BYTE)((UINT32)_bs->accumulator >> 16);
88
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 2) < (_bs->capacity))
89
0
      *(_bs->pointer + 2) = (BYTE)((UINT32)_bs->accumulator >> 8);
90
0
    if (((UINT32)(_bs->pointer - _bs->buffer) + 3) < (_bs->capacity))
91
0
      *(_bs->pointer + 3) = (BYTE)((UINT32)_bs->accumulator >> 0);
92
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
93
94
  static INLINE void BitStream_Shift(wBitStream* _bs, UINT32 _nbits)
95
0
  {
96
0
    WINPR_ASSERT(_bs);
97
0
    if (_nbits == 0)
98
0
    {
99
0
    }
100
0
    else if ((_nbits > 0) && (_nbits < 32))
101
0
    {
102
0
      _bs->accumulator <<= _nbits;
103
0
      _bs->position += _nbits;
104
0
      _bs->offset += _nbits;
105
0
      if (_bs->offset < 32)
106
0
      {
107
0
        _bs->mask = (UINT32)((1UL << _nbits) - 1UL);
108
0
        _bs->accumulator |= ((_bs->prefetch >> (32 - _nbits)) & _bs->mask);
109
0
        _bs->prefetch <<= _nbits;
110
0
      }
111
0
      else
112
0
      {
113
0
        _bs->mask = (UINT32)((1UL << _nbits) - 1UL);
114
0
        _bs->accumulator |= ((_bs->prefetch >> (32 - _nbits)) & _bs->mask);
115
0
        _bs->prefetch <<= _nbits;
116
0
        _bs->offset -= 32;
117
0
        _bs->pointer += 4;
118
0
        BitStream_Prefetch(_bs);
119
0
        if (_bs->offset)
120
0
        {
121
0
          _bs->mask = (UINT32)((1UL << _bs->offset) - 1UL);
122
0
          _bs->accumulator |= ((_bs->prefetch >> (32 - _bs->offset)) & _bs->mask);
123
0
          _bs->prefetch <<= _bs->offset;
124
0
        }
125
0
      }
126
0
    }
127
0
    else
128
0
    {
129
0
      WLog_WARN("com.winpr.bitstream", "warning: BitStream_Shift(%u)", (unsigned)_nbits);
130
0
    }
131
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
132
133
  static INLINE void BitStream_Shift32(wBitStream* _bs)
134
0
  {
135
0
    WINPR_ASSERT(_bs);
136
0
    BitStream_Shift(_bs, 16);
137
0
    BitStream_Shift(_bs, 16);
138
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
139
140
  static INLINE void BitStream_Write_Bits(wBitStream* _bs, UINT32 _bits, UINT32 _nbits)
141
0
  {
142
0
    WINPR_ASSERT(_bs);
143
0
    _bs->position += _nbits;
144
0
    _bs->offset += _nbits;
145
0
    if (_bs->offset < 32)
146
0
    {
147
0
      _bs->accumulator |= (_bits << (32 - _bs->offset));
148
0
    }
149
0
    else
150
0
    {
151
0
      _bs->offset -= 32;
152
0
      _bs->mask = ((1 << (_nbits - _bs->offset)) - 1);
153
0
      _bs->accumulator |= ((_bits >> _bs->offset) & _bs->mask);
154
0
      BitStream_Flush(_bs);
155
0
      _bs->accumulator = 0;
156
0
      _bs->pointer += 4;
157
0
      if (_bs->offset)
158
0
      {
159
0
        _bs->mask = (UINT32)((1UL << _bs->offset) - 1);
160
0
        _bs->accumulator |= ((_bits & _bs->mask) << (32 - _bs->offset));
161
0
      }
162
0
    }
163
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
164
165
  static INLINE size_t BitStream_GetRemainingLength(wBitStream* _bs)
166
0
  {
167
0
    WINPR_ASSERT(_bs);
168
0
    return (_bs->length - _bs->position);
169
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
170
171
  WINPR_API void BitDump(const char* tag, UINT32 level, const BYTE* buffer, UINT32 length,
172
                         UINT32 flags);
173
  WINPR_API UINT32 ReverseBits32(UINT32 bits, UINT32 nbits);
174
175
  WINPR_API void BitStream_Attach(wBitStream* bs, const BYTE* buffer, UINT32 capacity);
176
177
  WINPR_API void BitStream_Free(wBitStream* bs);
178
179
  WINPR_ATTR_MALLOC(BitStream_Free, 1)
180
  WINPR_API wBitStream* BitStream_New(void);
181
182
#ifdef __cplusplus
183
}
184
#endif
185
186
#endif /* WINPR_UTILS_BITSTREAM_H */