quirc/demo/camera.h
Daniel Beer 3a3df0d1d6 demo: rewrite camera driver.
New camera driver doesn't depend on obsolete headers (linux/videodev.h),
and should work on more types of cameras.
2014-10-20 16:59:45 +13:00

104 lines
2.5 KiB
C

/* quirc -- QR-code recognition library
* Copyright (C) 2010-2014 Daniel Beer <dlbeer@gmail.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef CAMERA_H_
#define CAMERA_H_
#include <stddef.h>
#define CAMERA_MAX_BUFFERS 32
typedef enum {
CAMERA_FORMAT_UNKNOWN = 0,
CAMERA_FORMAT_MJPEG,
CAMERA_FORMAT_YUYV
} camera_format_t;
struct camera_parms {
camera_format_t format;
int width;
int height;
int pitch_bytes;
int interval_n;
int interval_d;
};
struct camera_buffer {
void *addr;
size_t size;
unsigned long offset;
};
struct camera {
int fd;
struct camera_parms parms;
struct camera_buffer buf_desc[CAMERA_MAX_BUFFERS];
int buf_count;
/* Stream state */
int s_on;
int s_qc;
int s_qhead;
};
/* Initialize/destroy a camera. No resources are allocated. */
void camera_init(struct camera *c);
void camera_destroy(struct camera *c);
/* Open/close the camera device */
int camera_open(struct camera *c, const char *path,
int target_w, int target_h,
int tr_n, int tr_d);
void camera_close(struct camera *c);
static inline int camera_get_fd(const struct camera *c)
{
return c->fd;
}
static inline const struct camera_parms *camera_get_parms
(const struct camera *c)
{
return &c->parms;
}
/* Map buffers */
int camera_map(struct camera *c, int buf_count);
void camera_unmap(struct camera *c);
static inline int camera_get_buf_count(const struct camera *c)
{
return c->buf_count;
}
/* Switch streaming on/off */
int camera_on(struct camera *c);
void camera_off(struct camera *c);
/* Enqueue/dequeue buffers (count = 0 means enqueue all) */
int camera_enqueue_all(struct camera *c);
int camera_dequeue_one(struct camera *c);
/* Fetch the oldest dequeued buffer */
static inline const struct camera_buffer *camera_get_head
(const struct camera *c)
{
return &c->buf_desc[(c->s_qhead + c->buf_count - 1) % c->buf_count];
}
#endif