nx_hevc_dec.nx
buildroot/runtime/nx_hevc_dec.nx
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
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
structs
| none |
consts
| 7 | const K_MAGIC_32768: i64 = 32768 |
| 8 | const K_MAGIC_32767: i64 = 32767 |
| 9 | const K_MAGIC_8388608: i64 = 8388608 |
| 10 | const K_MAGIC_8192: i64 = 8192 |
| 11 | const K_MAGIC_1024: i64 = 1024 |
| 12 | const K_MAGIC_99999: i64 = 99999 |
functions
| 14 | func pe(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return sys_write(1,s,n) } |
| 15 | func 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) } |
| 16 | func 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 } |
| 17 | func clip3(lo: i64, hi: i64, v: i64) -> i64 { if v<lo {return lo} if v>hi {return hi} return v } |
| 18 | func 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 } |
| 19 | func 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 } |
| 20 | func 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 } |
| 21 | func 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 |
| 22 | func 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 |
| 24 | func 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 |
| 26 | func 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 } |
| 27 | func 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 } |
| 28 | func 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) } |
| 29 | func hse(hs: *i64) -> i64 { let k: i64=hue(hs); if (k&1)==1 {return (k+1)/2} return 0-(k/2) } |
| 30 | func 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 |
| 32 | func parse_strps(bs: *i64, idx: i64, numStr: i64, ndp: *i64) -> i64 |
| 48 | func 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 } |
| 49 | func 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 } |
| 50 | func crenorm(cab: *i64) -> i64 { while cab[0]<256 {cab[0]=cab[0]<<1; cab[1]=(cab[1]<<1)|cbit(cab)} return 0 } |
| 51 | func 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 } |
| 52 | func 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 } |
| 53 | func 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 } |
| 55 | func 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 } |
| 57 | func 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) } |
| 59 | func 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 |
| 61 | func gen_scan(S: i64, scanIdx: i64, sx: *i64, sy: *i64) -> i64 |
| 67 | func sig_ctxinc(xC: i64, yC: i64, log2: i64, cIdx: i64, scanIdx: i64, csbfR: i64, csbfB: i64, map: *i64) -> i64 called by 1: residual_sig |
| 76 | func coeff_rem(cab: *i64, rice: i64) -> i64 |
| 82 | func residual_sig(dec: *i64, log2: i64, cIdx: i64, predModeIntra: i64) -> i64 |
| 150 | func 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 } |
| 155 | func xtree(dec: *i64, log2: i64, depth: i64, cbfcb: i64, cbfcr: i64, x0: i64, y0: i64) -> i64 |
| 183 | func ilog2(n: i64) -> i64 { var l: i64=0; var v: i64=n; while v>1 {v=v>>1; l=l+1} return l } |
| 184 | func 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 |
| 185 | func 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 } |
| 186 | func 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 } |
| 187 | func 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 } |
| 188 | func 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 } |
| 189 | func predict_angular(pred: *i64, N: i64, mode: i64, refL: *i64, refT: *i64, corner: i64, angT: *i64, invT: *i64, lf: i64) -> i64 |
| 204 | func 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 } |
| 206 | func recon_chroma(dec: *i64, cN: i64, cIdx: i64, cx: i64, cy: i64, modeC: i64, hasRes: i64) -> i64 |
| 218 | func derive_refs(frame: *i64, fw: i64, fh: i64, x0: i64, y0: i64, N: i64, refL: *i64, refT: *i64, cornerP: *i64) -> i64 |
| 232 | func absi(x: i64) -> i64 { if x<0 {return 0-x} return x } called by 1: db_luma |
| 234 | func db_luma(frame: *i64, base: i64, ps: i64, ts: i64, beta: i64, tc: i64) -> i64 |
| 270 | func db_chroma(plane: *i64, base: i64, ps: i64, ts: i64, tc: i64) -> i64 |
| 276 | func deblock(dec: *i64, qpY: i64, betaOff: i64, tcOff: i64, qpcb: i64, qpcr: i64) -> i64 |
| 290 | func sgn(x: i64) -> i64 { if x>0 {return 1} if x<0 {return 0-1} return 0 } called by 1: sao_apply_comp |
| 292 | func sao_apply_comp(plane: *i64, cp: *i64, stride: i64, W: i64, H: i64, x0: i64, y0: i64, sz: i64, saoP: *i64, base: i64) -> i64 |
| 305 | func apply_sao(dec: *i64, ctbSize: i64) -> i64 |
| 318 | func 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 } |
| 321 | func cterm(cab: *i64) -> i64 { cab[0]=cab[0]-2; if cab[1]>=cab[0] {return 1} crenorm(cab); return 0 } |
| 324 | func 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 } |
| 326 | func sao_decode(dec: *i64, rx: i64, ry: i64, saoL: i64, saoC: i64, chromaArray: i64) -> i64 |
| 339 | func iabs(v: i64) -> i64 { if v<0 {return 0-v} return v } called by 1: smooth_refs |
| 342 | func smooth_refs(refL: *i64, refT: *i64, cornerP: *i64, N: i64, mode: i64) -> i64 |
| 356 | func mpm_list(dec: *i64, x0: i64, y0: i64, candList: *i64) -> i64 called by 1: coding_unit |
| 366 | func coding_unit(dec: *i64, x0: i64, y0: i64, log2Cb: i64, depth: i64) -> i64 |
| 388 | func coding_quadtree(dec: *i64, x0: i64, y0: i64, log2Cb: i64, depth: i64) -> i64 |
| 397 | func main(argc: i64, argv: *i64) -> i64 |