完成官方管线全量逆向与 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 规则
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
/* Official CoreSDKLib harness v2: use ThermalSDK high-level (which works),
|
||||
* but ALSO read raw temperature via CoreSDKLib MAG_GetTemperatureData_Raw
|
||||
* using the channel that ThermalSDK created. To find the channel, we
|
||||
* brute-force 0..4 after ThermalSDK Start().
|
||||
*/
|
||||
#define _WIN32_WINNT 0x0601
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.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_GetTemperatureDataRaw_t)(int, int *, int, int);
|
||||
typedef int (CALLBACK *MAG_GetOutputBMPdataRGB24_t)(int, unsigned char *, int, int);
|
||||
typedef int (CALLBACK *MAG_GetFilteredRaw_t)(int, unsigned short *, int);
|
||||
typedef int (CALLBACK *MAG_GetFrameStatisticalData_t)(int, void *);
|
||||
|
||||
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) {
|
||||
const char *dir = "C:\\Project\\MAG160C\\IR_Camera_SDK-1.0.1\\windows\\windows\\app";
|
||||
SetDllDirectoryA(dir);
|
||||
HMODULE t = LoadLibraryA("ThermalSDK.dll");
|
||||
HMODULE c = LoadLibraryA("CoreSDKLib.dll");
|
||||
printf("ThermalSDK=%p CoreSDKLib=%p\n", (void*)t, (void*)c);
|
||||
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_GetTemperatureDataRaw_t G_TempRaw = (MAG_GetTemperatureDataRaw_t)GetProcAddress(c, "MAG_GetTemperatureData_Raw");
|
||||
MAG_GetOutputBMPdataRGB24_t G_BMP = (MAG_GetOutputBMPdataRGB24_t)GetProcAddress(c, "MAG_GetOutputBMPdataRGB24");
|
||||
MAG_GetFilteredRaw_t G_FRaw = (MAG_GetFilteredRaw_t)GetProcAddress(c, "MAG_GetFilteredRaw");
|
||||
printf("Start=%p TempRaw=%p BMP24=%p FilteredRaw=%p\n",
|
||||
(void*)T_Start, (void*)G_TempRaw, (void*)G_BMP, (void*)G_FRaw);
|
||||
|
||||
T_Set(onIR);
|
||||
printf("Start()...\n"); fflush(stdout);
|
||||
BOOL ok = T_Start();
|
||||
printf("Start=%d\n", ok); fflush(stdout);
|
||||
Sleep(3000);
|
||||
printf("frames=%d\n", g_frames);
|
||||
|
||||
/* try channels 0..4 for TempRaw */
|
||||
static int tempdata[20000];
|
||||
static unsigned short fraw[20000];
|
||||
for (int chan = 0; chan < 5; ++chan) {
|
||||
memset(tempdata, 0, sizeof(tempdata));
|
||||
int rc = G_TempRaw(chan, tempdata, 1, 1);
|
||||
printf("chan %d: TempRaw rc=%d t[0]=%d t[500]=%d t[9600]=%d\n",
|
||||
chan, rc, tempdata[0], tempdata[500], tempdata[9600]);
|
||||
if (rc && tempdata[0] != 0) {
|
||||
/* save */
|
||||
FILE *f = fopen("official_tempraw.bin", "wb");
|
||||
if (f) { fwrite(tempdata, 4, 19200, f); fclose(f); }
|
||||
printf(" saved official_tempraw.bin\n");
|
||||
break;
|
||||
}
|
||||
memset(fraw, 0, sizeof(fraw));
|
||||
int rc2 = G_FRaw(chan, fraw, 19200);
|
||||
printf(" FilteredRaw rc=%d f[0]=%d f[500]=%d\n", rc2, fraw[0], fraw[500]);
|
||||
if (rc2 && fraw[0] != 0) {
|
||||
FILE *f = fopen("official_fraw.bin", "wb");
|
||||
if (f) { fwrite(fraw, 2, 19200, f); fclose(f); }
|
||||
printf(" saved official_fraw.bin\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
T_Stop();
|
||||
printf("done\n");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user