2021SC@SDUSC

目录

一、zbar_processor_create函数分析

二、zbar_processor_destroy函数分析

三、zbar_processor_init函数分析

四、zbar_processor_request_size函数分析

1.zbar_processor_request_size函数分析

2.zbar_processor_request_interface函数分析

3.zbar_processor_request_iomode函数分析


一、zbar_processor_create函数分析

zbar_processor_t *zbar_processor_create (int threaded)

该函数为构造器函数,函数需要传入线程参数

zbar_processor_t *proc = calloc(1, sizeof(zbar_processor_t));if(!proc)return(NULL);err_init(&proc->err, ZBAR_MOD_PROCESSOR);proc->scanner = zbar_image_scanner_create();if(!proc->scanner) {free(proc);return(NULL);}proc->threaded = !_zbar_mutex_init(&proc->mutex) && threaded;_zbar_processor_init(proc);return(proc);

该函数的目的在于:如果设置了线程并且线程可用,处理器将在适当的地方生成线程,以避免阻塞并提高响应能力

typedef struct zbar_processor_s zbar_processor_t;

该函数返回一个zbar_processor_t对象,可以在zbar.h文件中找到其定义

struct zbar_processor_s {errinfo_t err;                      /* error reporting */const void *userdata;               /* application data */zbar_video_t *video;                /* input video device abstraction */zbar_window_t *window;              /* output window abstraction */zbar_image_scanner_t *scanner;      /* barcode scanner */zbar_image_data_handler_t *handler; /* application data handler */unsigned req_width, req_height;     /* application requested video size */int req_intf, req_iomode;           /* application requested interface */uint32_t force_input;               /* force input format (debug) */uint32_t force_output;              /* force format conversion (debug) */int input;                          /* user input status *//* state flags */int threaded;int visible;                        /* output window mapped to display */int streaming;                      /* video enabled */int dumping;                        /* debug image dump */void *display;                      /* X display connection */unsigned long xwin;                 /* toplevel window */zbar_thread_t input_thread;         /* video input handler */zbar_thread_t video_thread;         /* window event handler */const zbar_symbol_set_t *syms;      /* previous decode results */zbar_mutex_t mutex;                 /* shared data mutex *//* API serialization lock */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的具体属性可以在processor.h文件中找到,属性已经在之前的博客中解析过

二、zbar_processor_destroy函数分析

void zbar_processor_destroy (zbar_processor_t *proc)

该函数为析构函数,需要传入zbar_processor_t对象

zbar_processor_init(proc, NULL, 0);if(proc->syms) {zbar_symbol_set_ref(proc->syms, -1);proc->syms = NULL;}if(proc->scanner) {zbar_image_scanner_destroy(proc->scanner);proc->scanner = NULL;}_zbar_mutex_destroy(&proc->mutex);_zbar_processor_cleanup(proc);assert(!proc->wait_head);assert(!proc->wait_tail);assert(!proc->wait_next);proc_waiter_t *w, *next;for(w = proc->free_waiter; w; w = next) {next = w->next;_zbar_event_destroy(&w->notify);free(w);}err_cleanup(&proc->err);free(proc);

该函数的目的在于:清理与处理器关联的所有资源

三、zbar_processor_init函数分析

int zbar_processor_init (zbar_processor_t *proc,const char *dev,int enable_display)
{return 0;//if(proc->video)//       zbar_processor_set_active(proc, 0);//   if(proc->window && !proc->input_thread.started)//       _zbar_processor_close(proc);//   _zbar_mutex_lock(&proc->mutex);//   _zbar_thread_stop(&proc->input_thread, &proc->mutex);//   _zbar_thread_stop(&proc->video_thread, &proc->mutex);//   _zbar_processor_lock(proc);//   _zbar_mutex_unlock(&proc->mutex);//   if(proc->window) {//       zbar_window_destroy(proc->window);//       proc->window = NULL;//   }//   int rc = 0;//   if(proc->video) {//       zbar_video_destroy(proc->video);//       proc->video = NULL;//   }//   if(!dev && !enable_display)//       /* nothing to do *///       goto done;//   if(enable_display) {//       proc->window = zbar_window_create();//       if(!proc->window) {//           rc = err_capture(proc, SEV_FATAL, ZBAR_ERR_NOMEM,//                            __func__, "allocating window resources");//           goto done;//       }//   }//   if(dev) {//       proc->video = zbar_video_create();//       if(!proc->video) {//           rc = err_capture(proc, SEV_FATAL, ZBAR_ERR_NOMEM,//                            __func__, "allocating video resources");//           goto done;//       }//       if(proc->req_width || proc->req_height)//           zbar_video_request_size(proc->video,//                                    proc->req_width, proc->req_height);//       if(proc->req_intf)//           zbar_video_request_interface(proc->video, proc->req_intf);//       if((proc->req_iomode &&//           zbar_video_request_iomode(proc->video, proc->req_iomode)) ||//          zbar_video_open(proc->video, dev)) {//           rc = err_copy(proc, proc->video);//           goto done;//       }//   }//   /* spawn blocking video thread *///   int video_threaded = (proc->threaded && proc->video &&//                         zbar_video_get_fd(proc->video) < 0);//   if(video_threaded &&//      _zbar_thread_start(&proc->video_thread, proc_video_thread, proc,//                         &proc->mutex)) {//       rc = err_capture(proc, SEV_ERROR, ZBAR_ERR_SYSTEM, __func__,//                        "spawning video thread");//       goto done;//   }//   /* spawn input monitor thread *///   int input_threaded = (proc->threaded &&//                         (proc->window ||//                          (proc->video && !video_threaded)));//   if(input_threaded &&//      _zbar_thread_start(&proc->input_thread, proc_input_thread, proc,//                         &proc->mutex)) {//       rc = err_capture(proc, SEV_ERROR, ZBAR_ERR_SYSTEM, __func__,//                        "spawning input thread");//       goto done;//   }//   if(proc->window && !input_threaded &&//      (rc = proc_open(proc)))//       goto done;//   else if(proc->video) {//       int retry = -1;//       if(proc->window) {//           retry = zbar_negotiate_format(proc->video, proc->window);//           if(retry)//               fprintf(stderr,//                       "WARNING: no compatible input to output format\n"//                       "...trying again with output disabled\n");//       }//       if(retry)//           retry = zbar_negotiate_format(proc->video, NULL);//       if(retry) {//           zprintf(1, "ERROR: no compatible %s format\n",//                   (proc->video) ? "video input" : "window output");//           rc = err_capture(proc, SEV_ERROR, ZBAR_ERR_UNSUPPORTED,//                            __func__, "no compatible image format");//       }//   }//done://   _zbar_mutex_lock(&proc->mutex);//   proc_leave(proc);//   return(rc);
}

该函数的目的在于:对处理器进行(重新)初始化,打开视频输入设备 和/或 准备显示输出,但是不知道为什么函数内容都被注释掉了,不是很懂

四、zbar_processor_request_size函数分析

1.zbar_processor_request_size函数分析

int zbar_processor_request_size (zbar_processor_t *proc,unsigned width,unsigned height)
{proc_enter(proc);proc->req_width = width;proc->req_height = height;proc_leave(proc);return(0);
}

该函数的作用在于:从设备请求视频图像的首选大小

但是驱动程序可能会调整或完全忽略该请求

2.zbar_processor_request_interface函数分析

int zbar_processor_request_interface (zbar_processor_t *proc,int ver)
{proc_enter(proc);proc->req_intf = ver;proc_leave(proc);return(0);
}

该函数目的在于:请求首选视频驱动程序接口版本用于debug或测试

3.zbar_processor_request_iomode函数分析

int zbar_processor_request_iomode (zbar_processor_t *proc,int iomode)
{proc_enter(proc);proc->req_iomode = iomode;proc_leave(proc);return(0);
}

该函数目的在于:为请求首选视频I/O模式用于debug或测试

如果驱动程序不支持指定的模式,则会出现错误

I/O模式包括:

0=自动检测

1=使用read()强制I/O

2=使用mmap()强制内存映射I/O

3=强制用户PTR I/O(仅限v4l2)

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

