96 lines
2.4 KiB
C
Executable File
96 lines
2.4 KiB
C
Executable File
#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;
|
|
*/
|
|
|
|
}
|
|
|