added threading in saix_tripwire

This commit is contained in:
Biswas005 2025-05-12 14:14:37 +05:30
parent 2f6eb69690
commit 9c0606994f
2 changed files with 101 additions and 0 deletions

View File

@ -13,6 +13,39 @@
#include "video.h"
#include "rockiva_ba_api.h"
// Add these if they're not already defined elsewhere
#ifndef ROCKIVA_OBJECT_TYPE_PERSON
#define ROCKIVA_OBJECT_TYPE_PERSON 1
#define ROCKIVA_OBJECT_TYPE_VEHICLE 2
#define ROCKIVA_OBJECT_TYPE_NON_VEHICLE 3
#define ROCKIVA_OBJECT_TYPE_FACE 4
#define ROCKIVA_OBJECT_TYPE_HEAD 5
#define ROCKIVA_OBJECT_TYPE_PET 6
#define ROCKIVA_OBJECT_TYPE_MOTORCYCLE 7
#define ROCKIVA_OBJECT_TYPE_BICYCLE 8
#define ROCKIVA_OBJECT_TYPE_PLATE 9
#define ROCKIVA_OBJECT_TYPE_BABY 10
#define ROCKIVA_OBJECT_TYPE_PACKAGE 11
#endif
const char* get_object_type_string(uint32_t obj_type) {
switch (obj_type) {
case ROCKIVA_OBJECT_TYPE_PERSON: return "person";
case ROCKIVA_OBJECT_TYPE_VEHICLE: return "vehicle";
case ROCKIVA_OBJECT_TYPE_NON_VEHICLE: return "non_vehicle";
case ROCKIVA_OBJECT_TYPE_FACE: return "face";
case ROCKIVA_OBJECT_TYPE_HEAD: return "head";
case ROCKIVA_OBJECT_TYPE_PET: return "pet";
case ROCKIVA_OBJECT_TYPE_MOTORCYCLE: return "motorcycle";
case ROCKIVA_OBJECT_TYPE_BICYCLE: return "bicycle";
case ROCKIVA_OBJECT_TYPE_PLATE: return "plate";
case ROCKIVA_OBJECT_TYPE_BABY: return "baby";
case ROCKIVA_OBJECT_TYPE_PACKAGE: return "package";
default: return "unknown";
}
}
// Event callback typedef
typedef void (*SaixEventCallback)(int rule_id, const char* event_type, const char* json_payload);
static SaixEventCallback g_saix_event_callback = NULL;

View File

@ -53,7 +53,73 @@ typedef enum rkCOLOR_INDEX_E {
} COLOR_INDEX_E;
typedef struct {
RockIvaHandle handle;
int running;
pthread_t thread_id;
pthread_mutex_t lock;
} SaixTripwireContext;
static SaixTripwireContext g_tripwire_ctx;
// Tripwire thread function
void* tripwire_thread_func(void* arg) {
SaixTripwireContext* ctx = (SaixTripwireContext*)arg;
printf("[Tripwire] Thread started\n");
// Initialize tripwire in this thread
if (init_tripwire() != 0) {
printf("[Tripwire] Failed to initialize tripwire\n");
return NULL;
}
// Main thread loop
while (ctx->running) {
// Sleep to reduce CPU usage - adjust based on your needs
usleep(10000); // 10ms
}
// Cleanup before thread exit
deinit_tripwire();
printf("[Tripwire] Thread exiting\n");
return NULL;
}
// Function to start the tripwire thread
int start_tripwire_thread() {
// Initialize context
memset(&g_tripwire_ctx, 0, sizeof(g_tripwire_ctx));
pthread_mutex_init(&g_tripwire_ctx.lock, NULL);
g_tripwire_ctx.running = 1;
// Create thread
int ret = pthread_create(&g_tripwire_ctx.thread_id, NULL, tripwire_thread_func, &g_tripwire_ctx);
if (ret != 0) {
printf("[Tripwire] Failed to create thread: %d\n", ret);
return -1;
}
printf("[Tripwire] Thread created successfully\n");
return 0;
}
// Function to stop the tripwire thread
int stop_tripwire_thread() {
if (g_tripwire_ctx.running) {
// Signal thread to stop
g_tripwire_ctx.running = 0;
// Wait for thread to exit
pthread_join(g_tripwire_ctx.thread_id, NULL);
// Clean up mutex
pthread_mutex_destroy(&g_tripwire_ctx.lock);
printf("[Tripwire] Thread stopped\n");
}
return 0;
}
int saix_vi_dev_init() {
LOG_DEBUG("%s\n", __func__);
@ -1723,6 +1789,7 @@ int rk_video_init() {
// rk_region_clip_set_all();
if (enable_npu || enable_ivs) {
ret |= saix_setup_ivs_pipe();
ret |= start_tripwire_thread();
saix_register_event_callback(ba_result_callback);
}
// The osd dma buffer must be placed in the last application,
@ -1739,6 +1806,7 @@ int rk_video_deinit() {
g_video_run_ = 0;
int ret = 0;
if (enable_npu || enable_ivs)
ret |= stop_tripwire_thread();
ret |= saix_teardown_ivs_pipe();
// rk_region_clip_set_callback_register(NULL);
rk_roi_set_callback_register(NULL);