/* v0.4 smoke subscriber — connect, read 100 frames, verify pattern, exit 0/1. */ #include #include #include #include #include #include int main(int argc, char **argv) { const char *key = argc > 1 ? argv[1] : "smoke"; cuframes_subscriber_config_t cfg = {0}; cfg.key = key; cfg.consumer_name = "smoke-sub"; cfg.mode = CUFRAMES_MODE_NEWEST_ONLY; cfg.cuda_device = 0; cfg.connect_timeout_ms = 10000; cuframes_subscriber_t *sub = NULL; int r = cuframes_subscriber_create(&cfg, &sub); if (r != CUFRAMES_OK) { fprintf(stderr, "subscriber create failed: %d (%s)\n", r, cuframes_strerror(r)); return 1; } fprintf(stderr, "subscribed to '%s' (v0.4)\n", key); cudaStream_t stream; cudaStreamCreate(&stream); size_t check_size = 1024; /* sample 1KB чтобы не тратить время */ uint8_t *host = malloc(check_size); int frames = 0; int good = 0; while (frames < 100) { cuframes_frame_t *f = NULL; r = cuframes_subscriber_next(sub, stream, &f, 2000); if (r != CUFRAMES_OK) { fprintf(stderr, "next failed: %d (%s)\n", r, cuframes_strerror(r)); break; } cudaMemcpyAsync(host, cuframes_frame_cuda_ptr(f), check_size, cudaMemcpyDeviceToHost, stream); cudaStreamSynchronize(stream); uint8_t exp = host[0]; int mismatch = 0; for (size_t i = 1; i < check_size; i++) { if (host[i] != exp) { mismatch++; } } if (mismatch == 0) good++; if (frames % 20 == 0) { fprintf(stderr, "frame seq=%lu byte0=0x%02x mismatch=%d\n", (unsigned long)cuframes_frame_seq(f), exp, mismatch); } cuframes_subscriber_release(sub, f); frames++; } free(host); cudaStreamDestroy(stream); cuframes_subscriber_destroy(sub); fprintf(stderr, "DONE: %d/%d frames OK\n", good, frames); return (good == frames && frames > 0) ? 0 : 1; }