  1. Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe

    Nouveau源码分析(三) 向DRM注册了Nouveau驱动之后,内核中的PCI模块就会扫描所有没有对应驱动的设备,然后和nouveau_drm_pci_table对照. 对于匹配的设备,PCI模块 ...

  2. 【投屏】Scrcpy源码分析三(Client篇-投屏阶段)

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

  3. Spring源码分析(三)

    Spring源码分析 第三章 手写Ioc和Aop 文章目录 Spring源码分析 前言 一.模拟业务场景 (一) 功能介绍 (二) 关键功能代码 (三) 问题分析 二.使用ioc和aop重构 (一) ...

  4. ZBar源码分析(五)

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

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

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

  6. ABP源码分析三十四:ABP.Web.Mvc

    ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...

  7. 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析

    动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...

  8. 【转】ABP源码分析三十四:ABP.Web.Mvc

    ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...

  9. 【转】ABP源码分析三十三:ABP.Web

    ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事 一,在 ...

  10. 【转】ABP源码分析三十一:ABP.AutoMapper

    这个模块封装了Automapper,使其更易于使用. 下图描述了改模块涉及的所有类之间的关系. AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttri ...

最新文章

  1. UNITY3D拓展编辑器 - 目录
  2. http://www.openwebx.org/docs/turbine.html
  3. oracle10g 开机自启动
  4. ocp 042 第六章:管理用户安全性
  5. MonogoDB 查询小结
  6. 网页服务器和mysql服务器_实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法...
  7. mysql+drbd+heartbeat高可用配置说明
  8. 数据科学家常见的五个 SQL 面试问题
  9. 联想服务器修改imm地址,联想服务器IMM运维管理指南.docx
  10. 精品小程序小游戏代码集合(持续更新中)
  11. tabbar角标 小程序_小程序tabbar实现底部tab导航栏
  12. Win7 远程桌面限制IP
  13. matlab pie 空隙,编码解决饼图(Pie)的标签重叠问题
  14. 一年级语文四季心田花开专项练习题
  15. 7485设计8位比较器
  16. RT-Thread线程实例
  17. 植物大战僵尸2 服务器维护时间,植物大战僵尸2:老玩家给平民党的7点忠告,不氪金也能玩到通关!...
  18. 蝙蝠侠前传2:暗夜骑士
  19. linux安装红帽openshift,Redhat Openshift 单机版安装指南 CRC4.6
  20. 程序是计算机要执行的指令的集合,计算机基础(示例代码)

热门文章

  1. linux计算校验和 c语言,校验和计算
  2. jQUery第一课(入门选择器)
  3. 算法开发常用软件列表
  4. 【EAGLE】学习记录1——制板速成
  5. Android使用百度定位不精确问题
  6. 域名邮箱是什么?企业域名邮箱怎么注册申请呢?
  7. Computer Systems A Programmer's Perspective
  8. Android AILD跨进程通讯 解决bindService无法启动
  9. 爱情配对测试缘分指数软件,爱情配对测试缘分指数,测试男女两个人姓名配
  10. 国外网盘休闲下载利器之:freeRapidDownloader 多国语言支持