Video Host
Note
Host UVC 框架和 ISO 驱动为商用收费,请联系官方购买授权。
使用流程
注册 frame 内存池,通常设计为双buffer。
static uint8_t frame_buffer1[IMAGE_WIDTH * IMAGE_HEIGHT * 2];
static uint8_t frame_buffer2[IMAGE_WIDTH * IMAGE_HEIGHT * 2];
static struct usbh_videoframe frame_pool[2];
frame_pool[0].frame_buf = frame_buffer1;
frame_pool[0].frame_bufsize = IMAGE_WIDTH * IMAGE_HEIGHT * 2;
frame_pool[1].frame_buf = frame_buffer2;
frame_pool[1].frame_bufsize = IMAGE_WIDTH * IMAGE_HEIGHT * 2;
usbh_video_stream_create(frame_pool, 2);
创建 frame 接收线程并处理。frame->frame_format 指示当前帧的格式,frame->frame_buf 指向帧数据,frame->frame_size 指示帧数据大小。处理完成后需要调用 usbh_video_stream_enqueue 将 frame 重新入队。
static void usbh_video_frame_thread(void *argument)
{
int ret;
struct usbh_videoframe *frame;
while (1) {
ret = usbh_video_stream_dequeue(&frame, 0xfffffff);
if (ret < 0) {
continue;
}
USB_LOG_RAW("frame buf:%p,frame len:%d\r\n", frame->frame_buf, frame->frame_size);
usbh_video_stream_enqueue(frame);
}
}
usb_osal_thread_create("uvc_frame", 3072, 5, usbh_video_frame_thread, NULL);
usbh_video_fps_init 函数辅助打印帧率
调用 usbh_video_stream_start 启动视频流,调用 usbh_video_stream_stop 停止视频流。
宏的说明
#define VIDEO_ISO_PACKETS (8 * 2)
#define VIDEO_EP_MAX_MPS 3072
VIDEO_ISO_PACKETS:每次传输的 ISO 个数。 要求是 8 的倍数,对应高速设备(1ms 8个包),全速设备(8ms 8个包)。 这里我们限定摄像头 bInterval 是 1,并且目前没有不是 1 的摄像头。
VIDEO_EP_MAX_MPS:视频流端点的最大包大小,单位为字节。 如果 USB IP 能够支持到 3072字节,则支持市面上所有的摄像头,如果不支持,则只能支持部分摄像头或者需要定制摄像头。对 BULK 摄像头没有要求。
Note
增大 VIDEO_ISO_PACKETS 可以降低传输中断频率,但是会增加 RAM 的开销,需要目标 IP 支持 scatter-gather DMA 才有效果,对于 buffer dma 或者 fifo 模式的 IP 不会降低中断频率。