IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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源码分析(二) -> 正文阅读

[C++知识库]ZBar源码分析(二)

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取消未完成的输出等待者

完成后进行通知和解锁

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-18 17:12:27  更:2021-10-18 17:12:50 
 
开发: 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 3:52:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码