nx_h264_bitwriter.nx source
↩ module page · 58 lines · 1828 B
1// nx_h264_bitwriter.nx -- MSB-first bit writer (hardware-rung primitive).
2// The inverse of nx_h264_bits' reader: accumulate bits MSB-first into a byte
3// buffer. Foundational for sovereign self-verification (encode->decode round
4// trip = the oracle, no third-party reference) and for re-encode/transcode.
5// Buffer must be zero-initialised (sys_mmap zeroes); we OR set-bits in.
6//
7// genealogy_id: msb_bitstream_writer
8// lineage_id: bit_accumulate_msb_first
9// license_tier: ORIGINAL
10import "nx_syscalls.nx"
11
12struct BitWriter {
13 buf: *u8,
14 byte_pos: i64,
15 bit_pos: i64,
16 cap: i64,
17}
18const NX_BW_BYTES: i64 = 32
19
20func bw_init(bw: *BitWriter, buf: *u8, cap: i64) -> i64 {
21 bw.buf = buf
22 bw.byte_pos = 0
23 bw.bit_pos = 0
24 bw.cap = cap
25 return 0
26}
27
28func bw_write_bit(bw: *BitWriter, bit: i64) -> i64 {
29 if bw.byte_pos >= bw.cap { return 0 }
30 if bit == 1 {
31 let cur: i64 = bw.buf[bw.byte_pos] as i64
32 bw.buf[bw.byte_pos] = (cur | (1 << (7 - bw.bit_pos))) as u8
33 }
34 bw.bit_pos = bw.bit_pos + 1
35 if bw.bit_pos == 8 { bw.bit_pos = 0; bw.byte_pos = bw.byte_pos + 1 }
36 return 0
37}
38
39// write n bits of val, MSB-first
40func bw_write_bits(bw: *BitWriter, val: i64, n: i64) -> i64 {
41 var i: i64 = n - 1
42 while i >= 0 { bw_write_bit(bw, (val >> i) & 1); i = i - 1 }
43 return 0
44}
45
46func bw_total_bits(bw: *BitWriter) -> i64 { return bw.byte_pos * 8 + bw.bit_pos }
47
48// Exp-Golomb ue(v) encode: code=v+1, write (numbits-1) zeros then code in numbits bits.
49func bw_write_ue(bw: *BitWriter, v: i64) -> i64 {
50 let code: i64 = v + 1
51 var numbits: i64 = 0
52 var t: i64 = code
53 while t > 0 { numbits = numbits + 1; t = t >> 1 }
54 var i: i64 = 0
55 while i < numbits - 1 { bw_write_bit(bw, 0); i = i + 1 }
56 bw_write_bits(bw, code, numbits)
57 return 0
58}