0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

V4L2框架概述 Xilinx视频编解码详解

我快闭嘴 来源:Comtech FPGA 作者:Jimmy Chen 2022-09-14 10:31 次阅读
  1. 1、V4L2框架概述

  2. V4L2是Video for Linux2的简称,为Linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写。

  3. 1.1 V4L2设备应用层流程

  4. 注册的设备节点有/dev/video和/dev/v4l2-subdev;其应用层操作video设备主要流程如下:

  5. 1) 通过打开video设备设置video参数

  6. 2) 设置采集方式;

  7. 3) 将数据取出、处理、放回,可循环处理;

  8. 4) 完成相应的任务后关闭。

  9. 1.2 内核V4L2模块

应用层流程可以通过打开文件一样打开视频输入设备,并且配置设备相关参数, 这是由于内核相关模块做了很多基础工作。跟V4L2相关的模块如下图所示:

ebaf11b6-33d4-11ed-ba43-dac502259ad0.png

图1 V4L2基本框架

1.3 典型捕获管道:

ec0316c6-33d4-11ed-ba43-dac502259ad0.png

图2 Xilinx视频典型捕获管道

  1. 1、硬件视图

  2. 1)多种组合可以开发一个捕获管道;

  3. 2)使用标准化接口(AXI总线接口)在管道中缝合多个IP。

  4. 2、软件视图

  5. 1)复杂性存在于软件级别,以支持多种组合;

  6. 2)由于没有任何标准的方法来配置管道中的不同元素,这给软件开发人员带来了更大的复杂性。

  7. 1.4具有流媒体和/或内存接口的基于帧的视频管道视频捕获设备:

  8. 1)视频存储器到存储器设备;

  9. 2)视频输出设备(无图形);

  10. 3)DMABUF:0拷贝缓冲区共享Media controller;

  11. 4)描述逻辑拓扑和数据流;

  12. 5)多媒体库 GStreamer、FFMPEG、OpenCV、OpenMAX、LibAV、VLC媒体播放器、MPlayers

  13. eca05418-33d4-11ed-ba43-dac502259ad0.png

  14. 图3 V4L2框架对应设备

  15. 2、Xilinx 视频编解码

在使用gst命令创建pipeline 完成视频输入到编码输出的过程如下:

ece88512-33d4-11ed-ba43-dac502259ad0.png

图4 Xilinx 视频输入设备及相关内核模块

当使用gst 命令处理HDMI视频输入时,我们会使用下面的命令:gst-launch-1.0 -v v4l2src device=/dev/video0 io-mode=4 !video/x-raw(memory:XLNXLL), format=NV16_10LE32, width=3840, height=2160,framerate=60/1 ! omxh265enc num-slices=8 periodicity-idr=240 cpb-size=500gdr-mode=horizontal initial-delay=250 control-rate=low-latencyprefetch-buffer=true target-bitrate=25000 gop-mode=low-delay-p ! video/x-h265,alignment=nal ! rtph265pay ! udpsink buffer-size=60000000 host=192.168.25.89port=5004 async=false max-lateness=-1 qos-dscp=60 max-bitrate=120000000 -v 其中/dev/video0设备对应我们的HDMI输入,使用omxh265enc进行编码,在使用rtph265pay完成RTP封装后,在通过udpsink使用udp将编码后的码流发送出去。这个实现我们可以通过V4L2接口来完成,本身gst 插件也是调用了V4L2接口完成,下面是使用V4L2接口完成上述工作的过程。
  1. 2.1 应用程序通过V4L2接口采集视频数据步骤

  2. 1)打开视频设备文件,通过视频采集的参数初始化, 通过V4L2接口设置视频图像属性;

  3. 2)申请若干视频采集的帧缓存区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;

  4. 3)将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;

  5. 4)驱动开始视频数据的采集,应用程序从视频采集输出队列中取出帧缓冲区,处理后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据。最后停止视频采集。

流程图如下所示

ed0d89de-33d4-11ed-ba43-dac502259ad0.png

  1. 2.2 V4L2ioctl控制符

  2. 1)VIDIOC_QUERYCAP 查询设备的属性;

  3. 2)VIDIOC_ENUM_FMT 帧格式;

  4. 3)VIDIOC_S_FMT 设置视频帧格式,对应struct v4l2_format;

  5. 4)VIDIOC_G_FMT 获取视频帧格式等;

  6. 5)VIDIOC_REQBUFS 请求/申请若干个帧缓冲区,一般为不少于3个;

  7. 6)VIDIOC_QUERYBUF 查询帧缓冲区在内核空间的长度和偏移量;

  8. 7)VIDIOC_QBUF 将申请到的帧缓冲区全部放入视频采集输出队列;

  9. 8)VIDIOC_STREAMON 开始视频流数据的采集;

  10. 9)VIDIOC_DQBUF 应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区;

  11. 10)VIDIOC_STREAMOFF 应用程序将该帧缓冲区重新挂入输入队列。

  12. 2.3 控制字符解析和使用用例:

