secuplug-t10-jxh42T10 · 2026-11-07 · lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K28 pass3 failContents

Light-box protocol: T10 secuplug-t10-jxh42, 2026-11-07

OpenIMP #230 light-box test, generated 2026-11-08 11:57 by lightbox_report.py from run-1107-v2, run-1107-d1d4. Open vs vendor on one camera.

At a glance

The open stack passes 28 of 31 compared checks against the vendor stack; all 3 failed checks are explained or handled (none open).

28
pass
3
fail
1
info / warn
15
planned, not run
Failed checks by handling:1 vendor difference2 accepted

Key numbers, open vs vendor

Where a direction is defined, open is better in 14, equal (within 3 %) in 7 and worse in 1 rows. This direction chip is the raw open-vs-vendor comparison; pass/fail uses the tolerance of each row.

Contents

  1. At a glance
  2. Summary (full text)
  3. Findings and follow-up (3 rows)
  4. Deviations and warnings (4)
  5. Checks (pass/fail) (28 pass, 3 fail)
  6. Protocol (camera, stacks, lamps)
  7. A1 P1 defaults (default AE, comp 128)
  8. A2 Matched exposure + NV12 noise (P2)
  9. A3 Colour (dE00) and grey row
  10. A4 Sharpness (slanted edge at the chart edges)
  11. Pictures (16)
  12. Method

Summary (full text)

Camera secuplug-t10-jxh42 (T10) in the light box with the SpyderCheckr 24 chart, lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K. Both stacks ran on the same camera, the same chart position and the same light: the open stack (open-tx-isp + OpenIMP + streamer) and the vendor stack (Ingenic ISP module + vendor libimp + streamer built for it), one after the other.

Result: 28 pass, 3 fail (1 vendor difference, 2 accepted), 1 info/warn, 15 planned checks not run in these runs.

Failed checks: frame luma p1_night (AE target, default comp 128) (open 87.2, vendor 76.0; pass = open within +-10 % of vendor); p2_a frame luma at the same exposure (open 70.8, vendor 49.4; pass = within +-3 %); p2_night frame luma at the same exposure (open 68.6, vendor 74.8; pass = within +-3 %).

Passed: frame luma p1_day (AE target, default comp 128); chart grey RG (AWB, 1.0 = neutral); chart grey BG (AWB, 1.0 = neutral); p2_a NV12 temporal noise Y (Y 32..224); p2_a NV12 temporal noise U; p2_a NV12 temporal noise V; p2_b frame luma at the same exposure; p2_b NV12 temporal noise Y (Y 32..224); p2_b NV12 temporal noise U; p2_b NV12 temporal noise V; ...

How to read: "pass" means the open stack is equal to or better than the vendor stack within the tolerance named in each row; matched-exposure rows (A2) compare the same integration time and gain on both stacks, read back from the ISP.

Findings and follow-up

3 rows

One row per failed or deviating (warn) check and how it is handled. Issue states were read from GitHub at generation time. The check name links to its row in the checks table.

checkstacksopenvendorverdicthandling
frame luma p1_night (AE target, default comp 128)open, vendor87.276.0failaccepted open is brighter with longer integration time and less noise
p2_a frame luma at the same exposureopen, vendor70.849.4failvendor difference vendor is 2x darker at the same exposure
p2_night frame luma at the same exposureopen, vendor68.674.8failaccepted vendor tone curve differs

Deviations and warnings

4

Checks (pass/fail)

28 pass, 3 fail

Cells: open / vendor value, Δ = open - vendor (relative to vendor), then the direction chip (better / equal / worse, where the row defines one) and the pass/fail verdict with its rule. Rows are grouped by test section.

