code wiki / (root) / nx_hevc_dec.nx

nx_hevc_dec.nx

buildroot/runtime/nx_hevc_dec.nx

67201 B602 linesdepth 2pulls 2 transitivereach 0 importersview sourcekind tooltopic hevc
docsdependenciesstructsconstsfunctions

about

nx_hevc_dec.nx -- SOVEREIGN HEVC decoder (combined), RUNG 3b-2: CABAC running on the real slice. Integrates R1 parse + R2 CABAC + R3a headers + R3b-1 contexts: full PPS + full slice_segment_header -> byte-aligned CABAC start + SliceQpY, init engine+contexts, then decode the first CTB's sao() + the first split_cu_flag of the coding_quadtree. This is the entry point the CU/TU/residual rungs (R3b-3..5) extend. No third party. Usage: nx_hevc_dec <in.mkv> license_tier: ORIGINAL

dependencies 1 imports · 0 importers

nx_syscalls.nx nx_hevc_dec.nx

imports: nx_syscalls.nx

imported by: nobody (leaf or entry point)

call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown

main sys_openat_rd pe sys_write sys_mmap sys_read sys_close rid vlen rsz vlen ↻ ruint deemul hb hbit hue hbit ↻ hb ↻ parse_strps hb ↻ hue ↻ hse hue ↻ pn sys_mmap ↻ sys_write ↻ vlen ↻ deemul_ep ceil_log2 parse_nums ctxi clip3 cinit cbit build_dct sao_decode cdecD cdec crenorm cbit ↻

structs

none

consts

7const K_MAGIC_32768: i64 = 32768
8const K_MAGIC_32767: i64 = 32767
9const K_MAGIC_8388608: i64 = 8388608
10const K_MAGIC_8192: i64 = 8192
11const K_MAGIC_1024: i64 = 1024
12const K_MAGIC_99999: i64 = 99999

functions