1)VIDIOC_QUERYCAP-------->struct v4l2_capability 例如: if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ==V4L2_CAP_VIDEO_CAPTURE) { printf("Device %s: supports capture. ", FILE_VIDEO); } if ((cap.capabilities & V4L2_CAP_STREAMING) ==V4L2_CAP_STREAMING) { printf("Device %s: supports streaming. ", FILE_VIDEO); }

2)VIDIOC_ENUM_FMT-------->struct v4l2_fmtdesc

//通过这个结构体,可以显示对应的摄像头所支持视频帧格式。例如

struct v4l2_fmtdesc fmtdesc; fmtdesc.index = 0; fmtdesc.type =V4L2_BUF_TYPE_VIDEO_CAPTURE; printf("Supportformat:/n"); while(ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) != -1) { printf("/t%d.%s/n",fmtdesc.index+1,fmtdesc.description); fmtdesc.index++; } 3)VIDIOC_G_FMT-------->struct v4l2_format 查看视频帧格式 4)VIDIOC_S_FMT 设置视频帧格式 5) VIDIOC_CROPCAP-------->struct v4l2_cropcap结构体 6)设置Stream信息,主要设置帧率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 7)设置Stream信息,主要设置帧率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 8)设置Stream信息,主要设置帧率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 9)申请和管理缓冲区 VIDIOC_REQBUFS-------->struct v4l2_requestbuffers 10) 应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区 VIDIOC_QUERYBUF-------->struct v4l2_buffer 应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区 intioctl(intfd,VIDIOC_DQBUF, structv4l2_buffer*argp) 11) 开始视频采集和关闭视频采集 VIDIOC_STREAMON&VIDIOC_STREAMOFF int ioctl(int fd, VIDIOC_STREAMON, const int *argp) int ioctl(int fd, VIDIOC_STREAMOFF, const int *argp) 12) 应用程序将该帧缓冲区重新挂入输入队列VIDIOC_QBUF intioctl(intfd,VIDIOC_QBUF,structv4l2_buffer*argp)

3、Xilinx V4L2 Demo

ed41e4ae-33d4-11ed-ba43-dac502259ad0.png

图5:Xilinx V4L2 demo

ed6ab5dc-33d4-11ed-ba43-dac502259ad0.png

图6:Xilinx V4L2 + CTRLSW encode

  1. 3.1Xilinx使用V4L2实现视频输入的代码

  2. edea3ba4-33d4-11ed-ba43-dac502259ad0.png

  3. ee47a3ac-33d4-11ed-ba43-dac502259ad0.png

eeafdf58-33d4-11ed-ba43-dac502259ad0.png

3.2应用程序将帧缓冲区重新排入输入队列

ioctl(fd_v4l2,VIDIOC_QBUF, &buf)

ef4e903a-33d4-11ed-ba43-dac502259ad0.pngef7a86e0-33d4-11ed-ba43-dac502259ad0.png
  1. 3.3开始视频流数据的采集

  2. ioctl(fd_v4l2,VIDIOC_STREAMON, &type)

efc36996-33d4-11ed-ba43-dac502259ad0.png

3.4 应用程序将视频采集输出队列中取出已含有采集数据的帧缓冲区 ioctl(fd_v4l2, VIDIOC_DQBUF, &buf)

f00ae794-33d4-11ed-ba43-dac502259ad0.png

3.5 停止视频采集 ioctl(fd_v4l2,VIDIOC_STREAMOFF, &tpe)f0390b10-33d4-11ed-ba43-dac502259ad0.png 上面为主要功能函数介绍,具体代码等等请参考如下链接:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1010303367/Zynq+UltraScale+MPSoC+VCU+TRD+2020.2+-+Xilinx+Low+Latency+PS+DDR+NV12+HDMI+Audio+Video+Capture+and+Display

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Xilinx
    +关注

    关注

    71

    文章

    2167

    浏览量

    121304
  • 视频编解码
    +关注

    关注

    2

    文章

    54

    浏览量

    11746
  • V4L2
    +关注

    关注

    0

    文章

    17

    浏览量

    3894

原文标题:在Xilinx平台使用V4L2框架编程实现视频输入

