Skip to content

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ề handle cvedix_node_t* — giải phóng bằng cvedix_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.txt

Sample CMake sẵn có tại bindings/c/ trong SDK.

Phần mềm độc quyền — CVEDIX