2021SC@SDUSC
zbar的工作流程图:
zbar文件夹中的decoder.c中的zbar_decode_width方法会将扫描器结构变量保存下来的明暗宽度流进行处理,该函数内部处理对象为当前行目前保存下来的宽度流,通过计算各宽度之间的宽度信息提取扫码特征,依次通过几种一维码二维码的检测标准,寻找到符合标准的扫码种类时更新扫描器结构变量中的type成员,并且更新lock成员以增加当前种类判断的置信度:
zbar_symbol_type_t zbar_decode_width (zbar_decoder_t *dcode,
unsigned w)
{
zbar_symbol_type_t tmp, sym = ZBAR_NONE;
dcode->w[dcode->idx & (DECODE_WINDOW - 1)] = w;
dbprintf(1, " decode[%x]: w=%d (%g)\n", dcode->idx, w, (w / 32.));
/* update shared character width */
dcode->s6 -= get_width(dcode, 7);
dcode->s6 += get_width(dcode, 1);
/* each decoder processes width stream in parallel */
#ifdef ENABLE_QRCODE
if(TEST_CFG(dcode->qrf.config, ZBAR_CFG_ENABLE) &&
(tmp = _zbar_find_qr(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
#ifdef ENABLE_EAN
if((dcode->ean.enable) &&
(tmp = _zbar_decode_ean(dcode)))
sym = tmp;
#endif
#ifdef ENABLE_CODE39
if(TEST_CFG(dcode->code39.config, ZBAR_CFG_ENABLE) &&
(tmp = _zbar_decode_code39(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
#ifdef ENABLE_CODE93
if(TEST_CFG(dcode->code93.config, ZBAR_CFG_ENABLE) &&
(tmp = _zbar_decode_code93(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
#ifdef ENABLE_CODE128
if(TEST_CFG(dcode->code128.config, ZBAR_CFG_ENABLE) &&
(tmp = _zbar_decode_code128(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
#ifdef ENABLE_DATABAR
if(TEST_CFG(dcode->databar.config | dcode->databar.config_exp,
ZBAR_CFG_ENABLE) &&
(tmp = _zbar_decode_databar(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
#ifdef ENABLE_CODABAR
if(TEST_CFG(dcode->codabar.config, ZBAR_CFG_ENABLE) &&
(tmp = _zbar_decode_codabar(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
#ifdef ENABLE_I25
if(TEST_CFG(dcode->i25.config, ZBAR_CFG_ENABLE) &&
(tmp = _zbar_decode_i25(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
#ifdef ENABLE_PDF417
if(TEST_CFG(dcode->pdf417.config, ZBAR_CFG_ENABLE) &&
(tmp = _zbar_decode_pdf417(dcode)) > ZBAR_PARTIAL)
sym = tmp;
#endif
dcode->idx++;
dcode->type = sym;
if(sym) {
if(dcode->lock && sym > ZBAR_PARTIAL && sym != ZBAR_QRCODE)
release_lock(dcode, sym);
if(dcode->handler)
dcode->handler(dcode);
}
return(sym);
}