文章出处:【微信号:Comtech FPGA,微信公众号:Comtech FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Xilinx Linux 如何理解V4L2的管道驱动程序

    概述 Xilinx提供了完整的V4L2的驱动程序, Xilinx V4L2 driver 。处于最顶层的驱动程序是
    的头像 发表于 09-30 13:44 4868次阅读
    <b class='flag-5'>Xilinx</b> Linux 如何理解<b class='flag-5'>V4L2</b>的管道驱动程序

    V853平台Camera模块开发框架详解

    引入media框架实现pipeline管理 将libisp移植到用户空间解决GPL问题 将统计buffer独立为v4l2 subdev 将的scaler(vipp)模块独立为v4l2 subdev
    的头像 发表于 12-05 14:30 5876次阅读
    <b class='flag-5'>V</b>853平台Camera模块开发<b class='flag-5'>框架</b><b class='flag-5'>详解</b>

    V4L2视频采集程序框架

    V4L2视频采集程序框架
    发表于 11-05 12:44

    DM6446 V4L2采集驱动和输出驱动与硬件工作原理

    Montavista 的Linux-2.6.18 V4L2好好分析一下,顺便讲解在产品中的应用,满足一些客户提出要求,毕竟V4L2是LINUX一个很重要的视频驱动,适合很多嵌入式芯片平台。本文首先讲解DM6446
    发表于 08-02 07:39

    基于PCIe和V4L2的8通道视频采集&显示IP

    基于PCIe和V4L2的8通道视频采集&显示IPVideo Capture&Display IP for V4L2在主机端视频设备内核驱动V4L2
    发表于 11-01 21:45

    什么是V4L2?有何作用

    1.什么是V4L2Video for(4) Linux 2 的简称,V4L的升级版。V4L2是linux操作系统下用于采集图片、
    发表于 01-17 09:05

    Chromium V4L2视频解码的功能问题求解

    我正在为 IMX8MM 使用 Yocto Langdale 版本。根据此提交消息,此版本应在 Chromium 中启用 V4L2 硬件视频解码:提交
    发表于 04-10 13:46

    需要了解Linux V4L2的驱动架构

    video4linux2(V4L2)是Linux内核中关于视频设备的中间驱动层,向上为Linux应用程序访问视频设备提供了通用接口,向下为linux中设备驱动程序开发提供了统一的
    发表于 04-28 17:29 1135次阅读
    需要了解Linux <b class='flag-5'>V4L2</b>的驱动架构

    学习V4L2应用程序框架时要注意的事项

    V4L2采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioctl函数来实现。
    发表于 05-14 14:00 1324次阅读
    学习<b class='flag-5'>V4L2</b>应用程序<b class='flag-5'>框架</b>时要注意的事项

    Linux应用开发【第七章】摄像头V4L2编程应用开发

    文章目录 7 摄像头V4L2编程应用开发 7.1 V4L2简介 7.2 V4L2视频采集原理 7.3 V4L2程序实现流程 7.4
    的头像 发表于 12-10 19:23 3091次阅读
    Linux应用开发【第七章】摄像头<b class='flag-5'>V4L2</b>编程应用开发

    V4L2学习笔记

    1.什么是V4L2Video for(4) Linux 2 的简称,V4L的升级版。V4L2是linux操作系统下用于采集图片、
    发表于 01-17 13:43 12次下载
    <b class='flag-5'>V4L2</b>学习笔记

    如何使用v4l2 API读取摄像头

    V4L2是Video For Linux的第二个版本,它是Linux的视频捕获的API。在这里,您可以找到有关的文档。它提供了很方便的c,c++和python接口
    发表于 02-07 11:16 4次下载
    如何使用<b class='flag-5'>v4l2</b> API读取摄像头

    Linux内核中视频设备驱动框架V4L2X详解

    V4L2(Video for Linux 2):Linux内核中关于视频设备驱动的框架,对上向应用层提供统一的接口,对下支持各类复杂硬件的灵活扩展.
    的头像 发表于 05-30 16:18 6147次阅读

    修改V4L2的Video Pipeline的devicetree

    PetaLinux 能够根据Vivado的设计,自动生成V4L2的Video Pipeline的devicetree。但是它主要为Xilinx的VCU TRD服务,测试的组合比较少。很多时候,需要根据自己的工程,修改V4L2的V
    的头像 发表于 08-02 08:03 2083次阅读
    修改<b class='flag-5'>V4L2</b>的Video Pipeline的devicetree

    v4l2编程

    v4l2编程
    发表于 10-28 11:10 0次下载