Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
bits.c
Go to the documentation of this file.
1#include <libk/bits.h>
2
4
5 size_t byte_pos = bs->bit_pos / 8;
6 if (byte_pos > bs->size)
7 return 0;
8
9 uint8_t val = bs->data[byte_pos];
10 if (val == 0xFF) {
11 if (byte_pos + 1 < bs->size && bs->data[byte_pos + 1] == 0x00) {
12 // Stuffed byte, skip 0x00
13 bs->bit_pos += 16;
14 return 0xFF;
15 } else {
16 // Marker encountered, stop reading
17 // throw std::runtime_error("JPEG marker encountered in bitstream");
18 }
19 } else {
20 bs->bit_pos += 8;
21 return val;
22 }
23 return 0;
24}
25
27 uint32_t val = 0;
28 for (int i = 0; i < n; i++) {
29 size_t byte_pos = bs->bit_pos / 8;
30 int bit_offset = 7 - (bs->bit_pos % 8);
31
32 if (byte_pos >= bs->size)
33 return val; // EOF
34
35 uint8_t byte = read_byte(bs);
36 val = (val << 1) | ((byte >> bit_offset) & 1);
37 }
38 return val;
39}
40
42 uint64_t byte_pos = bs->bit_pos / 8;
43 uint8_t bit_in_byte = 7 - (bs->bit_pos % 8);
44 uint8_t b = (bs->data[byte_pos] >> bit_in_byte) & 1;
45 bs->bit_pos++;
46 return b;
47}
uint8_t read_bit(bitstream_t *bs)
Definition bits.c:41
uint32_t read_bits(bitstream_t *bs, int n)
Definition bits.c:26
uint8_t read_byte(bitstream_t *bs)
Definition bits.c:3
size_t size
Definition bits.h:9
uint8_t * data
Definition bits.h:7
uint64_t bit_pos
Definition bits.h:8
unsigned int uint32_t
Definition type.h:19
unsigned long uint64_t
Definition type.h:25
unsigned char uint8_t
Definition type.h:7