checksettingopenvendorΔ open-vendoropen vs vendorverdictrule / notehandling
A1 P1 defaults
frame luma p1_day (AE target, default comp 128)default AE, comp 12891.792.6-0.9 (-1 %)passpass = open within +-10 % of vendor
frame luma p1_night (AE target, default comp 128)default AE, comp 12887.276.0+11.2 (+15 %)failpass = open within +-10 % of vendoraccepted open is brighter with longer integration time and less noise
chart grey RG (AWB, 1.0 = neutral)lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K1.08831.1063-0.0180 (-2 %)equalpasspass = |open - vendor| <= 0.02
chart grey BG (AWB, 1.0 = neutral)lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K0.87520.8806-0.0054 (-1 %)equalpasspass = |open - vendor| <= 0.02
A2 matched exposure
p2_a frame luma at the same exposureIT 351 / AGain 32 / IspDG 070.849.4+21.4 (+43 %)failpass = within +-3 %vendor difference vendor is 2x darker at the same exposure
p2_a NV12 temporal noise Y (Y 32..224)IT 351 / AGain 32 / IspDG 01.2001.117+0.083 (+7 %)worsepasspass = open <= vendor x (1 + 2 x A/A spread 5 %)
p2_a NV12 temporal noise UIT 351 / AGain 32 / IspDG 00.7480.785-0.037 (-5 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 9 %)
p2_a NV12 temporal noise VIT 351 / AGain 32 / IspDG 00.4400.509-0.069 (-14 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 7 %)
p2_b frame luma at the same exposureIT 175 / AGain 64 / IspDG 070.269.0+1.2 (+2 %)passpass = within +-3 %
p2_b NV12 temporal noise Y (Y 32..224)IT 175 / AGain 64 / IspDG 00.8650.892-0.027 (-3 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 5 %)
p2_b NV12 temporal noise UIT 175 / AGain 64 / IspDG 00.7490.856-0.107 (-12 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 9 %)
p2_b NV12 temporal noise VIT 175 / AGain 64 / IspDG 00.4200.535-0.115 (-21 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 7 %)
p2_c frame luma at the same exposureIT 88 / AGain 96 / IspDG 070.068.7+1.3 (+2 %)passpass = within +-3 %
p2_c NV12 temporal noise Y (Y 32..224)IT 88 / AGain 96 / IspDG 01.0981.125-0.027 (-2 %)equalpasspass = open <= vendor x (1 + 2 x A/A spread 5 %)
p2_c NV12 temporal noise UIT 88 / AGain 96 / IspDG 00.8740.951-0.077 (-8 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 9 %)
p2_c NV12 temporal noise VIT 88 / AGain 96 / IspDG 00.4970.610-0.113 (-19 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 7 %)
p2_night frame luma at the same exposureIT 73 / AGain 32 / IspDG 068.674.8-6.2 (-8 %)failpass = within +-3 %accepted vendor tone curve differs
p2_night NV12 temporal noise Y (Y 32..224)IT 73 / AGain 32 / IspDG 01.6041.753-0.149 (-8 %)betterpasspass = open <= vendor x (1 + 2 x A/A spread 5 %)
A/A repeatability (p2_a vs p2_a2, same point twice)IT/gain of p2_aYtemp 0% U 9% V 3%Ytemp 0% U 1% V 7%inforelative |a - a2|; > 15 % = the method is noisier than the difference sought
A3 colour
p1_day dE00 mean, unclipped patcheschart_de.py, lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K9.339.31+0.02 (+0 %)equalpasspass = open <= vendor + 1.0
p1_day dE00 mean, grey-normalisedchart_de.py, lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K7.257.22+0.03 (+0 %)equalpasspass = open <= vendor + 1.0
p2_a dE00 mean, unclipped patcheschart_de.py, lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K8.739.24-0.51 (-6 %)betterpasspass = open <= vendor + 1.0
p2_a dE00 mean, grey-normalisedchart_de.py, lamps 3000 (fair pass) + 5000 (colour pass, D1/D4) K7.037.26-0.23 (-3 %)betterpasspass = open <= vendor + 1.0
grey row tone slopeP1 day0.8810.877+0.004 (+0 %)equalpasspass = |open - vendor| <= 0.05
A4 sharpness
MTF50 median of 8 chart edges (cycles/pixel)P1 day, 8 frames averaged0.4810.434+0.047 (+11 %)betterpasspass = open >= 0.9 x vendor
10-90 % edge rise median (px)P1 day0.830.84-0.01 (-1 %)equalpasspass = open <= vendor x 1.1
B3 CPU/RAM
system busy % (idle streamer, 60 s)0 RTSP clients3.205.30-2.10 (-40 %)betterpasspass = open <= vendor + 0.5 points
streamer % of all CPU0 RTSP clients2.597.37-4.78 (-65 %)betterpasspass = open <= vendor + 0.5 points
ISP/codec kernel threads %0 RTSP clients0.057.92-7.87 (-99 %)betterpasspass = open <= vendor + 0.5 points
C1 D1/D4
D1 dark start: ISP nightstreamer daynight trace, dark start, lamps on 180 s, off 180 smode=Night - pass60 s after start in the dark
D4 lamps off: ISP night after 180 sstreamer daynight trace, dark start, lamps on 180 s, off 180 smode=Night - pass
D4 lamps on: ISP day after 180 sstreamer daynight trace, dark start, lamps on 180 s, off 180 smode=Day - pass
Planned, not run in these runs
A1b: AE comp sweep 40..200 + path test---not runnot part of the runs in this report
A2b: AWB 3000/5000 K + WB presets---not runnot part of the runs in this report
A1c: AE step response (lamps on/off)---not runnot part of the runs in this report
A2c: noise vs analog gain---not runnot part of the runs in this report
A4b: substream MTF / colour / NV12 layout---not runnot part of the runs in this report
A5: encoder H.264/H.265: FixQP bytes, CBR quality---not runnot part of the runs in this report
A6: banding / flicker---not runnot part of the runs in this report
A7: night IR picture---not runnot part of the runs in this report
B1: SSIM/PSNR + P/I ratio---not runnot part of the runs in this report
B2: RC modes CBR/VBR/FixQP + bitrate jump---not runnot part of the runs in this report
B5: startup time---not runnot part of the runs in this report
C4: motion detection (PTZ cams)---not runnot part of the runs in this report
B4: reload 10x + kill -9 + i2c release---not runnot part of the runs in this report
C2: control API with picture check---not runnot part of the runs in this report
C3: stability: 3 RTSP clients, snapshot under load, restart, persistence---not runnot part of the runs in this report

