日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

V4L2框架分析

發(fā)布時間:2023/11/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 V4L2框架分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ?V4L2是Video for linux2的簡稱,為linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動。v4L2是針對uvc(USB Video Class)免驅(qū)usb設(shè)備的編程框架,主要用于采集usb攝像頭等。

? ? ? 下圖是V4L2的框架,首先系統(tǒng)核心層分配設(shè)置注冊一個名為cdev結(jié)構(gòu)體變量(cdev結(jié)構(gòu)體是video_device結(jié)構(gòu)體里的一部分),并設(shè)置cdev->ops = v4l2_fops;在硬件層我們分配設(shè)置注冊了一個名為vfd結(jié)構(gòu)體變量(video_device結(jié)構(gòu)體),并設(shè)置vfd->fops = &vivi_fops,vfd->ioctl_ops ?= &vivi_ioctl_ops;當(dāng)應(yīng)用程序(APP)調(diào)用read、open等函數(shù)時,會調(diào)用到v4l2_fops里的read、open函數(shù),然后v4l2_fops里的read、open函數(shù)會再調(diào)用到硬件層相關(guān)的vfd->fops里的read、open函數(shù)。ioctl函數(shù)也類似。

? ? ? ? 下面我們從程序入手來分析V4L2的框架,本文借助Linux內(nèi)核目錄下的drivers\medio\video里的虛擬視頻驅(qū)動程序vivi.c(這段代碼使用v4l2 api模擬真實的視頻設(shè)備)來分析V4L2的框架。它的總體框架如下所示:

vivi_initvivi_create_instancev4l2_device_register // 不是主要, 只是用于初始化一些東西,比如自旋鎖、引用計數(shù)video_device_alloc// 設(shè)置1. vfd:.fops = &vivi_fops,.ioctl_ops = &vivi_ioctl_ops,.release = video_device_release,2.vfd->v4l2_dev = &dev->v4l2_dev;3. 設(shè)置"ctrl屬性"(用于APP的ioctl):v4l2_ctrl_handler_init(hdl, 11);dev->volume = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);dev->brightness = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);dev->contrast = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,V4L2_CID_CONTRAST, 0, 255, 1, 16); video_register_device(video_device, type:VFL_TYPE_GRABBER, nr)__video_register_devicevdev->cdev = cdev_alloc();vdev->cdev->ops = &v4l2_fops;cdev_addvideo_device[vdev->minor] = vdev;if (vdev->ctrl_handler == NULL)vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;

①我們從vivi.c里的vivi_init函數(shù)入手發(fā)現(xiàn)它調(diào)用了v4l2_device_register,該函數(shù)用于初始化一些東西,比如自旋鎖、引用計數(shù),這個并不是必需的;②調(diào)用了video_device_alloc分配video_device結(jié)構(gòu)體并對其進行相應(yīng)的設(shè)置,例如

.fops? ? ? ? ? ? ?= &vivi_fops,
.ioctl_ops ?? ?= &vivi_ioctl_ops,
.release? ? ? ?= video_device_release,

等設(shè)置,然后video_register_device注冊該結(jié)構(gòu)體;

③video_register_device函數(shù)調(diào)用了__video_register_device實現(xiàn)了如下操作:

vdev->cdev = cdev_alloc();
vdev->cdev->ops = &v4l2_fops;
cdev_add
? ? ? ? ? ? ? ??
video_device[vdev->minor] = vdev;

if (vdev->ctrl_handler == NULL)
? ? vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;

?

?

上圖是vivi_create_instance函數(shù)的一部分,首先分配一個video_device結(jié)構(gòu)體的變量vfd,然后設(shè)置*vfd = vivi_template;其中vivi_template是一個video_device的結(jié)構(gòu)體變量,它本身設(shè)置好了一些如.fops之類信息(如下圖),此操作便相當(dāng)于設(shè)置

?1. vfd:

.fops? ? ? ? ? ? ?= &vivi_fops,
.ioctl_ops ?? ?= &vivi_ioctl_ops,
.release? ? ? ?= video_device_release,

static struct video_device vivi_template = {.name = "vivi",.fops = &vivi_fops,.ioctl_ops = &vivi_ioctl_ops,.release = video_device_release,.tvnorms = V4L2_STD_525_60,.current_norm = V4L2_STD_NTSC_M, };

然后進入video_register_device函數(shù),下面是video_register_device里的一部分源碼,首先分配一個cdev結(jié)構(gòu)體

然后設(shè)置cdev->ops = &v4l2_fops;v4l2_fops本身指向了一些函數(shù)(如下圖),這樣cdev便也指向了這些函數(shù),當(dāng)APP調(diào)用read函數(shù)時,便會調(diào)用cdev里面的read函數(shù)