14func pe(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return sys_write(1,s,n) }
called by 2: residual_sigmain calls 1: sys_write
15func pn(v: i64) -> i64 { var m: i64=v; if m<0{m=0-m} let b: *u8=sys_mmap(32); var i: i64=32; if m==0{i=i-1;b[i]=(48 as u8)} while m>0{let q: i64=m/10; i=i-1; b[i]=((48+(m-q*10)) as u8); m=q} if v<0{i=i-1;b[i]=(45 as u8)} return sys_write(1,((b as i64)+i) as *u8,32-i) }
called by 2: residual_sigmain calls 2: sys_mmapsys_write
16func parse_nums(s: *u8, out: *i64) -> i64 { var n: i64=0; var i: i64=0; var cur: i64=0; var has: i64=0; var neg: i64=0; while s[i]!=(0 as u8){ let c: i64=s[i] as i64; if c>=48 { if c<=57 {cur=cur*10+(c-48);has=1} else { if has==1{if neg==1{cur=0-cur} out[n]=cur;n=n+1;cur=0;has=0;neg=0} } } else { if c==45 {neg=1} else { if has==1{if neg==1{cur=0-cur} out[n]=cur;n=n+1;cur=0;has=0;neg=0} } } i=i+1 } if has==1{if neg==1{cur=0-cur} out[n]=cur;n=n+1} return n }
called by 2: deblockmain
17func clip3(lo: i64, hi: i64, v: i64) -> i64 { if v<lo {return lo} if v>hi {return hi} return v }
18func vlen(b0: i64) -> i64 { if (b0&0x80)!=0{return 1} if (b0&0x40)!=0{return 2} if (b0&0x20)!=0{return 3} if (b0&0x10)!=0{return 4} if (b0&0x08)!=0{return 5} if (b0&0x04)!=0{return 6} if (b0&0x02)!=0{return 7} return 8 }
called by 3: ridrszmain
19func rid(b: *u8, i: i64, lo: *i64) -> i64 { let L: i64=vlen(b[i] as i64); var v: i64=0; var k: i64=0; while k<L {v=(v<<8)|(b[i+k] as i64); k=k+1} lo[0]=L; return v }
called by 1: main calls 1: vlen
20func rsz(b: *u8, i: i64, lo: *i64) -> i64 { let L: i64=vlen(b[i] as i64); var v: i64=(b[i] as i64)&(0xff>>L); var k: i64=1; while k<L {v=(v<<8)|(b[i+k] as i64); k=k+1} lo[0]=L; return v }
called by 1: main calls 1: vlen
21func ruint(b: *u8, o: i64, len: i64) -> i64 { var v: i64=0; var k: i64=0; while k<len {v=(v<<8)|(b[o+k] as i64); k=k+1} return v }
called by 1: main
22func deemul(src: *u8, off: i64, len: i64, nhdr: i64, out: *u8) -> i64 { var rn: i64=0; var z: i64=0; var s: i64=off+nhdr; while s<off+len { let c: i64=src[s] as i64; if z>=2 { if c==3 {z=0} else {out[rn]=c as u8;rn=rn+1; if c==0{z=z+1}else{z=0}} } else {out[rn]=c as u8;rn=rn+1; if c==0{z=z+1}else{z=0}} s=s+1 } return rn }
called by 1: main
24func deemul_ep(src: *u8, off: i64, len: i64, nhdr: i64, out: *u8, epos: *i64) -> i64 { var rn: i64=0; var z: i64=0; var s: i64=off+nhdr; while s<off+len { let c: i64=src[s] as i64; var sk: i64=0; if z>=2 { if c==3 {sk=1} } if sk==1 {z=0} else {out[rn]=c as u8; epos[rn]=s-(off+nhdr); rn=rn+1; if c==0{z=z+1}else{z=0}} s=s+1 } return rn }
called by 1: main
26func hbit(hs: *i64) -> i64 { let p: *u8=hs[0] as *u8; let bp: i64=hs[1]; hs[1]=bp+1; return ((p[bp>>3] as i64)>>(7-(bp&7)))&1 }
called by 2: hbhue
27func hb(hs: *i64, n: i64) -> i64 { var v: i64=0; var i: i64=0; while i<n {v=(v<<1)|hbit(hs); i=i+1} return v }
called by 3: hueparse_strpsmain calls 1: hbit
28func hue(hs: *i64) -> i64 { var lz: i64=0; while hbit(hs)==0 {lz=lz+1; if lz>40{return 0}} if lz==0{return 0} return ((1<<lz)-1)+hb(hs,lz) }
called by 3: hseparse_strpsmain calls 2: hbithb
29func hse(hs: *i64) -> i64 { let k: i64=hue(hs); if (k&1)==1 {return (k+1)/2} return 0-(k/2) }
called by 1: main calls 1: hue
30func ceil_log2(n: i64) -> i64 { var k: i64=0; var v: i64=1; while v<n {v=v*2; k=k+1} return k }
called by 1: main
32func parse_strps(bs: *i64, idx: i64, numStr: i64, ndp: *i64) -> i64
called by 1: main calls 2: hbhue
48func cbit(cab: *i64) -> i64 { let bp: i64=cab[3]; if bp>=cab[4] {cab[3]=bp+1; return 0} let p: *u8=cab[2] as *u8; cab[3]=bp+1; return ((p[bp>>3] as i64)>>(7-(bp&7)))&1 }
called by 3: cinitcrenormcbyp
49func cinit(cab: *i64, data: *u8, bitstart: i64, bytelen: i64) -> i64 { cab[2]=data as i64; cab[3]=bitstart; cab[4]=bytelen*8; cab[0]=510; var o: i64=0; var k: i64=0; while k<9 {o=(o<<1)|cbit(cab); k=k+1} cab[1]=o; return 0 }
called by 1: main calls 1: cbit
50func crenorm(cab: *i64) -> i64 { while cab[0]<256 {cab[0]=cab[0]<<1; cab[1]=(cab[1]<<1)|cbit(cab)} return 0 }
called by 2: cdeccterm calls 1: cbit
51func cdec(cab: *i64, ctx: *i64, k: i64, rlps: *i64, tlps: *i64, tmps: *i64) -> i64 { let ps: i64=ctx[2*k]; let mps: i64=ctx[2*k+1]; let lps: i64=rlps[ps*4+((cab[0]>>6)&3)]; cab[0]=cab[0]-lps; var bin: i64=0; if cab[1]>=cab[0] { bin=1-mps; cab[1]=cab[1]-cab[0]; cab[0]=lps; if ps==0{ctx[2*k+1]=1-mps} ctx[2*k]=tlps[ps] } else { bin=mps; ctx[2*k]=tmps[ps] } crenorm(cab); return bin }
called by 2: cdecDresidual_sig calls 1: crenorm
52func cbyp(cab: *i64) -> i64 { cab[1]=(cab[1]<<1)|cbit(cab); if cab[1]>=cab[0] {cab[1]=cab[1]-cab[0]; return 1} return 0 }
53func ctxi(ctx: *i64, k: i64, iv: i64, qp: i64) -> i64 { let sl: i64=(iv>>4)*5-45; let of: i64=((iv&15)<<3)-16; let pre: i64=clip3(1,126,((sl*clip3(0,51,qp))>>4)+of); if pre<=63 {ctx[2*k]=63-pre; ctx[2*k+1]=0} else {ctx[2*k]=pre-64; ctx[2*k+1]=1} return 0 }
called by 1: main calls 1: clip3
55func tr_bypass(cab: *i64, cMax: i64) -> i64 { var v: i64=0; while v<cMax { if cbyp(cab)==0 {return v} v=v+1 } return cMax }
called by 2: sao_offscoding_unit calls 1: cbyp
57func cdecD(dec: *i64, k: i64) -> i64 { return cdec(dec[0] as *i64, dec[1] as *i64, k, dec[2] as *i64, dec[3] as *i64, dec[4] as *i64) }
59func diag_scan(S: i64, sx: *i64, sy: *i64) -> i64 { var i: i64=0; var x: i64=0; var y: i64=0; var stop: i64=0; while stop==0 { while y>=0 { if x<S { if y<S { sx[i]=x; sy[i]=y; i=i+1 } } y=y-1; x=x+1 } y=x; x=0; if i>=S*S {stop=1} } return i }
called by 1: gen_scan
61func gen_scan(S: i64, scanIdx: i64, sx: *i64, sy: *i64) -> i64
called by 1: residual_sig calls 1: diag_scan
67func sig_ctxinc(xC: i64, yC: i64, log2: i64, cIdx: i64, scanIdx: i64, csbfR: i64, csbfB: i64, map: *i64) -> i64
called by 1: residual_sig
76func coeff_rem(cab: *i64, rice: i64) -> i64
called by 1: residual_sig calls 1: cbyp
82func residual_sig(dec: *i64, log2: i64, cIdx: i64, predModeIntra: i64) -> i64
150func eg0(cab: *i64) -> i64 { var lz: i64=0; var dn: i64=0; while dn==0 { if cbyp(cab)==1 {lz=lz+1; if lz>=31 {dn=1}} else {dn=1} } var v: i64=0; var k: i64=0; while k<lz {v=(v<<1)|cbyp(cab); k=k+1} return (1<<lz)-1+v }
called by 1: xtree calls 1: cbyp
155func xtree(dec: *i64, log2: i64, depth: i64, cbfcb: i64, cbfcr: i64, x0: i64, y0: i64) -> i64
183func ilog2(n: i64) -> i64 { var l: i64=0; var v: i64=n; while v>1 {v=v>>1; l=l+1} return l }
184func build_dct(gN: *i64, N: i64, gHalf: *i64, oddC: *i64) -> i64 { let H: i64=N/2; var j: i64=0; while j<H { var nn: i64=0; while nn<H { gN[(2*j)*N+nn]=gHalf[j*H+nn]; gN[(2*j)*N+(N-1-nn)]=gHalf[j*H+nn]; gN[(2*j+1)*N+nn]=oddC[j*H+nn]; gN[(2*j+1)*N+(N-1-nn)]=0-oddC[j*H+nn]; nn=nn+1 } j=j+1 } return 0 }
called by 1: main
185func dequant(coeff: *i64, N: i64, qP: i64, bd: i64, lsc: *i64) -> i64 { let bs: i64=bd+ilog2(N)-5; let ls: i64=lsc[qP%6]; let sh: i64=qP/6; let ad: i64=1<<(bs-1); var i: i64=0; while i<N*N { coeff[i]=clip3(0-K_MAGIC_32768,K_MAGIC_32767,((coeff[i]*16*ls<<sh)+ad)>>bs); i=i+1 } return 0 }
called by 2: xtreerecon_chroma calls 2: ilog2clip3
186func itransform(coeff: *i64, N: i64, mat: *i64, bd: i64, tmp: *i64) -> i64 { var c: i64=0; while c<N { var r: i64=0; while r<N { var s: i64=0; var k: i64=0; while k<N {s=s+mat[k*N+r]*coeff[k*N+c]; k=k+1} tmp[r*N+c]=clip3(0-K_MAGIC_32768,K_MAGIC_32767,(s+64)>>7); r=r+1 } c=c+1 } let b2: i64=20-bd; let a2: i64=1<<(b2-1); var r2: i64=0; while r2<N { var c2: i64=0; while c2<N { var s: i64=0; var k: i64=0; while k<N {s=s+mat[k*N+c2]*tmp[r2*N+k]; k=k+1} coeff[r2*N+c2]=(s+a2)>>b2; c2=c2+1 } r2=r2+1 } return 0 }
called by 2: xtreerecon_chroma calls 1: clip3
187func predict_planar(pred: *i64, N: i64, refL: *i64, refT: *i64, refTR: i64, refBL: i64) -> i64 { let sh: i64=ilog2(N)+1; var y: i64=0; while y<N { var x: i64=0; while x<N { pred[y*N+x]=((N-1-x)*refL[y]+(x+1)*refTR+(N-1-y)*refT[x]+(y+1)*refBL+N)>>sh; x=x+1 } y=y+1 } return 0 }
called by 1: predict_tu calls 1: ilog2
188func predict_dc(pred: *i64, N: i64, refL: *i64, refT: *i64, cIdx: i64) -> i64 { var s: i64=0; var k: i64=0; while k<N {s=s+refT[k]+refL[k]; k=k+1} let dc: i64=(s+N)>>(ilog2(N)+1); var i: i64=0; while i<N*N {pred[i]=dc; i=i+1} if cIdx==0 { if N<32 { pred[0]=(refL[0]+2*dc+refT[0]+2)>>2; var x2: i64=1; while x2<N {pred[x2]=(refT[x2]+3*dc+2)>>2; x2=x2+1} var y2: i64=1; while y2<N {pred[y2*N]=(refL[y2]+3*dc+2)>>2; y2=y2+1} } } return 0 }
called by 1: predict_tu calls 1: ilog2
189func predict_angular(pred: *i64, N: i64, mode: i64, refL: *i64, refT: *i64, corner: i64, angT: *i64, invT: *i64, lf: i64) -> i64
called by 1: predict_tu calls 2: sys_mmapclip3
204func predict_tu(out: *i64, N: i64, mode: i64, refL: *i64, refT: *i64, corner: i64, angT: *i64, invT: *i64, lf: i64) -> i64 { if mode==0 {predict_planar(out,N,refL,refT,refT[N],refL[N])} else { if mode==1 {predict_dc(out,N,refL,refT,1-lf)} else {predict_angular(out,N,mode,refL,refT,corner,angT,invT,lf)} } return 0 }
206func recon_chroma(dec: *i64, cN: i64, cIdx: i64, cx: i64, cy: i64, modeC: i64, hasRes: i64) -> i64
218func derive_refs(frame: *i64, fw: i64, fh: i64, x0: i64, y0: i64, N: i64, refL: *i64, refT: *i64, cornerP: *i64) -> i64
called by 2: xtreerecon_chroma calls 1: sys_mmap
232func absi(x: i64) -> i64 { if x<0 {return 0-x} return x }
called by 1: db_luma
234func db_luma(frame: *i64, base: i64, ps: i64, ts: i64, beta: i64, tc: i64) -> i64
called by 1: deblock calls 2: absiclip3
270func db_chroma(plane: *i64, base: i64, ps: i64, ts: i64, tc: i64) -> i64
called by 1: deblock calls 1: clip3
276func deblock(dec: *i64, qpY: i64, betaOff: i64, tcOff: i64, qpcb: i64, qpcr: i64) -> i64
290func sgn(x: i64) -> i64 { if x>0 {return 1} if x<0 {return 0-1} return 0 }
called by 1: sao_apply_comp
292func sao_apply_comp(plane: *i64, cp: *i64, stride: i64, W: i64, H: i64, x0: i64, y0: i64, sz: i64, saoP: *i64, base: i64) -> i64
called by 1: apply_sao calls 2: clip3sgn
305func apply_sao(dec: *i64, ctbSize: i64) -> i64
called by 1: main calls 2: sys_mmapsao_apply_comp
318func write_pgm(frame: *i64, w: i64, h: i64, path: *u8) -> i64 { let fd: i64=sys_openat_wr(path,420); if fd<0 {return 0-1} let hdr: *u8=sys_mmap(64); var p: i64=0; hdr[p]=(80 as u8);p=p+1; hdr[p]=(53 as u8);p=p+1; hdr[p]=(10 as u8);p=p+1; let tb: *u8=sys_mmap(16); var ti: i64=0; var tw: i64=w; while tw>0{tb[ti]=((48+tw%10) as u8);ti=ti+1;tw=tw/10} while ti>0{ti=ti-1;hdr[p]=tb[ti];p=p+1} hdr[p]=(32 as u8);p=p+1; var th: i64=h; ti=0; while th>0{tb[ti]=((48+th%10) as u8);ti=ti+1;th=th/10} while ti>0{ti=ti-1;hdr[p]=tb[ti];p=p+1} hdr[p]=(10 as u8);p=p+1; hdr[p]=(50 as u8);p=p+1; hdr[p]=(53 as u8);p=p+1; hdr[p]=(53 as u8);p=p+1; hdr[p]=(10 as u8);p=p+1; sys_write(fd,hdr,p); let body: *u8=sys_mmap(w*h); var i: i64=0; while i<w*h { var v: i64=frame[i]>>2; if v<0{v=0} if v>255{v=255} body[i]=(v as u8); i=i+1 } sys_write(fd,body,w*h); sys_close(fd); return 0 }
321func cterm(cab: *i64) -> i64 { cab[0]=cab[0]-2; if cab[1]>=cab[0] {return 1} crenorm(cab); return 0 }
called by 1: main calls 1: crenorm
324func sao_offs(cab: *i64, ty: i64, saoP: *i64, off: i64) -> i64 { var i: i64=0; while i<4 {saoP[off+i]=tr_bypass(cab,31); i=i+1} if ty==1 { i=0; while i<4 { if saoP[off+i]!=0 { if cbyp(cab)==1 {saoP[off+i]=0-saoP[off+i]} } i=i+1 } var bp: i64=0; var b: i64=0; while b<5 {bp=(bp<<1)|cbyp(cab); b=b+1} return bp } saoP[off+2]=0-saoP[off+2]; saoP[off+3]=0-saoP[off+3]; return 0 }
called by 1: sao_decode calls 2: tr_bypasscbyp
326func sao_decode(dec: *i64, rx: i64, ry: i64, saoL: i64, saoC: i64, chromaArray: i64) -> i64
called by 1: main calls 3: cdecDcbypsao_offs
339func iabs(v: i64) -> i64 { if v<0 {return 0-v} return v }
called by 1: smooth_refs
342func smooth_refs(refL: *i64, refT: *i64, cornerP: *i64, N: i64, mode: i64) -> i64
called by 1: xtree calls 2: iabssys_mmap
356func mpm_list(dec: *i64, x0: i64, y0: i64, candList: *i64) -> i64
called by 1: coding_unit
366func coding_unit(dec: *i64, x0: i64, y0: i64, log2Cb: i64, depth: i64) -> i64
388func coding_quadtree(dec: *i64, x0: i64, y0: i64, log2Cb: i64, depth: i64) -> i64
397func main(argc: i64, argv: *i64) -> i64