fusion/hal/hal_video/hal_interface_video.c

96 lines
2.4 KiB
C
Raw Permalink Normal View History

2025-08-05 07:53:44 +00:00
#include <stdlib.h>
#include "hal_interface_video.h"
#include "list.h"
#include "hthread.h"
#include "hlog.h"
typedef struct{
struct list_head link;
video_attr_st attr;
hal_video_frame_callback cb;
}video_ins;
static struct list_head s_vlist = LIST_HEAD_INIT(s_vlist);
static void * hal_video_polling_task(void *arg)
{
uint32_t ret;
uint32_t get;
while(1){
video_frame frame;
get = 0;
struct list_head *pos, *n;
list_for_each_safe(pos, n, &s_vlist){
video_ins *video = list_entry(pos, video_ins, link);
ret = hal_video_get_frame(video->attr.stream_chn, &frame, 5);
if (ret == OK){
video->cb(&frame);
get = 1;
}
}
if (!get){
hloge("%s failed to hal_video_get_frame", __func__);
hv_msleep(10);
}
}
}
uint32_t hal_video_openstream(HAL_SENSOR_IDX sensor_idx, hal_video_frame_callback cb, HAL_STREAM_CHANNEL stream_chn, const video_attr_st attr){
struct list_head *pos, *n;
list_for_each_safe(pos, n, &s_vlist){
video_ins* video = list_entry(pos, video_ins, link);
if (video->cb == cb) {
return 0;
}
}
if (list_empty(&s_vlist)){ /* 第一次open 创建一个共用线程, 理论取流还是够, 避免用太多的线程了 */
hthread_create(hal_video_polling_task, NULL);
}
video_ins *video = (video_ins*)hv_malloc(sizeof(video_ins));
if (!video){
hloge("%s failed to hv_malloc", __func__);
return -1;
}
video->cb = cb;
video->attr = attr;
list_add_tail(&video->link, &s_vlist);
{
/* to bind sensor and chn */
/* to start chn */
/* to start encode */
}
return 0;
}
uint32_t hal_video_closestream(hal_video_frame_callback cb){
struct list_head *pos, *n;
list_for_each_safe(pos, n, &s_vlist){
video_ins* video = list_entry(pos, video_ins, link);
if (video->cb == cb) {
//deinit chn
list_del(pos);
hv_free(video);
return 0;
}
}
return -1;
}
uint32_t hal_video_set_attr(HAL_SENSOR_IDX idx, HAL_STREAM_CHANNEL stream_chn, const video_attr_st * attr){
//video_attr_st *a = &s_hal_video_st[idx][stream_chn].attr;
/*
uint32_t width; // resolution width, 0为不重复设置
uint32_t height; // resolution height, 0为不重复设置
uint32_t bitrate; // 码率: Kbit per second, 0为不重复设置
uint32_t fps; // 编码帧率
uint32_t gop;
*/
}