2021SC@SDUSC

目录

一、processor头文件分析

二、processor源文件_zbar_processor_handle_input函数分析


一、processor头文件分析

#define MAX_INPUT_BLOCK 15/*ms*/typedef struct processor_state_s processor_state_t;typedef struct proc_waiter_s {struct proc_waiter_s *next;zbar_event_t notify;zbar_thread_id_t requester;unsigned events;
} proc_waiter_t;#define EVENT_INPUT     0x01
#define EVENT_OUTPUT    0x02
#define EVENT_CANCELED  0x80
#define EVENTS_PENDING  (EVENT_INPUT | EVENT_OUTPUT)

定义最大输入等待时间MAX_INPUT_BLOCK(15ms)

定义平台特定状态包装器processor_state_t(主体)

定义特定通知跟踪proc_waiter_s

定义高级API事件:输入事件(用户输入)、输出事件(解码输出数据可用)、取消事件(取消标志)、待定事件

struct zbar_processor_s {errinfo_t err;                      /* 错误报告 */const void *userdata;               /* 应用数据 */zbar_video_t *video;                /* 输入视频设备 */zbar_window_t *window;              /* 输出窗口 */zbar_image_scanner_t *scanner;      /* 条形码扫描器 */zbar_image_data_handler_t *handler; /* 应用程序数据处理程序 */unsigned req_width, req_height;     /* 应用程序请求的视频大小  */int req_intf, req_iomode;           /* 应用程序请求接口 */uint32_t force_input;               /* 强制输入格式(debug) */uint32_t force_output;              /* 强制格式转换(debug) */int input;                          /* 用户输入状态 *//* 状态标志 */int threaded;int visible;                        /* 映射到显示的输出窗口  */int streaming;                      /* 视频支持 */int dumping;                        /* debug映像转储 */void *display;                      /* X显示连接 */unsigned long xwin;                 /* 顶层窗口 */zbar_thread_t input_thread;         /* 视频输入处理器 */zbar_thread_t video_thread;         /* 窗口事件处理程序 */const zbar_symbol_set_t *syms;      /* 以前的解码结果 */zbar_mutex_t mutex;                 /* 共享数据互斥 *//* API序列化锁 */int lock_level;zbar_thread_id_t lock_owner;proc_waiter_t *wait_head, *wait_tail, *wait_next;proc_waiter_t *free_waiter;processor_state_t *state;
};

定义主体zbar_processor_s(属性分析见代码注释)

extern int _zbar_processor_lock(zbar_processor_t*);
extern int _zbar_processor_unlock(zbar_processor_t*, int);
extern void _zbar_processor_notify(zbar_processor_t*, unsigned);
extern int _zbar_processor_wait(zbar_processor_t*, unsigned, zbar_timer_t*);

处理器锁API包括四个函数:

_zbar_processor_lock(上锁)

_zbar_processor_unlock(解锁)

_zbar_processor_notify(通知)

_zbar_processor_wait(等待)

extern int _zbar_processor_init(zbar_processor_t*);
extern int _zbar_processor_cleanup(zbar_processor_t*);
extern int _zbar_processor_input_wait(zbar_processor_t*, zbar_event_t*, int);
extern int _zbar_processor_enable(zbar_processor_t*);extern int _zbar_process_image(zbar_processor_t*, zbar_image_t*);
extern int _zbar_processor_handle_input(zbar_processor_t*, int);

平台API包括六个函数:

_zbar_processor_init(初始化)

_zbar_processor_cleanup(清理)

_zbar_processor_input_wait(等待输入)

_zbar_processor_enable(允许允许)

_zbar_process_image(图像处理)

_zbar_processor_handle_input(输入处理)

extern int _zbar_processor_open(zbar_processor_t*, char*, unsigned, unsigned);
extern int _zbar_processor_close(zbar_processor_t*);
extern int _zbar_processor_set_visible(zbar_processor_t*, int);
extern int _zbar_processor_set_size(zbar_processor_t*, unsigned, unsigned);
extern int _zbar_processor_invalidate(zbar_processor_t*);

窗口平台API包括五个函数:

_zbar_processor_open(打开窗口)

_zbar_processor_close(关闭窗口)

_zbar_processor_set_visible(设置窗口可见)

_zbar_processor_set_size(设置窗口大小)

_zbar_processor_invalidate(无效化)

二、processor源文件_zbar_processor_handle_input函数分析

int _zbar_processor_handle_input (zbar_processor_t *proc,int input)

函数传入两个参数:zbar_processor_t(processor.h中定义的主体结构体)、input(int类型)

