virtio-video

使用场景

  车载中增强型视觉系统 (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_driver
  1. virtio_video_probe. 模块加载及初始化
virtio_video_probe
  //创建cmdq和eventq以及对应callback
  //检查后端支持feature VIRTIO_VIDEO_F_RESOURCE_GUEST_PAGES
  //支持3种类型设备
  VIRTIO_ID_VIDEO_CAM //video camera设备
  VIRTIO_ID_VIDEO_ENC //video encoder设备 
  VIRTIO_ID_VIDEO_DEC //video decoder设备
  vvd->use_dma_mem = use_dma_mem; //使用dma内存
  //检查后端支持feature VIRTIO_VIDEO_F_RESOURCE_NON_CONTIG
  vvd->has_iommu //对iommu支持,5.9后为virtio_has_dma_quirk,前为virtio_has_iommu_quirk
  v4l2_device_register(dev, &vvd->v4l2_dev); //注册为v4l2框架driver
  INIT_WORK(&vvd->eventq.work, virtio_video_process_events);//为eventq准备回调
  vvd->commandq.vq = vqs[0]; //为cmdq准备vq
  vvd->eventq.vq = vqs[1];   //为eventq准备vq
  //读取后端配置的max_caps_length/max_resp_length
  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)//设置m2m回调到v4l2框架
        fops = virtio_video_device_m2m_fops //设置m2m fops回调
        V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE //设置设备能力

    B.若不支持m2m
        fops = &virtio_video_device_fops; //设置 fops回调
        V4L2_CAP_STREAMING V4L2_CAP_VIDEO_CAPTURE或MPLANE //设置设备能力
    //根据设备类型不同,初始化CAM/ENC/DEC设备
    virtio_video_cam_init
        vd->ioctl_ops = &virtio_video_cam_ioctl_ops; //设置ioctl ops
        vvd->ops = &virtio_video_cam_ops; //设置cam ops

    virtio_video_enc_init
        vd->ioctl_ops = &virtio_video_enc_ioctl_ops;//设置ioctl ops
        vvd->ops = &virtio_video_enc_ops;//设置enc ops

    virtio_video_dec_init
        vd->ioctl_ops = &virtio_video_dec_ioctl_ops;//设置ioctl ops
        vvd->ops = &virtio_video_dec_ops;//设置dec ops

    virtio_video_parse_virtio_capabilities //解析cap域 in/out format
        解析input_fmt_list/num_input_fmts
        解析output_fmt_list/num_output_fmts

    virtio_video_parse_virtio_control      //解析control域
        virtio_format支持

    virtio_video_device_register           //device注册
        video_register_device  //注册/dev/videoN设备




  1. virtio_video_process_events。vq事件处理回调
virtio_video_process_events //eventq事件回调
    evt = virtqueue_get_buf(vq, &len) //从vq中取出virtio_video_event
    virtio_video_handle_event(vvd, evt); //处理event
        stream = idr_find //查找stream
        //根据event_type进行处理
        VIRTIO_VIDEO_EVENT_DECODER_RESOLUTION_CHANGED
            virtio_video_cmd_get_params //组装req_resp
            //将stream填充到req_resp
            virtio_video_queue_cmd_buffer_sync
                virtio_video_queue_cmd_buffer //buf入队
            virtio_video_queue_res_chg_event
                v4l2_event_queue_fh(&stream->fh, &ev_src_ch)//向V4L2入队event
            virtio_video_state_update //更新状态为RES_CHANGE
        VIRTIO_VIDEO_EVENT_ERROR
            virtio_video_state_update //更新状态为STATE_ERROR

    virtio_video_queue_event_buffer(vvd, evt); //将event buf入队并kick
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值