ZBar源码分析:zbar_decoder(1)

2021SC@SDUSC

decoder.h分析

decoder结构体组成zbar_decoder_s:

struct zbar_decoder_s {
    unsigned char idx;                  
    unsigned w[DECODE_WINDOW];          
    zbar_symbol_type_t type;            
    zbar_symbol_type_t lock;            
    unsigned modifiers;                 
    int direction;                     
    unsigned s6;                        

    unsigned buf_alloc;                 
    unsigned buflen;                    
    unsigned char *buf;                 
    void *userdata;                     
    zbar_decoder_handler_t *handler;   

  
#ifdef ENABLE_EAN
    ean_decoder_t ean;                  
#endif
#ifdef ENABLE_I25
    i25_decoder_t i25;                  
#endif
#ifdef ENABLE_DATABAR
    databar_decoder_t databar;         
#endif
#ifdef ENABLE_CODABAR
    codabar_decoder_t codabar;          
#endif
#ifdef ENABLE_CODE39
    code39_decoder_t code39;            
#endif
#ifdef ENABLE_CODE93
    code93_decoder_t code93;            
#endif
#ifdef ENABLE_CODE128
    code128_decoder_t code128;          
#endif
#ifdef ENABLE_PDF417
    pdf417_decoder_t pdf417;           
#endif
#ifdef ENABLE_QRCODE
    qr_finder_t qrf;                  
#endif
};

unsigned char idx; /* 当前宽度索引 */

unsigned w[DECODE_WINDOW]; /* 最后N条宽度的窗口 */

zbar_symbol_type_t type; /* 上次解码数据的类型 */

zbar_symbol_type_t lock; /* 缓冲锁 */

unsigned modifiers; /* 符号修饰符 */

int direction; /* 最后解码数据的方向 */

unsigned s6; /* 六元字符宽度 */

以上变量都会自动重置

unsigned buf_alloc; /* 动态缓冲区分配 */

unsigned buflen; /* 二进制数据长度 */

unsigned char *buf; /* 解码字符 */

void *userdata; /* 应用数据 */

zbar_decoder_handler_t *handler; /* 应用程序回调 */

以下定义符号特定状态

#ifdef ENABLE_EAN
    ean_decoder_t ean;                  /* EAN/UPC并行解码尝试*/
#endif
#ifdef ENABLE_I25
    i25_decoder_t i25;                  /* Interleaved 2 of 5解码状态 */
#endif
以下同为各符号的解码状态。

返回当前元素颜色函数:

static inline char get_color (const zbar_decoder_t *dcode)
{
    return(dcode->idx & 1);
}

检索前一个元素的第i个宽度:

static inline unsigned get_width (const zbar_decoder_t *dcode,
                                  unsigned char offset)
{
    return(dcode->w[(dcode->idx - offset) & (DECODE_WINDOW - 1)]);
}

从偏移量i开始检索条+空间对宽度:

static inline unsigned pair_width (const zbar_decoder_t *dcode,
                                   unsigned char offset)
{
    return(get_width(dcode, offset) + get_width(dcode, offset + 1));
}

计算字符总宽度“s”,由上下文相关偏移量标识的字符开头,字符大小为n个元素:

static inline unsigned calc_s (const zbar_decoder_t *dcode,
                               unsigned char offset,
                               unsigned char n)
{
    /* FIXME check that this gets unrolled for constant n */
    unsigned s = 0;
    while(n--)
        s += get_width(dcode, offset++);
    return(s);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值