Protocol (camera, stacks, lamps)

itemvalue
camerasecuplug-t10-jxh42 (T10, sensor jxh42), position: light box, chart centred, camera at the card centre (fixed, no PTZ)
run dirsrun-1107-v2, run-1107-d1d4
open stack time (run-1107-v2)2026-11-07 22:01:52 .. 22:17:18
open stack time (run-1107-d1d4)2026-11-07 23:34:09 .. 23:52:05
vendor stack time (run-1107-v2)2026-11-07 22:17:40 .. 22:45:51
lampsCT 3000 (fair pass) + 5000 (colour pass, D1/D4) K (2 x DiCUNO E14 5 W CRI 98 per CT, DC LED)
lamp marker22:13:47 NEED_LAMPS_OFF_1 (run-1107-v2)
lamp marker22:14:05 LAMPS_OFF_1 (run-1107-v2)
lamp marker22:17:40 NEED_LAMPS_ON (run-1107-v2)
lamp marker22:17:59 LAMPS_ON (run-1107-v2)
lamp marker22:41:16 NEED_LAMPS_OFF_2 (run-1107-v2)
lamp marker22:41:29 LAMPS_OFF_2 (run-1107-v2)
lamp marker23:38:16 NEED_LAMPS_OFF_1 (run-1107-d1d4)
lamp marker23:38:36 LAMPS_OFF_1 (run-1107-d1d4)
lamp marker23:41:36 NEED_LAMPS_ON_2 (run-1107-d1d4)
lamp marker23:41:49 LAMPS_ON_2 (run-1107-d1d4)
lamp marker23:44:51 NEED_LAMPS_OFF_3 (run-1107-d1d4)
lamp marker23:45:04 LAMPS_OFF_3 (run-1107-d1d4)
lamp marker23:48:32 NEED_LAMPS_ON_4 (run-1107-d1d4)
lamp marker23:48:45 LAMPS_ON_4 (run-1107-d1d4)
box temperature21.8 C (STALE: thermometer not logged during the run)
flashed image / buildsecuplug_sp1_t10l_jxh42_mt7601 build="claude/aperto-port-1107+725a14d, 2026-11-07 19:53:25 UTC"
open: ko file in /lib/modules (flashed; the loaded ko is under stack pieces) / libimp mappedtx_isp_t10 md5=0da5d9d4 libimp=0c0132c8
open: streamerstreamer bin_md5=5d79ec5d version=v1.12.0
open: streamer version (/control)v1.12.0
vendor: ko file in /lib/modules (flashed; the loaded ko is under stack pieces) / libimp mappedtx_isp_t10 md5=0da5d9d4 libimp=da38e940
vendor: streamerstreamer bin_md5=69c86ddb version=websocket version 13 required
vendor: streamer version (/control)vendor-t10-bb048e4
open stack pieces (md5)tx-isp-t10.ko 0da5d9d4 (run-1107-v2), sensor_jxh42_t10.ko b0e940bc (run-1107-v2), libimp.so 0c0132c8 (run-1107-v2), streamer 5d79ec5d (run-1107-v2)
vendor stack pieces (md5)libalog.so 90a3c90d (run-1107-v2), libimp.so da38e940 (run-1107-v2), libsysutils.so 3e9d3e8b (run-1107-v2), tx-isp-t10.ko a9fa2729 (run-1107-v2), sensor_jxh42_t10.ko 36c8fac8 (run-1107-v2), streamer 69c86ddb (run-1107-v2), fair_preload.so d65ce4bf (run-1107-v2), tx-isp-t10.ko 0da5d9d4 (run-1107-v2)
open stackopen-tx-isp tx_isp_t10 (flashed) + OpenIMP libimp (flashed) + installed streamer under LD_PRELOAD fair_preload.so
vendor stackingenic-sdk tx-isp-t10.ko (vendor ISP blob 3.12.0) + sensor_jxh42_t10.ko + vendor libimp 3.12.0 (da38e940) + streamer bb048e4 USE_OPENIMP=0

