Files
MAG160C/csdk/tools/mag160c_csdk_stream_test.c

68 lines
2.3 KiB
C

/* Headless csdk integration test: use the library's threaded reader
* (mag160c_ir_start) + attached FFC scheduler + frame callback to verify
* the exact Linux-portable pipeline on the Windows device.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "mag160c/mag160c.h"
#include "mag160c/mag160c_display.h"
static volatile long g_n0;
static volatile long g_n1;
static volatile long g_nframes;
static void on_frame(uint32_t idx, const uint8_t *frame, size_t size, void *user) {
(void)idx;
(void)user;
if (size < 0x1c + 2) return;
uint32_t type = (uint32_t)frame[12] | ((uint32_t)frame[13] << 8) |
((uint32_t)frame[14] << 16) | ((uint32_t)frame[15] << 24);
if (type == 0) g_n0++;
else g_n1++;
g_nframes++;
}
int main(void) {
printf("csdk ir-start + ffc-scheduler test\n");
mag160c_ctx_t *ctx = NULL;
mag160c_ir_t *ir = NULL;
mag160c_error_t rc = mag160c_init(&ctx);
if (rc == MAG160C_OK) rc = mag160c_ir_open(ctx, &ir);
if (rc == MAG160C_OK) {
mag160c_ffc_scheduler_t *s = (mag160c_ffc_scheduler_t *)calloc(1, sizeof(*s));
mag160c_ffc_scheduler_init(s, 400, 9);
rc = mag160c_ir_set_ffc_scheduler(ir, s, 1);
}
if (rc == MAG160C_OK) rc = mag160c_ir_set_frame_callback(ir, on_frame, NULL);
if (rc == MAG160C_OK) rc = mag160c_ir_start(ir);
if (rc != MAG160C_OK) {
fprintf(stderr, "%s: %s\n", mag160c_error_name(rc), mag160c_last_error());
return 2;
}
printf("streaming...\n");
DWORD t0 = GetTickCount();
long last = 0;
while (g_n0 < 1000 && GetTickCount() - t0 < 130000) {
Sleep(5000);
double secs = (GetTickCount() - t0) / 1000.0;
printf(" t=%5.1fs frames=%ld type0=%ld type1=%ld fps=%.1f\n",
secs, g_nframes, g_n0, g_n1, g_n0 / secs);
if (g_nframes == last) {
printf(" STALL? no new frames in 5s\n");
}
last = g_nframes;
}
double secs = (GetTickCount() - t0) / 1000.0;
printf("DONE: frames=%ld type0=%ld type1=%ld in %.1fs\n",
g_nframes, g_n0, g_n1, secs);
int pass = g_n0 >= 1000;
printf("%s\n", pass ? "PASS: csdk threaded pipeline >= 1000 type=0 frames" :
"FAIL");
mag160c_ir_stop(ir);
mag160c_ir_close(ir);
mag160c_shutdown(ctx);
return pass ? 0 : 2;
}