code wiki / (root) / nx_h264_bitwriter.nx

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}