FreeRDP
Loading...
Searching...
No Matches
rfx_bitstream.h
1
20#ifndef FREERDP_LIB_CODEC_RFX_BITSTREAM_H
21#define FREERDP_LIB_CODEC_RFX_BITSTREAM_H
22
23#include <winpr/assert.h>
24#include <winpr/cast.h>
25
26#include <freerdp/codec/rfx.h>
27
28#ifdef __cplusplus
29extern "C"
30{
31#endif
32
33 typedef struct
34 {
35 BYTE* buffer;
36 uint32_t nbytes;
37 uint32_t byte_pos;
38 uint32_t bits_left;
40
41 static inline void rfx_bitstream_attach(RFX_BITSTREAM* bs, BYTE* WINPR_RESTRICT buffer,
42 size_t nbytes)
43 {
44 WINPR_ASSERT(bs);
45 bs->buffer = (buffer);
46
47 WINPR_ASSERT(nbytes <= UINT32_MAX);
48 bs->nbytes = WINPR_ASSERTING_INT_CAST(uint32_t, nbytes);
49 bs->byte_pos = 0;
50 bs->bits_left = 8;
51 }
52
53 WINPR_ATTR_NODISCARD
54 static inline uint32_t rfx_bitstream_get_bits(RFX_BITSTREAM* bs, uint32_t nbits)
55 {
56 UINT16 n = 0;
57 while (bs->byte_pos < bs->nbytes && nbits > 0)
58 {
59 uint32_t b = nbits;
60 if (b > bs->bits_left)
61 b = bs->bits_left;
62 if (n)
63 n <<= b;
64 n |= (bs->buffer[bs->byte_pos] >> (bs->bits_left - b)) & ((1 << b) - 1);
65 bs->bits_left -= b;
66 nbits -= b;
67 if (bs->bits_left == 0)
68 {
69 bs->bits_left = 8;
70 bs->byte_pos++;
71 }
72 }
73 return n;
74 }
75
76 static inline void rfx_bitstream_put_bits(RFX_BITSTREAM* bs, uint32_t _bits, uint32_t _nbits)
77 {
78 UINT16 bits = WINPR_ASSERTING_INT_CAST(UINT16, _bits);
79
80 uint32_t nbits = (_nbits);
81 while (bs->byte_pos < bs->nbytes && nbits > 0)
82 {
83 uint32_t b = nbits;
84 if (b > bs->bits_left)
85 b = bs->bits_left;
86 bs->buffer[bs->byte_pos] |= ((bits >> (nbits - b)) & ((1 << b) - 1))
87 << (bs->bits_left - b);
88 bs->bits_left -= b;
89 nbits -= b;
90 if (bs->bits_left == 0)
91 {
92 bs->bits_left = 8;
93 bs->byte_pos++;
94 }
95 }
96 }
97
98 static inline void rfx_bitstream_flush(RFX_BITSTREAM* bs)
99 {
100 WINPR_ASSERT(bs);
101 if (bs->bits_left != 8)
102 {
103 uint32_t _nbits = 8 - bs->bits_left;
104 rfx_bitstream_put_bits(bs, 0, _nbits);
105 }
106 }
107
108 WINPR_ATTR_NODISCARD
109 static inline BOOL rfx_bitstream_eos(RFX_BITSTREAM* bs)
110 {
111 WINPR_ASSERT(bs);
112 return ((bs)->byte_pos >= (bs)->nbytes);
113 }
114
115 WINPR_ATTR_NODISCARD
116 static inline uint32_t rfx_bitstream_left(RFX_BITSTREAM* bs)
117 {
118 WINPR_ASSERT(bs);
119
120 if ((bs)->byte_pos >= (bs)->nbytes)
121 return 0;
122
123 return ((bs)->nbytes - (bs)->byte_pos - 1) * 8 + (bs)->bits_left;
124 }
125
126 WINPR_ATTR_NODISCARD
127 static inline uint32_t rfx_bitstream_get_processed_bytes(RFX_BITSTREAM* bs)
128 {
129 WINPR_ASSERT(bs);
130 if ((bs)->bits_left < 8)
131 return (bs)->byte_pos + 1;
132 return (bs)->byte_pos;
133 }
134
135#ifdef __cplusplus
136}
137#endif
138#endif /* FREERDP_LIB_CODEC_RFX_BITSTREAM_H */