decoder.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. /*------------------------------------------------------------------------
  2. * Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
  3. *
  4. * This file is part of the ZBar Bar Code Reader.
  5. *
  6. * The ZBar Bar Code Reader is free software; you can redistribute it
  7. * and/or modify it under the terms of the GNU Lesser Public License as
  8. * published by the Free Software Foundation; either version 2.1 of
  9. * the License, or (at your option) any later version.
  10. *
  11. * The ZBar Bar Code Reader is distributed in the hope that it will be
  12. * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  13. * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Lesser Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser Public License
  17. * along with the ZBar Bar Code Reader; if not, write to the Free
  18. * Software Foundation, Inc., 51 Franklin St, Fifth Floor,
  19. * Boston, MA 02110-1301 USA
  20. *
  21. * http://sourceforge.net/projects/zbar
  22. *------------------------------------------------------------------------*/
  23. #include <config.h>
  24. //#include <stdlib.h> /* malloc, calloc, free */
  25. #include <stdio.h> /* snprintf */
  26. #include <string.h> /* memset, strlen */
  27. #include <zbar.h>
  28. #include "decoder.h"
  29. #include "zbar_config.h"
  30. #if defined(DEBUG_DECODER) || defined(DEBUG_EAN) || \
  31. defined(DEBUG_CODE39) || defined(DEBUG_I25) || \
  32. defined(DEBUG_CODE128) || defined(DEBUG_QR_FINDER) || \
  33. (defined(DEBUG_PDF417) && (DEBUG_PDF417 >= 4))
  34. //# define DEBUG_LEVEL 1
  35. #endif
  36. #include "debug.h"
  37. zbar_decoder_t *zbar_decoder_create ()
  38. {
  39. zbar_decoder_t *dcode = calloc(1, sizeof(zbar_decoder_t));
  40. dcode->buf_alloc = BUFFER_MIN;
  41. dcode->buf = malloc(dcode->buf_alloc);
  42. /* initialize default configs */
  43. #ifdef ENABLE_EAN
  44. dcode->ean.enable = 1;
  45. dcode->ean.ean13_config = ((1 << ZBAR_CFG_ENABLE) |
  46. (1 << ZBAR_CFG_EMIT_CHECK));
  47. dcode->ean.ean8_config = ((1 << ZBAR_CFG_ENABLE) |
  48. (1 << ZBAR_CFG_EMIT_CHECK));
  49. dcode->ean.upca_config = 1 << ZBAR_CFG_EMIT_CHECK;
  50. dcode->ean.upce_config = 1 << ZBAR_CFG_EMIT_CHECK;
  51. dcode->ean.isbn10_config = 1 << ZBAR_CFG_EMIT_CHECK;
  52. dcode->ean.isbn13_config = 1 << ZBAR_CFG_EMIT_CHECK;
  53. #endif
  54. #ifdef ENABLE_I25
  55. dcode->i25.config = 1 << ZBAR_CFG_ENABLE;
  56. CFG(dcode->i25, ZBAR_CFG_MIN_LEN) = 6;
  57. #endif
  58. #ifdef ENABLE_CODE39
  59. dcode->code39.config = 1 << ZBAR_CFG_ENABLE;
  60. CFG(dcode->code39, ZBAR_CFG_MIN_LEN) = 1;
  61. #endif
  62. #ifdef ENABLE_CODE128
  63. dcode->code128.config = 1 << ZBAR_CFG_ENABLE;
  64. #endif
  65. #ifdef ENABLE_PDF417
  66. dcode->pdf417.config = 1 << ZBAR_CFG_ENABLE;
  67. #endif
  68. #ifdef ENABLE_QRCODE
  69. dcode->qrf.config = 1 << ZBAR_CFG_ENABLE;
  70. #endif
  71. zbar_decoder_reset(dcode);
  72. return(dcode);
  73. }
  74. void zbar_decoder_destroy (zbar_decoder_t *dcode)
  75. {
  76. if(dcode->buf)
  77. free(dcode->buf);
  78. free(dcode);
  79. }
  80. void zbar_decoder_reset (zbar_decoder_t *dcode)
  81. {
  82. memset(dcode, 0, (long)&dcode->buf_alloc - (long)dcode);
  83. #ifdef ENABLE_EAN
  84. ean_reset(&dcode->ean);
  85. #endif
  86. #ifdef ENABLE_I25
  87. i25_reset(&dcode->i25);
  88. #endif
  89. #ifdef ENABLE_CODE39
  90. code39_reset(&dcode->code39);
  91. #endif
  92. #ifdef ENABLE_CODE128
  93. code128_reset(&dcode->code128);
  94. #endif
  95. #ifdef ENABLE_PDF417
  96. pdf417_reset(&dcode->pdf417);
  97. #endif
  98. #ifdef ENABLE_QRCODE
  99. qr_finder_reset(&dcode->qrf);
  100. #endif
  101. }
  102. void zbar_decoder_new_scan (zbar_decoder_t *dcode)
  103. {
  104. /* soft reset decoder */
  105. memset(dcode->w, 0, sizeof(dcode->w));
  106. dcode->lock = 0;
  107. dcode->idx = 0;
  108. #ifdef ENABLE_EAN
  109. ean_new_scan(&dcode->ean);
  110. #endif
  111. #ifdef ENABLE_I25
  112. i25_reset(&dcode->i25);
  113. #endif
  114. #ifdef ENABLE_CODE39
  115. code39_reset(&dcode->code39);
  116. #endif
  117. #ifdef ENABLE_CODE128
  118. code128_reset(&dcode->code128);
  119. #endif
  120. #ifdef ENABLE_PDF417
  121. pdf417_reset(&dcode->pdf417);
  122. #endif
  123. #ifdef ENABLE_QRCODE
  124. qr_finder_reset(&dcode->qrf);
  125. #endif
  126. }
  127. zbar_color_t zbar_decoder_get_color (const zbar_decoder_t *dcode)
  128. {
  129. return(get_color(dcode));
  130. }
  131. const char *zbar_decoder_get_data (const zbar_decoder_t *dcode)
  132. {
  133. return((char*)dcode->buf);
  134. }
  135. unsigned int zbar_decoder_get_data_length (const zbar_decoder_t *dcode)
  136. {
  137. return(dcode->buflen);
  138. }
  139. zbar_decoder_handler_t *
  140. zbar_decoder_set_handler (zbar_decoder_t *dcode,
  141. zbar_decoder_handler_t handler)
  142. {
  143. zbar_decoder_handler_t *result = dcode->handler;
  144. dcode->handler = handler;
  145. return(result);
  146. }
  147. void zbar_decoder_set_userdata (zbar_decoder_t *dcode,
  148. void *userdata)
  149. {
  150. dcode->userdata = userdata;
  151. }
  152. void *zbar_decoder_get_userdata (const zbar_decoder_t *dcode)
  153. {
  154. return(dcode->userdata);
  155. }
  156. zbar_symbol_type_t zbar_decoder_get_type (const zbar_decoder_t *dcode)
  157. {
  158. return(dcode->type);
  159. }
  160. zbar_symbol_type_t zbar_decode_width (zbar_decoder_t *dcode,
  161. unsigned w)
  162. {
  163. dcode->w[dcode->idx & (DECODE_WINDOW - 1)] = w;
  164. dprintf(1, " decode[%x]: w=%d (%g)\n", dcode->idx, w, (w / 32.));
  165. /* each decoder processes width stream in parallel */
  166. zbar_symbol_type_t sym = dcode->type = ZBAR_NONE;
  167. #ifdef ENABLE_EAN
  168. if((dcode->ean.enable) &&
  169. (sym = _zbar_decode_ean(dcode)))
  170. dcode->type = sym;
  171. #endif
  172. #ifdef ENABLE_CODE39
  173. if(TEST_CFG(dcode->code39.config, ZBAR_CFG_ENABLE) &&
  174. (sym = _zbar_decode_code39(dcode)) > ZBAR_PARTIAL)
  175. dcode->type = sym;
  176. #endif
  177. #ifdef ENABLE_CODE128
  178. if(TEST_CFG(dcode->code128.config, ZBAR_CFG_ENABLE) &&
  179. (sym = _zbar_decode_code128(dcode)) > ZBAR_PARTIAL)
  180. dcode->type = sym;
  181. #endif
  182. #ifdef ENABLE_I25
  183. if(TEST_CFG(dcode->i25.config, ZBAR_CFG_ENABLE) &&
  184. (sym = _zbar_decode_i25(dcode)) > ZBAR_PARTIAL)
  185. dcode->type = sym;
  186. #endif
  187. #ifdef ENABLE_PDF417
  188. if(TEST_CFG(dcode->pdf417.config, ZBAR_CFG_ENABLE) &&
  189. (sym = _zbar_decode_pdf417(dcode)) > ZBAR_PARTIAL)
  190. dcode->type = sym;
  191. #endif
  192. #ifdef ENABLE_QRCODE
  193. if(TEST_CFG(dcode->qrf.config, ZBAR_CFG_ENABLE) &&
  194. (sym = _zbar_find_qr(dcode)) > ZBAR_PARTIAL)
  195. dcode->type = sym;
  196. #endif
  197. dcode->idx++;
  198. if(dcode->type) {
  199. if(dcode->handler)
  200. dcode->handler(dcode);
  201. if(dcode->lock && dcode->type > ZBAR_PARTIAL)
  202. dcode->lock = 0;
  203. }
  204. return(dcode->type);
  205. }
  206. static inline int decoder_set_config_bool (zbar_decoder_t *dcode,
  207. zbar_symbol_type_t sym,
  208. zbar_config_t cfg,
  209. int val)
  210. {
  211. unsigned *config = NULL;
  212. switch(sym) {
  213. #ifdef ENABLE_EAN
  214. case ZBAR_EAN13:
  215. config = &dcode->ean.ean13_config;
  216. break;
  217. case ZBAR_EAN8:
  218. config = &dcode->ean.ean8_config;
  219. break;
  220. case ZBAR_UPCA:
  221. config = &dcode->ean.upca_config;
  222. break;
  223. case ZBAR_UPCE:
  224. config = &dcode->ean.upce_config;
  225. break;
  226. case ZBAR_ISBN10:
  227. config = &dcode->ean.isbn10_config;
  228. break;
  229. case ZBAR_ISBN13:
  230. config = &dcode->ean.isbn13_config;
  231. break;
  232. #endif
  233. #ifdef ENABLE_I25
  234. case ZBAR_I25:
  235. config = &dcode->i25.config;
  236. break;
  237. #endif
  238. #ifdef ENABLE_CODE39
  239. case ZBAR_CODE39:
  240. config = &dcode->code39.config;
  241. break;
  242. #endif
  243. #ifdef ENABLE_CODE128
  244. case ZBAR_CODE128:
  245. config = &dcode->code128.config;
  246. break;
  247. #endif
  248. #ifdef ENABLE_PDF417
  249. case ZBAR_PDF417:
  250. config = &dcode->pdf417.config;
  251. break;
  252. #endif
  253. #ifdef ENABLE_QRCODE
  254. case ZBAR_QRCODE:
  255. config = &dcode->qrf.config;
  256. break;
  257. #endif
  258. /* FIXME handle addons */
  259. default:
  260. return(1);
  261. }
  262. if(!config || cfg >= ZBAR_CFG_NUM)
  263. return(1);
  264. if(!val)
  265. *config &= ~(1 << cfg);
  266. else if(val == 1)
  267. *config |= (1 << cfg);
  268. else
  269. return(1);
  270. #ifdef ENABLE_EAN
  271. dcode->ean.enable = TEST_CFG(dcode->ean.ean13_config |
  272. dcode->ean.ean8_config |
  273. dcode->ean.upca_config |
  274. dcode->ean.upce_config |
  275. dcode->ean.isbn10_config |
  276. dcode->ean.isbn13_config,
  277. ZBAR_CFG_ENABLE);
  278. #endif
  279. return(0);
  280. }
  281. static inline int decoder_set_config_int (zbar_decoder_t *dcode,
  282. zbar_symbol_type_t sym,
  283. zbar_config_t cfg,
  284. int val)
  285. {
  286. switch(sym) {
  287. #ifdef ENABLE_I25
  288. case ZBAR_I25:
  289. CFG(dcode->i25, cfg) = val;
  290. break;
  291. #endif
  292. #ifdef ENABLE_CODE39
  293. case ZBAR_CODE39:
  294. CFG(dcode->code39, cfg) = val;
  295. break;
  296. #endif
  297. #ifdef ENABLE_CODE128
  298. case ZBAR_CODE128:
  299. CFG(dcode->code128, cfg) = val;
  300. break;
  301. #endif
  302. #ifdef ENABLE_PDF417
  303. case ZBAR_PDF417:
  304. CFG(dcode->pdf417, cfg) = val;
  305. break;
  306. #endif
  307. default:
  308. return(1);
  309. }
  310. return(0);
  311. }
  312. int zbar_decoder_set_config (zbar_decoder_t *dcode,
  313. zbar_symbol_type_t sym,
  314. zbar_config_t cfg,
  315. int val)
  316. {
  317. if(sym == ZBAR_NONE) {
  318. zbar_decoder_set_config(dcode, ZBAR_EAN13, cfg, val);
  319. zbar_decoder_set_config(dcode, ZBAR_EAN8, cfg, val);
  320. zbar_decoder_set_config(dcode, ZBAR_UPCA, cfg, val);
  321. zbar_decoder_set_config(dcode, ZBAR_UPCE, cfg, val);
  322. zbar_decoder_set_config(dcode, ZBAR_ISBN10, cfg, val);
  323. zbar_decoder_set_config(dcode, ZBAR_ISBN13, cfg, val);
  324. zbar_decoder_set_config(dcode, ZBAR_I25, cfg, val);
  325. zbar_decoder_set_config(dcode, ZBAR_CODE39, cfg, val);
  326. zbar_decoder_set_config(dcode, ZBAR_CODE128, cfg, val);
  327. zbar_decoder_set_config(dcode, ZBAR_PDF417, cfg, val);
  328. zbar_decoder_set_config(dcode, ZBAR_QRCODE, cfg, val);
  329. return(0);
  330. }
  331. if(cfg >= 0 && cfg < ZBAR_CFG_NUM)
  332. return(decoder_set_config_bool(dcode, sym, cfg, val));
  333. else if(cfg >= ZBAR_CFG_MIN_LEN && cfg <= ZBAR_CFG_MAX_LEN)
  334. return(decoder_set_config_int(dcode, sym, cfg, val));
  335. else
  336. return(1);
  337. }
  338. static char *decoder_dump = NULL;
  339. static unsigned decoder_dumplen = 0;
  340. const char *_zbar_decoder_buf_dump (unsigned char *buf,
  341. unsigned int buflen)
  342. {
  343. int dumplen = (buflen * 3) + 12;
  344. if(!decoder_dump || dumplen > decoder_dumplen) {
  345. if(decoder_dump)
  346. free(decoder_dump);
  347. decoder_dump = malloc(dumplen);
  348. decoder_dumplen = dumplen;
  349. }
  350. char *p = decoder_dump +
  351. snprintf(decoder_dump, 12, "buf[%04x]=",
  352. (buflen > 0xffff) ? 0xffff : buflen);
  353. int i;
  354. for(i = 0; i < buflen; i++)
  355. p += snprintf(p, 4, "%s%02x", (i) ? " " : "", buf[i]);
  356. return(decoder_dump);
  357. }