summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaj-Michael Lang <milang@tal.org>2010-09-28 18:21:57 +0300
committerStefan Kost <ensonic@users.sf.net>2010-10-14 23:51:01 +0300
commit18c3302608643a196486979dde3e1c83319d4f06 (patch)
tree9e068370a5ff6ea2577889f7e69b4f80f7463168
parent5433fd062b3442bbaad706e333b7b469edc932c0 (diff)
zbar: Make scanner cache optional
-rw-r--r--ext/zbar/gstzbar.c27
-rw-r--r--ext/zbar/gstzbar.h1
2 files changed, 23 insertions, 5 deletions
diff --git a/ext/zbar/gstzbar.c b/ext/zbar/gstzbar.c
index d1d316827..8904ea969 100644
--- a/ext/zbar/gstzbar.c
+++ b/ext/zbar/gstzbar.c
@@ -102,6 +102,7 @@ enum
{
PROP_0,
PROP_MESSAGE,
+ PROP_CACHE,
};
#define DEFAULT_PROP_ZBAR 1
@@ -170,6 +171,11 @@ gst_zbar_class_init (GstZBarClass * g_class)
"Post a barcode message for each detected code",
TRUE, G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, PROP_CACHE,
+ g_param_spec_boolean ("cache", "cache",
+ "Enable or disable the inter-image result cache",
+ TRUE, G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY));
+
trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_zbar_set_caps);
trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_zbar_transform_ip);
trans_class->start = GST_DEBUG_FUNCPTR (gst_zbar_start);
@@ -179,6 +185,7 @@ gst_zbar_class_init (GstZBarClass * g_class)
static void
gst_zbar_init (GstZBar * zbar, GstZBarClass * g_class)
{
+ zbar->cache = TRUE;
zbar->message = TRUE;
zbar->scanner = zbar_image_scanner_create ();
@@ -204,6 +211,9 @@ gst_zbar_set_property (GObject * object, guint prop_id, const GValue * value,
zbar = GST_ZBAR (object);
switch (prop_id) {
+ case PROP_CACHE:
+ zbar->cache = g_value_get_boolean (value);
+ break;
case PROP_MESSAGE:
zbar->message = g_value_get_boolean (value);
break;
@@ -223,6 +233,9 @@ gst_zbar_get_property (GObject * object, guint prop_id, GValue * value,
zbar = GST_ZBAR (object);
switch (prop_id) {
+ case PROP_CACHE:
+ g_value_set_boolean (value, zbar->cache);
+ break;
case PROP_MESSAGE:
g_value_set_boolean (value, zbar->message);
break;
@@ -274,6 +287,8 @@ gst_zbar_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
/* scan the image for barcodes */
n = zbar_scan_image (zbar->scanner, image);
+ if (n == 0)
+ goto out;
/* extract results */
symbol = zbar_image_first_symbol (image);
@@ -285,7 +300,7 @@ gst_zbar_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
GST_DEBUG_OBJECT (zbar, "decoded %s symbol \"%s\" at quality %d",
zbar_get_symbol_name (typ), data, quality);
- if (zbar_symbol_get_count (symbol) != 0)
+ if (zbar->cache && zbar_symbol_get_count (symbol) != 0)
continue;
if (zbar->message) {
@@ -302,7 +317,9 @@ gst_zbar_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
}
}
+out:
/* clean up */
+ zbar_image_scanner_recycle_image (zbar->scanner, image);
zbar_image_destroy (image);
done:
@@ -316,8 +333,8 @@ gst_zbar_start (GstBaseTransform * base)
{
GstZBar *zbar = GST_ZBAR (base);
- /* start the cache (e.g. for filtering dupes) */
- zbar_image_scanner_enable_cache (zbar->scanner, TRUE);
+ /* start the cache if enabled (e.g. for filtering dupes) */
+ zbar_image_scanner_enable_cache (zbar->scanner, zbar->cache);
return TRUE;
}
@@ -327,8 +344,8 @@ gst_zbar_stop (GstBaseTransform * base)
{
GstZBar *zbar = GST_ZBAR (base);
- /* stop the cache (e.g. for filtering dupes) */
- zbar_image_scanner_enable_cache (zbar->scanner, FALSE);
+ /* stop the cache if enabled (e.g. for filtering dupes) */
+ zbar_image_scanner_enable_cache (zbar->scanner, zbar->cache);
return TRUE;
}
diff --git a/ext/zbar/gstzbar.h b/ext/zbar/gstzbar.h
index 1c47a0f76..eea1b4fab 100644
--- a/ext/zbar/gstzbar.h
+++ b/ext/zbar/gstzbar.h
@@ -56,6 +56,7 @@ struct _GstZBar
/* properties */
gboolean message;
+ gboolean cache;
/* internals */
zbar_image_scanner_t *scanner;