图库: 修 M27 评审 P1 门控旁路 + 三个 P2(r1)

P1-1:判定为 backend 的页不再无条件放行 + 后端中途失败不再静默回退 stb。
- meow_img_load_file_step_ex 增加 allow_stb_fallback 参数:0 = 只试后端,
  失败返回 NULL(坏图占位),绝不回落 stb。阅读器按 dec.path 传入。
- 旧行为实测:截断 12MP JPEG 18,403kB、3000×3000 24bpp 头-only BMP 36,056kB、
  非法位深 PNG 16,409kB(stb 都"成功"出图)。修复后:
  截断 JPEG 275kB→NULL、头-only BMP 908kB→NULL、非法位深 PNG 门控占位(0 分配)。

P2-1:PNG 支持矩阵补 png_depth_ok 同式(color 2/4/6 仅 8/16;color 3 无 16;
color 0 允许 1/2/4/8/16),不再出现「矩阵说支持、后端拒绝」。
P2-2:后端命中页也保留两道安全阀:MemAvailable<6MB 占位、估算 >12MB 硬上限占位。
P2-3:B8 指标改为「窗口稳定后只 reset 一次」,量整个 30 翻窗口内相对稳态基线的
最大存活增量(淘汰不再掩盖峰值),并打印稳态/驻留/增量。
P2-4:page_source.h 的估算精度口径限定为「后端命中/典型页」。

回归:
- B7c 新增截断 12MP JPEG / 24bpp 头-only BMP / 非法位深 PNG,断言 backend-only
  NULL 且峰值 ≤3MB、或 stb 门控占位;B7 典型页与 B7b 回退矩阵保持全绿。
- test_reader_many_pages 恢复 24bpp 头-only 夹具(1bpp 保留):24bpp 判 failed、
  1bpp 判 skipped;断言 failed=2 / skipped=1。
- run_tests.sh / run_webtoon_tests.sh EXIT=0;sdk/test_meow_img_stream ALL PASS;
  交叉构建(SDK + tuku)零警告。
This commit is contained in:
AskaEth committed 2026-11-06 11:46:16 +08:00
1 parent 1725af631b
commit 11e09af7a4
8 files changed
+171 -49

No files matched your search

+7 -3
View File
@@ -490,13 +490,17 @@ static meow_img *reader_load_page(const char *path, void *ud, int maxdim)
}
/* 2) 解码(路径/档位已定)。失败与「跳过」必须分开:NULL + skip==0 才是坏图。
* step_ex 回报实际路径,日志据此区分 backend / stb(决策与实际必须一致)。 */
* P1-1:门控按后端放行的页必须用 backend-only 入口——后端中途失败(截断/坏流/
* DHT 超限/malloc 失败)直接返回 NULL 按坏图占位,绝不静默回落 stb(实测会放出
* 18–36MB)。只有判定为 stb 的页才允许 stb。 */
int allow_stb = !have || dec.path != MR_DECODE_PATH_BACKEND;
int used_backend = 0;
meow_img *im = have ? meow_img_load_file_step_ex(path, dim, dec.step, &used_backend)
meow_img *im = have ? meow_img_load_file_step_ex(path, dim, dec.step, allow_stb,
&used_backend)
: meow_img_load_file_dim(path, dim);
if (!im) {
log_decode(page, have ? in.w : 0, have ? in.h : 0, dec.peak_bytes, mfree, mavail, "fail",
dec.step, used_backend,
dec.step, have && dec.path == MR_DECODE_PATH_BACKEND,
(unsigned long long)(meow_ui_time_ms() - t0));
return NULL;
}