| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> ZBar源码分析——video.c(二) | 2021SC@SDUSC -> 正文阅读 |
|
[C++知识库]ZBar源码分析——video.c(二) | 2021SC@SDUSC |
2021SC@SDUSC 目录 一、Video模块我们知道,扫描时提供给ZBar的不都是静态的图片,也有可能是动态的视频。例如我们日常生活中调用的微信扫码,所提供的也是视频video,这时便需要Zbar对视频进行分析,动态扫码。 Video模块是ZBar实现对读入视频进行扫描分析的功能模块。核心代码由video.h和video.c组成,video.h包括对一些关键变量的声明和结构体的定义,同时也是其他部件对Video模块的调用接口(头文件),而具体功能代码则是在video.c中实现。 二、代码分析上篇博客对ZBar关于图像和视频之间的转换和处理部分的代码进行了简要分析,这篇博客将继上篇博客往下分析。 ZBar对视频流的创建和销毁
首先为视频对象zbar_video_t *vdo申请内存,大小为zbar_video_所需内存。 若申请成功,则将相机状态置为打开(属性fd决定),若未申请成功,则返回NULL。 打开相机后,则代表着相机资源已被占用,其他视频对象不可使用相机资源。 这一功能由函数_zbar_mutex_init(&vdo->qlock)来实现,该函数在上篇博客中简单提到过,它实现了视频对象的上锁,即当前状态下不可产生新的视频对象(调用该函数),以免产生资源互斥。 接下来对图像进行预分配。 Zbar采用的处理方式是设定一个图像数量的最大值,然后将视频的图像数量置为该值并申请内存。 接下来根据这个最大值对视频对象进行遍历,对视频中包含的所有扫描得到的图像进行保存和创建,申请内存。并对每一张图像的进行计数、索引,以便调用和分析。 注意到,如果某一张图像出现异常、损坏,ZBar则直接销毁整个视频对象。
当ZBar需要销毁一个视频对象时,同样不能直接调用free函数释放内存,需要对将该视频对象占用的资源(包括占用的图像数组等)进行销毁后,才能释放视频对象。 这个函数的代码较为浅显,做的工作就是遍历视频对象调用过的图像和阴影部分图像,将其占用内存逐一释放后,最后free(vdo)释放视频对象。 获取相机设备状态
该函数对相机状态的两种异常情况进行了异常处理:视频设备未打开和视频驱动程序不支持轮询。 视频初始化(预处理)
在对视频进行初始化时,ZBar首先判断了该视频是否被初始化过,如果被初始化过,则判定一种异常情况,需要对该视频格式进行重新修正。这一点在我们写代码的过程中容易被忽略,值得学习。 接下来则是对视频进行预处理(创建解码器所需要的视频/图像格式),用于下一步的解码操作。 这里ZBar设定了编码格式为Y800。 对于单色的图像,Y800格式仅包含一个8位Y平面。它的FourCC编码中包含重复的为Y8和灰色对应的编码。这部分将在解码部分的代码中进行分析。 视频流的图像迭代
这部分功能实现的核心在于迭代过程中需要返回视频图像的副本并立即回收驱动程序的缓冲区,以避免资源死锁。 这部分代码与操作系统中的信号量机制类似,对于每一张图像的循环,必须保证缓冲区的有序使用,这就需要对缓冲区进行上锁和解锁。 对于缓冲区的资源,图像之间需要进行递交,在递交过程中,需要借助到tmp暂时图像,在递交结束之后,需要对tmp进行回收,否则会产生相当大的资源浪费。 三、总结本次博客对ZBar扫描器的Video模块的几个关键函数进行了分析。如有不足,敬请指正。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:54:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |