Files
arcs/arcs-sdk/components/lis_algo/algo/img_stream/img_stream.c
2026-08-13 16:50:52 +08:00

89 lines
2.4 KiB
C
Executable File

#include "cache.h"
#include "ic_message.h"
#include <stdint.h>
#include <string.h>
#include "sysheap.h"
#include "log_print.h"
#include "lsfs_interface.h"
#include "img_stream.h"
static img_stream_t *_img_stream = NULL;
static int32_t _img_stream_cb(ic_message_handle_info_t *handle, ic_message_msg_info_t *msg)
{
img_stream_t *img_stream = (void *)handle->user_datas;
struct img_stream_msg *img_msg = (void *)msg->msg;
uint32_t img_size = img_msg->wdith * img_msg->height;
int ret = 0;
if (img_msg->addr && img_size)
HAL_InvalidateDCache_by_Addr((uint32_t *)img_msg->addr, img_size);
for (int i = 0; i < sizeof(img_stream->observers)/sizeof(img_stream->observers[0]); i++) {
if (img_stream->observers[i] != NULL) {
img_stream->observers[i](img_msg);
}
}
end:
ic_message_msg_send_by_id(IC_MESSAGE_ID_STREAM, IC_MESSAGE_MSG_TYPE_CMD, &ret, sizeof(ret));
return 0;
}
img_stream_t *img_stream_init(void)
{
img_stream_t *img_stream = exram_malloc(4, sizeof(img_stream_t));
if (!img_stream) {
CLOGE("malloc img_stream failed");
return NULL;
}
memset(img_stream, 0x00, sizeof(img_stream_t));
uint32_t send_data = 0;
ic_message_register_by_id(IC_MESSAGE_ID_STREAM, _img_stream_cb, img_stream);
do {
int ret = ic_message_msg_send_by_id(IC_MESSAGE_ID_STREAM, IC_MESSAGE_MSG_TYPE_CMD, &send_data, sizeof(send_data));
if (ret == 0) break;
} while (1);
_img_stream = img_stream;
return img_stream;
}
void img_stream_register_on_recv(on_data_received cbs_recv)
{
if (!_img_stream)
return;
for (int i = 0; i < sizeof(_img_stream->observers) / sizeof(_img_stream->observers[0]); i++) {
if (_img_stream->observers[i] == NULL) {
_img_stream->observers[i] = cbs_recv;
break;
}
}
}
void img_stream_unregister_on_recv(on_data_received cbs_recv)
{
if (!_img_stream)
return;
for (int i = 0; i < sizeof(_img_stream->observers) / sizeof(_img_stream->observers[0]); i++) {
if (_img_stream->observers[i] == cbs_recv) {
_img_stream->observers[i] = NULL;
break;
}
}
}
void img_stream_unregister_all(void)
{
for (int i = 0; i < sizeof(_img_stream->observers) / sizeof(_img_stream->observers[0]); i++) {
if (_img_stream->observers[i] != NULL) {
_img_stream->observers[i] = NULL;
}
}
}