nx_jpeg_sos_test.nx source
↩ module page · 119 lines · 4717 B
1// nx_jpeg_sos_test.nx -- KAT for SOS header parser.
2//
3// expect_exit: 0
4// license_tier: ORIGINAL
5
6import "nx_syscalls.nx"
7import "nx_jpeg_sos.nx"
8
9func _fail(n: i64) -> i64 {
10 let b: *u8 = sys_mmap(16)
11 b[0]=0x46; b[1]=0x41; b[2]=0x49; b[3]=0x4C; b[4]=0x3D
12 sys_write(2, b, 5)
13 var x: i64 = n
14 if x < 0 { let m: *u8 = sys_mmap(4); m[0]=0x2D; sys_write(2, m, 1); x = 0 - x }
15 if x == 0 { let z: *u8 = sys_mmap(4); z[0]=0x30; sys_write(2, z, 1) }
16 else {
17 let buf: *u8 = sys_mmap(16)
18 var pos: i64 = 0
19 while x > 0 { buf[pos] = (0x30 + (x % 10)) as u8; x = x / 10; pos = pos + 1 }
20 let out: *u8 = sys_mmap(16)
21 var i: i64 = 0
22 while i < pos { out[i] = buf[pos - 1 - i]; i = i + 1 }
23 sys_write(2, out, pos)
24 }
25 let nl: *u8 = sys_mmap(4); nl[0]=0x0A; sys_write(2, nl, 1)
26 return 0
27}
28
29func main() -> i64 {
30 let scan: *NxJpegScan = sys_mmap(NX_JPEG_SCAN_BYTES) as *NxJpegScan
31 let comps: *NxJpegSosComponent = sys_mmap(NX_JPEG_SOS_COMP_BYTES * 4) as *NxJpegSosComponent
32 scan.components = comps
33
34 // ============================================================
35 // Section A: standard 3-component YCbCr scan.
36 // Ns=3
37 // Y: Cs=1, Td=0 Ta=0 -> 0x00
38 // Cb: Cs=2, Td=1 Ta=1 -> 0x11
39 // Cr: Cs=3, Td=1 Ta=1 -> 0x11
40 // Ss=0, Se=63, AhAl=0x00
41 // Total payload = 1 + 3*2 + 3 = 10 bytes
42 // ============================================================
43 let p_a: *u8 = sys_mmap(16)
44 p_a[0] = 3
45 p_a[1] = 1; p_a[2] = 0x00
46 p_a[3] = 2; p_a[4] = 0x11
47 p_a[5] = 3; p_a[6] = 0x11
48 p_a[7] = 0 // Ss
49 p_a[8] = 63 // Se
50 p_a[9] = 0 // AhAl
51
52 if nx_jpeg_sos_parse(p_a, 10, scan) != NX_JPEG_SOS_OK { _fail(1); return 1 }
53 if scan.n_components != 3 { _fail(2); return 2 }
54 if scan.ss != 0 { _fail(3); return 3 }
55 if scan.se != 63 { _fail(4); return 4 }
56 if scan.ah != 0 { _fail(5); return 5 }
57 if scan.al != 0 { _fail(6); return 6 }
58
59 let c0: *NxJpegSosComponent = comps
60 let c1: *NxJpegSosComponent = (comps as i64 + NX_JPEG_SOS_COMP_BYTES) as *NxJpegSosComponent
61 let c2: *NxJpegSosComponent = (comps as i64 + 2 * NX_JPEG_SOS_COMP_BYTES) as *NxJpegSosComponent
62 if c0.csj != 1 { _fail(10); return 10 }
63 if c0.td != 0 { _fail(11); return 11 }
64 if c0.ta != 0 { _fail(12); return 12 }
65 if c1.csj != 2 { _fail(13); return 13 }
66 if c1.td != 1 { _fail(14); return 14 }
67 if c1.ta != 1 { _fail(15); return 15 }
68 if c2.csj != 3 { _fail(16); return 16 }
69
70 // ============================================================
71 // Section B: grayscale 1-component scan.
72 // ============================================================
73 let p_b: *u8 = sys_mmap(16)
74 p_b[0] = 1
75 p_b[1] = 1; p_b[2] = 0x00
76 p_b[3] = 0; p_b[4] = 63; p_b[5] = 0
77
78 if nx_jpeg_sos_parse(p_b, 6, scan) != NX_JPEG_SOS_OK { _fail(20); return 20 }
79 if scan.n_components != 1 { _fail(21); return 21 }
80
81 // ============================================================
82 // Section C: progressive (Ss != 0) detection
83 // ============================================================
84 let p_c: *u8 = sys_mmap(16)
85 p_c[0] = 1
86 p_c[1] = 1; p_c[2] = 0x00
87 p_c[3] = 1; p_c[4] = 5; p_c[5] = 0 // Ss=1, Se=5 -> progressive
88 if nx_jpeg_sos_parse(p_c, 6, scan) != NX_JPEG_SOS_NOT_BASELINE { _fail(30); return 30 }
89
90 // ============================================================
91 // Section D: malformed -- Ns = 0
92 // ============================================================
93 let p_d: *u8 = sys_mmap(16)
94 p_d[0] = 0
95 p_d[1] = 0; p_d[2] = 63; p_d[3] = 0
96 if nx_jpeg_sos_parse(p_d, 4, scan) != NX_JPEG_SOS_BAD_NS { _fail(40); return 40 }
97
98 // ============================================================
99 // Section E: malformed -- truncated (Ns=3 but only 5 bytes after header)
100 // ============================================================
101 let p_e: *u8 = sys_mmap(8)
102 p_e[0] = 3
103 p_e[1] = 1; p_e[2] = 0x00
104 if nx_jpeg_sos_parse(p_e, 3, scan) != NX_JPEG_SOS_TRUNC { _fail(50); return 50 }
105
106 // ============================================================
107 // Section F: malformed -- bad table id (Td > 3)
108 // ============================================================
109 let p_f: *u8 = sys_mmap(16)
110 p_f[0] = 1
111 p_f[1] = 1; p_f[2] = 0x40 // Td=4, illegal
112 p_f[3] = 0; p_f[4] = 63; p_f[5] = 0
113 if nx_jpeg_sos_parse(p_f, 6, scan) != NX_JPEG_SOS_BAD_TABLE { _fail(60); return 60 }
114
115 let pass: *u8 = sys_mmap(16)
116 pass[0]=0x50; pass[1]=0x41; pass[2]=0x53; pass[3]=0x53; pass[4]=0x0A
117 sys_write(1, pass, 5)
118 return 0
119}