code wiki / (root) / nx_jpeg_sos_test.nx

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}