summaryrefslogtreecommitdiffstats
path: root/zbar/video.h
diff options
context:
space:
mode:
Diffstat (limited to 'zbar/video.h')
-rw-r--r--zbar/video.h183
1 files changed, 183 insertions, 0 deletions
diff --git a/zbar/video.h b/zbar/video.h
new file mode 100644
index 0000000..fdb7394
--- /dev/null
+++ b/zbar/video.h
@@ -0,0 +1,183 @@
+/*------------------------------------------------------------------------
+ * Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
+ *
+ * This file is part of the ZBar Bar Code Reader.
+ *
+ * The ZBar Bar Code Reader is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The ZBar Bar Code Reader is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser Public License
+ * along with the ZBar Bar Code Reader; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * http://sourceforge.net/projects/zbar
+ *------------------------------------------------------------------------*/
+#ifndef _VIDEO_H_
+#define _VIDEO_H_
+
+#include "config.h"
+
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <zbar.h>
+
+#include "error.h"
+#include "image.h"
+#include "mutex.h"
+
+/* number of images to preallocate */
+#define ZBAR_VIDEO_IMAGES_MAX 4
+
+typedef enum video_interface_e
+{
+ VIDEO_INVALID = 0, /* uninitialized */
+ VIDEO_V4L1, /* v4l protocol version 1 */
+ VIDEO_V4L2, /* v4l protocol version 2 */
+ VIDEO_VFW, /* video for windows */
+ VIDEO_DSHOW /* direct show */
+} video_interface_t;
+
+typedef enum video_iomode_e
+{
+ VIDEO_READWRITE = 1, /* standard system calls */
+ VIDEO_MMAP, /* mmap interface */
+ VIDEO_USERPTR, /* userspace buffers */
+} video_iomode_t;
+
+typedef struct video_state_s video_state_t;
+
+struct zbar_video_s {
+ errinfo_t err; /* error reporting */
+ int fd; /* open camera device */
+ unsigned width, height; /* video frame size */
+
+ video_interface_t intf; /* input interface type */
+ video_iomode_t iomode; /* video data transfer mode */
+ unsigned initialized : 1; /* format selected and images mapped */
+ unsigned active : 1; /* current streaming state */
+
+ uint32_t format; /* selected fourcc */
+ unsigned palette; /* v4l1 format index corresponding to format */
+ uint32_t *formats; /* 0 terminated list of supported formats */
+ uint32_t *emu_formats; /* 0 terminated list of emulated formats */
+
+ struct video_resolution_s *res; /* 0 terminated list of resolutions */
+
+ struct video_controls_s *controls; /* linked list of controls */
+
+ unsigned long datalen; /* size of image data for selected format */
+ unsigned long buflen; /* total size of image data buffer */
+ void *buf; /* image data buffer */
+
+ unsigned frame; /* frame count */
+
+ zbar_mutex_t qlock; /* lock image queue */
+ int num_images; /* number of allocated images */
+ zbar_image_t **images; /* indexed list of images */
+ zbar_image_t *nq_image; /* last image enqueued */
+ zbar_image_t *dq_image; /* first image to dequeue (when ordered) */
+ zbar_image_t *shadow_image; /* special case internal double buffering */
+
+ video_state_t *state; /* platform/interface specific state */
+
+#ifdef HAVE_LIBJPEG
+ struct jpeg_decompress_struct *jpeg; /* JPEG decompressor */
+ zbar_image_t *jpeg_img; /* temporary image */
+#endif
+
+ /* interface dependent methods */
+ int (*init)(zbar_video_t *, uint32_t);
+ int (*cleanup)(zbar_video_t *);
+ int (*start)(zbar_video_t *);
+ int (*stop)(zbar_video_t *);
+ int (*nq)(zbar_video_t *, zbar_image_t *);
+ /** set value of video control
+ * implemented by v4l2_set_control()
+ * @param name name of a control, acceptable names are listed
+ * in processor.h
+ * @param value pointer to value of a type specified by flags
+ */
+ int (*set_control)(zbar_video_t *, const char *name, void *value);
+ /** get value of video control
+ * implemented by v4l2_get_control()
+ * @param name name of a control, acceptable names are listed
+ * in processor.h
+ * @param value pointer to a receiver of a value of a type
+ * specified by flags
+ */
+ int (*get_control)(zbar_video_t *, const char *name, void *value);
+
+ void (*free)(zbar_video_t *);
+
+ zbar_image_t *(*dq)(zbar_video_t *);
+};
+
+/* video.next_image and video.recycle_image have to be thread safe
+ * wrt/other apis
+ */
+static inline int video_lock(zbar_video_t *vdo)
+{
+ int rc = 0;
+ if ((rc = _zbar_mutex_lock(&vdo->qlock))) {
+ err_capture(vdo, SEV_FATAL, ZBAR_ERR_LOCKING, __func__,
+ "unable to acquire lock");
+ vdo->err.errnum = rc;
+ return (-1);
+ }
+ return (0);
+}
+
+static inline int video_unlock(zbar_video_t *vdo)
+{
+ int rc = 0;
+ if ((rc = _zbar_mutex_unlock(&vdo->qlock))) {
+ err_capture(vdo, SEV_FATAL, ZBAR_ERR_LOCKING, __func__,
+ "unable to release lock");
+ vdo->err.errnum = rc;
+ return (-1);
+ }
+ return (0);
+}
+
+static inline int video_nq_image(zbar_video_t *vdo, zbar_image_t *img)
+{
+ /* maintains queued buffers in order */
+ img->next = NULL;
+ if (vdo->nq_image)
+ vdo->nq_image->next = img;
+ vdo->nq_image = img;
+ if (!vdo->dq_image)
+ vdo->dq_image = img;
+ return (video_unlock(vdo));
+}
+
+static inline zbar_image_t *video_dq_image(zbar_video_t *vdo)
+{
+ zbar_image_t *img = vdo->dq_image;
+ if (img) {
+ vdo->dq_image = img->next;
+ img->next = NULL;
+ }
+ if (video_unlock(vdo))
+ /* FIXME reclaim image */
+ return (NULL);
+ return (img);
+}
+
+/* PAL interface */
+extern int _zbar_video_open(zbar_video_t *, const char *);
+
+#endif