A1 P1 defaults (default AE, comp 128)

stackphasemodeIT (lines)AGainIspDGEVjpg Y (0..255)R/GB/Gclippedtimerun
openp1_dayDay45037057091.71.08830.87520.022:08:02run-1107-v2
vendorp1_dayDay44837259592.61.10630.88060.022:35:19run-1107-v2
openp1_nightNight2080025687.2---22:16:33run-1107-v2
vendorp1_nightNight1750025676.0---22:43:56run-1107-v2

A2 Matched exposure + NV12 noise (P2)

Same integration time (lines) and gains (x1024) forced on both stacks through the streamer, read back from the ISP (verify). NV12: 8 frames of channel 1, centre half, temporal std per pixel.

stackphaseverifymodeIT (lines)AGainIspDGEVjpg Y (0..255)NV12 Y (0..255)Ytemp (std)U (std)V (std)drifttimerun
openp2_aokDay35132051270.878.521.2000.7480.4400.1022:09:14run-1107-v2
vendorp2_aokDay35132051249.455.521.1170.7850.5090.1822:36:34run-1107-v2
openp2_a2okDay35132051270.578.221.2020.8250.4540.1022:12:08run-1107-v2
vendorp2_a2okDay35132051249.455.451.1130.7920.5490.2222:39:34run-1107-v2
openp2_bokDay175640102470.277.950.8650.7490.4200.1122:10:12run-1107-v2
vendorp2_bokDay175640102469.075.950.8920.8560.5350.2222:37:35run-1107-v2
openp2_cokDay88960204870.078.101.0980.8740.4970.2922:11:10run-1107-v2
vendorp2_cokDay88960204868.776.101.1250.9510.6100.1922:38:34run-1107-v2
openp2_nightokNight7332051268.6125.481.604--0.7022:17:17run-1107-v2
vendorp2_nightokNight7332051274.8134.211.753--0.9422:44:41run-1107-v2

A3 Colour (dE00) and grey row

chart_de.py (audit/issue230/colour) per phase, cells = open / vendor. Lower dE00 is better.

phasedE00 meandE00 mediandE00 maxdE00 mean, unclipped patchesdE00 mean, grey-normalisedchroma ratio (1 = reference)dE00 skin patchesgrey a* castgrey b* castgamma fit
p1_day9.41 / 9.408.30 / 8.2816.10 / 16.089.33 / 9.317.25 / 7.220.83 / 0.8314.87 / 14.83-2.03 / -1.905.91 / 5.620.91 / 0.90
p2_a8.73 / 9.247.20 / 7.9015.70 / 16.698.73 / 9.247.03 / 7.260.90 / 0.9215.22 / 16.28-0.75 / -0.014.94 / 3.811.02 / 1.07

Suite colour-cct, P1 day

audit/chart/spyder.py: sRGB -> Lab D50, CIEDE2000, reference = Datacolor default values, D50 assumed, not batch specific.

metricopenvendorΔ open-vendoropen vs vendor
dE00 mean (raw)8.678.49+0.18 (+2 %)equal
dE00 mean (grey-normalised)7.687.51+0.17 (+2 %)equal
dE00 colour patches9.729.44+0.28 (+3 %)equal
dE00 grey patches5.515.67-0.16 (-3 %)equal
dE00 max14.3713.88+0.49 (+4 %)worse
chroma ratio (1 = reference)0.830.85-0.02 (-2 %)equal
mean hue error deg6.726.94-0.22 (-3 %)better
grey a* cast0.840.75+0.09 (+12 %)worse
grey b* cast5.965.81+0.15 (+3 %)equal

dE00 per patch, P1 day

