code wiki / (root) / nx_h264_intra16.nx

nx_h264_intra16.nx source

↩ module page · 78 lines · 2922 B

1// nx_h264_intra16.nx -- Intra_16x16 luma prediction (spec 8.3.3), core modes. 2// 0 Vertical : pred[y][x] = top[x] (needs top) 3// 1 Horizontal : pred[y][x] = left[y] (needs left) 4// 2 DC : both -> (sum top16 + sum left16 + 16) >> 5 5// top-only -> (sum top16 + 8) >> 4 ; left-only -> (sum left16 + 8) >> 4 6// neither -> 128 (the first MB of a frame: flat 128) 7// (Mode 3 Plane = gradient fit, not yet built -- flagged.) pred is 256 i64 (16x16 raster). 8// 9// genealogy_id: itu_t_h264_sec8_3_3_intra16x16 10// lineage_id: intra16x16_dc_vertical_horizontal 11// license_tier: ORIGINAL 12import "nx_syscalls.nx" 13import "nx_h264_idct.nx" 14 15func nx_intra16x16_pred(mode: i64, top: *i64, left: *i64, avail_top: i64, avail_left: i64, pred: *i64) -> i64 { 16 if mode == 0 { 17 var y: i64 = 0 18 while y < 16 { var x: i64 = 0; while x < 16 { pred[y * 16 + x] = top[x]; x = x + 1 } y = y + 1 } 19 } 20 if mode == 1 { 21 var y: i64 = 0 22 while y < 16 { var x: i64 = 0; while x < 16 { pred[y * 16 + x] = left[y]; x = x + 1 } y = y + 1 } 23 } 24 if mode == 2 { 25 var st: i64 = 0 26 var sl: i64 = 0 27 var k: i64 = 0 28 while k < 16 { st = st + top[k]; sl = sl + left[k]; k = k + 1 } 29 var dc: i64 = 128 30 if avail_top == 1 { if avail_left == 1 { dc = (st + sl + 16) >> 5 } } 31 if avail_top == 1 { if avail_left == 0 { dc = (st + 8) >> 4 } } 32 if avail_top == 0 { if avail_left == 1 { dc = (sl + 8) >> 4 } } 33 var i: i64 = 0 34 while i < 256 { pred[i] = dc; i = i + 1 } 35 } 36 return 0 37} 38 39// Full Intra_16x16 predictor incl. mode 3 Plane (spec 8.3.3.4). top[0..15]=p[x,-1], 40// left[0..15]=p[-1,y], topleft=p[-1,-1]. pred = 256 i64 raster, clipped to [0,255]. 41func nx_intra16x16_pred_full(mode: i64, top: *i64, left: *i64, topleft: i64, avail_top: i64, avail_left: i64, pred: *i64) -> i64 { 42 if mode < 3 { 43 return nx_intra16x16_pred(mode, top, left, avail_top, avail_left, pred) 44 } 45 // mode 3 Plane 46 var H: i64 = 0 47 var xp: i64 = 0 48 while xp < 8 { 49 var t2: i64 = topleft 50 if 6 - xp >= 0 { t2 = top[6 - xp] } 51 H = H + (xp + 1) * (top[8 + xp] - t2) 52 xp = xp + 1 53 } 54 var V: i64 = 0 55 var yp: i64 = 0 56 while yp < 8 { 57 var l2: i64 = topleft 58 if 6 - yp >= 0 { l2 = left[6 - yp] } 59 V = V + (yp + 1) * (left[8 + yp] - l2) 60 yp = yp + 1 61 } 62 let a: i64 = 16 * (left[15] + top[15]) 63 let b: i64 = asr(5 * H + 32, 6) 64 let c: i64 = asr(5 * V + 32, 6) 65 var y: i64 = 0 66 while y < 16 { 67 var x: i64 = 0 68 while x < 16 { 69 var v: i64 = asr(a + b * (x - 7) + c * (y - 7) + 16, 5) 70 if v < 0 { v = 0 } 71 if v > 255 { v = 255 } 72 pred[y * 16 + x] = v 73 x = x + 1 74 } 75 y = y + 1 76 } 77 return 0 78}