static const struct file_operations v4l2_fops = {.owner = THIS_MODULE,.read = v4l2_read,.write = v4l2_write,.open = v4l2_open,.get_unmapped_area = v4l2_get_unmapped_area,.mmap = v4l2_mmap,.unlocked_ioctl = v4l2_ioctl, #ifdef CONFIG_COMPAT.compat_ioctl = v4l2_compat_ioctl32, #endif.release = v4l2_release,.poll = v4l2_poll,.llseek = no_llseek, };

cdev里面的read函數(shù)如下圖,首先根據(jù)filp獲取到video_device結(jié)構(gòu)體,然后判斷該video_device結(jié)構(gòu)體里的read函數(shù)是否存在,若存在則調(diào)用它,所以最后便調(diào)用到了前面我們設(shè)置的vfd.fops里的read函數(shù)。

?

?

?

?

相比open、read函數(shù),ioctl的調(diào)用過程更復(fù)雜一些,下面我們來看一下(我們以VIDIOC_QUERYCAP為例)。下圖是v4l2_fops里的.unlocked_ioctl指向的v4l2_ioctl函數(shù)。

它調(diào)用了前面vivi_template的fops里面的ioctl。

vivi_template的fops里面的ioctl里調(diào)用到下圖的__video_do_ioctl函數(shù),該函數(shù)最終調(diào)用到vfd里的ioctl_ops成員里面的函數(shù),即vivi_ioctl_ops里的函數(shù)

比如調(diào)用的是?VIDIOC_QUERYCAP,則最終會調(diào)用到下面的函數(shù)。

/* ------------------------------------------------------------------IOCTL vidioc handling------------------------------------------------------------------*/ static int vidioc_querycap(struct file *file, void *priv,struct v4l2_capability *cap) {struct vivi_dev *dev = video_drvdata(file);strcpy(cap->driver, "vivi");strcpy(cap->card, "vivi");strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));cap->version = VIVI_VERSION;cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | \V4L2_CAP_READWRITE;return 0; }

?

?

總結(jié):ioctl的調(diào)用比open、read多了一層,當(dāng)APP調(diào)用ioctl函數(shù)時,便會調(diào)用cdev里面的ioctl函數(shù),然后調(diào)用到了前面我們設(shè)置的vfd.fops里的ioctl函數(shù),即和read、open函數(shù)同一結(jié)構(gòu)體里的v4l2_ioctl,然后最終再去調(diào)用到和??

.fops ? ? ? ? ? = &vivi_fops,同一結(jié)構(gòu)體里的
.ioctl_ops ?? ?= &vivi_ioctl_ops,里對應(yīng)的函數(shù)。

?

?

相關(guān)文章:

https://blog.csdn.net/qingkongyeyue/article/details/53447331

https://blog.csdn.net/qingkongyeyue/article/details/52372960

總結(jié)

以上是生活随笔為你收集整理的V4L2框架分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产欧美日韩精品在线 | 岛国片免费在线观看 | 久久午夜视频 | 亚洲天堂2024 | 成人视屏在线观看 | 欧美老熟妇乱xxxxx | 欧美爱爱免费视频 | 亚洲a成人 | 国产精品成人aaaa在线 | 亚洲av成人一区二区国产精品 | 奇米综合 | 欧美69囗交视频 | 日韩三级免费看 | 五月天av在线| 息与子五十路翔田千里 | 国产欧美激情 | 亚洲综合精品国产 | 国产伦精品一区二区 | 久草影视网 | 美女免费视频网站 | 91欧美一区二区三区 | 九九热免费在线视频 | 久久久久国| 亚洲视频一二三区 | 亚洲狼人在线 | 在线亚洲一区 | 日剧大尺度床戏做爰 | 久久综合成人 | 午夜特级毛片 | 免费无遮挡网站 | 就去色av| 成人在线观看一区 | 久久国产精品久久久久 | 日韩精品视频在线观看网站 | 奇米在线播放 | 男人日女人在线观看 | 欧美一级黄 | 狠狠躁夜夜躁人人爽视频 | 北京富婆泄欲对白 | 麻豆私人影院 | 深田咏美在线x99av | 日韩中出在线 | 国产精品久久av无码一区二区 | 精品动漫一区二区 | 亚洲综合视频网站 | 国产精品视频久久久 | 色天堂在线视频 | 中字幕视频在线永久在线观看免费 | 国产婷婷色综合av蜜臀av | 香蕉视频官网在线观看 | 国产精品视频专区 | 少妇69xx | 爱的天堂 | 九七影院在线观看免费观看电视 | 婷婷五月精品中文字幕 | 精品欧美在线观看 | 又黄又爽一区二区三区 | 福利视频二区 | 精品在线视频观看 | 人人看人人看 | 国产51页| 三级4级全黄60分钟 成人自拍视频 | www.色网| 日韩成人激情视频 | 国产欧美在线观看视频 | 男人与雌性宠物交啪啪 | 小辣椒福利视频导航 | 在线黄网 | 天天舔天天干天天操 | 91黄色国产| 91精品一区二区三区四区 | 亚洲第99页| 日少妇b| 天天干天天草天天射 | 91精品国产欧美一区二区成人 | www.国产在线视频 | 97在线视频免费观看 | 亚洲美女视频 | 成人性生交大免费看 | 秋霞久久精品 | 精品乱码一区二区三区 | 欧美性生活在线视频 | 亚洲AV成人无码久久精品同性 | 一区二区三区av在线 | 朝鲜女人性猛交 | 欧美一级在线观看 | 久天堂| 女优中文字幕 | 97国产精品视频人人做人人爱 | 欧美性三级 | www.久久精品.com| 黄色正能量网站 | 国产精品一区二区三区久久久 | 久久精品视频6 | 成人听书哪个软件好 | 中文激情网 | 亚洲一级二级片 | 瑟瑟视频免费看 | 亚洲第一字幕 |