void qrcode_check (SDL_Surface *screen, char *payload) { struct quirc *qr; int count = 0; int i = 0; qr = quirc_new(); if (!qr) { perror("couldn't allocate QR decoder"); return; } if (quirc_resize(qr, screen->w, screen->h) < 0) { perror("couldn't allocate QR buffer"); return; } rgb32_to_luma(screen->pixels, screen->pitch, screen->w, screen->h, quirc_begin(qr, NULL, NULL), screen->w); quirc_end(qr); count = quirc_count(qr); for (i = 0; i < count; i++) { struct quirc_code code; struct quirc_data data; quirc_decode_error_t err; quirc_extract(qr, i, &code); err = quirc_decode(&code, &data); if (! err) { strcpy(payload, (char *)data.payload); } } quirc_destroy(qr); }
static int main_loop(struct camera *cam, struct quirc *q, struct mjpeg_decoder *mj) { struct dthash dt; dthash_init(&dt, printer_timeout); for (;;) { int w, h; int i, count; uint8_t *buf = quirc_begin(q, &w, &h); const struct camera_buffer *head; const struct camera_parms *parms = camera_get_parms(cam); if (camera_dequeue_one(cam) < 0) { perror("camera_dequeue_one"); return -1; } head = camera_get_head(cam); switch (parms->format) { case CAMERA_FORMAT_MJPEG: mjpeg_decode_gray(mj, head->addr, head->size, buf, w, w, h); break; case CAMERA_FORMAT_YUYV: yuyv_to_luma(head->addr, w * 2, w, h, buf, w); break; default: fprintf(stderr, "Unknown frame format\n"); return -1; } if (camera_enqueue_all(cam) < 0) { perror("camera_enqueue_all"); return -1; } quirc_end(q); count = quirc_count(q); for (i = 0; i < count; i++) { struct quirc_code code; struct quirc_data data; quirc_extract(q, i, &code); if (!quirc_decode(&code, &data)) print_data(&data, &dt, want_verbose); } } }
static int main_loop(struct camera *cam, struct quirc *q, struct mjpeg_decoder *mj) { struct dthash dt; dthash_init(&dt, printer_timeout); for (;;) { int w, h; int i, count; uint8_t *buf = quirc_begin(q, &w, &h); if (camera_update(cam) < 0) return -1; switch (cam->format) { case CAMERA_FORMAT_MJPEG: mjpeg_decode_gray(mj, cam->mem, cam->mem_len, buf, w, w, h); break; case CAMERA_FORMAT_YUYV: yuyv_to_luma(cam->mem, w * 2, w, h, buf, w); break; } quirc_end(q); count = quirc_count(q); for (i = 0; i < count; i++) { struct quirc_code code; struct quirc_data data; quirc_extract(q, i, &code); if (!quirc_decode(&code, &data)) print_data(&data, &dt, want_verbose); } } }
static int scan_file(const char *path, const char *filename, struct result_info *info) { int len = strlen(filename); const char *ext; clock_t start; clock_t total_start; int ret; int i; while (len >= 0 && filename[len] != '.') len--; ext = filename + len + 1; if (!(toupper(ext[0] == 'j') && toupper(ext[1] == 'p') && (toupper(ext[2] == 'e') || toupper(ext[2] == 'g')))) return 0; total_start = start = clock(); ret = load_jpeg(decoder, path); info->load_time = clock() - start; if (ret < 0) { fprintf(stderr, "%s: load_jpeg failed\n", filename); return -1; } start = clock(); quirc_end(decoder); info->identify_time = clock() - start; info->id_count = quirc_count(decoder); for (i = 0; i < info->id_count; i++) { struct quirc_code code; struct quirc_data data; quirc_extract(decoder, i, &code); if (!quirc_decode(&code, &data)) info->decode_count++; } info->total_time += clock() - total_start; printf(" %-30s: %5ld %5ld %5ld %5d %5d\n", filename, CLOCK_TO_MS(info->load_time), CLOCK_TO_MS(info->identify_time), CLOCK_TO_MS(info->total_time), info->id_count, info->decode_count); if (want_cell_dump || want_verbose) { for (i = 0; i < info->id_count; i++) { struct quirc_code code; quirc_extract(decoder, i, &code); if (want_cell_dump) { dump_cells(&code); printf("\n"); } if (want_verbose) { struct quirc_data data; quirc_decode_error_t err = quirc_decode(&code, &data); if (err) { printf(" ERROR: %s\n\n", quirc_strerror(err)); } else { printf(" Decode successful:\n"); dump_data(&data); printf("\n"); } } } } info->file_count = 1; return 1; }