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}