C API
Header: include/cvedix/capi/cvedix_c_api.h · Thư viện: libcvedix_capi.so
Nguyên tắc
- Mọi
*_create()trả về handlecvedix_node_t*— giải phóng bằngcvedix_node_destroy(). - Callback được gọi từ thread nội bộ của pipeline — dữ liệu chỉ hợp lệ trong callback, cần copy nếu giữ lại.
- Lỗi chi tiết:
cvedix_last_error()(per-thread). - Thứ tự hủy: sink/mid trước, source sau — hoặc gọi
cvedix_src_stop()trước.
Nhóm hàm
Runtime
c
int cvedix_init(cvedix_log_level_t log_level); // gọi 1 lần đầu tiên
const char* cvedix_version(void);
const char* cvedix_last_error(void);Tạo node
c
/* Source */
cvedix_node_t* cvedix_file_src_create(name, channel, file_path, resize_ratio, loop, gst_decoder);
cvedix_node_t* cvedix_rtsp_src_create(name, channel, rtsp_url, resize_ratio, gst_decoder);
/* Inference — backend tự chọn theo đuôi model:
.onnx → ONNX Runtime | .engine → TensorRT | .rknn → RKNN */
cvedix_node_t* cvedix_yolo_detector_create(name, model_path, version, labels_path,
conf_threshold, nms_threshold);
/* Tracking */
cvedix_node_t* cvedix_sort_tracker_create(name);
cvedix_node_t* cvedix_bytetrack_tracker_create(name, 0.5f, 0.6f, 0.8f, 30, 30);
/* OSD + Destination */
cvedix_node_t* cvedix_osd_create(name, font);
cvedix_node_t* cvedix_rtsp_des_create(name, channel, port, stream_name, bitrate_kbps, draw_osd);
cvedix_node_t* cvedix_file_des_create(name, channel, save_dir, prefix, max_min, bitrate, draw_osd);
cvedix_node_t* cvedix_web_des_create(name, channel, port, jpeg_quality);
cvedix_node_t* cvedix_app_des_create(name, channel);Nối & vòng đời
c
int cvedix_node_attach_to(node, upstreams, count);
int cvedix_src_start(src);
int cvedix_src_stop(src);
int cvedix_node_detach_recursively(src);
int cvedix_node_destroy(node);Nhận kết quả (callback)
c
typedef struct cvedix_detection {
int32_t x, y, width, height;
int32_t class_id;
float score;
int32_t track_id; /* -1 nếu không có tracker */
char label[64];
} cvedix_detection_t;
typedef void (*cvedix_result_callback_t)(
int32_t frame_index, int32_t channel,
int32_t frame_width, int32_t frame_height,
const cvedix_detection_t* detections, int32_t count,
void* user_data);
int cvedix_app_des_set_callback(app_des, callback, user_data);Ví dụ hoàn chỉnh
c
#include <cvedix/capi/cvedix_c_api.h>
#include <stdio.h>
static void on_result(int32_t frame_index, int32_t channel,
int32_t fw, int32_t fh,
const cvedix_detection_t* dets, int32_t count,
void* user) {
if (frame_index % 30 != 0) return;
printf("frame %d: %d object(s)\n", frame_index, count);
for (int i = 0; i < count; ++i)
printf(" [%s] score=%.2f track=%d box=(%d,%d,%d,%d)\n",
dets[i].label, dets[i].score, dets[i].track_id,
dets[i].x, dets[i].y, dets[i].width, dets[i].height);
}
int main(int argc, char** argv) {
cvedix_init(CVEDIX_LOG_INFO);
printf("cvedix core version: %s\n", cvedix_version());
cvedix_node_t* src = cvedix_file_src_create("src", 0, argv[1], 1.0f, 1, NULL);
cvedix_node_t* det = cvedix_yolo_detector_create("det", argv[2], CVEDIX_YOLO11,
argv[3], 0.45f, 0.5f);
cvedix_node_t* trk = cvedix_sort_tracker_create("trk");
cvedix_node_t* app = cvedix_app_des_create("app", 0);
cvedix_node_attach_to(det, &src, 1);
cvedix_node_attach_to(trk, &det, 1);
cvedix_node_attach_to(app, &trk, 1);
cvedix_app_des_set_callback(app, on_result, NULL);
cvedix_src_start(src);
puts("pipeline running — press Enter to stop");
getchar();
cvedix_src_stop(src);
cvedix_node_detach_recursively(src);
cvedix_node_destroy(app);
cvedix_node_destroy(trk);
cvedix_node_destroy(det);
cvedix_node_destroy(src);
return 0;
}Build
bash
gcc main.c -o my_app \
-I$CVEDIX_SDK_DIR/include \
-L$CVEDIX_SDK_DIR/lib/x86_64 -lcvedix_capi
LD_LIBRARY_PATH=$CVEDIX_SDK_DIR/lib/x86_64 ./my_app video.mp4 yolo11n.engine labels.txtSample CMake sẵn có tại bindings/c/ trong SDK.