Files
ZXCLI 0bfb926892 完成官方管线全量逆向与 demo3 v5 复刻,清理仓库
- 逆向:Ghidra/IDA 全量反编译 CoreSDKLib.dll/ThermalSDK.dll/libthermalSDK.so/
  libcoresdk.so(ARM64)/libmagcore.so,导出 analysis/ida/export/
- 解码官方渲染管线:DDT 校准表加载->快门端点选择->Q12 插值->ref(4x type1 帧
  均值)->NUC 查表->盲元补偿->窗口->LUT1024 重建->2x 升采样->调色板
- 逐像素验证:NUC+盲元 0/19200、插值 0 误差、2x 0/76800、窗口一致
- demo3 v5:完整复刻官方管线(含 DDT 解析、FFC 状态机、快门温度驱动),
  修复 load_ddt 表错位导致的零像素问题
- 鬼影根因分析写入 analysis/reverse_20260813_full.md
- 心跳/恢复机制:analysis/session_state.md + tools/resume_rev.ps1
- 新增 tsdk_pair3 增强采集工具;历史工具归档 csdk/tools/legacy/;
  根目录抓帧残留删除,历史文档归档 analysis/history/
- csdk/README.md 完整使用文档;.gitignore/.gitattributes 补 LFS 规则
2026-08-13 23:16:12 +08:00

71 lines
2.8 KiB
C

/* Capture grayscale AND RGB24 at the same moment via CoreSDKLib, plus
* verify the palette mapping. */
#define _WIN32_WINNT 0x0601
#include <windows.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
typedef void (CALLBACK *INewIRFrame)(const unsigned char *, int, int, int);
typedef bool (CALLBACK *fn_Start_t)(void);
typedef void (CALLBACK *fn_Stop_t)(void);
typedef void (CALLBACK *fn_SetNewIRFrameDelegate_t)(INewIRFrame);
typedef int (CALLBACK *MAG_GetOutputBMPdata_t)(int, int *, unsigned char **);
typedef int (CALLBACK *MAG_GetOutputBMPdataRGB24_t)(int, unsigned char *, int, int);
static volatile int g_frames;
static void CALLBACK onIR(const unsigned char *buf, int w, int h, int ch) {
(void)buf; (void)w; (void)h; (void)ch;
g_frames++;
}
int main(void) {
SetDllDirectoryA("C:\\Project\\MAG160C\\IR_Camera_SDK-1.0.1\\windows\\windows\\app");
HMODULE t = LoadLibraryA("ThermalSDK.dll");
HMODULE c = LoadLibraryA("CoreSDKLib.dll");
if (!t || !c) return 1;
fn_Start_t T_Start = (fn_Start_t)GetProcAddress(t, "Start");
fn_Stop_t T_Stop = (fn_Stop_t)GetProcAddress(t, "Stop");
fn_SetNewIRFrameDelegate_t T_Set = (fn_SetNewIRFrameDelegate_t)GetProcAddress(t, "SetNewIRFrameDelegate");
MAG_GetOutputBMPdata_t G_Gray = (MAG_GetOutputBMPdata_t)GetProcAddress(c, "MAG_GetOutputBMPdata");
MAG_GetOutputBMPdataRGB24_t G_RGB = (MAG_GetOutputBMPdataRGB24_t)GetProcAddress(c, "MAG_GetOutputBMPdataRGB24");
T_Set(onIR);
BOOL ok = T_Start();
printf("Start=%d\n", ok); fflush(stdout);
Sleep(3000);
for (int chan = 0; chan < 5; ++chan) {
int w = 0;
unsigned char *graybuf = NULL;
int rc = G_Gray(chan, &w, &graybuf);
printf("chan %d gray rc=%d buf=%p\n", chan, rc, (void*)graybuf);
if (rc && graybuf) {
/* read true w/h from dev+0xadc/0xae0 = graybuf - 0xaf0 + 0xadc */
unsigned char *dev = graybuf - 0xaf0;
int w2 = *(int *)(dev + 0xadc);
int h2 = *(int *)(dev + 0xae0);
printf(" dev w=%d h=%d\n", w2, h2);
if (w2 > 0 && w2 < 1000 && h2 > 0 && h2 < 1000) {
unsigned char *rgb = malloc((size_t)w2 * h2 * 3);
int rc2 = G_RGB(chan, rgb, w2 * h2 * 3, 1);
printf(" RGB24 rc=%d\n", rc2);
if (rc2) {
FILE *f = fopen("official_gray3.bin", "wb");
if (f) { fwrite(graybuf, 1, (size_t)w2 * h2, f); fclose(f); }
f = fopen("official_rgb3.bin", "wb");
if (f) { fwrite(rgb, 1, (size_t)w2 * h2 * 3, f); fclose(f); }
printf(" saved gray=%dx%d rgb\n", w2, h2);
}
free(rgb);
}
break;
}
}
T_Stop();
printf("done\n");
return 0;
}