patchopenvendorpatchopenvendor
A115.115.3C115.415.4
A26.96.6C26.16.1
A37.27.0C38.78.6
A45.65.4C45.45.4
A52.92.9C510.710.8
A63.02.8C614.614.6
B17.97.9D113.113.2
B27.17.1D213.513.5
B311.311.6D312.212.2
B44.44.4D411.111.2
B57.67.6D516.116.1
B66.36.2D613.613.6
dE00 per patch, P1 day (lower = better) 0 5 10 15 A1 open: 15.1 A1 vendor: 15.3 A1 A2 open: 6.9 A2 vendor: 6.6 A2 A3 open: 7.2 A3 vendor: 7 A3 A4 open: 5.6 A4 vendor: 5.4 A4 A5 open: 2.9 A5 vendor: 2.9 A5 A6 open: 3 A6 vendor: 2.8 A6 B1 open: 7.9 B1 vendor: 7.9 B1 B2 open: 7.1 B2 vendor: 7.1 B2 B3 open: 11.3 B3 vendor: 11.6 B3 B4 open: 4.4 B4 vendor: 4.4 B4 B5 open: 7.6 B5 vendor: 7.6 B5 B6 open: 6.3 B6 vendor: 6.2 B6 C1 open: 15.4 C1 vendor: 15.4 C1 C2 open: 6.1 C2 vendor: 6.1 C2 C3 open: 8.7 C3 vendor: 8.6 C3 C4 open: 5.4 C4 vendor: 5.4 C4 C5 open: 10.7 C5 vendor: 10.8 C5 C6 open: 14.6 C6 vendor: 14.6 C6 D1 open: 13.1 D1 vendor: 13.2 D1 D2 open: 13.5 D2 vendor: 13.5 D2 D3 open: 12.2 D3 vendor: 12.2 D3 D4 open: 11.1 D4 vendor: 11.2 D4 D5 open: 16.1 D5 vendor: 16.1 D5 D6 open: 13.6 D6 vendor: 13.6 D6 dE00 open vendor

Grey row A1..A6

metricopenvendorΔ open-vendoropen vs vendor
tone slope log-log (1 = reference gamma)0.8810.877+0.004 (+0 %)equal
mean dL-3.357-3.478+0.121 (-3 %)
max |dL|18.66219.272-0.610 (-3 %)better
white A1 code244.497245.000-0.503 (-0 %)
black A6 code55.38656.259-0.873 (-2 %)
clipped greys0.0000.000+0.000equal
range ratio23.45322.856+0.597 (+3 %)
code A1244.497245.000-0.503 (-0 %)
code A2239.720242.154-2.434 (-1 %)
code A3201.602203.716-2.114 (-1 %)
code A4155.728157.538-1.810 (-1 %)
code A5111.521112.338-0.817 (-1 %)
code A655.38656.259-0.873 (-2 %)

A4 Sharpness (slanted edge at the chart edges)

Outer edge of the two middle patches on every chart side (patch vs black chart frame), 8 frames averaged, edge ESF with sub-pixel registration from the small chart tilt (lbmetrics.edge_sharpness): 10-90 % rise in pixels (lower = sharper) and MTF50 in cycles/pixel (higher = sharper).

edgerise open (px)rise vendor (px)MTF50 open (c/p)MTF50 vendor (c/p)contrast ocontrast vtilt (deg)
bottom-230.830.840.4810.4347781-2.4
bottom-331.471.480.3210.3155352-3.7
left-01-------
left-020.790.800.5630.5311251182.2

Pictures

16

Downscaled to 800 px, JPEG q75. Chart and grey card only. Click a picture to see it large (Esc or click closes).

A1 p1_day

open p1_day
open p1_day
vendor p1_day
vendor p1_day

A1 p1_night

open p1_night
open p1_night
vendor p1_night
vendor p1_night

A2 p2_a

open p2_a
open p2_a
vendor p2_a
vendor p2_a

A2 p2_night

open p2_night
open p2_night
vendor p2_night
vendor p2_night

A3 dE00 overlay p1_day (chart_de.py)

open p1_day
open p1_day
vendor p1_day
vendor p1_day

A3 dE00 overlay p2_a (chart_de.py)

open p2_a
open p2_a
vendor p2_a
vendor p2_a

A4 MTF crops

bottom-23 open: rise 0.83 px
bottom-23 open: rise 0.83 px
bottom-23 vendor: rise 0.84 px
bottom-23 vendor: rise 0.84 px
left-01 open: rise - px
left-01 open: rise - px
left-01 vendor: rise - px
left-01 vendor: rise - px

Method