Cogs.Core
Parser.h
1#pragma once
2
3#include <assert.h>
4#include <stdint.h>
5#include <stddef.h>
6
7namespace Cogs::Core{
8
9inline uint32_t get_bit(const uint8_t *data, size_t &bit)
10{
11 size_t byte = bit>>0x3; //size_t byte = bit/8;
12 size_t n = bit&0x7; // size_t n = bit%8;
13 uint32_t res = (data[byte]>>(7-n))&1;
14 bit++;
15 return res;
16}
17inline uint32_t peek_bit(const uint8_t *data, size_t &bit)
18{
19 size_t byte = bit>>0x3; //size_t byte = bit/8;
20 size_t n = bit&0x7; //size_t n = bit%8;
21 uint32_t res = (data[byte]>>(7-n))&1;
22 return res;
23}
24inline uint32_t next_bits(size_t n, const uint8_t *data, size_t bit)
25{
26 assert(n<=32);
27 uint32_t res = 0;
28 for(uint32_t i=0; i<n; i++)
29 res = (res << 1) | get_bit(data, bit);
30 return res;
31}
32inline uint32_t read_bits(size_t n, const uint8_t *data, size_t &bit)
33{
34 assert(n<=32);
35 uint32_t res = 0;
36 for(uint32_t i=0; i<n; i++)
37 res = (res << 1) | get_bit(data, bit);
38 return res;
39}
40inline uint64_t read_bits64(size_t n, const uint8_t *data, size_t &bit)
41{
42 assert(n<=64);
43 uint64_t res = 0;
44 for(uint32_t i=0; i<n; i++)
45 res = (res << 1) | get_bit(data, bit);
46 return res;
47}
48
49// Parse Syntax Elements
50inline uint32_t parse_ue(const uint8_t *data, size_t &bit);
51
52inline uint32_t parse_ae(const uint8_t * /*data*/, size_t & /*bit*/)
53{
54 assert(false);
55 return 0;
56}
57inline uint32_t parse_b(size_t n, const uint8_t *data, size_t &bit) { return read_bits(n, data, bit); }
58inline uint32_t parse_f(size_t n, const uint8_t *data, size_t &bit) { return read_bits(n, data, bit); }
59inline int32_t parse_i(size_t n, const uint8_t *data, size_t &bit) { return (int32_t)read_bits(n, data, bit); }
60inline int32_t parse_se(const uint8_t *data, size_t &bit)
61{
62 uint32_t codeNum = parse_ue(data, bit);
63 uint32_t neg = (codeNum & 1) ^ 1;
64 return -(int32_t)neg * (((int32_t)codeNum+1)/2);
65}
66inline uint32_t parse_u(size_t n, const uint8_t *data, size_t &bit) { return read_bits(n, data, bit); }
67inline uint64_t parse_u64(size_t n, const uint8_t *data, size_t &bit) { return read_bits64(n, data, bit); }
68inline uint32_t parse_ue(const uint8_t *data, size_t &bit)
69{
70 int32_t leadingZeroBits = -1;
71 for(uint32_t b=0; !b; leadingZeroBits++)
72 b = get_bit(data, bit);
73 //uint32_t codeNum = (1<<leadingZeroBits)-1+readBits(leadingZeroBits);
74 uint32_t codeNum = (1<<leadingZeroBits)-1+parse_u(leadingZeroBits, data, bit);
75 return codeNum;
76}
77inline uint32_t parse_ue(const uint8_t *data, size_t &bit, size_t size)
78{
79 int32_t leadingZeroBits = -1;
80 for(uint32_t b=0; !b; leadingZeroBits++){
81 b = get_bit(data, bit);
82 if(bit/8 >= size) return 0;
83 }
84 //uint32_t codeNum = (1<<leadingZeroBits)-1+readBits(leadingZeroBits);
85 uint32_t codeNum = (1<<leadingZeroBits)-1+parse_u(leadingZeroBits, data, bit);
86 return codeNum;
87}
88inline uint64_t parse_ue64(const uint8_t *data, size_t &bit)
89{
90 int32_t leadingZeroBits = -1;
91 for(uint32_t b=0; !b; leadingZeroBits++)
92 b = get_bit(data, bit);
93 //uint32_t codeNum = (1<<leadingZeroBits)-1+readBits(leadingZeroBits);
94 uint64_t codeNum = ((uint64_t)1<<leadingZeroBits)-1+parse_u64(leadingZeroBits, data, bit);
95 return codeNum;
96}
97
98inline uint32_t more_rbsp_data(const uint8_t *data, size_t size, size_t bit)
99{
100 if(bit>=size*8) return 0x0;
101 size_t stop_bit = size*8-1;
102 while(!peek_bit(data, stop_bit)) stop_bit--;
103 if(bit<stop_bit) return 0x1;
104 return 0x0;
105}
106
107}// namespace ...
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....