使用场景
车载中增强型视觉系统 (EVS) 用于显示由后视摄像头和环视摄像头拍摄的视频。
在AAOS Cuttlefish或Trout中,EVS可以从VirtIO-video驱动程序的虚拟化V4L2流式传输设备访问视频流。
介绍
virtio-video模块源码位于谷歌维护内核主线common-modules/virtual-device/virtio_video,
该部分代码由opensynergy贡献的前端代码,没有开源后端实现(opensynergy是闭源的,别的开源hypervisor也没看到virtio-video后端实现)
- virtio-video驱动支持3种设备类型:video camera,video encoder,video decoder
代码分析
- virtio_video_probe. 模块加载及初始化
virtio_video_probe
VIRTIO_ID_VIDEO_CAM
VIRTIO_ID_VIDEO_ENC
VIRTIO_ID_VIDEO_DEC
vvd->use_dma_mem = use_dma_mem;
vvd->has_iommu
v4l2_device_register(dev, &vvd->v4l2_dev);
INIT_WORK(&vvd->eventq.work, virtio_video_process_events);
vvd->commandq.vq = vqs[0];
vvd->eventq.vq = vqs[1];
virtio_video_alloc_events
virtio_video_queue_event_buffer
virtqueue_add_inbuf
virtqueue_kick
virtio_video_device_init
a.若是支持m2m设备
查询后端capability VIRTIO_VIDEO_QUEUE_TYPE_OUTPUT
查询后端capability VIRTIO_VIDEO_QUEUE_TYPE_INPUT
v4l2_m2m_init(&virtio_video_device_m2m_ops)
fops = virtio_video_device_m2m_fops
V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE
B.若不支持m2m
fops = &virtio_video_device_fops;
V4L2_CAP_STREAMING V4L2_CAP_VIDEO_CAPTURE或MPLANE
virtio_video_cam_init
vd->ioctl_ops = &virtio_video_cam_ioctl_ops;
vvd->ops = &virtio_video_cam_ops;
virtio_video_enc_init
vd->ioctl_ops = &virtio_video_enc_ioctl_ops;
vvd->ops = &virtio_video_enc_ops;
virtio_video_dec_init
vd->ioctl_ops = &virtio_video_dec_ioctl_ops;
vvd->ops = &virtio_video_dec_ops;
virtio_video_parse_virtio_capabilities
解析input_fmt_list/num_input_fmts
解析output_fmt_list/num_output_fmts
virtio_video_parse_virtio_control
virtio_format支持
virtio_video_device_register
video_register_device
- virtio_video_process_events。vq事件处理回调
virtio_video_process_events
evt = virtqueue_get_buf(vq, &len)
virtio_video_handle_event(vvd, evt);
stream = idr_find
VIRTIO_VIDEO_EVENT_DECODER_RESOLUTION_CHANGED
virtio_video_cmd_get_params
virtio_video_queue_cmd_buffer_sync
virtio_video_queue_cmd_buffer
virtio_video_queue_res_chg_event
v4l2_event_queue_fh(&stream->fh, &ev_src_ch)
virtio_video_state_update
VIRTIO_VIDEO_EVENT_ERROR
virtio_video_state_update
virtio_video_queue_event_buffer(vvd, evt);