int event = EVENT_INPUT;switch(input) {case -1:event |= EVENT_CANCELED;_zbar_processor_set_visible(proc, 0);err_capture(proc, SEV_WARNING, ZBAR_ERR_CLOSED, __func__,"user closed display window");break;case 'd':proc->dumping = 1;return(0);case '+':case '=':if(proc->window) {int ovl = zbar_window_get_overlay(proc->window);zbar_window_set_overlay(proc->window, ovl + 1);}break;case '-':if(proc->window) {int ovl = zbar_window_get_overlay(proc->window);zbar_window_set_overlay(proc->window, ovl - 1);}break;}

定义event变量为输入事件

如果input为-1:event变量等于取消事件,调用_zbar_processor_set_visible函数关闭窗口,调用err_capture函数记录用户关闭窗口;

如果input为'd':设置映像转储属性dumping为1,函数结束;

如果input为'+'或'=':如果存在输出窗口,则让该窗口的ovl属性加一;

如果input为'-':如果存在输出窗口,则让该窗口的ovl属性减一。

_zbar_mutex_lock(&proc->mutex);proc->input = input;if(input == -1 && proc->visible && proc->streaming)/* also cancel outstanding output waiters */event |= EVENT_OUTPUT;_zbar_processor_notify(proc, event);_zbar_mutex_unlock(&proc->mutex);return(input);

进行共享数据上锁

根据input、visible、streaming取消未完成的输出等待者

完成后进行通知和解锁

ZBar源码分析(二)相关推荐

  1. ZBar源码分析(五)

    2021SC@SDUSC 目录 一.image头文件分析 二.image源文件分析 1.zbar_image_create函数分析 2._zbar_image_free函数分析 3.一系列get.se ...

  2. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  3. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  4. gSOAP 源码分析(二)

    gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...

  5. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

  6. 【投屏】Scrcpy源码分析二(Client篇-连接阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  7. Nouveau源码分析(二):Nouveau结构体的基本框架

    Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...

  8. ENS最新合约源码分析二

    ENS(以太坊域名服务)智能合约源码分析二 0.简介 ​ 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...

  9. ZBar源码分析(一)

    2021SC@SDUSC 目录 一.zbar.h头文件分析 二.图像处理器代码分析 一.zbar.h头文件分析 在安装路径下,include中有个zbar.h文件,首先从这个头文件入手. zbar.h ...

  10. ZBar源码分析——多线程部分代码分析 | 2021SC@SDUSC

    2021SC@SDUSC 目录 一.ZBar中的多线程 线程:cpu调度的最小单位 何为线程安全? 锁机制 二.ZBar中使用多线程的代码示例 Window线程的上锁与解锁 Vedio视频流的上锁与解 ...

最新文章

  1. JDBC实例--工具类升级,使用Apache DBCP连接池重构DBUtility,让连接数据库更有效,更安全...
  2. python在线-python+在线
  3. win 8 学习笔记一:生存周期
  4. HDU4510 小Q系列故事——为什么时光不能倒流【时间计算】
  5. 线上python课程一般多少钱-Python在线培训课程费用是多少?值不值得报名?
  6. python美女源代码_单身程序员,每晚用python抓取百万张美女图片,连女友都不想找了...
  7. gdb 7.X 下载编译(aarch64)
  8. rabbitmq 一个生产者多个消费者_RabbitMQ入门学习系列(二),单生产者消费者
  9. python程序员面试宝典 剑指offer_程序员面试宝典+剑指Offer + 算法100题系列 + 15个经典算法下载...
  10. 2019中兴笔试选择题
  11. 区块链技术实体结合解决方案——汇新云
  12. 对话“第二人生”创始人:这不是一款游戏
  13. SVN版本控制—branches、trunk、tag篇
  14. excel如何将内容拆分
  15. 2018/02/12
  16. Proteus8.9 VSM Studio WINAVR编译器仿真ATmega16系列a09_扩展内存
  17. h5拍照添加水印上传
  18. Java 中怎么打印数组?
  19. LintCode 数字组合 题解
  20. python使用ffmpeg提取mkv视频的字幕srt

热门文章

  1. ccks2020中文短文本实体链接任务测评论文--小米团队--第一名
  2. 人民日报大家谈:少儿编程热,需要冷思考
  3. 【C语言】浮点型数据在内存中的存储方式
  4. DETR、conditional DETR、Deformable DETR
  5. VMware虚拟机去虚拟化完整版教程|永久过强壳VMP、SE壳、GK盾、TMD教程|VMware去虚拟化吾爱汇编论坛教程完整版
  6. 【博学谷学习记录】超强总结,用心分享 | 狂野大数据 | 环境 | hive搭建
  7. 怎么利用粉丝圈这个微信社区工具做好社群营销?我们是做教育行业
  8. 鱼和熊掌兼得——解密阿里云PCDN如何实现高质量低价格
  9. QQ电脑版修改聊天界面的显示比例后变成纯文本界面
  10. 木瓜移动每日资讯0518:滴滴在哈推出打车服务